Fisher精确检验未给出R中的预期结果

时间:2015-06-02 23:24:13

标签: r

我想测试A的计数是否大于B的计数。我正在尝试使用Fisher精确测试,但它根据我如何安排数据给出了不同的结果。我不知道问题是来自这个特定的数据集(太多的零),还是来自它们的排列方式。

首先,我尝试按照互联网的说明构建一个列联表(m)。

       factor
 counts     A       B
      0   205       226
      1    33        29
      2    15        18
      3    13         8
      4     4         2
      5     5         1
      6     3         0
      7     2         0
      9     1         0
      12    2         0
      23    1         0

fisher.test(m, workspace = 200000, hybrid = FALSE,
control = list(), or = 1, 
alternative = "two.sided",
conf.int = TRUE, 
conf.level = 0.95,
simulate.p.value = T, B = 2000)    
#results: data:  m  pvalue = 0.1184    alternative hypothesis: two.sided

这给了我微不足道的差异,这在查看数据和表格时完全出乎意料。数据集过于庞大和复杂,无法在此处发布或模拟,但我可以将其发送给任何感兴趣的人。

但是,如果我创建一个列联表的矩阵......

classes=c(0,1,2,3,4,5,6,7,9,12,23)
A=c(205,33,15,13,4,5,3,2,1,2,1)
B=c(226,29,18,8,2,1,0,0,0,0,0)
m=as.matrix(data.frame(classes,A,B))
fisher.test(m, workspace = 200000, hybrid = FALSE,
control = list(), or = 1, 
alternative = "two.sided",
conf.int = TRUE, 
conf.level = 0.95,
simulate.p.value = T, B = 2000)
#results: data:  m p-value = 0.0004998 alternative hypothesis: two.sided 

哪个是正确的程序?如果它是第一个,怎么可能这么大的差异并不显着?

由于

1 个答案:

答案 0 :(得分:1)

第一项可能是R列联表(实际上是伪装的矩阵),因此第一个“列”实际上是一堆rownames。当我使用这些rownames创建一个data.frame并强制转换为矩阵并传递给fisher.test时,我得到了相同的结果,就像我制作一个矩阵一样......没有额外的列:

m=matrix( cbind(A,B),,2)
rownames(m)=classes

> m
   [,1] [,2]
0   205  226
1    33   29
2    15   18
3    13    8
4     4    2
5     5    1
6     3    0
7     2    0
9     1    0
12    2    0
23    1    0

> as.matrix(d)
     A   B
0  205 226
1   33  29
2   15  18
3   13   8
4    4   2
5    5   1
6    3   0
7    2   0
9    1   0
12   2   0
23   1   0
> fisher.test( as.matrix(d) )

    Fisher's Exact Test for Count Data

data:  as.matrix(d)
p-value = 0.1197
alternative hypothesis: two.sided

> fisher.test(m)

    Fisher's Exact Test for Count Data

data:  m
p-value = 0.1197
alternative hypothesis: two.sided

请澄清您的统计数据(错误?) - 与您的教授或CV.com的人员就此事项达成一致。你的p值和我展示的两个值之间的微小数值差异是因为你坚持在第一个实例中进行“真正的”精确测试。检测到我们都怀疑应该是统计上显着差异的部分权力丧失是那些数量较少的分布的长尾。 fisher.test会对它进行不正确的处理。此外,额外的自由度会削弱统计效力。通过将其作为两个指数变量进行测试,您将获得更多的力量......但这也是统计讨论的问题。