假设我们有如下数据:
set.seed(1)
b0 <- 0 # intercept
b1 <- 1 # slope
x <- c(1:100) # predictor variable
y <- b0 + b1*x + rnorm(n = 100, mean = 0, sd = 200) # predicted variable
我们拟合一个简单的线性模型:
mod.1 <- lm(y~x)
summary(mod.1)
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 26.3331 36.3795 0.724 0.471
# x 0.9098 0.6254 1.455 0.149
b0.est <- summary(mod.1)$coefficients[1,1]
b1.est <- summary(mod.1)$coefficients[2,1]
还有一个模型,我们(1)从数据集中减去第一个模型中的截距项拟合,(2)防止截距项拟合(或者换句话说,强制模型通过零):
mod.2 <- lm(y - b0.est ~ 0 + x)
summary(mod.2)
# Estimate Std. Error t value Pr(>|t|)
# x 0.9098 0.3088 2.946 0.00401 **
b1.est.2 <- summary(mod.2)$coefficients[1,1]
正如所料,斜率参数保持不变(0.9098)。
然而,虽然斜率参数在第一个模型中不显着,但在第二个模型中是显着的(第二个模型中估计的标准误差远低于第一个模型,0.3088 对 0.6254)。
两个模型中的数据形状相同,两个模型估计的斜率参数相同。第二个模型如何对斜率参数估计更加“确定”?
或者换句话说,这些标准误差是如何计算的?
使用我在这里找到的标准误差方程,我以这种方式计算了模型 1 和 2 的标准误差:
# Model 1
DF <- length(x)-2
y.est <- b0.est + b1.est*x
numerator <- sqrt(sum((y - y.est)^2)/DF)
denominator <- sqrt(sum((x - mean(x))^2))
numerator/denominator
# SE = 0.6254
这与 R 输出相匹配。
# Model 2
DF <- length(x)-1
y.est <- b1.est.2*x
numerator <- sqrt(sum((y - (y.est+b0.est))^2)/DF)
denominator <- sqrt(sum((x - mean(x))^2))
numerator/denominator
# SE = 0.6223
这与 SE = 0.3088 的 R 输出不匹配。
我错过了什么?