【问题标题】:apply fisher test in a large dataset that join all contingency tables在连接所有列联表的大型数据集中应用 Fisher 测试
【发布时间】:2017-10-09 17:01:29
【问题描述】:

我有一个这样的数据集:

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 function loops


    【解决方案1】:

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

    因此,在问题的语言中,我们希望您的 tibble 的所有组合一次取 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 代码就是这样做的。最终输出应该是您解决问题所需要的。

    【讨论】:

    • 谢谢,非常有用。问题是我得到 28 个 p_values 并且应该只有 4 个,因为有四个问题。
    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多