Bagaimana kesalahan standar koefisien dihitung dalam regresi?

114

Untuk pemahaman saya sendiri, saya tertarik untuk secara manual mereplikasi perhitungan kesalahan standar estimasi koefisien sebagai, misalnya, datang dengan output dari lm()fungsi R, tetapi belum dapat menjabarkannya. Apa formula / implementasi yang digunakan?

ako
sumber
8
pertanyaan yang bagus, banyak orang tahu regresi dari sudut pandang aljabar linier, di mana Anda menyelesaikan persamaan linear dan mendapatkan jawaban untuk beta. Tidak jelas mengapa kami memiliki kesalahan standar dan asumsi di baliknya. XXβ=Xy
Haitao Du

Jawaban:

122

Model linier ditulis sebagai di mana menunjukkan vektor respons, adalah vektor parameter efek tetap, adalah matriks desain yang sesuai yang kolomnya adalah nilai-nilai variabel penjelas, dan adalah vektor kesalahan acak. y β X ϵ

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

Sudah diketahui bahwa perkiraan diberikan oleh (merujuk, misalnya, ke artikel wikipedia ) Karenanya [pengingat: , untuk beberapa vektor acak dan beberapa matriks non-acak ]ß = ( 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

sehingga mana dapat diperoleh dengan Mean Square Error (MSE) di tabel ANOVA.

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

Contoh dengan regresi linier sederhana dalam 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 
#----------------------

Ketika ada variabel penjelas tunggal, model berkurang menjadi dan sehingga dan rumus menjadi lebih transparan. Misalnya, kesalahan standar perkiraan kemiringan adalah

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
okram
sumber
Terima kasih atas jawabannya. Jadi, saya anggap formula terakhir tidak berlaku dalam kasus multivarian?
ako
1
Tidak, rumus terakhir hanya berfungsi untuk matriks X spesifik dari model linier sederhana. Dalam kasus multivarian, Anda harus menggunakan rumus umum yang diberikan di atas.
ocram
4
+1, pertanyaan singkat, bagaimana muncul? Var(β^)
alpukat
6
@loganecolss: Ini berasal dari fakta bahwa , untuk beberapa vektor acak dan beberapa non-acak matriks . Var(AX)=AVar(X)AXA
ocram
4
perhatikan bahwa ini adalah jawaban yang tepat untuk perhitungan tangan, tetapi implementasi aktual yang digunakan dalam lm.fit/ summary.lmsedikit berbeda, untuk stabilitas dan efisiensi ...
Ben Bolker
26

Rumus untuk ini dapat ditemukan dalam teks perantara pada statistik, khususnya, Anda dapat menemukannya di Sheather (2009, Bab 5) , dari mana latihan berikut juga diambil (halaman 138).

Kode R berikut menghitung estimasi koefisien dan kesalahan standarnya secara manual

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

yang menghasilkan 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

Bandingkan dengan output dari lm():

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

yang menghasilkan 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 
tchakravarty
sumber
Trik yang bagus dengan solve()fungsinya. Ini akan menjadi sedikit lebih lama tanpa aljabar matriks. Apakah ada cara ringkas untuk melakukan saluran tertentu hanya dengan operator dasar?
ako
1
@AkselO Ada ekspresi bentuk tertutup yang terkenal untuk penaksir OLS, , yang dapat Anda hitung dengan secara eksplisit menghitung kebalikan dari matriks ( (seperti yang telah dilakukan @ ocram), tetapi ini menjadi rumit dengan matriks yang dikondisikan dengan buruk. β^=(XX)1XY(XX)
tchakravarty
0

Sebagian dari jawaban Ocram salah. Sebenarnya:

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

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

Dan komentar dari jawaban pertama menunjukkan bahwa diperlukan lebih banyak penjelasan tentang varian koefisien:

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


Sunting

Terima kasih, saya mengabaikan topi versi beta itu. Pengurangan di atas adalah . Hasil yang benar adalah:wronglywrong

1.(Untuk mendapatkan persamaan ini, tetapkan turunan urutan pertama dari pada sama dengan nol, untuk memaksimalkan )β^=(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

Semoga bermanfaat.

Linzhe Nie
sumber
1
Derivasi estimator OLS untuk vektor beta, , ditemukan dalam setiap buku teks regresi yang layak. Sehubungan dengan itu, dapatkah Anda memberikan bukti bahwa itu harus sebagai gantinya? β =(X'X)-1X'y-(X'X)-1X'εβ^=(XX)1XYβ^=(XX)1Xy(XX)1Xϵ
gung
4
Anda bahkan tidak estimator, karena tidak bisa diamati! εβ^ϵ
whuber
Ini juga dapat dilihat di video ini: youtube.com/watch?v=jyBtfhQsf44
StatsStudent