如何批量对模型列表运行LeveneTest与shapiro test校验ANOVA假设
ANOVA前提假设批量校验实现方案
Levene检验需依赖car包,先加载包再运行后续代码。
核心实现逻辑
你已经把所有线性模型存在models列表里,不需要重复构造模型,两类前提检验的批量实现逻辑如下:
- Shapiro-Wilk正态性检验:直接从每个lm模型中提取残差做检验,ANOVA的正态性假设针对模型残差,不需要用原始变量直接计算
- Levene方差齐性检验:按模型中的核心分组因子(即
irrigation和genotype的交互分组),对每个响应变量批量构造检验公式即可
分步代码
1. 加载依赖
library(car)
2. 批量Shapiro-Wilk残差正态性检验
# 批量运行检验 shapiro_test_list <- lapply(models, function(model) { shapiro.test(residuals(model)) }) # 可选:将检验结果整理为易读的表格 shapiro_result_table <- do.call(rbind, lapply(names(shapiro_test_list), function(resp_var) { res <- shapiro_test_list[[resp_var]] data.frame( 响应变量 = resp_var, W统计量 = unname(res$statistic), p值 = res$p.value, 检验结论 = ifelse(res$p.value > 0.05, "残差满足正态性假设", "残差不满足正态性假设") ) }))
3. 批量Levene方差齐性检验
# 批量运行检验,分组为irrigation和genotype的交互组合,和原模型的处理效应对应 levene_test_list <- lapply(varlist, function(resp_var) { # 用反引号包裹变量名,兼容带空格、特殊字符的列名 leveneTest(as.formula(paste0("`", resp_var, "` ~ irrigation*genotype")), data = dt) }) names(levene_test_list) <- varlist # 可选:将检验结果整理为易读的表格 levene_result_table <- do.call(rbind, lapply(names(levene_test_list), function(resp_var) { res <- levene_test_list[[resp_var]] data.frame( 响应变量 = resp_var, F统计量 = unname(res$`F value`[1]), p值 = unname(res$`Pr(>F)`[1]), 检验结论 = ifelse(res$`Pr(>F)`[1] > 0.05, "满足方差齐性假设", "不满足方差齐性假设") ) }))
和原有代码衔接的完整版本
library(car) # 原有批量建模代码 models <- lapply(varlist, function(t) lm(formula = paste0("`", t, "` ~ block+irrigation*genotype"),dt)) names(models) = varlist # 原有批量ANOVA anova_results <- lapply(models, anova) # 批量正态性检验 shapiro_test_list <- lapply(models, function(model) shapiro.test(residuals(model))) shapiro_result_table <- do.call(rbind, lapply(names(shapiro_test_list), function(resp_var) { res <- shapiro_test_list[[resp_var]] data.frame( 响应变量 = resp_var, W统计量 = unname(res$statistic), p值 = res$p.value, 正态性结论 = ifelse(res$p.value > 0.05, "满足", "不满足") ) })) # 批量方差齐性检验 levene_test_list <- lapply(varlist, function(resp_var) { leveneTest(as.formula(paste0("`", resp_var, "` ~ irrigation*genotype")), data = dt) }) names(levene_test_list) <- varlist levene_result_table <- do.call(rbind, lapply(names(levene_test_list), function(resp_var) { res <- levene_test_list[[resp_var]] data.frame( 响应变量 = resp_var, F统计量 = unname(res$`F value`[1]), p值 = unname(res$`Pr(>F)`[1]), 方差齐性结论 = ifelse(res$`Pr(>F)`[1] > 0.05, "满足", "不满足") ) }))
注:如果需要按其他分组维度做方差齐性检验,只需要替换Levene检验公式右侧的分组变量即可。
内容的提问来源于stack exchange,提问作者eleftheria26
相关产品推荐
相关产品推荐

