确定每个id内的常量变量(堆叠数据集)

时间:2013-07-05 18:07:25

标签: sas

我继承了一个记录不完整的人月数据集,该数据集没有匹配的人员级数据集。我想确定人月数据集中的哪些变量实际上是人级变量(具有特定id的所有观察的常量),例如您对出生日期的预期。简单的例子:

id month dob    race tx weight
1  1     4058   1    1  105
1  2     4058   1    1  107
1  3     4058   1    2  108
2  1     1622   2    1  153
2  2     1622   2    3  153
2  3     1622   2    2  153

在这个例子中,dob和种族是固定在个体内但是tx和体重在个体内按个月变化。

我提出了一个笨拙的解决方案:使用proc方法计算所有数字变量BY id的标准差,然后取这些标准偏差的最大值。如果变量的std的最大值为0,则任何个体中的该列都没有变化,我可以将该变量标记为固定(或人级)。

我觉得我错过了一个更简单的统计测试,以确定我的每个个体中数百个变量中的哪个变量是固定的,并且在个体的观察中变化。有什么建议吗?

的pT

2 个答案:

答案 0 :(得分:1)

我认为除了你已经解决的问题之外还有一个“简单的统计测试” - 标准偏差,甚至是MIN / MAX(大致相同)。我可能只是在PROC SQL中做,除非有大量的变量;这允许你也使用字符变量。

%macro comparetype(var);
max(&var.) = min(&var.) as &var.
%mend comparetype;
proc sql;
select min(origin) as origin, min(type) as type, min(drivetrain) as drivetrain,
            min(msrp) as msrp,min(invoice) as invoice,min(enginesize) as enginesize from (
  select make,
%comparetype(origin),
%comparetype(type),
%comparetype(drivetrain),
%comparetype(msrp),
%comparetype(invoice),
%comparetype(enginesize)
from sashelp.cars
    group by make
);
quit;

答案 1 :(得分:1)

我会在PROC FREQ中使用NLEVELS选项。这为您提供了每个变量的唯一值数,因此您需要查找具有唯一值(nlevels)1的变量。 这是代码,如果没有完成,你需要事先按id对数据进行排序。

data have;
input id month dob race tx weight;
cards;
1  1     4058   1    1  105
1  2     4058   1    1  107
1  3     4058   1    2  108
2  1     1622   2    1  153
2  2     1622   2    3  153
2  3     1622   2    2  153
;
run;

ods select nlevels;
ods output nlevels=want;
ods noresults;
proc freq data=have nlevels;
by id;
run;
ods results;