R语言中anova与summary分析线性模型的结果差异原因探究
为什么线性模型中
anova()和summary()的结果在模型复杂时会不一致? 我用R构建了线性模型,发现当模型只有单个自变量时,anova()和summary()的显著性检验结果一致;但当模型包含多个自变量时,两者给出的结果存在明显差异,想知道背后的原因。
差异示例(多变量模型)
> lm_all <- lm(mtci_ac~sd_height+density+ORA+dry_weight+northess,data=at_growth) > summary(lm_all) Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.480e-01 3.984e-02 6.225 1.33e-07 *** sd_height 1.106e-02 1.045e-02 1.058 0.295 density 1.006e-01 1.481e-01 0.679 0.501 ORA -3.397e-04 1.361e-03 -0.250 0.804 dry_weight 5.045e-06 1.636e-05 0.308 0.759 northess 5.077e-03 3.203e-02 0.159 0.875 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 > anova(lm_all) Analysis of Variance Table Response: mtci_ac Df Sum Sq Mean Sq F value Pr(>F) sd_height 1 0.02525 0.0252488 3.3059 0.07555 . density 1 0.00469 0.0046852 0.6135 0.43750 ORA 1 0.00006 0.0000560 0.0073 0.93214 dry_weight 1 0.00074 0.0007426 0.0972 0.75659 northess 1 0.00019 0.0001919 0.0251 0.87475 Residuals 46 0.35132 0.0076374 ---
一致示例(单变量模型)
> lm_all <- lm(mtci_ac~sd_height,data=at_growth) > anova(lm_all) Analysis of Variance Table Response: mtci_ac Df Sum Sq Mean Sq F value Pr(>F) sd_height 1 0.02525 0.0252488 3.5363 0.06587 . Residuals 50 0.35700 0.0071399 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 > summary(lm_all) Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.261539 0.019209 13.62 <2e-16 *** sd_height 0.013703 0.007287 1.88 0.0659 . --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
原因解释
核心在于两个函数的检验逻辑完全不同:
summary()中的t检验(对应Pr(>|t|)):检验的是在模型包含所有其他自变量的前提下,当前自变量的回归系数是否显著不为0。也就是控制了其他变量的影响后,单独看这个变量的边际效应。anova()默认的顺序方差分析(Type I平方和):检验的是按照自变量在公式中出现的顺序,每加入一个新变量后,模型额外解释的方差是否显著。即先看第一个变量单独能解释多少方差,再看加入第二个变量后新增的解释力,以此类推,后面的变量检验是基于前面变量已被纳入模型的基础上,但和summary()的控制所有变量不同,它是按顺序逐步控制。
在单变量模型中,两者检验的是同一个问题——这个唯一的自变量是否能显著解释因变量的方差,所以结果一致(t值的平方等于F值,对应的p值也几乎相同,因为自由度匹配)。
而在多变量模型中:
summary()的p值是每个变量的偏效应显著性,考虑了所有其他变量的存在。anova()的p值是每个变量的增量方差显著性,依赖于变量进入模型的顺序,不同顺序会得到不同结果。
比如你提供的多变量例子里,sd_height在anova()里p值是0.07555,而在summary()里是0.295,这是因为anova()里的检验是只考虑sd_height单独加入模型时的方差贡献,而summary()里是控制了density、ORA等所有其他变量后,sd_height的边际效应是否显著。
内容的提问来源于stack exchange,提问作者ChuDingjin
相关产品推荐
相关产品推荐

