如何在R数据框中对多组向量对批量执行配对Wilcoxon符号秩检验
R批量配对Wilcoxon符号秩检验实现方案
报错原因说明
你原有代码的错误来自两个问题:
- 遍历逻辑错误:
for (a in variable.set1)实际遍历的是数据框的列向量数值,而不是列名,导致索引列时出现undefined columns selected报错 - 检验逻辑错误:配对Wilcoxon检验针对的是同一样本、同一标志物的_MOM和_CB配对,不需要拆分组,也不需要做所有MOM和CB列的交叉检验
完整实现代码
该代码和你之前的秩和检验输出格式完全对齐,自动匹配配对标志物、计算P值、FDR校正,最终输出汇总表格:
# 加载所需包 library(tidyverse) library(knitr) library(kableExtra) library(scales) # 用于scientific函数格式化科学计数法 # ---------------------- # 1. 数据预处理 # ---------------------- # 你原来的排除变量定义 excluded_vars <- toydata %>% select(CCBB_dyad_number, cCMV_status, maternal_CMV_IgM_status) %>% names() # 仅保留cCMV+样本(如果需要全样本检验则去掉filter步骤即可) toy_cCMV_pos <- toydata %>% filter(cCMV_status == 'cCMV+') # 提取所有MOM标志物列名,去掉后缀得到核心标志物名称,用于匹配对应的CB列 mom_col_names <- toy_cCMV_pos %>% select(ends_with("_MOM")) %>% names() marker_core <- str_remove(mom_col_names, "_MOM$") # ---------------------- # 2. 批量配对检验 # ---------------------- paired_wilcox_out <- lapply(marker_core, function(m){ # 匹配对应的MOM和CB列名 mom_col <- paste0(m, "_MOM") cb_col <- paste0(m, "_CB") # 执行配对Wilcoxon符号秩检验 test_res <- wilcox.test( x = toy_cCMV_pos[[mom_col]], y = toy_cCMV_pos[[cb_col]], paired = TRUE, conf.int = TRUE # 可选,输出置信区间 ) # 整理结果为数据框 as.data.frame(test_res) %>% mutate( Marker = m, P.value = scientific(p.value, digits = 2, format = "e") ) %>% select( Marker, V.statistic = statistic, P.value, Method = method, conf.low, conf.high # 不需要置信区间可以删掉这两个 ) }) %>% bind_rows() # ---------------------- # 3. FDR校正 + 输出表格 # ---------------------- paired_wilcox_out$FDR_P.value <- p.adjust( paired_wilcox_out$P.value, method = "fdr" ) %>% scientific(digits = 2, format = "e") # 调整列顺序 paired_wilcox_out <- paired_wilcox_out[, c( "Marker", "V.statistic", "P.value", "FDR_P.value", "Method", "conf.low", "conf.high" )] # 输出美观表格 kable(paired_wilcox_out, "html", booktabs = T) %>% kable_styling(latex_options = c("striped", "scale_down"))
代码适配说明
- 如果不需要限定cCMV+样本,直接把
toy_cCMV_pos替换为原始的toydata即可 - 如果不需要输出置信区间,删掉代码中对应
conf.int、conf.low、conf.high的部分即可 - 代码会自动匹配所有_MOM和_CB的配对标志物,78组数据直接运行即可,不需要手动修改配对逻辑
内容的提问来源于stack exchange,提问作者cewim
相关产品推荐
相关产品推荐

