有没有办法获得所有相互作用项的残差图?

Is there a way to obtain residual plots for all interaction terms?

我正在做一个练习,要求我“在单独的图表上针对 Y_hat、每个预测变量和每个双因素交互项绘制残差。”这是我正在使用的数据集的片段:

> dput(head(Commercial_Properties, 10))
structure(list(Rental_Rates = c(13.5, 12, 10.5, 15, 14, 10.5, 
14, 16.5, 17.5, 16.5), Age = c(1, 14, 16, 4, 11, 15, 2, 1, 1, 
8), Op_Expense_Tax = c(5.02, 8.19, 3, 10.7, 8.97, 9.45, 8, 6.62, 
6.2, 11.78), Vacancy_Rate = c(0.14, 0.27, 0, 0.05, 0.07, 0.24, 
0.19, 0.6, 0, 0.03), Total_Sq_Ft = c(123000, 104079, 39998, 57112, 
60000, 101385, 31300, 248172, 215000, 251015), residuals = c(`1` = -1.03567244005944, 
`2` = -1.51380641405037, `3` = -0.591053402133659, `4` = -0.133568082335235, 
`5` = 0.313283765150399, `6` = -3.18718522392237, `7` = -0.538356748944345, 
`8` = 0.236302385996349, `9` = 1.98922037248654, `10` = 0.105829602747806
)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))

从这里我创建了适当的线性模型,其中包括两个因子交互项:

commercial_properties_lm_two_degree_interaction <- 
  lm(data=Commercial_Properties, 
     formula=Rental_Rates ~ (Age + Op_Expense_Tax + Vacancy_Rate + Total_Sq_Ft)^2)

接下来我希望完成的是不仅绘制线性项的残差,还绘制交互项的残差。我尝试使用 car

中的 residualPlots() 函数来做到这一点
library(car)
residualPlots(model=commercial_properties_lm_two_degree_interaction, 
              terms=~ (Age + Op_Expense_Tax + Vacancy_Rate + Total_Sq_Ft)^2)

当以这种方式应用时,输出仅产生针对线性项的残差图,它没有绘制任何相互作用。因此,我随后尝试手动执行此操作,但出现错误:

residualPlots(model=commercial_properties_lm_two_degree_interaction,
              terms=~ Age + Op_Expense_Tax + Vacancy_Rate + Tota_Sq_Ft + 
                Age:Op_Expense_Tax + Age:Vacancy_Rate)

Error in termsToMf(model, terms) : argument 'terms' not interpretable.

现在,如果我完全手动做事,我就能得到一个交互图,例如:

with(data=Commercial_Properties, plot(x=Op_Expense_Tax * Vacancy_Rate, y=residuals))

绘制成功。我的问题是,对于相当少量的变量,我确实可以完全手动执行此操作,但是一旦变量的数量开始变大,它就会变得非常乏味。

所以我的问题是,是否有一种方法可以使用 R 中已经创建的函数来制作交互项的残差图,或者我会完全手动完成还是很可能不得不编写某种循环?

注意,我不是在问部分残差。在我正在使用的文本中,我还没有达到这一点。只是针对残差的简单交互项。

您可以使用 'term.labels' 属性执行 eval(parse()) 方法。

使用 gsub(':', '*', a[grep(':', a)]) 提取交互项并将 : 替换为 * 以便对其进行评估。

a <- attr(terms(commercial_properties_lm_two_degree_interaction), 'term.labels')

op <- par(mfrow=c(2, 3))
with(Commercial_Properties, 
     lapply(gsub(':', '*', a[grep(':', a)]), function(x)
            plot(eval(parse(text=x)), residuals, xlab=x)))
par(op)

编辑

这就是我们在 R 中使用 for 循环的方式(但请参阅下面的评论):

as <- gsub(':', '*', a[grep(':', a)])
op <- par(mfrow=c(2, 3))
for (x in as) {
  with(Commercial_Properties, 
       plot(eval(parse(text=x)), residuals, xlab=x)
  )
}
par(op)