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
相关产品推荐
相关产品推荐

