有没有办法获得所有相互作用项的残差图?
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)
我正在做一个练习,要求我“在单独的图表上针对 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)