miclita
楼主的问题其实我也想过,但没验证过,今天就来自己动手试试,我不是专业学数学的,要从数学上证明不太会,所以就用模拟的方法来试试。
首先,摘自wiki,卡方检验的前提条件包括:
1. Quantitative data.
2. One or more categories.
3. Independent observations.
4. Adequate sample size (at least 10).
5. Simple random sample.
6. Data in frequency form.
7. All observations must be used.
从最简单的来看,假设这是一个A乘B数据,并且要兼顾采样是越大越准确(Adequate sample size)。为了都得到正数,我直接用泊松产生随机数,lambda取了20(也可以用二项分布等等anything you like)。
`{r}
A=4 #row number
B=3 #column number
lambda=20 #(由于一般卡方检验要求大于10,这个数最好设置的比10大)
test_N=100000 #模拟次数,嫌时间长可以改小点,但结果会不一致,请看最后
set.seed(5000)
#chi_stat<-replicate(test_N,{
# tb<-matrix(rbinom(A*B,100,0.5),ncol=B)
# chisq.test(tb)$statistic
# }) #使用二项分布
chi_stat<-replicate(test_N,{
tb<-matrix(rpois(A*B,20),ncol=B)
chisq.test(tb)$statistic
}) #使用泊松分布
rcsq<-rchisq(test_N,df=(A-1)*(B-1))#产生自由度为(A-1)*(B-1)的卡方分布
`
数据准备好了,可以开始做检验了:
`{r,echo=FALSE}
d<-as.data.frame(chi_stat)
d$rcsq<-rcsq
library(ggplot2)
library(reshape2)
d1<-melt(data=d,variable.name="Var",value.name="numvar")
qplot(x=numvar,data=d1,geom="bar",facets=Var~.,binwidth=1)
ks.test(chi_stat,pchisq,df=(A-1)*(B-1))
ks.test(chi_stat,rcsq)
`
ks检验结果:
##
## One-sample Kolmogorov-Smirnov test
##
## data: chi_stat
## D = 0.0053, p-value = 0.007093
## alternative hypothesis: two-sided
##
## Two-sample Kolmogorov-Smirnov test
##
## data: chi_stat and rcsq
## D = 0.0096, p-value = 0.0002189
## alternative hypothesis: two-sided
结果竟然悲催的发现,不管怎么整,两者都不是一个分布,但却非常非常接近。
问题来了,ks.test是不是有什么前提假设我没注意到呀?
非常令人费解的是,当test_N=10000时,可以得到非显著性结果(p>0.05),而当test_N越大时,p值越小。
不管怎么说,直观从分布图上看(上面的代码已经绘制了直方图,论坛里我也不会贴图,可以自己在R上面跑一下),两者可以说非常一致。算是通过模拟验证了楼主的疑问。