r - 使用 lapply 或 map over columns 将 McNemar 测试应用于所有列组合

标签 r

我正在尝试将麦克尼马尔测试应用于我的数据的不同模型组合。我有 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/

相关文章:

R 枢轴示例

xml - 使用“R”中的XML节点

加载库时 R rgl 包错误

r - 如何使用 R 根据组指定添加列数据?

linux - 无法获得语法突出显示以在 vim 中使用 R 代码

使用 for 循环删除中间行

r - 在 coord_polar 上制作弯曲文本

r - 如何将一个变量与R上的所有其他变量相关

r - knit 与 gganimate,找不到 ffmpeg 命令

r - 基于 r 中的属性条件删除顶点