在SAS中的数据步骤中计算变量的均值和标准差

Calculate mean and std of a variable, in a datastep in SAS

我有一个数据集,其中观察值是学生,然后我有一个变量表示他们的考试成绩。我需要像这样标准化这些分数:

newscore = (oldscore - mean of all scores) / std of all scores

所以我在考虑使用数据步骤,我在其中创建一个新数据集,并将 'newscore' 添加到每个学生。但是我不知道如何在Data Step中计算整个数据集IN的均值和标准差。我知道我可以使用 proc 方法计算它,然后手动输入它。但是我需要做很多次并且可能会删除变量和其他东西。所以我希望能够在同一步骤中计算它。

数据示例:

__VAR testscore newscore
学生 1 5 x
学生 2 8 x
学生 3 5 x

我试过的代码:

data new;
set old;
newscore=(oldscore-(mean of testscore))/(std of testscore)
run;

(不能post任何真实数据,不能从服务器中删除它)

我该怎么做?

您不应尝试在数据步骤中执行此操作。用 proc means 来做。您无需输入任何内容,只需获取数据集中的值即可。

你没有提供足够的答案来给出完整的代码,但是基本思路。

proc means data=sashelp.class;
var height weight;
output out=class_stats mean= std= /autoname;
run;

data class;
  if _n_=1 then set class_Stats;  *copy in the values from class_Stats;
  set sashelp.class;
  height_norm = (height-height_mean)/(height_stddev);
  weight_norm = (weight-weight_mean)/(weight_stddev);

run;

或者,只需使用 PROC STDIZE 即可。

proc stdize data=sashelp.class out=class_Std;
   var height weight;
run;

Method1: 解决这个问题的有效方法是使用 proc stdize 。它可以解决问题,您不需要为此计算均值和标准差。

data have;
input var $ testscore;
cards;
student1 5
student2 8
student3 5
;
run;

data have;
set have;
newscore = testscore;
run;

proc stdize data=have out=want;
   var newscore;
run;   

Method2: 正如您所建议的那样,从 proc means 中取出均值和标准差,将它们的值存储在宏中并在我们的计算中使用它们。

proc means data=have;
var testscore;
output out=have1 mean = m stddev=s;
run;

data _null_;
set have1;
call symputx("mean",m);
call symputx("std",s);
run;

data want;
set have;
newscore=(testscore-&mean.)/&std.;
run;

我的输出:

var           testscore  newscore
student1      5          -0.577350269   
student2      8          1.1547005384   
student3      5          -0.577350269

如有任何疑问,请告诉我。

如果你想通过proc实现这个sql:

proc sql; 
create table want as
select *, mean(oldscore) as mean ,std(oldscore) as sd
from have; 
quit; 

有关 proc sql 中的其他统计函数,请参阅此处:https://support.sas.com/kb/25/279.html