使用 R,将多个卡方意外事件 table 测试应用于分组数据框,并添加一个包含测试 p 值的新列
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
我有一个类似于下面示例的数据框(这是我实际数据框的一小部分)。
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”和“生态型”的每个组合进行单独的卡方应急检验,检验“性别”和“等位基因”之间的关联。然后我想在 table 中总结这些结果,其中包括“contig_ID”和“生态型”的每个组合的 p 值。例如,根据给出的示例 table,我希望结果 table 具有 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 值列添加到原始 table 也可以,每个组合的 p 值在所有相关行中重复。
我一直在尝试将 lapply()
和 summarise()
等函数与 chisq.test()
结合使用来实现这一点,但到目前为止还没有成功。我也尝试过使用类似于此的方法: ,但也无法完成这项工作。
我们可以对 contig_ID
和 ecotype
列进行分组,并创建一个嵌套数据框,并将数据转换为矩阵,如下所示。
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
我有一个类似于下面示例的数据框(这是我实际数据框的一小部分)。
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”和“生态型”的每个组合进行单独的卡方应急检验,检验“性别”和“等位基因”之间的关联。然后我想在 table 中总结这些结果,其中包括“contig_ID”和“生态型”的每个组合的 p 值。例如,根据给出的示例 table,我希望结果 table 具有 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 值列添加到原始 table 也可以,每个组合的 p 值在所有相关行中重复。
我一直在尝试将 lapply()
和 summarise()
等函数与 chisq.test()
结合使用来实现这一点,但到目前为止还没有成功。我也尝试过使用类似于此的方法:
我们可以对 contig_ID
和 ecotype
列进行分组,并创建一个嵌套数据框,并将数据转换为矩阵,如下所示。
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