【问题标题】:Using R, apply multiple chi-square contingency table tests to a grouped data frame and add a new column containing the p values of the tests使用 R,将多个卡方列联表检验应用于分组数据框,并添加一个包含检验 p 值的新列
【发布时间】:2018-09-14 11:50:33
【问题描述】:

我有一个类似于下面示例的数据框(这是我实际数据框的一小部分)。

frequencies <- data.frame(sex=c("female", "female", "male", "male", "female", "female", "male", "male", "female", "female", "male", "male", "female", "female", "male", "male"),
                      ecotype=c("Crab", "Wave", "Crab", "Wave", "Crab", "Wave", "Crab", "Wave", "Crab", "Wave", "Crab", "Wave", "Crab", "Wave", "Crab", "Wave"),
                      contig_ID=c("Contig100169_2367", "Contig100169_2367", "Contig100169_2367", "Contig100169_2367", "Contig100169_2367", "Contig100169_2367", "Contig100169_2367", "Contig100169_2367", 
                                  "Contig100169_2481", "Contig100169_2481", "Contig100169_2481", "Contig100169_2481", "Contig100169_2481", "Contig100169_2481", "Contig100169_2481", "Contig100169_2481"),
                      allele=c("p", "p", "p", "p", "q", "q", "q", "q", "p", "p", "p", "p", "q", "q", "q", "q"),
                      frequency=c(157, 98, 140, 65, 29, 8, 26, 9, 182, 108, 147, 80, 46, 4, 49, 4))

我想对“contig_ID”和“ecotype”的每个组合进行单独的卡方列联检验,测试“sex”和“allele”之间的关联。然后我想在一个表格中总结这些结果,其中包括“contig_ID”和“ecotype”的每个组合的 p 值。例如,从给出的示例表中,我希望得到一个包含 4 个 p 值的结果表,如下例所示。

results <- data.frame(ecotype=c("Crab", "Wave", "Crab", "Wave"),
                  contig_ID=c("Contig100169_2367", "Contig100169_2367", "Contig100169_2481", "Contig100169_2481"),
                  pvalue=c("pval", "pval", "pval", "pval"))

或者,只需在原始表中添加一个 p 值列也可以,每个组合的 p 值只是在所有相关行中重复。

我一直在尝试将lapply()summarise() 等函数与chisq.test() 结合使用来实现这一目标,但到目前为止还没有成功。我也尝试过使用类似的方法:R chi squared test (3x2 contingency table) for each row in a table,但也无法实现。

【问题讨论】:

    标签: r tidyverse chi-squared


    【解决方案1】:

    我们可以将contig_IDecotype 列分组,并创建一个嵌套数据框,并将数据转换为矩阵,如下所示。

    library(tidyverse)
    
    frequencies2 <- frequencies %>%
      group_by(contig_ID, ecotype) %>%
      nest() %>%
      mutate(M = map(data, function(dat){
        dat2 <- dat %>% spread(sex, frequency)
        M <- as.matrix(dat2[, -1])
        row.names(M) <- dat2$allele
        return(M)
      }))
    

    如果我们查看M 列的第一个元素,我们会发现每个组的数据都被转换为一个矩阵。

    frequencies2$M[[1]]
    #   female male
    # p    157  140
    # q     29   26
    

    从这里,我们可以将chisq.test 应用于每个矩阵并提取p 值。 frequencies3 是最终输出。

    frequencies3 <- frequencies2 %>%
      mutate(pvalue = map_dbl(M, ~chisq.test(.x)$p.value)) %>%
      select(-data, -M) %>%
      ungroup()
    frequencies3
    # # A tibble: 4 x 3
    #   contig_ID         ecotype pvalue
    #   <fct>             <fct>    <dbl>
    # 1 Contig100169_2367 Crab     1.00 
    # 2 Contig100169_2367 Wave     0.434
    # 3 Contig100169_2481 Crab     0.284
    # 4 Contig100169_2481 Wave     0.958
    

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 2019-06-18
      • 2022-10-15
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 2021-10-17
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多