全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
18208 6
2013-09-22
在看的一篇文章中有下面的原始数据,列1:581962,437149,1325516,2813226,2847335,2451519,列2:2,0,3,1,4,1,文中给出的LL值是7.216,p值是0.129。
我试着在R2.15.2中算了一下,结果出现了问题:
d<-matrix(c(581962,437149,1325516,2813226,2847335,2451519,2,0,3,1,4,1),nr=6)
> d
     [,1] [,2]
[1,] 581962 2
[2,] 437149 0
[3,] 1325516 3
[4,] 2813226 1
[5,] 2847335 4
[6,] 2451519 1
> toi<-chisq.test(d)
警告信息:
In chisq.test(d) : Chi-squared近似算法有可能不准
> g<-2*sum(toi$observed*log(toi$observed/toi$expected))
> g
[1] NaN

请问各位大大:上面的这个LL值为什么会显示为NaN呢?为什么就算不出人家给的7.216呢?
大于2×2的列联表中如何计算出其log likelihood值呢?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-9-23 19:04:03
附件是原书中的另外一段原始数据,我能用1楼的方法计算出第一栏中的LL值,但是算不出第二栏和第三栏的结果来。还望各位高人指点一下啊!自学个R太不容易啦!
附件列表
001.jpg

原图尺寸 76.38 KB

001.jpg

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-9-24 21:57:31
前面提到算不出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值的。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-9-25 20:14:40
非常感谢您的回复和解释。原书是英国出的,好像作者计算时用的是SPSS。我对SPSS也只是了解点皮毛,最近多半年来一直在自学R,看过的五本书里都没有提及列联表计算LL值的具体操作,上面这个计算方法是以前从老外的R讲座网站上学过来的。
另外还想请教您一下:象2楼附件中第三栏数据出现两个0值的情况也可以象您说的那样处理吗?需将两个0值都替换为0.1吗?这个替换值0.1是通行的做法吗? 期望您能解释一下!本人R新手一个,问题太多,望见谅!在此提前谢过了!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-9-26 11:15:40
在使用频数表计算统计指标时,如果因为有0值计算不出结果时,采用一个较小值来代替0值是一种被认可的通行做法,但较小值用什么值则没有标准,用0.1应该是可以接受的。如果频数表中有多个0,建议采用相同的较小值替换。

比较一下采用0.1替换0的情况下,用R计算的LL值与SPSS计算结果的差异
以二楼的数据表为例
1、对****表的LL计算,R和SPSS均为668.4795,说明没有0值的时候两个软件计算结果相同。(二楼数据表中报道为622.580显然有误)
2、对于****ed表的LL计算,R为31.39712,与SPSS为32.1255,计算结果接近。
3、对于****s表的LL计算,R为9.7795,与SPSS为10.8062,计算结果接近。

从上面结果看,采用0.1替换0值,计算结果与SPSS接近,是可以接受的。
但另一方面说明SPSS处理0值的方法显然不是用0.1替换,至于采取什么方法,SPSS的技术资料中没有介绍。我估计是使用Fienberg书中的处理方法(Fienberg, S. E. 1980. The Analysis of Cross-Classified Categorical Data. 2nd ed. Cambridge, MA: MIT Press.),遗憾的是我没有此书。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-9-26 13:03:52
非常非常感谢您的回复!按照您所说的方法,我已经把二楼表格中的数据又操作了一遍,跟您说的都一样。
另外,您说的那本Stephen E. Fienberg(2nd ed., 1980,MIT)的书籍在网上有其pdf电子版的,是由Springer2007年对其的重印版。您可以到新浪爱问上下载,如果下载不了的话,发消息告诉我一声,我把电子版的给您发过去。希望这消息对您有用!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群