我正在重复在一篇论文中所做的一些分析,看看我的结果与他们的结果是否一致。我有以下应急表(见下文)。我想在这里做一个费舍尔精确的测试(因为我不能做卡方,不是所有的细胞计数都是>= 5)。但是,每次我尝试执行"fisher.test(ContTable)“时,它都会返回以下错误消息(请参见下面的应急表)。
我试过按指示添加'simulate.p.value=TRUE‘,但是我没有得到与我正在工作的论文相同的p值。请有人解释一下为什么没有‘simate.p.value=TRUE’就不能工作,或者请解释如何不用这一行来解决这个问题,因为我不想得到模拟的p-值,我试图得到与论文中提供的数据相同的结果。
> 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)“的输出
> 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")
编辑:我不确定我所工作的那篇论文是否是费舍尔的,就像他们说的那样,他们做了一个“智方”,但是当我做一个“智方”时,我得到了以下信息:
> chisq <- chisq.test(ContTable)
Warning message:
In chisq.test(ContTable) : Chi-squared approximation may be incorrect
这是正确的,因为不管怎么说,当我继续做的时候,下面的输出不会产生与论文相同的结果:
> chisq
Pearson's Chi-squared test
data: ContTable
X-squared = 69.147, df = 46, p-value = 0.01523
发布于 2022-01-15 20:20:56
像你这样的表格的费舍尔精确测试需要大量的时间或内存。它必须列举每一个可能的结果,这些结果至少和你从某种程度上脱离独立所得到的结果一样极端。显然,R所使用的算法为此需要大量内存。
计算结果的另一种方法是在给定的范围内对所有结果进行抽样,并找出至少同样极端的结果所占比例。这就是“模拟”方法。它不会给出完全相同的p值,因为这是一个随机近似。如果将参数B
设置为非常大的数目,则会得到相当一致的结果,并且它们将接近确切的结果。
如果这不能给你一个接近你试图复制的答案,那么我怀疑你在做一个不同于那篇论文的测试。我相信“至少是极端”有多种可能的定义。这篇论文也有可能做错了测试。您可能应该在stats.stackexchange.com网站上发布详细信息并询问差异,而不是堆栈溢出,因为这是一个统计问题,而不是编程问题。
发布于 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值越接近真实值。
因此,在回答您的问题时,您应该使用更多的工作区,以便您的机器能够执行所有所需的计算(正如上面引用的文档中提到的,这可能需要几个小时),或者考虑蒙特卡罗方法。
https://stackoverflow.com/questions/70724987
复制相似问题