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. X′Xβ=X′y
— 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 'β

β^=(X′X)−1X′y.
Var ( A X ) = A × Var ( X ) × A ′ X A
Var(β^)=(X′X)−1X′σ2IX(X′X)−1=σ2(X′X)−1,
Var(AX)=A×Var(X)×A′XA

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

Var^(β^)=σ^2(X′X)−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=(1x11x2⋮⋮1xn),β=(ab)
(X′X)−1=1n∑xi2−(∑xi)2(∑xi2−∑xi−∑xin)
Var^(b^)=[σ^2(X′X)−1]22=nσ^2n∑xi2−(∑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)A′XA
— 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)β^=(X′X)−1XY(X′X)
— Tchakravarty,

0

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

β^=(X′X)−1X′y−(X′X)−1X′ϵ.

E(β^)=(X′X)−1X′y.

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

Var(β^)=E(β^−E(β^))2=Var(−(X′X)−1X′ϵ)=(X′X)−1X′σ2IX(X′X)−1=σ2(X′X)−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 )β^=(X′X)−1X′y.SSRβSSR

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

3.Var(β^)=E(β^−E(β^|X))2=Var((X′X)−1X′ϵ)=(X′X)−1X′σ2IX(X′X)−1=σ2(X′X)−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 ' εβ^=(X′X)−1X′Yβ^=(X′X)−1X′y−(X′X)−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.