Wie werden die Standardfehler von Koeffizienten in einer Regression berechnet?


114

Nach meinem eigenen Verständnis bin ich daran interessiert, die Berechnung der Standardfehler der geschätzten Koeffizienten manuell zu wiederholen, da sie beispielsweise mit der Ausgabe der lm()Funktion einhergehen R, diese aber nicht festhalten können. Was ist die Formel / Implementierung verwendet?


8
Gute Frage, viele Leute kennen die Regression aus der Sicht der linearen Algebra, wo Sie die lineare Gleichung und die Antwort für beta erhalten. Unklar, warum wir Standardfehler und Annahme dahinter haben. XXβ=Xy
Haitao Du

Antworten:


122

Das lineare Modell wird als Dabei bezeichnet den Vektor der Antworten, den Vektor der Parameter für feste Effekte, die entsprechende Entwurfsmatrix, deren Spalten die Werte der erklärenden Variablen sind, und ist der Vektor zufälliger Fehler. Y β X ε

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

Es ist bekannt, dass eine Schätzung von gegeben ist durch (siehe z. B. den Wikipedia-Artikel ) Also [Erinnerung: , für einen zufälligen Vektor und eine nicht zufällige Matrix ]& bgr; = ( X ' X ) - 1 X ' y . Var ( β ) = ( X ' X ) - 1 X 'β

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

so dass wobei durch den Mean Square Error (MSE) in der ANOVA-Tabelle erhalten werden kann.

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

Beispiel mit einer einfachen linearen Regression 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 
#----------------------

Wenn es eine einzelne erklärende Variable gibt, reduziert sich das Modell auf und so dass und Formeln werden transparenter. Beispielsweise ist der Standardfehler der geschätzten Steigung

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

Danke für die gründliche Antwort. Also nehme ich an, die letzte Formel gilt nicht für den multivariaten Fall?
Ako

1
Nein, die letzte Formel funktioniert nur für die spezifische X-Matrix des einfachen linearen Modells. Im multivariaten Fall müssen Sie die oben angegebene allgemeine Formel verwenden.
2.

4
+1, eine kurze Frage, wie kommt ? Var(β^)
Avocado

6
@loganecolss: Es kommt von der Tatsache , dass , für einige Zufallsvektor und einige nicht-Zufallsmatrix . X AVar(AX)=AVar(X)AXA
9.

4
Beachten Sie, dass dies die richtigen Antworten für die Handberechnung sind, die tatsächliche Implementierung in lm.fit/ summary.lmjedoch aus
Ben Bolker

26

Die Formeln hierfür finden Sie in jedem Zwischentext zur Statistik, insbesondere finden Sie sie in Sheather (2009, Kapitel 5) , aus dem auch die folgende Übung stammt (Seite 138).

Der folgende R-Code berechnet die Koeffizientenschätzungen und ihre Standardfehler manuell

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

was die Ausgabe erzeugt

                         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

Vergleichen Sie mit der Ausgabe von lm():

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

was die Ausgabe erzeugt:

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 

Netter Trick mit der solve()Funktion. Dies wäre ohne die Matrixalgebra viel länger. Gibt es eine prägnante Möglichkeit, diese bestimmte Zeile nur mit Basisoperatoren auszuführen?
Ako

1
@AkselO Es gibt den bekannten Ausdruck in geschlossener Form für den OLS-Schätzer: , das Sie berechnen können, indem Sie die Inverse der -Matrix explizit berechnen (wie es @ ocram getan hat), aber dies wird mit schlecht konditionierten Matrizen schwierig. β^=(XX)1XY(XX)
Tschakravarty

0

Ein Teil von Ocrams Antwort ist falsch. Tatsächlich:

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

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

Der Kommentar der ersten Antwort zeigt, dass weitere Erklärungen zur Varianz des Koeffizienten erforderlich sind:

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


Bearbeiten

Danke, ich habe den Hut auf dieser Beta zu ignoriert. Der obige Abzug ist . Das richtige Ergebnis ist:wronglywrong

1.(Um diese Gleichung zu erhalten, setzen Sie die Ableitung erster Ordnung von auf auf Null, um zu maximieren. )β^=(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

Hoffentlich hilft es.


1
Die Herleitung des OLS-Schätzers für den Beta-Vektor, , findet sich in jedem anständigen Regressionslehrbuch. Können Sie vor diesem Hintergrund den Beweis erbringen, dass es sich um stattdessen? β =(X'X)-1X'y-(X'X)-1X'εβ^=(XX)1XYβ^=(XX)1Xy(XX)1Xϵ
Gung

4
Ihr ist nicht einmal ein Schätzer, weil nicht beobachtbar ist! & egr;β^ϵ
Whuber

Dies kann auch in diesem Video angesehen werden: youtube.com/watch?v=jyBtfhQsf44
StatsStudent
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.