如何在R中为McNemar显著性检验批量生成所需2x2矩阵
实现方案
你完全可以通过批量遍历的方式自动生成所有选项对应的2×2检验矩阵,不用手动逐个构造,核心逻辑是对每个选项,把两道题的作答转换为「选了该选项/没选该选项」的二分类值,再直接生成配对列联表即可,和你手动构造的矩阵逻辑完全一致。
以下是R语言的可直接复用的实现代码:
# -------------------------- # 第一步:替换为你的真实数据 # -------------------------- # 示例模拟数据,你可以替换成自己调研数据里的a2、a3列 set.seed(123) a2 <- sample(c("a","b","c","d","e"), size = 200, replace = T) a3 <- sample(c("a","b","c","d","e"), size = 200, replace = T) # 提取所有需要检验的选项 opts <- unique(c(a2, a3)) |> sort() # -------------------------- # 第二步:批量生成矩阵+检验 # -------------------------- # 用列表存所有选项的结果,方便后续调用 mcnemar_res <- list() for (opt in opts) { # 对当前选项生成二分类标记:选了记为1,没选记为0 a2_bin <- ifelse(a2 == opt, 1, 0) a3_bin <- ifelse(a3 == opt, 1, 0) # 生成2×2列联表,行对应a2的结果,列对应a3的结果 mat <- table(a2_bin, a3_bin) # 校验矩阵合法性,避免极端情况下矩阵维度不足 if (nrow(mat) == 2 & ncol(mat) == 2) { mcnemar_res[[opt]][["matrix"]] <- mat # 可按需设置mcnemar.test的correct参数控制连续性校正 mcnemar_res[[opt]][["test"]] <- mcnemar.test(mat) } else { mcnemar_res[[opt]] <- "样本分布极端,无法构建2×2矩阵" } }
结果调用方式
- 获取e选项的2×2矩阵:
mcnemar_res[["e"]][["matrix"]] - 查看e选项的McNemar检验结果:
mcnemar_res[["e"]][["test"]]
如果不想用for循环,也可以换成lapply写法,运行逻辑和输出结果完全一致:
mcnemar_res <- lapply(opts, function(opt) { a2_bin <- ifelse(a2 == opt, 1, 0) a3_bin <- ifelse(a3 == opt, 1, 0) mat <- table(a2_bin, a3_bin) if(nrow(mat)==2 & ncol(mat)==2) { return(list(matrix = mat, test = mcnemar.test(mat))) } else { return("样本分布极端,无法构建2×2矩阵") } }) |> setNames(opts)
内容的提问来源于stack exchange,提问作者Beginner Java
相关产品推荐
相关产品推荐

