计算 lm 的截距

机器算法验证 r 流明 截距
2022-03-31 09:34:52

我想了解如何手动计算 lm 的截距。以下示例是部分因子设计 (3^3),变量是因子。

f1 <- factor(c(1,1,1,2,2,2,3,3,3))
f2 <- factor(c(1,2,3,1,2,3,1,2,3))
f3 <- factor(c(3,1,2,1,2,3,2,3,1))
r <- c(77.311, 70.838, 87.173, 60.831, 74.898, 70.743,
73.946, 64.263, 64.624)

d <- data.frame(f1, f2, f3, r)

mod1 <- lm(r~., data = d)
summary(mod1)

我想了解截距 71.3172 是如何计算的。

谢谢

2个回答

模型中的所有系数估计量(包括截距估计量)都是使用线性回归中使用的标准普通最小二乘 (OLS) 估计量计算的。在手动复制计算之前,我们可以从lm函数中生成系数。

#Input the data and model
DATA  <- data.frame(f1, f2, f3, r);
MODEL <- lm(r ~ ., data = DATA);

#Extract the coefficient estimates
summary(MODEL)$coefficients

               Estimate Std. Error    t value     Pr(>|t|)
(Intercept)  71.3172222   1.197402 59.5599462 0.0002817785
f12          -9.6166667   1.108579 -8.6747673 0.0130296029
f13         -10.8296667   1.108579 -9.7689607 0.0103167234
f22          -0.6963333   1.108579 -0.6281313 0.5940817326
f23           3.4840000   1.108579  3.1427615 0.0880753355
f32          13.2413333   1.108579 11.9444179 0.0069363819
f33           5.3413333   1.108579  4.8181793 0.0404784180 

我们可以使用 OLS 公式手动复制这些估计系数。x是设计矩阵和r响应向量,估计系数向量为β^=(xTx)1(xTr). 这可以R使用矩阵运算进行编程。我们看到这复制了lm函数中计算的相同数字。

#Compute the coefficient estimator manually
DESIGN <- model.matrix(r ~ ., data = DATA);
COEF   <- solve(t(DESIGN) %*% DESIGN, t(DESIGN) %*% r);
colnames(COEF) <- "Estimate";

#Extract the coefficient estimates
COEF;

               Estimate
(Intercept)  71.3172222
f12          -9.6166667
f13         -10.8296667
f22          -0.6963333
f23           3.4840000
f32          13.2413333
f33           5.3413333

截距是不包括解释变量的基线值。因为您的解释变量都是分类变量,所以实际上您的回归将简单地计算每组的平均值。事实上,您的数据假设 3 乘以 3 = 27 个唯一组。R一般会选择一组作为baseline,然后给出其他组的附加值。在你的情况下,输出是:

(Intercept)   71.317      1.197   59.56  0.00028 ***
f12           -9.617      1.109   -8.67  0.01303 *  
f13          -10.830      1.109   -9.77  0.01032 *  
f22           -0.696      1.109   -0.63  0.59408    
f23            3.484      1.109    3.14  0.08808 .  
f32           13.241      1.109   11.94  0.00694 ** 
f33            5.341      1.109    4.82  0.04048 *  

在这种情况下,截距是组 (1,1,1) 的值 - 它实际上不在您的数据中,但如果存在,这是该组的预期值。系数应如下读取:对于系数 fxy,x 表示为哪个变量给出系数,y 表示变量获得的值(在您的情况下为 1、2 或 3)。由于基线组是 (1,1,1),因此 y 的值为 1 永远不会出现,它已经是基值。

小例子:f12 显示了将第一个变量更改为第 2 组的预期值,表示以 (2,1,1) 为特征的组,它在您的数据中(值 = 60.8,模型估计值为 71.3-9.6 = 61.7) . 要计算组 (2,2,1) 的期望,请将 f12 系数和 f22 系数 (71.3 - 9.6 - 0.7 = 61) 相加。最后,数据中值为 74.9 的组 (2,2,2) 的预期值为 Intercept + f12 + f22 + f32 = 71.3-9.6-0.7+13.2 = 74.2

因此,总而言之,截距是所有回归变量的值为零的那个组或那些观察值,在您的情况下是指剩余的组。

编辑:要计算 (3,3,3) 的期望值,请将 f13、f23 和 f33 添加到截距中。我刚刚意识到我上面的示例可能没有涵盖您没有将 f12 和 f13 都添加到截距以使第一个因子变量为 3。