我继承了一个记录不完整的人月数据集,该数据集没有匹配的人员级数据集。我想确定人月数据集中的哪些变量实际上是人级变量(具有特定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
答案 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;