在 SAS 中生成人口数据集

Generating a Population Data Set in SAS

我是 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;

不太确定这会有什么帮助,但这似乎可以帮助您:

首先在长列表中创建 rows/columns 值,然后根据需要翻转到宽结构。这是动态的,可以很容易地针对任意数量的 rows/columns 或选择的 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;
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 以获得四边形重复。

既然您似乎想以四位递增,那么一点算术应该可以解决问题。只测试当前行是否小于当前列数乘以 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