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

R语言如何为含二阶交互项的线性模型生成所有交互项残差图

car包的residualPlots()默认仅支持主效应项的残差图绘制,不识别公式语法中的交互项写法,没有现成的一键函数可以直接输出你需要的所有交互项残差图,但是可以通过少量循环代码实现自动化绘制,不需要手动逐个指定交互项。

你之前手动指定交互项的代码除了函数本身不支持交互项外,还存在拼写错误,Tota_Sq_Ft 少了字母l,应为Total_Sq_Ft,但即便修正拼写也无法正常输出交互项的残差图。

以下是两种可行的实现方案:

方案1:tidyverse生态批量绘图(推荐)

可以一次性生成所有需要的残差图,支持单页汇总展示或单独导出:

# 加载依赖包
library(tidyverse)
library(broom)

# 合并原始预测变量、拟合值(Y_hat)、模型残差
plot_data <- Commercial_Properties %>%
  select(Age, Op_Expense_Tax, Vacancy_Rate, Total_Sq_Ft) %>%
  mutate(
    Y_hat = fitted(commercial_properties_lm_two_degree_interaction),
    residuals = resid(commercial_properties_lm_two_degree_interaction)
  )

# 自动生成所有二阶交互项的乘积列
pred_vars <- c("Age", "Op_Expense_Tax", "Vacancy_Rate", "Total_Sq_Ft")
combs <- combn(pred_vars, 2, simplify = FALSE)
for (comb in combs) {
  col_name <- paste0(comb[1], "_x_", comb[2])
  plot_data[[col_name]] <- plot_data[[comb[1]]] * plot_data[[comb[2]]]
}

# 转为长格式数据批量绘图
plot_data_long <- plot_data %>%
  pivot_longer(-residuals, names_to = "term", values_to = "value")

# 绘制所有残差图,每个项单独一个子图
ggplot(plot_data_long, aes(x = value, y = residuals)) +
  geom_point() +
  geom_smooth(method = "loess", se = FALSE, color = "red") +
  geom_hline(yintercept = 0, linetype = 2, color = "gray50") +
  facet_wrap(~term, scales = "free_x") +
  labs(x = "项取值", y = "普通残差")

方案2:基础R循环实现

不需要额外加载tidyverse包,直接输出单张独立图片:

pred_vars <- c("Age", "Op_Expense_Tax", "Vacancy_Rate", "Total_Sq_Ft")
model_resid <- resid(commercial_properties_lm_two_degree_interaction)

# 绘制残差与Y_hat的图
plot(fitted(commercial_properties_lm_two_degree_interaction), 
     model_resid,
     xlab = "Y_hat", ylab = "残差", main = "残差 vs Y_hat")
abline(h = 0, lty = 2, col = "red")

# 绘制残差与所有主效应的图
for (var in pred_vars) {
  plot(Commercial_Properties[[var]], 
       model_resid,
       xlab = var, ylab = "残差", main = paste0("残差 vs ", var))
  abline(h = 0, lty = 2, col = "red")
}

# 绘制残差与所有二阶交互项的图
combs <- combn(pred_vars, 2, simplify = FALSE)
for (comb in combs) {
  x_val <- Commercial_Properties[[comb[1]]] * Commercial_Properties[[comb[2]]]
  term_name <- paste0(comb[1], ":", comb[2])
  plot(x_val, model_resid,
       xlab = term_name, ylab = "残差", 
       main = paste0("残差 vs ", term_name))
  abline(h = 0, lty = 2, col = "red")
}

以上两种方案都可以适配任意数量的预测变量,自动生成所有二阶交互项的残差图,不需要手动逐个指定交互项。


内容的提问来源于stack exchange,提问作者D.C. the III

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:45:03