如何使用 R anova() 结果来选择最佳模型?

机器算法验证 r 回归 方差分析 模型选择
2022-03-31 07:17:44

使用 R 的 mtcars 数据集和 anova() 函数的新手问题。我的问题是如何使用 anova() 来选择最佳(嵌套)模型。以下是一些示例数据:

> anova(lm(mpg~disp,mtcars),lm(mpg~disp+wt,mtcars),lm(mpg~disp+wt+am,mtcars))
Analysis of Variance Table

Model 1: mpg ~ disp
Model 2: mpg ~ disp + wt
Model 3: mpg ~ disp + wt + am
  Res.Df    RSS Df Sum of Sq      F   Pr(>F)   
1     30 317.16                                
2     29 246.68  1    70.476 8.0036 0.008535 **
3     28 246.56  1     0.126 0.0143 0.905548   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> anova(lm(mpg~disp,mtcars),lm(mpg~disp+wt,mtcars),lm(mpg~disp+wt+hp,mtcars))
Analysis of Variance Table

Model 1: mpg ~ disp
Model 2: mpg ~ disp + wt
Model 3: mpg ~ disp + wt + hp
  Res.Df    RSS Df Sum of Sq       F   Pr(>F)   
1     30 317.16                                 
2     29 246.68  1    70.476 10.1201 0.003571 **
3     28 194.99  1    51.692  7.4228 0.010971 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

我的理解是 anova() 比较残差平方和的减少以报告每个嵌套模型的相应 p 值,其中较低的 p 值意味着嵌套模型与第一个模型有更大的不同。

问题 1:为什么改变第三个回归变量的影响是由第二个巢模型产生的?也就是说,disp+wt从第一个示例到第二个示例,模型的 p 值从 0.008535 变为 0.003571。(anova 的模型 2 分析是否使用模型 3 的数据???)

问题 2:由于第 3 个模型的Sum of Sq值在第一个示例中要低得多(例如 0.126 对 51.692),我预计 p 值也会更低,但实际上它会增加(例如 0.905548 对 0.010971)。为什么?

问题 3:最终我试图理解,给定一个包含很多回归变量的数据集,如何使用 anova() 来找到最佳模型。任何一般的经验法则都值得赞赏。

3个回答
Question 1:

关于第一个方差分析与第二个方差分析中p 值(或F 值)的Model 2差异,我没有明显的解释。它们确实应该是相同的,因为我们在这两种情况下Model 1都在进行比较。Model 2获得有关背后原因的进一步输入将非常有用,但在没有解释的情况下,可能建议在每个ANOVA调用中仅包含两个模型。“手动”计算的值(我认为是正确的值)与您帖子中的第一个ANOVA调用一致,带有F = 8.2852.

Question 2:

您正在比较51.6920.126但是在第二种情况下这种较大的差异是一件好事:您应该注意的是246.68forModel 2194.99for之间的第二个方差分析的差异,这比您观察到的RSSModel 3下降更多在第一个 ANOVA 中,从变为,等于没有。因此,通过在第二个 ANOVA 中包含第三个回归量,您可以减少现在捕获的大量残留(错误拟合)信息,而在第一组模型中几乎没有留下任何痕迹。246.68246.56

Question 3:

问题是如何使用 ANOVA 来找到最佳模型,但我认为现在答案很清楚 - 低 p 值使得您应该包括正在考虑的回归量是一个不错的选择。然而,完全不清楚的是您进行一系列 ANOVA 测试的过程。换句话说,我知道你知道,因为我参加了 Coursera 课程,起初你熟悉,你可以手动计算,并理解这里的想法(以及许多其他地方);在引入过拟合的概念之后,解释了调整后的值,紧接着是ANOVA(F 检验)。所有这些和其他,例如AIC标准R2R2选择模型或包含/排除回归变量的测试或标准。例如,AIC 和 BIC 用于非嵌套模型,ANOVA 和似然比检验用于嵌套模型(我在这篇文章中引用了 @f coppens 的评论。

然而,挑战在于提出对测试有意义的模型(查看这篇文章)。假设您有 5 个自变量,并且您正在进行线性回归或 OLS,您可以在考虑交互之前在任何可能的模型中包含或排除每个变量,总共模型(请记住,有 10 个变量除了)。例如,这有其自身的共线性问题。您可以求助于您对汽车的了解,或者只是使用原始计算机功能通过所有组合运行前向或后向逐步选择,如本文档中很好地解释的那样,使用 R 代码如下:210=1,024mtcarsmpg

fit.full <- lm(mpg ~ ., data = mtcars)    
for.aic <- step(lm(mpg ~ 1, data = mtcars), direction = "forward", 
                 scope = formula(fit.full), k = 2, trace = 0)               # forward AIC
for.bic <- step(lm(mpg ~ 1, data=mtcars), direction = "forward", 
                 scope = formula(fit.full), k = log(32), trace = 0)         # forward BIC
back.aic <- step(fit.full, direction = "backward", k = 2, trace = 0)        # backward AIC
back.bic <- step(fit.full, direction = "backward", k = log(32), trace = 0)  # backward BIC

(Adjusted_R.square <- data.frame("Method"=c("for.aic", "for.bic", "back.aic", "back.bic"), 
"Adj.r.square"=c(summary(for.aic)$adj.r.square, summary(for.bic)$adj.r.square, 
summary(back.aic)$adj.r.square, summary(back.bic)$adj.r.square)))
summary(back.bic)

选择具有最高调整的模型(或者您也可以运行ANOVA),以便稍后研究可能的交互并运行残差诊断。R2

问题 1:请注意,您上面提供的 anova 命令等同于提供 anova() 完整模型。如果您执行以下命令:

anova(m3) # where m3 is lm(mpg~disp+wt+am,mtcars)
anova(m4) # where m4 is lm(mpg~disp+wt+hp,mtcars)

您会看到方差分析确实告诉您模型中每个变量的重要性。我认为您一次只能将一个嵌套模型与一个完整模型进行比较。顺便说一句,通过之前针对模型 2 测试模型 1,您应该已经知道您将包含第一个变量,因此无需再次测试排除此变量的模型。这导致了“那么我首先包含哪个变量?”的问题。模型创建实际上是一门艺术,但 MASS 库中的 stepAIC() 中有一个函数允许您根据 AIC 或某些其他指定标准选择最重要的变量。(使用向前、向后或逐步选择。)

问题 2:我相信上面已经回答了这个问题,但需要明确的是,这些显着性值不是针对嵌套模型的,而是针对向模型添加该参数的。

问题 3:一旦您获得具有大量可能预测变量的数据,除非您对要包含的内容有一个大致的了解,否则您不会想要使用 anova()。如果您想知道一个特定变量(或按特定顺序排列的一组特定变量)的影响,最好使用 anova。如果您真的不知道并且正在使用超过 10-15 种可能的预测变量组合进行更多测试,我建议您使用 stepAIC 之类的东西。LASSO 和岭回归是选择参数的其他方法,而不仅仅是手动尝试一次 anova 或使用 stepAIC 来自动化类似过程。

对于问题 3,我想补充安东尼给出的答案。最好使用交叉验证,这是一种在前向、后向或最佳子集的各种模型中进行选择的直接方法,而不是混淆使用哪个。这根本不需要您使用 ANOVA()。当您添加交互项、多项式项、样条等项时,更适合使用 ANOVA,