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 函数搜索整个工作表。例如,要屏蔽以下工作表中的异常值:

FAQ 878 1.png

你可以运行下面的脚本:

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
}
}
}

最后,你将获得以下结果。

FAQ 878 2.png

: 如果您的数据集按行排列,则需要先将工作表转置为按列排列。


Keywords:mask outlier, detect outlier,屏蔽异常值,检测异常值