假设检验的鲁棒性

来源:互联网 发布:手机钉钉 请检查网络 编辑:程序博客网 时间:2024/06/01 17:04

Richard Wu
2016年3月3日

考虑一个问题,当一个随机变量不一定服从正态分布时,是不是还可以使用参数检验?

T检验

思路是,分两种情况原假设是正确的情况下p-value是否是我们想象的那样和显著性水平相符合。在原假设错误的情况下在相同的样本容量,相同的均值差的情况下两者的功效相差多少?

第一种情况:原假设是正确的

若随机变量X服从正态分布,抽取一个样本取其t检验的p值,看看p值小于显著性水平比如5%的样本个数是不是真的符合。

N <- 10000 #蒙特卡洛逼近的迭代次数n <- 10 #样本容量p <- vector()for( i in 1:N ){  x <- rnorm(n) #均值为0的正态分布  p <- append(p,t.test(x)$p.value)}sum(p <= .05) / N
## [1] 0.046
qqplot(p,seq(0,1,length.out = length(p)))abline(a=0,b=1,col='red')

这里写图片描述
从上面的结果看,如果样本是正态分布,那边当反复测试时p-value小于α的样本个数占比确实是5%

N <- 10000 #蒙特卡洛逼近的迭代次数n <- 10 #样本容量p <- vector()for( i in 1:N ){  x <- runif(n,-1,1)   p <- append(p,t.test(x)$p.value)}sum(p <= .05) / N
## [1] 0.0551
qqplot(p,seq(0,1,length.out = length(p)))abline(a=0,b=1,col='red')

这里写图片描述

library(e1071)kurtosis(rnorm(100))
## [1] 1.076053
kurtosis(runif(100))
## [1] -1.266117
kurtosis(rcauchy(100))
## [1] 54.45368

数据更集中的均匀分布上,t检验略有错误

N <- 10000 #蒙特卡洛逼近的迭代次数n <- 100 #样本容量p <- vector()for( i in 1:N ){  x <- runif(n,-1,1)   p <- append(p,t.test(x)$p.value)}sum(p <= .05) / N
## [1] 0.0491
qqplot(p,seq(0,1,length.out = length(p)))abline(a=0,b=1,col='red')

这里写图片描述
增加样本容量以后基本和正态分布保持一致了

N <- 10000 #蒙特卡洛逼近的迭代次数n <- 10 #样本容量p <- vector()for( i in 1:N ){  x <- rcauchy(n)   p <- append(p,t.test(x)$p.value)}sum(p <= .05) / N
## [1] 0.0192
qqplot(p,seq(0,1,length.out = length(p)))abline(a=0,b=1,col='red')

这里写图片描述
离散程度更高的分布偏差就会很大,上图代表p-value比较小的时候,其在样本中的实际占比要小于p-value的值。所以当总体是柯西分布这类的离散度比较高的分布t检验效果就会差很多。

curve(dcauchy(x),-6,6,ylim = c(0,.4))curve(dnorm(x),add=T,col='red')legend(x=4,y=.4,legend = c('Cauthy','Normal'),col=1:2,lty = 1,cex = .6)

这里写图片描述

N <- 10000 #蒙特卡洛逼近的迭代次数n <- 10 #样本容量p <- vector()for( i in 1:N ){  x <- rcauchy(n)   p <- append(p,wilcox.test(x)$p.value)}sum(p <= .05) / N
## [1] 0.0494
qqplot(p,seq(0,1,length.out = length(p)),main="Wilcox秩和检验")abline(a=0,b=1,col='red')

这里写图片描述

原假设错误

N <- 10000 #蒙特卡洛逼近的迭代次数n <- 10 #样本容量p <- vector()for( i in 1:N ){  x <- rnorm(n,1)  p <- append(p,t.test(x)$p.value)}sum(p <= .05) / N
## [1] 0.7997
qqplot(p,seq(0,1,length.out = length(p)))abline(a=0,b=1,col='red')abline(h = .95 , lty=2)

这里写图片描述

0 0