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

如何编写R函数检验残差正态性与同方差性并输出结果解释

改进后的残差检验与可视化R函数

下面是整合了残差正态性、同方差性检验,同时附带结果解释和残差图说明的R函数:

# 首次运行需安装依赖包,之后可注释该行
# install.packages("lmtest")
library(lmtest)

Residuals <- function(model) {
  # 校验输入模型类型
  if (!inherits(model, c("lm", "glm"))) {
    stop("输入必须是lm或glm类型的模型对象!")
  }
  
  # 提取残差与拟合值
  res <- residuals(model)
  fitted_vals <- fitted(model)
  
  # 生成2x2布局的残差诊断图
  par(mfrow = c(2, 2), mar = c(4, 4, 2, 1))
  plot(model)
  
  # --- 正态性检验:Shapiro-Wilk检验 ---
  cat("\n===== 残差正态性检验结果 =====\n")
  shapiro_test <- shapiro.test(res)
  print(shapiro_test)
  
  # 输出正态性结论
  if (shapiro_test$p.value > 0.05) {
    cat("解释:Shapiro-Wilk检验p值大于0.05,无充分证据否定残差正态分布的假设,认为残差满足正态性要求。\n")
  } else {
    cat("解释:Shapiro-Wilk检验p值≤0.05,拒绝残差正态分布的假设,说明残差可能不满足正态性要求。\n")
  }
  
  # --- 同方差性检验:Breusch-Pagan检验 ---
  cat("\n===== 残差同方差性检验结果 =====\n")
  bp_test <- bptest(model)
  print(bp_test)
  
  # 输出同方差性结论
  if (bp_test$p.value > 0.05) {
    cat("解释:Breusch-Pagan检验p值大于0.05,无充分证据否定残差方差齐性的假设,认为残差满足同方差性要求。\n")
  } else {
    cat("解释:Breusch-Pagan检验p值≤0.05,拒绝残差方差齐性的假设,说明残差存在异方差性。\n")
  }
  
  # --- 残差图解读说明 ---
  cat("\n===== 残差图各子图解读 =====\n")
  cat("- 左上(残差vs拟合值):点随机分布在y=0附近、无明显趋势→同方差性好;出现漏斗/扇形趋势→存在异方差。\n")
  cat("- 右上(正态Q-Q图):点基本沿对角线分布→残差接近正态;两端明显偏离对角线→正态性不足。\n")
  cat("- 左下(尺度-位置图):点随机分布无趋势→方差齐性;出现递增/递减趋势→存在异方差。\n")
  cat("- 右下(残差vs杠杆值):红色虚线外的点为异常值或高杠杆点,需重点关注。\n")
}

# 示例用法:基于mtcars数据集构建线性模型后调用函数
model <- lm(mpg ~ wt + hp, data = mtcars)
Residuals(model)

关键说明

  • 输入限制:仅支持lm或glm类型的模型对象,函数会自动校验输入合法性。
  • 依赖说明:使用lmtest包的bptest函数执行Breusch-Pagan检验,首次使用需安装该包。
  • 输出内容:包含残差诊断图、两类检验的数值结果+中文解释、残差图各子图的直白解读。

内容的提问来源于stack exchange,提问作者bbq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:40:20