3.144 FAQ-878 如何根据用户自定义的条件消除异常值?
Last Update: 7/30/2018
如果想通过自定义异常值的条件来识别工作表中异常值所在的单元格,你需要使用 LabTalk 脚本。在以下的代码例子中,如果绝对 Z 值 (=abs((x-MeanOfColumn)/SDOfColumn)) 大于某个预设阈值,我们将该值定义为 “异常值”:
function dataset remoutliers(dataset ds1, double zthresh) { dataset ds2; double ii; sum(ds1); //collect stats of ds1 double summean=sum.mean; //store mean double sumsd=sum.SD; //store SD double nr=ds1.getSize(); //number of rows for(ii=1; ii<=nr; ii++) { ds2[ii]=abs(ds1[ii]-summean)/sumsd<=zthresh?ds1[ii]:0/0; //set missing if outlier } return ds2; }
然后你可以使用 remoutliers 函数搜索整个工作表。例如,要屏蔽以下工作表中的异常值:
你可以运行下面的脚本:
zthreshold=1.0; //Set the threshold Z nc=wks.ncols; //number of columns nr=wks.maxrows; //number of rows for(jj=1; jj<=nc; jj++){ dataset ds=wcol(jj); range rc=wcol(jj); wcol(jj)=remoutliers(wcol(jj),zthreshold); for(ii=1; ii<=nr; ii++) { if(rc[ii]==0/0) { rc[ii]=ds[ii]; //recover the data from original rc<ii>=1; //if cell is missing, mask it } } }
最后,你将获得以下结果。
注: 如果您的数据集按行排列,则需要先将工作表转置为按列排列。
Keywords:mask outlier, detect outlier,屏蔽异常值,检测异常值

