¿Cómo se calculan los errores estándar de los coeficientes en una regresión?

114

Según tengo entendido, estoy interesado en replicar manualmente el cálculo de los errores estándar de los coeficientes estimados ya que, por ejemplo, viene con el resultado de la lm()función R, pero no he podido precisarlo. ¿Cuál es la fórmula / implementación utilizada?

ako
fuente
8
buena pregunta, muchas personas conocen la regresión desde el punto de vista del álgebra lineal, donde resuelves la ecuación lineal XXβ=Xy y obtienes la respuesta para beta. No está claro por qué tenemos un error estándar y una suposición detrás.
Haitao Du

Respuestas:

122

El modelo lineal se escribe como donde denota el vector de respuestas, es el vector de los parámetros de efectos fijos, es la matriz de diseño correspondiente cuyas columnas son los valores de las variables explicativas, y es el vector de errores aleatorios.

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

Es bien sabido que una estimación de viene dada por (consulte, por ejemplo, el artículo de Wikipedia ) Por lo tanto, [recordatorio: , para algunos vectores aleatorios y algunas matrices no aleatorias ]β

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

para que donde se puede obtener por el error cuadrático medio (MSE) en la tabla ANOVA.

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

Ejemplo con una regresión lineal simple en 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 
#----------------------

Cuando hay una sola variable explicativa, el modelo se reduce a y para que y las fórmulas se vuelven más transparentes. Por ejemplo, el error estándar de la pendiente estimada es

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
ocram
fuente
Gracias por la respuesta completa. Entonces, supongo que la última fórmula no se cumple en el caso multivariante.
ako
1
No, la última fórmula solo funciona para la matriz X específica del modelo lineal simple. En el caso multivariante, debe usar la fórmula general dada anteriormente.
ocram
44
+1, una pregunta rápida, ¿cómo viene ? Var(β^)
aguacate
66
@loganecolss: viene del hecho de que , por alguna vector aleatorio y alguna matriz no aleatoria . Var(AX)=AVar(X)AXA
ocram
44
tenga en cuenta que estas son las respuestas correctas para el cálculo manual, pero la implementación real utilizada dentro de lm.fit/ summary.lmes un poco diferente, para la estabilidad y la eficiencia ...
Ben Bolker
26

Las fórmulas para estos se pueden encontrar en cualquier texto intermedio sobre estadísticas, en particular, puede encontrarlas en Sheather (2009, Capítulo 5) , de donde también se toma el siguiente ejercicio (página 138).

El siguiente código R calcula las estimaciones de coeficientes y sus errores estándar manualmente

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

que produce la salida

                         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

Compare con la salida de lm():

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

que produce la salida:

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 
tchakravarty
fuente
Buen truco con la solve()función. Esto sería bastante más largo sin el álgebra matricial. ¿Hay una manera sucinta de realizar esa línea específica con solo operadores básicos?
ako
1
@AkselO Existe la conocida expresión de forma cerrada para el estimador OLS, , que puede calcular calculando explícitamente el inverso de la matriz ( (como lo ha hecho @ ocram), pero esto se vuelve complicado con matrices mal acondicionadas. β^=(XX)1XY(XX)
tchakravarty
0

Parte de la respuesta de Ocram es incorrecta. Realmente:

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

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

Y el comentario de la primera respuesta muestra que se necesita más explicación de la varianza del coeficiente:

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


Editar

Gracias, ignoré el sombrero en esa beta. La deducción anterior es . El resultado correcto es:wronglywrong

1.(Para obtener esta ecuación, establezca la derivada de primer orden de en igual a cero, para maximizar )β^=(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

Espero que ayude.

Linzhe Nie
fuente
1
La derivación del estimador OLS para el vector beta, , se encuentra en cualquier libro de texto de regresión decente. A la luz de eso, ¿puede proporcionar una prueba de que debería ser lugar? β^=(XX)1XYβ^=(XX)1Xy(XX)1Xϵ
gung
44
¡Tu ni siquiera es un estimador, porque no es observable! β^ϵ
whuber
Esto también se puede ver en este video: youtube.com/watch?v=jyBtfhQsf44
StatsStudent