SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 10670|回复: 1
打印 上一主题 下一主题

SAS程序——异常值在SAS中的处理

[复制链接]

8

主题

25

帖子

118

积分

超级版主

Rank: 8Rank: 8

积分
118
跳转到指定楼层
楼主
发表于 2015-7-19 21:29:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Emma 于 2015-7-19 21:36 编辑

异常值在SAS中的处理

     数据分析少不了和数据中的异常值打交道,Winsorize处理在SAS中经常使用。

     Winsorize即极值处理,原理是将数据中的异常值修建,使之与正常分布的最大值与最小值相同。例如,你的数据整体位于[70,90]这个区间,而分析的数据中有些值特别大或者特别小,比如出现了60、65、95与125这种数值,这时Winsorize处理就能够将这些特别大或者特别小的值进行调整,让这些异常值变成你自己定义的一个合理范围中。对于上限,如果定义比90高出10%记为异常值,那么95这个值就会被SAS处理,放在Winsorize处理后的数据集里,而125将被看做异常值,不会放入Winsorize处理后的数据集里;同理,对于下限也是如此。

     数据中含有缺失值和重复值时,进行Winsorize处理稍微会复杂一些。可以先对数据排序,但是缺失值首先会对计算造成不小的影响,所以Winsorize处理很方便解决这些常见难题。

     SAS Winsorize 处理过程:

%let DSName =sashelp.heart;
proc iml;
/* SAS/IML moduleto Winsorize each column of a matrix.
   Input proportion of observations toWinsorize: prop < 0.5.
   Ex:  y= Winsorize(x, 0.1) computes the two-side 10% Winsorized data */
start Winsorize(x,prop);
   p = ncol(x);            /* number of columns */
   w = x;                  /* copy of x */
   do i = 1 to p;
      z = x[,i];           /* copy i_th column */
      n = countn(z);       /* count nonmissing values */
      k = ceil(prop*n);    /* number of obs to trim from each tail */
      r = rank(z);         /* rank values in i_th column */
      /* find target values and obs with smaller/largervalues */
      lowIdx = loc(r<=k & r^=.);
      lowVal = z[loc(r=k+1)];
      highIdx = loc(r>=n-k+1);
      highVal = z[loc(r=n-k)];
      /* Winsorize (replace) k smallest and klargest values */
      w[lowIdx,i] = lowVal;
      w[highIdx,i] = highVal;
   end;
   return(w);
finish;

/* test thealgorithm on numerical vars in a data set */
use &DSName;
read all var _NUM_into X[colname=varNames];
close;
winX = Winsorize(X,0.1);


    代码中,矩阵winX包含经过Winsorize处理过的数据,如果你想输出SASWinsorize处理后的数据,数据集属于小数据集,可以使用代码:%letDSName = sashelp.class; 进行实现。

    大批量数据处理之前,想验证SAS Winsorize过程是否正确,可以借助SAS/IML计算出来的缩尾均值( Winsorized means),与SAS PROC UNIVARIATE 计算出来的缩尾均值进行比较。

/* Compute Winsorized mean, which is  mean of the Winsorized data */
winMean = mean(winX);
print winMean[c=varNames f=8.4];


/* Validation: compute Winsorized means byusing UNIVARIATE */
ods exclude all;
proc univariate data=&dsname winsorized=0.1;
  ods output WinsorizedMeans=winMeans;
run;
ods exclude none;

proc print data=winMeans;
   var VarName Mean;
run;


   学习SAS/IML程序,可以参考附件资料。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  微信微信
收藏收藏
回复

使用道具 举报

0

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
沙发
发表于 2016-10-26 14:38:46 | 只看该作者

回帖奖励 +1

大神你好,大白求教~第一次用sas,想处理异常值,但是看不懂这个程序~还请大神赐教啊~我有6个数据:0.0572  0.0308  0.0597  0.0538  0.0380  0.0573 ,想修正异常值,该如何写这个程序呢?感激不尽!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2024-4-20 12:13 , Processed in 0.162781 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表