1

我继承了一个记录不充分的人月数据集,它没有匹配的人级数据集。我想确定人月数据集中的哪些变量实际上是人级别的变量(对于具有特定 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

在此示例中,出生日期和种族在个人中是固定的,但在个人中 tx 和体重会因月而异。

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

我觉得我错过了一个更简单的统计测试来确定我的数百个变量中的哪些变量在每个人中是固定的,哪些在个人的观察中有所不同。有什么建议么?

pT

4

2 回答 2

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;
于 2013-07-05T19:39:21.490 回答
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;
于 2013-07-08T08:44:55.847 回答