首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中的Fisher精确检验,不使用“simulate.p.value=TRUE”

R中的Fisher精确检验,不使用“simulate.p.value=TRUE”
EN

Stack Overflow用户
提问于 2022-01-15 20:02:18
回答 2查看 700关注 0票数 1

我正在重复在一篇论文中所做的一些分析,看看我的结果与他们的结果是否一致。我有以下应急表(见下文)。我想在这里做一个费舍尔精确的测试(因为我不能做卡方,不是所有的细胞计数都是>= 5)。但是,每次我尝试执行"fisher.test(ContTable)“时,它都会返回以下错误消息(请参见下面的应急表)。

我试过按指示添加'simulate.p.value=TRUE‘,但是我没有得到与我正在工作的论文相同的p值。请有人解释一下为什么没有‘simate.p.value=TRUE’就不能工作,或者请解释如何不用这一行来解决这个问题,因为我不想得到模拟的p-值,我试图得到与论文中提供的数据相同的结果。

代码语言:javascript
运行
复制
> ContTable
                data.age
data.DEATH_EVENT 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 60.667 61
               0  7  1  6  1  2 13  2  1  0  3 19  3  5  9  1 14  1  1  8  1 20      1  4
               1  0  0  1  0  0  6  1  0  2  1  8  1  0  1  1  3  0  1  2  3 13      1  0
                data.age
data.DEATH_EVENT 62 63 64 65 66 67 68 69 70 72 73 75 77 78 79 80 81 82 85 86 87 90 94 95
               0  4  8  3 18  2  2  3  1 18  2  3  5  1  2  1  2  1  0  3  0  0  1  0  0
               1  1  0  0  8  0  0  2  2  7  5  1  6  1  0  0  5  0  3  3  1  1  2  1  2

> fisher.test(ContTable)
Error in fisher.test(ContTable) : 
  FEXACT error 7(location). LDSTP=18210 is too small for this problem,
  (pastp=20.1432, ipn_0:=ipoin[itp=498]=11425, stp[ipn_0]=3.68888).
Increase workspace or consider using 'simulate.p.value=TRUE'

编辑:根据要求,"dput(ContTable)“的输出

代码语言:javascript
运行
复制
> dput(ContTable)
structure(c(7L, 0L, 1L, 0L, 6L, 1L, 1L, 0L, 2L, 0L, 13L, 6L, 
2L, 1L, 1L, 0L, 0L, 2L, 3L, 1L, 19L, 8L, 3L, 1L, 5L, 0L, 9L, 
1L, 1L, 1L, 14L, 3L, 1L, 0L, 1L, 1L, 8L, 2L, 1L, 3L, 20L, 13L, 
1L, 1L, 4L, 0L, 4L, 1L, 8L, 0L, 3L, 0L, 18L, 8L, 2L, 0L, 2L, 
0L, 3L, 2L, 1L, 2L, 18L, 7L, 2L, 5L, 3L, 1L, 5L, 6L, 1L, 1L, 
2L, 0L, 1L, 0L, 2L, 5L, 1L, 0L, 0L, 3L, 3L, 3L, 0L, 1L, 0L, 1L, 
1L, 2L, 0L, 1L, 0L, 2L), .Dim = c(2L, 47L), .Dimnames = list(
    data.DEATH_EVENT = c("0", "1"), data.age = c("40", "41", 
    "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", 
    "52", "53", "54", "55", "56", "57", "58", "59", "60", "60.667", 
    "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", 
    "72", "73", "75", "77", "78", "79", "80", "81", "82", "85", 
    "86", "87", "90", "94", "95")), class = "table")

编辑:我不确定我所工作的那篇论文是否是费舍尔的,就像他们说的那样,他们做了一个“智方”,但是当我做一个“智方”时,我得到了以下信息:

代码语言:javascript
运行
复制
> chisq <- chisq.test(ContTable)
Warning message:
In chisq.test(ContTable) : Chi-squared approximation may be incorrect

这是正确的,因为不管怎么说,当我继续做的时候,下面的输出不会产生与论文相同的结果:

代码语言:javascript
运行
复制
> chisq

    Pearson's Chi-squared test

data:  ContTable
X-squared = 69.147, df = 46, p-value = 0.01523
EN

回答 2

Stack Overflow用户

发布于 2022-01-15 20:20:56

像你这样的表格的费舍尔精确测试需要大量的时间或内存。它必须列举每一个可能的结果,这些结果至少和你从某种程度上脱离独立所得到的结果一样极端。显然,R所使用的算法为此需要大量内存。

计算结果的另一种方法是在给定的范围内对所有结果进行抽样,并找出至少同样极端的结果所占比例。这就是“模拟”方法。它不会给出完全相同的p值,因为这是一个随机近似。如果将参数B设置为非常大的数目,则会得到相当一致的结果,并且它们将接近确切的结果。

如果这不能给你一个接近你试图复制的答案,那么我怀疑你在做一个不同于那篇论文的测试。我相信“至少是极端”有多种可能的定义。这篇论文也有可能做错了测试。您可能应该在stats.stackexchange.com网站上发布详细信息并询问差异,而不是堆栈溢出,因为这是一个统计问题,而不是编程问题。

票数 3
EN

Stack Overflow用户

发布于 2022-01-15 20:16:55

打电话给help(fisher.test)

workspace是一个整数,指定网络算法中使用的工作区的大小。以4个字节为单位。仅用于非模拟p值大于2×2表.由于R版本3.5.0,这也增加了内部堆栈大小,允许更大的问题得到解决,但有时需要几个小时。在这种情况下,simulate.p.values=TRUE可能更合理。

从您得到的错误来看,我确实认为工作区的维度存在问题(请参阅Increase workspace or consider using 'simulate.p.value=TRUE')。据我所知,Fisher的精确方法包括排列治疗分配向量,以便考虑所有可能的治疗分配。我的背景主要是因果推理,所以我不知道这如何适用于你的情况,如果不存在治疗。无论如何,这里最重要的是,这种方法考虑所有可能的数据分配(广义上),如果有大量的观察,这在计算上可能是不可行的。因此,有时我们很高兴只考虑所有可能排列的子集,例如,10000,这就是我们通过设置simulate.p.value = TRUE所要求的。我们考虑的复制越多(参数B),得到的p值越接近真实值。

因此,在回答您的问题时,您应该使用更多的工作区,以便您的机器能够执行所有所需的计算(正如上面引用的文档中提到的,这可能需要几个小时),或者考虑蒙特卡罗方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70724987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档