为什么在包含 R 中的因素的方差分析中删除变量不会降低自由度?

Why removing a variable in an Anova containing factors in R doesn't reduce degree of freedom?

我正在尝试在不同模型之间进行 ANCOVA(混合方差分析和线性回归),但我 运行 遇到了一些问题。我想我把它缩小到一个关于方差分析的问题(或者我不明白或做错的事情):为了在两个模型之间进行比较,它们需要有不同的残差 Df(自由度)。

例如,让我们考虑 R 中的 mtcars 数据:

library(car)
test_data <- mtcars %>% mutate(factored_variable = as.factor(carb))

model_1 <- aov(drat ~ factored_variable , data = test_data)
Anova(model_1, type = "III")

    # Anova Table (Type III tests)
    # 
    # Response: drat
    # Sum Sq Df  F value                Pr(>F)    
    # (Intercept)       94.870  1 313.3656 0.0000000000000005038 ***
    #   factored_variable  0.991  5   0.6546                0.6607    
    # Residuals          7.871 26                                   
    # ---
    #   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

model_2 <- aov(drat ~ factored_variable - 1, data = test_data)
Anova(model_2, type = "III")

    # Anova Table (Type III tests)
    # 
    # Response: drat
    # Sum Sq Df F value                Pr(>F)    
    # factored_variable 414.92  6  228.42 < 0.00000000000000022 ***
    #   Residuals           7.87 26                                  
    # ---
    #   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

所以,我刚才做的是创建两个模型来预测 drat 值。第一个采用带有因子的变量(Df = 水平数 - 1 = 5)和截距(Df = 1 始终),因此使用 6 Df。 我删除了第二个模型中的截距,所以我只有变量。我希望这个变量只使用 5 个 Df,但显然不是这样,因为 Anova 说有 6 个。

因此我的问题是:为什么最后一个 Df 是 6 而不是 5?我猜这与变量有因素有关,但我不明白为什么。是否无法比较涉及此类变量的两个模型?

编辑:感谢您的回答。我想我误解了理论而不是R,现在更清楚了

你的两个模型本质上是同一个模型,但在第二个模型中你强制截距为零。删除截距不会改变自由度,因为它会导致 factored_variable 的所有 6 个级别都获得参数估计,而不是 factored_variable 的 6-1=5 个级别加上截距。

要了解模型在其他方面是等价的(并且每个模型都等价于回归模型),我们将创建等价的线性回归模型,然后查看系数。

aov1 <- aov(drat ~ factored_variable , data = test_data)
aov2 <- aov(drat ~ factored_variable - 1, data = test_data)

lm1 = lm(drat ~ factored_variable , data = test_data)
lm2 = lm(drat ~ factored_variable - 1 , data = test_data)

现在查看四个模型的系数,如下面的代码和输出所示。 aov1lm1 估计 factored_variable 的截距加上 5 个系数。 factored_variable("reference" 类别)缺失类别的系数是截距。其他系数是该类别与参考类别之间的差异。 aov2lm2 估计 factored_variable 的每个类别的绝对系数,而不是相对于参考类别的系数。

coefs = data.frame(aov1=coef(aov1), aov2=coef(aov2), lm1=coef(lm1), lm2=coef(lm2))
                                         aov1     aov2         lm1      lm2
(Intercept)/factored_variable1     3.68142857 3.681429  3.68142857 3.681429
factored_variable2                 0.01757143 3.699000  0.01757143 3.699000
factored_variable3                -0.61142857 3.070000 -0.61142857 3.070000
factored_variable4                -0.08542857 3.596000 -0.08542857 3.596000
factored_variable6                -0.06142857 3.620000 -0.06142857 3.620000
factored_variable8                -0.14142857 3.540000 -0.14142857 3.540000

请注意,模型对 lm1/aov1lm2/aov2 每个都具有相同的系数。对于模型 aov1lm1,如果将每个 factored_variable 的系数添加到截距,您还会看到系数与 lm2 的系数相同和 aov2。在每种情况下,模型都在估计六个参数。