目录
- 适用实例
- 计算原理
- 计算实例
3.1 解答过程
3.2 R语言代码 - 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检验
网友评论