You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量对模型列表运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:57:16