【问题标题】:SAS - Using Global Normalization Factor w/o Using Macro VariableSAS - 使用全局归一化因子而不使用宏变量
【发布时间】:2017-08-29 20:27:31
【问题描述】:

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

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

数据集_1:

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

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

过程摘要 ....;通过一次观察生成数据集:

数据集_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;

但是,这对我来说似乎是垃圾代码。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: macros sas global


    【解决方案1】:

    如果你想用老式的方法来做,有比宏变量更好的方法;只需合并数据集,或者如果只有一个平均值,则设置它们。 (如果有 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 的较新版本,但我不清楚是否有特定方法可以完全满足您的需求。

    【讨论】:

    • STDIZE 是 SAS/STAT 的一部分,PROC STANDARD 在 Base 中。因此,我倾向于使用 STANDARD。
    【解决方案2】:

    试试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;
    

    【讨论】:

    • 我想让分数乘法归一化。不过,我不知道“标准”程序。我看到我可以记录转换并使用此方法,但我是否缺少使用此过程以更巧妙的方式执行此操作的选项?
    • 我不这么认为。对数转换可能是您最好的选择。可能有另一种程序可以做到这一点,但我想不出一个。我会编写一个宏来执行此操作,并在需要时使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    相关资源
    最近更新 更多