为什么截距不是连续预测变量的平均值为零?
Why is the intercept not the mean at the continuous predictor being zero?
在 Gelman&Hill 的书中描述了当您用一个连续预测变量拟合线性回归时,截距应该代表预测变量==0 时的预测结果。有时这可能有意义,有时则没有意义(或仅通过某种方式缩放的预测器)。如果预测变量是一个因素,则截距应反映参考类别的平均值(至少在使用虚拟代码时)。我目前正在处理睡眠研究数据,但我不明白发生了什么,因为这里不是这种情况。虽然我在线性混合模型中遇到了这个问题,但它在线性模型中也出现了:
在下面的示例 (fit) 中,截距为 251.41,而我们可以看到 Days == 0 的平均值为 256.65。当我将预测变量转换为一个因子时,一切都按预期进行。我错过了什么?对于线性混合模型,我希望截距反映第 5 天的平均值,但将变量 Days 保留为数值变量。问题也出现在那里。它也发生在我拥有的另一个数据集中,其中每天的样本量相等。我觉得我错过了一些非常简单或明显但我无法理解的东西...
library(lme4)
library(tidyverse)
fit <- lm(Reaction ~ Days, sleepstudy)
summary(fit)
group_by(sleepstudy, Days) %>% summarise(means=mean(Reaction))
sleepstudy$Days_discrete <- as.factor(sleepstudy$Days)
fit2 <- lm(Reaction ~ Days_discrete, sleepstudy)
summary(fit2)
What am I missing?
fit1
不必在值为零的 Days
的平均值处穿过原点。如果 Days
具有线性效应,则这是最佳拟合线。请参阅 simple linear regression.
的公式
fit2
应该是由于 R 中的默认对比度设置。它也是如此
library(lme4)
tapply(sleepstudy$Reaction, sleepstudy$Days, mean)
0 1 2 3 4 5 6 7 8 9
#R> 256.6518 264.4958 265.3619 282.9920 288.6494 308.5185 312.1783 318.7506 336.6295 350.8512
fit1 <- lm(Reaction ~ Days, sleepstudy)
coef(fit1)
#R> (Intercept) Days
#R> 251.40510 10.46729
fit2 <- lm(Reaction ~ as.factor(Days), sleepstudy)
coef(fit2)
#R> (Intercept) as.factor(Days)1 as.factor(Days)2 as.factor(Days)3 as.factor(Days)4 as.factor(Days)5 as.factor(Days)6
#R> 256.651806 7.843950 8.710094 26.340206 31.997617 51.866650 55.526450
#R> as.factor(Days)7 as.factor(Days)8 as.factor(Days)9
#R> 62.098778 79.977700 94.199417
在 Gelman&Hill 的书中描述了当您用一个连续预测变量拟合线性回归时,截距应该代表预测变量==0 时的预测结果。有时这可能有意义,有时则没有意义(或仅通过某种方式缩放的预测器)。如果预测变量是一个因素,则截距应反映参考类别的平均值(至少在使用虚拟代码时)。我目前正在处理睡眠研究数据,但我不明白发生了什么,因为这里不是这种情况。虽然我在线性混合模型中遇到了这个问题,但它在线性模型中也出现了:
在下面的示例 (fit) 中,截距为 251.41,而我们可以看到 Days == 0 的平均值为 256.65。当我将预测变量转换为一个因子时,一切都按预期进行。我错过了什么?对于线性混合模型,我希望截距反映第 5 天的平均值,但将变量 Days 保留为数值变量。问题也出现在那里。它也发生在我拥有的另一个数据集中,其中每天的样本量相等。我觉得我错过了一些非常简单或明显但我无法理解的东西...
library(lme4)
library(tidyverse)
fit <- lm(Reaction ~ Days, sleepstudy)
summary(fit)
group_by(sleepstudy, Days) %>% summarise(means=mean(Reaction))
sleepstudy$Days_discrete <- as.factor(sleepstudy$Days)
fit2 <- lm(Reaction ~ Days_discrete, sleepstudy)
summary(fit2)
What am I missing?
fit1
不必在值为零的 Days
的平均值处穿过原点。如果 Days
具有线性效应,则这是最佳拟合线。请参阅 simple linear regression.
fit2
应该是由于 R 中的默认对比度设置。它也是如此
library(lme4)
tapply(sleepstudy$Reaction, sleepstudy$Days, mean)
0 1 2 3 4 5 6 7 8 9
#R> 256.6518 264.4958 265.3619 282.9920 288.6494 308.5185 312.1783 318.7506 336.6295 350.8512
fit1 <- lm(Reaction ~ Days, sleepstudy)
coef(fit1)
#R> (Intercept) Days
#R> 251.40510 10.46729
fit2 <- lm(Reaction ~ as.factor(Days), sleepstudy)
coef(fit2)
#R> (Intercept) as.factor(Days)1 as.factor(Days)2 as.factor(Days)3 as.factor(Days)4 as.factor(Days)5 as.factor(Days)6
#R> 256.651806 7.843950 8.710094 26.340206 31.997617 51.866650 55.526450
#R> as.factor(Days)7 as.factor(Days)8 as.factor(Days)9
#R> 62.098778 79.977700 94.199417