回归中如何计算系数的标准误差?


114

就我自己的理解而言,我有兴趣手动复制估算系数的标准误差的计算,例如,该lm()函数的输出随in一起提供R,但无法将其固定下来。使用的公式/实现是什么?


8
很好的问题,很多人从线性代数的角度了解回归,在这里您可以求解线性方程并获得beta的答案。尚不清楚为什么我们会有标准错误和假设。XXβ=Xy
海涛杜

Answers:


122

线性模型写为 其中表示响应的向量,是固定效果参数的向量,是相应的设计矩阵,其列是解释变量的值,而是随机错误的向量。

|y=Xβ+ϵϵN(0,σ2I),
yβXϵ

众所周知,的估算是由(例如,参考维基百科的文章) 因此 [提醒:,对于某些随机向量和某些非随机矩阵 ]β

β^=(XX)1Xy.
Var(β^)=(XX)1Xσ2IX(XX)1=σ2(XX)1,
Var(AX)=A×Var(X)×AXA

这样 其中可以通过ANOVA表中的均方误差(MSE)获得。

Var^(β^)=σ^2(XX)1,
σ^2

R中的简单线性回归示例

#------generate one data set with epsilon ~ N(0, 0.25)------
seed <- 1152 #seed
n <- 100     #nb of observations
a <- 5       #intercept
b <- 2.7     #slope

set.seed(seed)
epsilon <- rnorm(n, mean=0, sd=sqrt(0.25))
x <- sample(x=c(0, 1), size=n, replace=TRUE)
y <- a + b * x + epsilon
#-----------------------------------------------------------

#------using lm------
mod <- lm(y ~ x)
#--------------------

#------using the explicit formulas------
X <- cbind(1, x)
betaHat <- solve(t(X) %*% X) %*% t(X) %*% y
var_betaHat <- anova(mod)[[3]][2] * solve(t(X) %*% X)
#---------------------------------------

#------comparison------
#estimate
> mod$coef
(Intercept)           x 
   5.020261    2.755577 

> c(betaHat[1], betaHat[2])
[1] 5.020261 2.755577

#standard error
> summary(mod)$coefficients[, 2]
(Intercept)           x 
 0.06596021  0.09725302 

> sqrt(diag(var_betaHat))
                    x 
0.06596021 0.09725302 
#----------------------

当只有一个解释变量时,模型简化为 和 这样 ,公式变得更加透明。例如,估计坡度的标准误差为

yi=a+bxi+ϵi,i=1,,n
X=(1x11x21xn),β=(ab)
(XX)1=1nxi2(xi)2(xi2xixin)
Var^(b^)=[σ^2(XX)1]22=nσ^2nxi2(xi)2.
> num <- n * anova(mod)[[3]][2]
> denom <- n * sum(x^2) - sum(x)^2
> sqrt(num / denom)
[1] 0.09725302

感谢您的详尽回答。因此,我认为在多变量情况下,最后一个公式不成立?
2012年

1
不,最后一个公式仅适用于简单线性模型的特定X矩阵。在多变量情况下,您必须使用上面给出的通用公式。
ocram

4
+1,一个简单的问题,来?Var(β^)
鳄梨

6
@loganecolss:对于某些随机向量和某些非随机矩阵它来自的事实。Var(AX)=AVar(X)AXA
ocram 2014年

4
请注意,这些是手动计算的正确答案,但出于稳定性和效率的考虑,在lm.fit/中使用的实际实现方式summary.lm略有不同...
Ben Bolker

26

这些公式可以在统计的任何中间文本中找到,尤其是可以在Sheather(2009,第5章)中找到它们,并从中进行以下练习(第138页)。

以下R代码手动计算系数估计值及其标准误差

dfData <- as.data.frame(
  read.csv("http://www.stat.tamu.edu/~sheather/book/docs/datasets/MichelinNY.csv",
                   header=T))

# using direct calculations
vY <- as.matrix(dfData[, -2])[, 5]                        # dependent variable
mX <- cbind(constant = 1, as.matrix(dfData[, -2])[, -5])  # design matrix

vBeta <- solve(t(mX)%*%mX, t(mX)%*%vY)                    # coefficient estimates
dSigmaSq <- sum((vY - mX%*%vBeta)^2)/(nrow(mX)-ncol(mX))  # estimate of sigma-squared
mVarCovar <- dSigmaSq*chol2inv(chol(t(mX)%*%mX))          # variance covariance matrix
vStdErr <- sqrt(diag(mVarCovar))                          # coeff. est. standard errors
print(cbind(vBeta, vStdErr))                              # output

产生输出

                         vStdErr
constant   -57.6003854 9.2336793
InMichelin   1.9931416 2.6357441
Food         0.2006282 0.6682711
Decor        2.2048571 0.3929987
Service      3.0597698 0.5705031

与以下输出进行比较lm()

# using lm()
names(dfData)
summary(lm(Price ~ InMichelin + Food + Decor + Service, data = dfData))

产生输出:

Call:
lm(formula = Price ~ InMichelin + Food + Decor + Service, data = dfData)

Residuals:
    Min      1Q  Median      3Q     Max 
-20.898  -5.835  -0.755   3.457 105.785 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -57.6004     9.2337  -6.238 3.84e-09 ***
InMichelin    1.9931     2.6357   0.756    0.451    
Food          0.2006     0.6683   0.300    0.764    
Decor         2.2049     0.3930   5.610 8.76e-08 ***
Service       3.0598     0.5705   5.363 2.84e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 13.55 on 159 degrees of freedom
Multiple R-squared: 0.6344, Adjusted R-squared: 0.6252 
F-statistic: 68.98 on 4 and 159 DF,  p-value: < 2.2e-16 

solve()功能不错。如果没有矩阵代数,这会更长一些。仅使用基本运算符就可以执行该特定行的简洁方法吗?
2012年

1
@AkselO OLS估计量有一个众所周知的封闭形式表达式,,可以通过显式计算矩阵的逆来进行计算(如@ ocram所做的那样),但这在条件不佳的矩阵上会比较棘手。β^=(XX)1XY(XX)
tchakravarty 2012年

0

Ocram的部分答案是错误的。其实:

β^=(XX)1Xy(XX)1Xϵ.

E(β^)=(XX)1Xy.

第一个答案的注释表明,需要更多解释系数方差:

Var(β^)=E(β^E(β^))2=Var((XX)1Xϵ)=(XX)1Xσ2IX(XX)1=σ2(XX)1


编辑

谢谢,我忽略了该Beta版的帽子。上面的推导是。正确的结果是:wronglywrong

1.(要获得该方程,请将上的的一阶导数设置为零,以使最大化)β^=(XX)1Xy.SSRβSSR

2.E(β^|X)=E((XX)1X(Xβ+ϵ)|X)=β+((XX)1X)E(ϵ|X)=β.

3.Var(β^)=E(β^E(β^|X))2=Var((XX)1Xϵ)=(XX)1Xσ2IX(XX)1=σ2(XX)1

希望它会有所帮助。


1
在任何体面的回归教科书中都可以找到针对beta向量的OLS估计量。有鉴于此,您能否提供证明它应该是代替?β^=(XX)1XYβ^=(XX)1Xy(XX)1Xϵ
gung

4
您的甚至都不是估计量,因为不可观察!β^ϵ
whuber

也可以在以下视频中查看: youtube.com/watch?
v=jyBtfhQsf44
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.