如何编写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
相关产品推荐
相关产品推荐

