多列ANOVA及Tukey HSD后续检验执行问题求助
批量执行ANOVA与Tukey HSD检验解决多响应变量问题
我正在对潜在量表题项执行Hinkin and Tracey内容效度检验,现有一个含74列的样本数据集(示例数据如下):
cleandata <- structure(list(Condition = c("RS", "AS", "BGPS", "APCS", "OP", "TS"), alt_energy = c(2, 5, 3, 3, 2, 2), animal_product = c(5, 3, 4, 4, 3, 1), deforest = c(5, 1, 4, 1, 2, 1)), row.names = c(NA, 6L), class = c("tbl_df", "tbl", "data.frame"))
其中仅Condition列为分组维度列,需检验其余73列的响应均值在不同Condition组间是否存在显著差异,以此验证量表题项是否仅反映单一维度。
最初尝试一次性对所有列运行ANOVA:
test <- aov(as.matrix(cleandata[, -1]) ~ as.factor(Condition), data = cleandata) summary(test, effect.size = "both", detailed = TRUE, observed = NULL)
但后续执行Tukey HSD检验时报错:
tukeyHSD(test)
报错信息:
Error in model.tables.aov(x, "means") :
'model.tables' is not implemented for multiple responses
可以通过循环遍历每个题项列分别执行ANOVA和Tukey HSD检验,同时整理出整洁的输出结果。以下是具体实现:
步骤1:加载必要工具包
# 安装并加载所需包(首次运行需安装) if (!require(tidyverse)) install.packages("tidyverse") if (!require(broom)) install.packages("broom") if (!require(emmeans)) install.packages("emmeans") library(tidyverse) library(broom) library(emmeans)
步骤2:循环处理每个题项
# 初始化结果存储列表 results <- list() # 遍历所有待检验列(排除Condition) for (var in setdiff(colnames(cleandata), "Condition")) { # 拟合单变量ANOVA模型 aov_fit <- aov(reformulate("as.factor(Condition)", response = var), data = cleandata) # 整理ANOVA结果 anova_tidy <- tidy(aov_fit) %>% mutate(variable = var) %>% relocate(variable, .before = everything()) # 执行Tukey HSD并整理结果 tukey_tidy <- emmeans(aov_fit, pairwise ~ as.factor(Condition)) %>% tidy() %>% mutate(variable = var) %>% relocate(variable, .before = everything()) # 存入列表 results[[var]] <- list(anova = anova_tidy, tukey = tukey_tidy) } # 合并所有ANOVA结果为一个数据框 all_anova_results <- bind_rows(lapply(results, function(x) x$anova)) # 合并所有Tukey HSD结果为一个数据框 all_tukey_results <- bind_rows(lapply(results, function(x) x$tukey))
结果说明
all_anova_results包含所有题项的ANOVA统计量(F值、p值等),可快速筛选出组间均值有显著差异的题项。all_tukey_results包含每组间的两两比较结果,可具体查看哪些分组间存在显著差异。- 使用
broom包将模型结果转换为整洁的数据框格式,便于后续的筛选、可视化或导出。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

