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
的较新版本,但我不清楚是否有一种特定的方法可以完全满足您的需求。
免责声明:这主要是一个 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
的较新版本,但我不清楚是否有一种特定的方法可以完全满足您的需求。