我有一个数据集,其中观察是学生,然后我有他们的测试分数的变量。我需要将这些分数标准化为:
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;
(无法发布任何真实数据,无法将其从服务器中删除)
任何人都知道如何拉这个伎俩?
最好的问候
答案 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