r-在连接所有列联表的大型数据集中应用fisher测试



我有一个这样的数据集:

contingency_table<-tibble::tibble(
x1_not_happy = c(1,4),
x1_happy = c(19,31),
x2_not_happy = c(1,4),
x2_happy= c(19,28),
x3_not_happy=c(14,21),
X3_happy=c(0,9),
x4_not_happy=c(3,13),
X4_happy=c(17,22)
)

事实上,还有许多其他变量来自于两年不同时期的一项民意调查。

然后,我在每个2X2列联矩阵中应用Fisher检验,使用以下代码:

matrix1_prueba <- contingency_table[1:2,1:2]
matrix2_prueba<- contingency_table[1:2,3:4]
fisher1<-fisher.test(matrix1_prueba,alternative="two.sided",conf.level=0.9)
fisher2<-fisher.test(matrix2_prueba,alternative="two.sided",conf.level=0.9)

我想通过函数或循环使用短代码来运行此任务。输出必须是一个向量,其中包含每个问题的p_values。

谢谢,

弗雷德里克

所以这有点有趣。你需要认识到的主要事情是你想要数据的组合。R中有许多函数可以为您做到这一点。主要工作部件是combn()链路

因此,在问题的语言中,我们希望您的tibble的所有组合一次获取2链接2

从那里,你只需要做一些循环结构就可以让你的测试工作,并从对象中提取p值。

list_tables <- lapply(combn(contingency_table,2,simplify=F), fisher.test)
unlist(lapply(list_tables, `[`, 'p.value'))

这应该会产生你的答案。

编辑

考虑到仅对相邻数据.frame列的更新要求,以下修改应该有效。

full_list <- combn(contingency_table,2,simplify=F)
full_list <- full_list[sapply(
full_list, function(x) all(startsWith(names(x), substr(names(x)[1], 1,2))))]
full_list <- lapply(full_list, fisher.test)
unlist(lapply(full_list, `[`, 'p.value'))

这与以前的代码大致相同,但现在我们必须找到具有相同问题前缀名称的数据子集。只有当前缀完全相同(X3 != x3)时,这才有效。我认为这是一个比尝试使用列索引更好的解决方案,而且不能保证总是挨在一起。sapply代码正是这样做的。最终的输出应该是解决问题所需要的。

最新更新