在SAS的datastep中计算变量的平均值和标准值

时间:2017-05-04 19:10:10

标签: sas datastep

我有一个数据集,其中观察是学生,然后我有他们的测试分数的变量。我需要将这些分数标准化为:

newscore =(旧分数 - 所有分数的平均值)/所有分数的标准

因此,我正在考虑使用数据步骤,我使用' newscore'创建新的数据集。添加到每个学生。但我不知道如何在数据步骤中计算整个数据集IN的平均值和标准值。我知道我可以使用proc方法计算它,然后手动输入它。但我需要做很多次和mabye drop变量和其他stuf。所以我希望能够在同一步骤中计算它。

数据例证:

___ VAR_ testscore newscore
Student1 5 x
Student2 8 x
Student3 5 x

我试过的代码:

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

(无法发布任何真实数据,无法将其从服务器中删除)

任何人都知道如何拉这个伎俩?

最好的问候

3 个答案:

答案 0 :(得分:1)

您不应该尝试在数据步骤中执行此操作。使用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;

答案 1 :(得分:0)

方法1:解决此问题的有效方法是使用 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;   

方法2:正如您建议从proc中取出均值和标准偏差,将其值存储在宏中并在计算中使用它们。

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

如有任何疑问,请与我联系。

答案 2 :(得分:0)

如果你想通过 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