Come vengono calcolati gli errori standard dei coefficienti in una regressione?


114

Per la mia comprensione, sono interessato a replicare manualmente il calcolo degli errori standard dei coefficienti stimati poiché, ad esempio, viene fornito l'output della lm()funzione R, ma non sono stato in grado di fissarlo. Qual è la formula / implementazione utilizzata?


8
bella domanda, molte persone conoscono la regressione dal punto di vista dell'algebra lineare, dove risolvi l'equazione lineare e ottieni la risposta per la beta. Non è chiaro il motivo per cui abbiamo un errore standard e un presupposto dietro di esso. XXβ=Xy
Haitao Du

Risposte:


122

Il modello lineare è scritto come dove indica il vettore delle risposte, è il vettore dei parametri degli effetti fissi, è la matrice di progettazione corrispondente le cui colonne sono i valori delle variabili esplicative e è il vettore di errori casuali. y β X ϵ

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

È noto che una stima di è data da (fare riferimento, ad esempio, all'articolo di Wikipedia ) Quindi [promemoria: , per un vettore casuale e una matrice non casuale ]ß = ( X ' X ) - 1 x ' y . Var ( β ) = ( X ' X ) - 1 x 'β

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

in modo che dove può essere ottenuto con Mean Square Error (MSE) nella tabella ANOVA. σ 2

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

Esempio con una semplice regressione lineare in 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 
#----------------------

Quando esiste una singola variabile esplicativa, il modello si riduce a e modo che e le formule diventano più trasparenti. Ad esempio, l'errore standard della pendenza stimata è

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

Grazie per la risposta esaustiva. Quindi, presumo che l'ultima formula non valga nel caso multivariato?
ako,

1
No, l'ultima formula funziona solo per la matrice X specifica del modello lineare semplice. Nel caso multivariato, è necessario utilizzare la formula generale indicata sopra.
Ocram,

4
+1, una domanda veloce, come viene ? Var(β^)
avocado,

6
@loganecolss: Esso deriva dal fatto che , per un po' a caso vettore e alcuni non casuale matrice . X AVar(AX)=AVar(X)AXA
Ocram,

4
si noti che queste sono le risposte giuste per il calcolo manuale, ma l'implementazione effettiva utilizzata all'interno di lm.fit/ summary.lmè un po 'diversa, per stabilità ed efficienza ...
Ben Bolker

26

Le formule per queste possono essere trovate in qualsiasi testo intermedio sulle statistiche, in particolare, puoi trovarle in Sheather (2009, capitolo 5) , da cui viene preso anche il seguente esercizio (pagina 138).

Il seguente codice R calcola manualmente le stime dei coefficienti e i loro errori standard

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

che produce l'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

Confronta con l'output di lm():

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

che produce l'output:

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 

Bel trucco con la solve()funzione. Sarebbe un po 'più lungo senza l'algebra matriciale. Esiste un modo sintetico di eseguire quella linea specifica solo con operatori di base?
ako,

1
@AkselO Esiste l'espressione di forma chiusa nota per lo stimatore OLS, , che puoi calcolare calcolando esplicitamente l'inverso della matrice ( (come ha fatto @ ocram), ma questo diventa difficile con matrici mal condizionate. (X'X)β^=(XX)1XY(XX)
Tchakravarty,

0

Parte della risposta di Ocram è sbagliata. In realtà:

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

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

E il commento della prima risposta mostra che sono necessarie ulteriori spiegazioni sulla varianza del coefficiente:

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


modificare

Grazie, ho ignorato il cappello su quella beta. La detrazione sopra è . Il risultato corretto è:wronglywrong

1.(Per ottenere questa equazione, imposta la derivata del primo ordine di su uguale a zero, per massimizzare )β^=(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

Speriamo che aiuti.


1
La derivazione dello stimatore OLS per il vettore beta, , si trova in qualsiasi manuale di regressione decente. Alla luce di ciò, puoi fornire una prova che dovrebbe essere invece? β =( X ' X ) - 1 X ' Y -( X ' X ) - 1 X ' εβ^=(XX)1XYβ^=(XX)1Xy(XX)1Xϵ
gung

4
Il tuo non è nemmeno uno stimatore, perché non è osservabile! εβ^ϵ
whuber

Questo può anche essere visto in questo video: youtube.com/watch?v=jyBtfhQsf44
StatsStudent
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.