在加入所有列联表的大型数据集中应用fisher测试

时间:2017-10-09 17:01:29

标签: r function loops

我有这样的数据集:

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的向量。

谢谢,

弗雷德里克

1 个答案:

答案 0 :(得分:0)

所以这很有趣。您需要认识到的主要事情是您需要组合您的数据。 R中有许多功能可以为您做到这一点。主要工作是combn() Link

因此,在问题的语言中,我们希望您的所有组合一次只能获得2个link2

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

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

这应该会产生你的答案。

修改

鉴于仅对邻接data.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代码就是这样做的。最终输出应该是您需要的问题。