如何用purrr::map生成Wilcoxon检验的report文本报告
解决分组Wilcoxon检验结合report包生成报告的问题
问题背景
需要按Session分组,使用purrr映射执行配对Wilcoxon检验,再通过report包生成标准化文本报告,但运行代码时出现报错,提示无法计算效应量,原因是无法从htest对象中检索原始数据。
报错原因
默认的wilcox.test()返回的htest对象不会保存原始数据集,而report包生成完整报告时需要原始数据来计算效应量(如秩相关系数r),因此当通过map批量处理时,report无法从htest对象中获取所需数据,进而触发报错。
解决方案
以下两种方法均可解决该问题:
方法一:修改检验函数,让htest对象保留原始数据
在自定义的检验函数中,将原始数据附加到返回的htest对象中,使report能直接从对象中提取数据计算效应量:
library(tidyverse) library(report) # 构造示例数据 df <- tibble(Session = c(rep("1", 10), rep("2", 10)), scores = sample(20:70, 20), group = c(rep("before", 5), rep("after",5), rep("before", 5), rep("after",5))) # 修改后的Wilcoxon检验函数,附加原始数据到htest对象 w_test <- function(df) { test <- wilcox.test(scores ~ group, df, paired = TRUE) test$data <- df # 将原始数据存入htest对象 test } # 分组生成检验结果和报告 w_results <- df %>% group_by(Session) %>% nest() %>% mutate(wtest = map(data, w_test), result = map(wtest, report)) # 查看各分组的报告 w_results$result
方法二:调用report时显式传入原始数据
无需修改检验函数,使用map2同时传递htest对象和对应的分组数据,在report调用时显式指定data参数:
library(tidyverse) library(report) # 构造示例数据 df <- tibble(Session = c(rep("1", 10), rep("2", 10)), scores = sample(20:70, 20), group = c(rep("before", 5), rep("after",5), rep("before", 5), rep("after",5))) # 原检验函数无需修改 w_test <- function(df) { wilcox.test(scores ~ group, df, paired = TRUE) } # 分组生成检验结果,并用map2传递htest和数据给report w_results <- df %>% group_by(Session) %>% nest() %>% mutate(wtest = map(data, w_test), # 同时传入wtest对象和对应分组数据 result = map2(wtest, data, ~report(.x, data = .y))) # 查看各分组的报告 w_results$result
结果说明
执行上述代码后,w_results$result列会存储每个Session对应的标准化文本报告,包含检验类型、效应量、p值等完整统计信息,可直接提取使用或进一步处理。
内容的提问来源于stack exchange,提问作者sbac
相关产品推荐
相关产品推荐

