【问题标题】:Generating a Population Data Set in SAS在 SAS 中生成人口数据集
【发布时间】:2019-06-11 17:31:30
【问题描述】:

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

【问题讨论】:

  • 数组创建一行数据,而不是列。您能否以行而非列的形式重新定义您的要求?如果没有,我想你可以生成数据然后转置它。
  • 标准统计分析结构要求我将变量保持为列,将行保持为受访者(或观察)。所以不幸的是,我将无法根据行重新定义我的要求,我也没有看到行之间的关系。但我愿意尝试您生成正确转置版本数据集的想法。你知道我会怎么做吗?
  • 因此,对于第一个变量,您希望 400 个观察结果中有 4 个为真,其余为假。您是否关心哪些观察结果为真?可以是前4吗?最后4个?还是需要 4 次随机观察?
  • 哪 4 个观察结果是正确的并不重要。您列出的这 3 种情况中的任何一种都适合我
  • 稍微简化了我的回答,希望这对你来说足够动态:)

标签: arrays sas nested-loops sas-macro do-loops


【解决方案1】:

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

首先在一个长列表中创建行/列值,然后根据需要翻转到一个宽结构。这是动态的,可以轻松修改任意数量的行/列或选择 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;

【讨论】:

  • 感谢您的回复,非常感谢!
【解决方案2】:

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

【讨论】:

  • 一如既往的简洁明了!
【解决方案3】:
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 以获得四边形重复。

【讨论】:

  • 优质的东西,感谢您提供这种替代方法!
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多