Создание набора данных о населении в SAS - PullRequest
0 голосов
/ 11 июня 2019

Я очень новичок в SAS и пытаюсь сгенерировать набор данных о категориальных переменных. Мне нужно получить набор данных с 400 наблюдениями и 99 переменными. В первом столбце (переменная 1) будет 4 1 и 396 0, во втором столбце (переменная 2) будет 8 1 и 392 0 и т. Д. И т. Д., Пока в последнем столбце (переменная 99) не будет 396 1 и 4. 0 '. Я пытался создать этот набор данных, но мне пока не повезло. Я считаю, что я должен использовать MACROS и DO-LOOPS, ARRAYS и, возможно, даже вложенные 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;

Ответы [ 3 ]

1 голос
/ 12 июня 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
1 голос
/ 11 июня 2019

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

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

 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;
0 голосов
/ 11 июня 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, чтобы получить повторение четырехугольников.

...