美文网首页
Fisher's exact test

Fisher's exact test

作者: Z_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