【问题标题】:Calculate mean and std of a variable, in a datastep in SAS在 SAS 的数据步中计算变量的平均值和标准差
【发布时间】:2017-05-04 19:10:10
【问题描述】:

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

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

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

数据示例:

__VAR 测试分数新闻分数
学生 1 5 x
学生 2 8 x
学生3 5 x

我试过的代码:

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

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

我该怎么做?

【问题讨论】:

  • 请编辑您的问题以包含一些示例数据和您迄今为止尝试过的 sas 代码。

标签: sas datastep


【解决方案1】:

方法 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

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

【讨论】:

  • 嘿,非常感谢! Proc stdize 非常容易完成这项工作。也感谢其他方法,我不知道你可以使用 proc 方法来存储输出然后再次使用它。虽然我只是做了一张桌子。非常感谢!
  • 是的。但是您还需要知道存储值并进一步使用它们而无需手动输入它们的方式(在这种情况下是平均值和标准差),因此我也告诉了另一种方式。不客气。乐于助人:)
  • 啊当然,完成了,我在 stackoverflow 上很新:)
  • 为什么要使用宏变量来进行从 PROC MEANS 到数据步骤的转换,而不是我如何显示它(直接使用数据集)?
  • 我不知道。我从来没有在 if 语句中使用过 set 不过感谢您提供的信息。赞赏。
【解决方案2】:

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

【讨论】:

  • 非常感谢您的回答!我不知道 proc stdize,它的工作就像一个魅力!再次感谢
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 2022-01-23
    • 2021-04-08
    • 1970-01-01
    • 2017-01-18
    • 2019-08-20
    相关资源
    最近更新 更多