星期日, 十二月 04, 2011

参数检验、非参数检验与置换检验的比较

当我们研究的样本处于良好情况下(近似正态、无离群点、数据量大等),传统的参数检验是很有效的。但是当这些前提条件不再满足时,参数检验就不再有效。此时人们往往求助于非参数检验,非参数检验不再关注数据的值,而只关注数据的秩,这样就抛弃了大量可用的信息。而置换检验采取重复随机抽样的方法,通过对样本再抽样构造经验分布,然后在此基础上生成P值进行推断,达到很好的效果。但要注意的是,如果样本不能很好的代表总体,任何检验方法都是无效的。


以往进行置换检验可能需要编程,但在R语言中利用coin包和lmPerm可方便的进行这项工作。我们来构造两组数据来说明T检验、wilcox检验和置换检验的区别。
score=c(40,57,45,55,58,57,64,55,62,65)
treatment=factor(c(rep("A",5),rep("B",5)))
mydata=data.frame(treatment,score)
library(lattice)
stripplot(treatment~score,data=mydata)

从上面的图形可以看到两组数据有差别,但这种差别是否显著呢,用三种方法分别来看一下P值,注意本例的置换检验函数是coin包中的oneway_test
library(coin)
t.test(score~treatment,data=mydata,var.equal=T)
wilcox.test(score~treatment,data=mydata)
oneway_test(score~treatment,data=mydata,distribution='exact')
可见T检验的P值为0.047,wilcox检验P值为0.09,而置换检验P值为0.07,由于样本数量只有十个,所以更倾向于相信置换检验。

我们也可以对多组数据进行比较,还是利用multcomp包中的cholesterol数据集,首先绘图进行观察,然后分别用传统的方差分析函数aov,非参数的kruskal检验和lmPerm包中的置换检验函数aovp获得P值。
library(multcomp)
stripplot(trt~response,data=cholesterol)
summary(aov(response~trt,data=cholesterol))
kruskal.test(trt~response,data=cholesterol)
library(lmPerm)
summary(aovp(response~trt,data=cholesterol))

在这个例子中,因为样本数据表现良好,所以参数检验和置换检验所得结论相近,P值都非常小而拒绝原假设。但非参数检验的信息利用不足,导致检验效能降低,无法检验出这种差别的存在。


1 条评论: