前面提到算不出LL的几个例子原因都相同,是因为观察频数中有0值
因为计算公式中有log(toi$observed/toi$expected),如果toi$observed中有0值就计算不出结果,0取对数是没有值的。
在这种情况计算LL的关键是如何处理0值,一种处理方法是用一个较小的值来代替0值。
比如 上面提到的数据
> d
[,1] [,2]
[1,] 581962 2
[2,] 437149 0
[3,] 1325516 3
[4,] 2813226 1
[5,] 2847335 4
[6,] 2451519 1
将0值替换为一个较小的数,比如0.1
> d[2,2]=0.1
> toi<-chisq.test(d)
警告信息:
In chisq.test(d) : Chi-squared近似算法有可能不准
> g<-2*sum(toi$observed*log(toi$observed/toi$expected))
> g
[1] 7.075657
计算出的LL值与前面提到的7.216不相同,但比较接近。这种差异主要是0值处理方式的不同造成的。
也可以在运行卡方检验后,再处理观察频数中的0值,即将toi$observed中的0值替换为一个较小的数。
> d<-matrix(c(581962,437149,1325516,2813226,2847335,2451519,2,0,3,1,4,1),nr=6)
> toi<-chisq.test(d)
警告信息:
In chisq.test(d) : Chi-squared近似算法有可能不准
> toi$observed # 查看一下卡方检验后的观察频数,与原观察频数是一样的
[,1] [,2]
[1,] 581962 2
[2,] 437149 0
[3,] 1325516 3
[4,] 2813226 1
[5,] 2847335 4
[6,] 2451519 1
> toi$observed[2,2]=0.1 # 将观察频数中的0值用0.1替换,然后计算LL
> g<-2*sum(toi$observed*log(toi$observed/toi$expected))
> g
[1] 7.276563
计算出的LL与7.216相当接近了。要得到与书中完全一致的结果,需要查看原书中是如何处理0值的。