SAS - 使用全局归一化因子 w/o 使用宏变量

SAS - Using Global Normalization Factor w/o Using Macro Variable

免责声明:这主要是一个 style/best 实践问题,因为我确实有一个使用宏变量(如下所述)的功能解决方案,因此可能不适合该站点。

给定一个非标准化风险评分数据集,例如:

Dataset_1:

Person, Score
A, 1.00
B, 4.00
C, 2.35
...

我想标准化,使算术平均值为 1.0。我可以总结这个数据集,得出平均风险评分并将每个观察值除以该风险评分。例如:

过程总结....;通过一次观察产生数据集:

Dataset_2:

Avg_Score
2.5

然后使用:

Data _null_; Set Dataset_2;
  Call Symput("NormFactor", Avg_Score);
Run;

并且:

Data NormalizedScores;
  Set Dataset_1;
  Score_Norm = Score / &NormFactor.;
Run;

但是,这对我来说似乎是垃圾代码。有更好的方法吗?

尝试PROC STANDARD

data test;
input Person $ Score;
datalines;
A 1.00
B 4.00
C 2.35
;

proc standard data=test out=test2 mean=1;
var Score;
run;

如果你想用老式的方法,有比宏变量更好的方法;只需合并数据集,或者如果只有一种方法则设置它们。 (如果您有 BY 变量,则合并。)

例如:

data dataset_1;
input Person $ Score;
datalines;
A 1.00
B 4.00
C 2.35
;
run;
proc means data=dataset_1 noprint;
  var score;
  output out=dataset_2 mean=avg_score;
run;


Data NormalizedScores;
  set dataset_1;
  if _n_=1 then set dataset_2;
  Score_Norm = Score / avg_score;
Run;

来自 SET 语句的变量会自动保留,因为我们只在第二个数据集中读取一次,所以它们不会被替换或设置为缺失。

更巧妙的方法是使用 PROC STDIZE,它是 PROC STANDARD 的较新版本,但我不清楚是否有一种特定的方法可以完全满足您的需求。