美文网首页
Fisher's exact test

Fisher's exact test

作者: Li_bioinfo | 来源:发表于2022-05-19 20:12 被阅读0次

目录

  1. 适用实例
  2. 计算原理
  3. 计算实例
    3.1 解答过程
    3.2 R语言代码
  4. Fisher精确检验和卡方检验的选择

1. 适用实例

Fisher's exact test和卡方检验的目的一样,都属于独立性检验。目的是为了检验两个事件是否相互独立,如果不相互独立,则证明两者之间有相关性。例如:

性别和是否节食是否相关

两个候选人的得票是否和投票人性别相关

收入高低是否和出行方式(火车/飞机)相关

……

2. 计算原理

image.png

实质就是各项阶乘的商。

这里求出的p值是假设两者无相关性的前提下,利用超几何检验的思想计算出的当节食男为a的情况下的P值,而Fisher's exact test的P值则是把更加罕见的情况(P值更小的情况)全部计算出来并相加即可。

3. 计算实例

我们要观察性别和是否节食是否相关,统计结果如下:


image.png
3.1 解答过程

建立H0假设:性别和是否节食无关。

计算所有情况下的P值:

这里以节食男为12个的情况进行举例计算:


image.png

接下来计算出所有比该情况更加罕见的情况下的P值:

case a b c d P value
1 0 15 15 2 0.0000002
2 1 14 14 3 0.0000180
3 2 13 13 4 0.0004417
4 3 12 12 5 0.0049769
5 4 11 11 6 0.0298613
6 5 10 10 7 0.1032349
7 6 9 9 8 0.2150728
8 7 8 8 9 0.2765221
9 8 7 7 10 0.2212177
10 9 6 6 11 0.1094916
11 10 5 5 12 0.0328475
12 11 4 4 13 0.0057426
13 12 3 3 14 0.0005469
14 13 2 2 15 0.0000252
15 14 1 1 16 0.0000005
16 15 0 0 17 0.0000000
我们需要将case13,也就是前面题目中出现的这种情况,以及比case13更加极端的情况下的P值进行相加:

单侧检验:P=0.0005726
case13+case14+case15+case16=0.0005469+0.0000252+0.0000005+0.0000000=0.0005726
双侧检验:P=0.0010325

case13+case14+case15+case16+case1+case2+case3=0.0005469+0.0000252+0.0000005+0.0000000+0.0000002+0.0000180+0.0004417=0.0010325

3.2 R语言代码

为了验证,我们先用R语言按照公式计算每个结果

1# 编写公式用来计算每种情况下的概率p

 2fish <- function(a){
 3  b=15-a
 4  c=15-a
 5  d=32-a-c-b
 6  factorial(15)*factorial(15)*factorial(17)*factorial(17)/factorial(32)/factorial(a)/factorial(b)/factorial(c)/factorial(d)
 7}
 8# 计算出所有情况下的p值
 9result <- data.frame(case=seq(1,16),
10                     a=seq(1,16)-1,
11                     p=sapply(seq(1,16)-1, fish))
12result
13#      case  a            p
14# 1     1  0 2.404005e-07
15# 2     2  1 1.803003e-05
16# 3     3  2 4.417358e-04
17# 4     4  3 4.976890e-03
18# 5     5  4 2.986134e-02
19# 6     6  5 1.032349e-01
20# 7     7  6 2.150728e-01
21# 8     8  7 2.765221e-01
22# 9     9  8 2.212177e-01
23# 10   10  9 1.094916e-01
24# 11   11 10 3.284748e-02
25# 12   12 11 5.742566e-03
26# 13   13 12 5.469110e-04
27# 14   14 13 2.524205e-05
28# 15   15 14 4.507509e-07
29# 16   16 15 1.767650e-09
30
31# 计算单侧检验的结果
32sum(result[result$a>=12,3])
33# 0.0005726056 结果一致
34
35# 计算双侧检验的结果
36sum(result[result$p<=fish(12),3])
37# 0.001032612 结果一致
接下来直接使用R语言自带函数进行验证:

 1mytable <- data.frame(men = c(12,3),
 2                      women = c(3,14))
 3mytable
 4#   men women
 5# 1  12     3
 6# 2   3    14
 7fisher.test(mytable)# 双侧检验
 8# p-value = 0.001033
 9fisher.test(mytable, alternative = "greater")# 单侧检验
10# p-value = 0.0005726

alternative选项仅仅适用于2x2列联表的情况下使用,"greater" or "less" 针对的是a.

4. Fisher精确检验和卡方检验的选择

Fisher精确检验和卡方检验解决的问题非常相似,以至于我们在选择上

需要注意。

但是目前更认为Fisher精确检验适用于总样本量n<40或者理论频数Ei<1的情况。

卡方检验和Fisher精确检验的区别在于:

所有的理论频数Ei >= 5并且总样本量n >= 40,用卡方检验

如果有理论数Ei < 5或总样本量n >= 40,则用连续性校正的卡方进行检验

如果有理论数Ei < 1或总样本量n < 40,则用Fisher’s检验

相关文章

网友评论

      本文标题:Fisher's exact test

      本文链接:https://www.haomeiwen.com/subject/ynwtprtx.html