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