数据分析中异常值在SAS中的处理
数据分析少不了和数据中的异常值打交道,Winsorize处理在SAS中经常使用。
Winsorize即极值处理,原理是将数据中的异常值修建,使之与正常分布的最大值与最小值相同。例如,你的数据整体位于[70,90]这个区间,而分析的数据中有些值特别大或者特别小,比如出现了60、65、95与125这种数值,这时Winsorize处理就能够将这些特别大或者特别小的值进行调整,让这些异常值变成你自己定义的一个合理范围中。对于上限,如果定义比90高出10%记为异常值,那么95这个值就会被SAS处理,放在Winsorize处理后的数据集里,而125将被看做异常值,不会放入Winsorize处理后的数据集里;同理,对于下限也是如此。
数据中含有缺失值和重复值时,进行Winsorize处理稍微会复杂一些。可以先对数据排序,但是缺失值首先会对计算造成不小的影响,所以Winsorize处理很方便解决这些常见难题。
SASWinsorize处理过程:
%letDSName=sashelp.heart;
prociml;
/*SAS/IMLmoduletoWinsorizeeachcolumnofamatrix.
InputproportionofobservationstoWinsorize:prop<0.5.
Ex:y=Winsorize(x,0.1)computesthetwo-side10%Winsorizeddata*/
startWinsorize(x,prop);
p=ncol(x);/*numberofcolumns*/
w=x;/*copyofx*/
doi=1top;
z=x[,i];/*copyi_thcolumn*/
n=countn(z);/*countnonmissingvalues*/
k=ceil(prop*n);/*numberofobstotrimfromeachtail*/
r=rank(z);/*rankvaluesini_thcolumn*/
/*findtargetvaluesandobswithsmaller/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)ksmallestandklargestvalues*/
w[lowIdx,i]=lowVal;
w[highIdx,i]=highVal;
end;
return(w);
finish;
/*testthealgorithmonnumericalvarsinadataset*/
use&DSName;
readallvar_NUM_intoX[colname=varNames];
close;
winX=Winsorize(X,0.1);
代码中,矩阵winX包含经过Winsorize处理过的数据,如果你想输出SASWinsorize处理后的数据,数据集属于小数据集,可以使用代码:%letDSName=sashelp.class;进行实现。
大批量数据处理之前,想验证SASWinsorize过程是否正确,可以借助SAS/IML计算出来的缩尾均值(Winsorizedmeans),与SASPROCUNIVARIATE计算出来的缩尾均值进行比较。
/*ComputeWinsorizedmean,whichismeanoftheWinsorizeddata*/
winMean=mean(winX);
printwinMean[c=varNamesf=8.4];
/*Validation:computeWinsorizedmeansbyusingUNIVARIATE*/
odsexcludeall;
procunivariatedata=&dsnamewinsorized=0.1;
odsoutputWinsorizedMeans=winMeans;
run;
odsexcludenone;
procprintdata=winMeans;
varVarNameMean;
run;
——SAS中文论坛
Copyright © 2010-2018 中国舆情网 版权所有 | 中国舆情网简介
网络文化经营许可证 广播电视节目制作经营许可证 电信增值业务经营许可证
编辑:tougao@yuqingz.com 运营:operate@yuqingz.com
本网站所刊载信息,不代表中国舆情网观点。转载本网站原创信息请注明出处。
网站地图 | XML地图 | 手机版 | 电脑版 | 标签