Создание набора данных населения в SAS

Я очень новичок в SAS, и я пытаюсь создать набор данных о населении категориальных переменных. Мне нужно получить набор данных с 400 наблюдениями и 99 переменными. В первом столбце (переменная 1) будет 4 единицы и 396 нулей, во втором столбце (переменная 2) будет 8 единиц и 392 нуля, и так далее, и так далее, пока в последнем столбце (переменная 99) не будет 396 единиц и 4. 0 с. Я пытался создать этот набор данных, но пока не повезло. Я считаю, что мне нужно использовать МАКРОСЫ и DO-LOOPS, МАССИВЫ и, возможно, даже вложенные ЦИКЛЫ.

Пока это то, что у меня есть, но я довольно далек от фактического решения;

DATA population;
    ARRAY pop V1-V99;
        DO N=1 TO 400;
           DO i=1 TO dim(pop);
               pop(i)=.....;
           END;
        DROP i;
        DROP N;
        END;
RUN;

person Nelly    schedule 11.06.2019    source источник
comment
Массивы создают строку данных, а не столбцы. Можете ли вы переопределить свои требования в терминах строк, а не столбцов? Если нет, я полагаю, вы могли бы сгенерировать данные, а затем перенести их.   -  person Reeza    schedule 11.06.2019
comment
Стандартная структура статистического анализа требует, чтобы мои переменные отображались как столбцы, а строки — как респонденты (или наблюдения). Поэтому, к сожалению, я не смогу переопределить свои требования с точки зрения строк, а также я не увидел связи между строками. Но я готов опробовать вашу идею создания правильной транспонированной версии набора данных. Вы случайно не представляете, как я это сделаю?   -  person Nelly    schedule 11.06.2019
comment
Итак, для первой переменной вы хотите, чтобы 4 из 400 наблюдений были истинными, а остальные — ложными. Вас волнует, какие наблюдения станут истинными? Может первые 4? Последние 4? Или это должно быть 4 случайных наблюдения?   -  person Tom    schedule 11.06.2019
comment
Неважно, какие 4 наблюдения верны. Любой из этих трех сценариев, которые вы перечислили, мне подойдет.   -  person Nelly    schedule 11.06.2019
comment
Немного упростил мой ответ, надеюсь, он достаточно динамичен для вас :)   -  person Reeza    schedule 11.06.2019


Ответы (3)


Не совсем уверен, как это поможет, но, похоже, это приведет вас туда:

Сначала создайте значения строк/столбцов в длинном списке, а затем по желанию перейдите к широкой структуре. Это динамично и легко модифицируется для любого количества строк/столбцов или выбора единиц. Единицы просто выбираются по порядку, вы не указали, должны ли они быть случайными или последовательными.

 data have;
 *loop over 99 columns;
 do col=1 to 99;
     *create row values, using 4 rule and basic math for loop counting;
     do row=1 to 400;
         if row <= col*4 then val=1; 
         else val=0;
         output;
     end;
end;
run;

*sort for transpose;
proc sort data=have;
    by row col;
run;

*flip to desired structure;
proc transpose data=have out=want prefix=COL;
by row;
var VAL;
id col;
run;

*check # of 1's per col;
proc means data=want N SUM;
var COL1-COL99;
run;
person Reeza    schedule 11.06.2019
comment
Спасибо за ваш ответ, очень признателен! - person Nelly; 12.06.2019

Поскольку вы, кажется, хотите увеличить на четыре, небольшая арифметика должна помочь. Просто проверьте, меньше ли текущая строка, чем номер текущего столбца, умноженный на 4.

data population;
  do row=1 to 400;
    id='ID'||put(row,z3.);
    array vars v1-v99 ;
    do col=1 to dim(vars);
      vars[col]= row <= 4*col;
    end;
    output;
  end;
  drop row col;
run;

Чтобы убедиться, что мы получили правильное количество единиц, мы можем сложить их:

proc means sum; run;

Полученные результаты:

Variable             Sum
------------------------
v1             4.0000000
v2             8.0000000
v3            12.0000000
v4            16.0000000
v5            20.0000000
v6            24.0000000
v7            28.0000000
v8            32.0000000
v9            36.0000000
v10           40.0000000
v11           44.0000000
...
v96          384.0000000
v97          388.0000000
v98          392.0000000
v99          396.0000000
person Tom    schedule 11.06.2019
comment
Красиво и лаконично, как всегда! - person Reeza; 12.06.2019

data line;
do i = 1 to 100;
    do j = 1 to 100;
        select; 
            when (i > j) k = 0;
            otherwise k = 1;
        end;
        output;
    end;    
end;
run;

proc transpose data = line
out = cube (drop = _NAME_);
by i;
id j;
var k;
run;

proc sql;
create table quad_cube_prep as
select t1.* from cube t1
union all
select t2.* from cube t2
union all
select t3.* from cube t3
union all
select t4.* from cube t4
;quit;

proc sort data = quad_cube_prep out=quad_cube (drop = i) ; by i;

В основном создайте столбец строк из 10000 записей, сложите его на 100, используя транспонирование, чтобы получить куб. и объединить все x4, чтобы получить четырехкратное повторение.

person Ben    schedule 11.06.2019
comment
Качественный материал, спасибо за этот альтернативный подход! - person Nelly; 12.06.2019