由于内置和第三方包的Dixon test都只能检测30个以下数据的异常值,手上的数据有1500多个,手搓了一个函数(虽然我也知道Dixon test检测异常值最好用于30个以下样本量,但是找不到其它更好的方法了。。。。)
造的轮子有时能正常跑,有时换个工作目录都会报错。刚才又试了下,没换工作目录都报错了。。。。玄学吗?
test data
造的轮子:
# only for upper Dixon outlier detection, after removing outliers, n>=31
Dixon_outlier<-function(x)
{
n<-length(x)-2
i<-1
x<-sort(x, decreasing = TRUE)
for(i in 1:n){
#calculate Dixon critical
Dixon_critical<-(x[i]-x[i+2])/(x[i]-x[n-2])
if(Dixon_critical == "NaN"){
break
}
# outlier will be subsituted by NA
else if (Dixon_critical>0.254) {
x[i]<-NA
i<-i+1
Dixon_critical<-(x[i]-x[i+2])/(x[i]-x[n-2])
}
else {
break
}
}
return(x)
}
报错信息:
错误于if (Dixon_critical == "NaN") {:
需要TRUE/FALSE值的地方不可以用缺少值
更新测试过程中遇到的更奇怪的问题:
手工直接r<-Dixon_outlier(test_data$mRBC)
会报这个错误,但是取出第一列先sort
再用函数就不会报错。。。。
可是我写的函数一开始就先进行降序排列了啊