在【定量分析、量化金融与统计学】R语言ANOVA方差分析关于outliers(异常值)的处理中,我们提到了异常值的问题,也说了如何使用R来处理这些异常值,但是R语言对于方差分析,不论ANOVA还是MANOVA是存在异常值陷阱的。
今天我就把我的教训分享出来:
目录
一、各种陷阱
1.循环陷阱
这个我们之前提过一次,就是当你去掉一次outliers后再查看outliers,发现去掉异常值的数据集又会出现新的异常值,这会让人很困惑。
但其实,每次实验你只需要进行一次异常值处理,不然就会陷入循环陷阱,你会一直发现新的异常值,然后一直去掉异常值,最终数据集会变得越来越小,因为你把值都删掉了。
2.重复陷阱
当你对不同的列进行异常值检测的时候,可能会出现一下这种情况:
data_set=read.csv(file.choose(),header=TRUE)
library("dplyr")
head(data_set,10)
outliers = boxplot(data_set$Dry.weight~data_set$Temperature,data=data_set,
ylab="Dry.weight",xlab="Temperature",col="steelblue",border ="black")
print(outliers$out)
outliers2 = boxplot(data_set$Optical.density~data_set$Temperature,data=data_set,
ylab="Optical.density",xlab="Temperature",col="steelblue",border ="black")
print(outliers2$out)
outliers3 = boxplot(data_set$Product.yield~data_set$Temperature,data=data_set,
ylab="Product.yield",xlab="Temperature",col="steelblue",border ="black")
print(outliers3$out)
所以你以为总共的outliers的个数是2个,于是十分的兴奋的去搜索这两个异常值,准备把他们干掉。但是你找来找去就只能找到1个。当你打开数据集查看时才发现,原来这两个异常值是一个行的不同列。
所以R语言的outliers检测是对列名敏感的,并不会自动检测这个值是不是重复的。这就是重复陷阱。
3.复合陷阱
当你分析不同要素的交互时,当然你也是要做ANOVA或者MANOVA的,那么当你检测outliers时,你可能会遇到这种情况:
outliers = boxplot(data_set$weight_loss~data_set$gender*data_set$diet,data=data_set,
ylab="weight_loss",xlab="group:gender",col="steelblue",border ="black")
你检测联合因素性别和饮食,你会发现:
仿佛,有四个outliers等着你去删除,但是当你取删除时:
print(outliers2)
out1 = data_set[(data_set$gender==0&data_set$Diet == 1) & data_set$weight_loss==-8.5,]
print(out1)
out2 = data_set[(data_set$gender==1&data_set$Diet == 1) & data_set$weight_loss==-9.0,]
print(out2)
ex3 = data_set[(data_set$gender==1&data_set$Diet == 2),]
out3 = data_set[(data_set$gender==1&data_set$Diet == 2)& data_set$weight6weeks==1.4 ,]
print(out3)
ex4 = data_set[(data_set$gender==0&data_set$Diet == 3),]
out4 = data_set[(data_set$gender==0&data_set$Diet == 3) & data_set$weight6weeks==-0.9,]
outAll<- rbind(out1,out2, out3, out4)
print(outAll)
data_set<-data_set[-which(data_set$Person %in% outAll$Person),]
你却发现,你只删掉两个,这就很奇怪,明明有四个。
但是当你将两个因素分开分析时:
嘿,还真只有两个,那为什么联合的时候会有四个呢?
其实这也是R语言对列名敏感的表现,当你联合时,你的列名就发生了变化,是不同列的排列组合,所以R会站在这个角度去看,他就看到了4个,但是当你拆开,回归本质,就是2个。所以当多因素出现,请拆开单个要素,逐步分析outliers,不要联合分析。