我正在尝试将麦克尼马尔测试应用于我的数据的不同模型组合。我有 N
个模型,但这里我显示了 3 个。我可以执行以下操作。
mcnemar.test(x = d$mod1, y = d$mod2)
mcnemar.test(x = d$mod1, y = d$mod3)
mcnemar.test(x = d$mod2, y = d$mod3)
我希望将结果存储在数据框中,例如:
P 值:
mod1 mod2 mod3
mod1 - 0.1306 0.7518
mod2 - - 0.3711
mod3 - - -
数据:
d <- structure(list(id = 1:50, mod1 = c("Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Incorrect", "Incorrect", "Correct", "Correct", "Correct",
"Correct", "Incorrect", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Incorrect", "Correct", "Incorrect", "Incorrect",
"Correct", "Correct", "Correct", "Correct", "Correct"), mod2 = c("Correct",
"Correct", "Correct", "Incorrect", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct"), mod3 = c("Correct", "Correct", "Incorrect", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Incorrect", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Incorrect", "Correct", "Correct",
"Incorrect", "Correct", "Correct", "Correct", "Correct", "Correct",
"Correct", "Correct", "Correct", "Correct")), row.names = c(NA,
-50L), class = c("tbl_df", "tbl", "data.frame"))
最佳答案
我们可以使用base R
中的outer
outer(d[-1], d[-1], FUN = Vectorize(function(x, y) mcnemar.test(x, y)$p.value))
# mod1 mod2 mod3
#mod1 NaN 0.1305700 0.7518296
#mod2 0.1305700 NaN 0.3710934
#mod3 0.7518296 0.3710934 NaN
或者与嵌套sapply
相同
sapply(d[-1], function(x) sapply(d[-1], function(y) mcnemar.test(x, y)$p.value))
或者使用tidyverse
中的crossing/pivot_wider
library(dplyr)
library(tidyr)
library(purrr)
crossing(v1 = names(d)[-1], v2 = names(d)[-1]) %>%
rowwise() %>%
mutate(pval = mcnemar.test(d[[v1]], d[[v2]])$p.value) %>%
pivot_wider(names_from = v2, values_from = pval) %>%
column_to_rownames('v1')
# mod1 mod2 mod3
#mod1 NaN 0.1305700 0.7518296
#mod2 0.1305700 NaN 0.3710934
#mod3 0.7518296 0.3710934 NaN
或者另一种选择是 reshape 为“长”格式,然后进行交叉
d %>%
pivot_longer(cols = -id) %>%
select(-id) %>%
nest_by(name) %>%
crossing(., set_names(., str_c(names(.), '_new'))) %>%
rowwise() %>%
transmute(name, name_new, pvalue = mcnemar.test(data[[1]], data_new[[1]])$p.value) %>%
ungroup %>%
pivot_wider(names_from = name_new, values_from = pvalue) %>%
column_to_rownames('name')
# mod1 mod2 mod3
#mod1 NaN 0.1305700 0.7518296
#mod2 0.1305700 NaN 0.3710934
#mod3 0.7518296 0.3710934 NaN
关于r - 使用 lapply 或 map over columns 将 McNemar 测试应用于所有列组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64035687/