使用 lm() 作为输入时解释 anova() 的输出

机器算法验证 r 回归 方差分析 流明
2022-02-14 15:26:32

我正在通过查看别人的 R 代码来学习如何构建线性回归模型。这是我正在使用的示例数据:

v1  v2  v3  response
0.417655013 -0.012026453    -0.528416414    48.55555556
-0.018445979    -0.460809371    0.054017873 47.76666667
-0.246110341    0.092230159 0.057435968 49.14444444
-0.521980295    -0.428499038    0.119640369 51.08888889
0.633310578 -0.224215856    -0.153917427    48.97777778
0.41522316  0.050609412 -0.642394965    48.5
-0.07349941 0.547128578 -0.539018121    53.95555556
-0.313950353    0.207853678 0.713903994 48.16666667
0.404643796 -0.326782199    -0.785848428    47.7
0.028246796 -0.424323318    0.289313911 49.34444444
0.720822953 -0.166712488    0.323246062 50.78888889
-0.430825851    -0.308119827    0.543823856 52.65555556
-0.964175294    0.661700584 -0.11905972 51.03333333
-0.178955757    -0.11148414 -0.151179885    48.28888889
0.488388035 0.515903257 -0.087738159    48.68888889
-0.097527627    0.188292773 0.207321867 49.86666667
0.481853599 0.21142728  -0.226700254    48.38888889
1.139561277 -0.293574756    0.574855693 54.55555556
0.104077762 0.16075114  -0.131124443    48.61111111

我读入数据并使用调用lm()来构建模型:

> my_data<- read.table("data.csv", header = T, sep = ",")
> my_lm <- lm(response~v1 + v2 + v3 + v1:v2 + v1:v3 + v2:v3, data=my_data)
> summary(my_lm)

Call:
lm(formula = response ~ v1 + v2 + v3 + v1:v2 + v1:v3 + v2:v3, 
data = my_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.0603 -0.6615 -0.1891  1.0395  1.8280 

Coefficients:
         Estimate Std. Error t value Pr(>|t|)    
(Intercept)  49.33944    0.42089 117.226  < 2e-16 ***
v1            0.06611    0.82320   0.080  0.93732    
v2           -0.36725    1.06359  -0.345  0.73585    
v3            0.72741    1.00973   0.720  0.48508    
v1:v2        -2.54544    2.21663  -1.148  0.27321    
v1:v3         0.80641    2.77603   0.290  0.77640    
v2:v3       -12.16017    3.62473  -3.355  0.00573 ** 
--- 
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.375 on 12 degrees of freedom
Multiple R-squared:  0.697, Adjusted R-squared:  0.5455 
F-statistic:   4.6 on 6 and 12 DF,  p-value: 0.01191

跟随他们的代码,然后我调用anova()

> my_lm_anova <- anova(my_lm)
> my_lm_anova
Analysis of Variance Table

Response: response
          Df  Sum Sq Mean Sq F value   Pr(>F)   
v1         1  0.0010  0.0010  0.0005 0.982400   
v2         1  0.2842  0.2842  0.1503 0.705036   
v3         1  9.8059  9.8059  5.1856 0.041891 * 
v1:v2      1  4.3653  4.3653  2.3084 0.154573   
v1:v3      1 16.4582 16.4582  8.7034 0.012141 * 
v2:v3      1 21.2824 21.2824 11.2545 0.005729 **
Residuals 12 22.6921  1.8910                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

但是,我不确定:

  1. 为什么我会在这种情况下使用对 ANOVA 的调用,以及
  2. ANOVA 表告诉我有关预测变量的信息。

从代码中,他们似乎使用了 ANOVA 表,如下所示。对于预测变量 v1,结果

  • 添加 v1 的“Sum Sq”条目以及 v1:v2 的一半“Sum Sq”条目和 v1:v3 的一半“Sum Sq”条目,
  • 除以整个“Sum Sq”列的总和,以及
  • 乘以 100

给出模型中由预测变量 v1 解释的响应变量的方差百分比lm(). 我不明白为什么这也不是为什么 v1:v2 的“Sum Sq”条目的一半归因于 v1 而一半归因于 v2。这只是方便吗?

1个回答

anova()函数调用返回一个方差分析表您可以随时使用它来获取 ANOVA 表。因此,问题变成了,“当我可以通过标准输出(即命令) tsummary.lm()

首先,您可能对摘要输出非常满意,这很好。但是,ANOVA 表可能会提供一些优势。首先,如果您有一个超过两个级别的分类/因子变量,那么汇总输出很难解释。它会根据参考水平为您提供个人水平的测试,但不会为您提供整个因素的测试。考虑:

set.seed(8867)                           # this makes the example exactly reproducible
y     = c(rnorm(10, mean=0,   sd=1),
          rnorm(10, mean=-.5, sd=1),
          rnorm(10, mean=.5,  sd=1) )
g     = rep(c("A", "B", "C"), each=10)
model = lm(y~g)
summary(model)
# ...
# Residuals:
#      Min       1Q   Median       3Q      Max 
# -2.59080 -0.54685  0.04124  0.79890  2.56064 
# 
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)
# (Intercept)  -0.4440     0.3855  -1.152    0.260
# gB           -0.9016     0.5452  -1.654    0.110
# gC            0.6729     0.5452   1.234    0.228
# 
# Residual standard error: 1.219 on 27 degrees of freedom
# Multiple R-squared:  0.2372,  Adjusted R-squared:  0.1807 
# F-statistic: 4.199 on 2 and 27 DF,  p-value: 0.02583
anova(model)
# Analysis of Variance Table
# 
# Response: y
#           Df Sum Sq Mean Sq F value  Pr(>F)  
# g          2 12.484  6.2418   4.199 0.02583 *
# Residuals 27 40.135  1.4865                  

您可能更喜欢查看 ANOVA 表的另一个原因是,它允许您使用有关自变量和因变量之间可能关联的信息,这些关联会被摘要输出中考虑您自己的示例,您可能会注意到值不匹配(例如,对于摘要输出中的 p 值为但在 ANOVA 表中为)。原因是您的变量并非完全不相关: tpv1p0.937320.982400

cor(my_data)
#                   v1          v2         v3    response
# v1        1.00000000 -0.23760679 -0.1312995 -0.00357923
# v2       -0.23760679  1.00000000 -0.2358402  0.06069167
# v3       -0.13129952 -0.23584024  1.0000000  0.32818751
# response -0.00357923  0.06069167  0.3281875  1.00000000

其结果是存在可归因于多个变量的平方和。检验等同于平方和的“类型 III”检验,但其他检验也是可能的默认的 ANOVA 表使用“I 型”平方和,这可以让您对假设进行更精确、更强大的检验。(不过,这个主题相当高级,您可能想在这里阅读我的答案:如何解释 I 型(顺序)ANOVA 和 MANOVA?t