首页 > 生物信息学 > R与Python中的Fisher exact test实现与异同
2017
03-15

R与Python中的Fisher exact test实现与异同

R与Python中的Fisher exact test实现与异同

余欢

     背景

     我们在做病例对照研究中,经常会用到Fisher检验,目前文章中常用的都是R中的Fisher检验。一次偶然的经历,使用了python做Fisher检验,发现两种方法得到的结果并不一致,于是好奇研究一下到底是什么原因。
     经过查询发现,这是由于两种语言中使用的Fisher检验的公式有所不同。R中的Fisher检验是条件最大似然,python中的Fisher是无条件最大似然。
    Python描述自己的fisher检验方法时,描述这两种方法不同的原话是:The calculated odds ratio is different from the one R uses. This scipy implementation returns the (more common) “unconditional Maximum Likelihood Estimate”, while R uses the “conditional Maximum Likelihood Estimate”.
    既然有所不同,那我们做病例对照研究时,那种检验方法更适合我们呢?根据《四格表OR值点估计的条件与非条件最大似然估计比较》这篇文章提到的,对于条件最大似然,样本量N对其影响较大,N越大越接近真实情况,而非条件的最大似然则不随N波动(很遗憾,目前还没有搞清楚两者原理上的的具体区别)。在病例对照研究中,采用无条件最大似然的Fisher检验计算OR值,无论从符合实际情况,还是计算量上,都更加有利。这样的话应该是python中的Fisher检验的方法更好一些。不过考虑到目前已发表的文章的方法,使用R做Fisher检验的占绝大多数,并且根据我们下面的测试,发现P值差别其实并不大,所以其实无论用哪种,都是可以的。
   测试&实现:

   用几个小数据试了一下,OR还是有一定差别,但是似乎没有影响到特别明显的地步,比如下面的结果:
python:
oddsratio, pvalue = stats.fisher_exact([[8, 2], [1, 5]])
>>> pvalue
0.034965034965034919
>>> oddsratio
20.0
R(命令默认是双边检验):
x5 <- matrix(c(8,1,2,5),2,2)
> a5 <- fisher.test(x5)
> a5
Fisher’s Exact Test for Count Data
data: x5
p-value = 0.03497
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
1.008849 1049.791446
sample estimates:
odds ratio
15.46969
另外,一个有意思的现象:R的p值在屏幕上,最小只能显示到2.2e-16,只有使用变量再调出来P值是原始的P值,比如:
python:
oddsratio, pvalue = stats.fisher_exact([[76, 0], [216, 3610]])
>>> pvalue
1.2310135300448082e-90
>>> oddsratio
inf
R:
x5 <- matrix(c(76,216,0,3610),2,2)
> a5 <- fisher.test(x5)
> a5
Fisher’s Exact Test for Count Data
data: x5
p-value < 2.2e-16(与实际的P值并不一致,只到2.2e-16,为什么不直接展示实际的P值,或者说为什么是小于2.2e-16,而不是其他值?而且测试了多个实际P值小于2.2e-16的,这里显示的值都是小于2.2e-16。)
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
332.3857 Inf
sample estimates:
odds ratio
Inf
> a5$
a5$p.value a5$conf.int a5$estimate a5$null.value a5$alternative a5$method a5$data.name
> a5$p.value
[1] 1.231014e-90 (实际的P值)
推测此现象的原因:
对于浮点数来说:2.2e-16 is the smallest number larger than 0 that can be stored by the floating system in our computer.所以直接输出的P值是浮点型的,最小只能到2.2e-16,就这样写了。
用以下命令可以看到浮点型最小值:
> .Machine$double.eps
[1] 2.220446e-16
备注:
greater (or less) refers to a one-sided test comparing a null hypothesis that p1=p2 to the alternative p1>p2 (or p1<p2). In contrast, a two-sided test compares the null hypotheses to the alternative that p1 is not equal to p2.

R与Python中的Fisher exact test实现与异同》有 1 条评论

  1. zhengqi 说:

    棒棒

留下一个回复

你的email不会被公开。

This blog is kept spam free by WP-SpamFree.