Metode yang dijelaskan di bawah ini adalah yang dijelaskan dalam Bagian 6.3.3 dari Davidson dan Hinckley (1997),
Metode Bootstrap dan Penerapannya . Terima kasih untuk Glen_b dan komentarnya di sini . Mengingat ada beberapa pertanyaan tentang Cross yang divalidasi pada topik ini, saya pikir itu layak ditulis.
Model regresi linier adalah:
Yi=Xiβ+ϵi
Kami memiliki data, , yang kita gunakan untuk memperkirakan β sebagai:
β OLSi=1,2,…,Nβ
β^OLS=(X′X)−1X′Y
Sekarang, kami ingin memprediksi apa yang akan menjadi untuk titik data baru, mengingat bahwa kami tahu X untuk itu. Ini adalah masalah prediksi. Mari panggilan baru X (yang kita tahu) X N + 1 dan baru Y (yang kita ingin memprediksi), Y N + 1 . Prediksi yang biasa (jika kita mengasumsikan bahwa ϵ i adalah iid dan tidak berkorelasi dengan X ) adalah:
Y p N + 1YXXXN+1YYN+1ϵiX
YpN+1=XN+1β^OLS
Kesalahan perkiraan yang dibuat oleh prediksi ini adalah:
epN+1=YN+1−YpN+1
Kita dapat menulis ulang persamaan ini seperti:
YN+1=YpN+1+epN+1
Sekarang, kita sudah dihitung. Jadi, jika kita ingin terikat Y N + 1 di interval, katakanlah, 90% dari waktu, semua yang perlu kita lakukan adalah perkiraan konsisten 5 t h dan 95 t h persentil / quantiles dari e p N + 1 , panggilan mereka e 5 , e 95 , dan interval prediksi akan [ Y p N + 1 + e 5 , Y p NYpN+1YN+15th95thepN+1e5,e95.[YpN+1+e5,YpN+1+e95]
Bagaimana cara memperkirakan kuantil / persentil dari ? Kita bisa menulis:
e p N + 1epN+1
epN+1=YN+1−YpN+1=XN+1β+ϵN+1−XN+1β^OLS=XN+1(β−β^OLS)+ϵN+1
Strateginya adalah dengan mengambil sampel (dengan cara bootstrap) berkali-kali dari dan kemudian menghitung persentil dengan cara biasa. Jadi, mungkin kita akan sampel 10.000 kali dari e p N + 1 , dan kemudian perkirakan persentil 5 t jam dan 95 t jam sebagai 500 t jam dan 9 , 500 t jam anggota terkecil dari sampel.epN+1epN+15th95th500th9,500th
Untuk menggambar pada , kita dapat bootstrap kesalahan (kasus akan baik-baik saja, juga, tapi kita mengasumsikan kesalahan iid pula). Jadi, pada setiap replikasi bootstrap, Anda menggambar N kali dengan penggantian dari residual variance-disesuaikan (lihat butir berikutnya) untuk mendapatkan ε * i , kemudian membuat yang baru Y * i = X i β OLS + ε * i , kemudian jalankan OLS pada dataset baru, ( Y ∗ , X )XN+1(β−β^OLS)Nϵ∗iY∗i=Xiβ^OLS+ϵ∗i(Y∗,X)untuk mendapatkan replikasi ini . Akhirnya, hasil imbang ini replikasi pada X N + 1 ( β - β OLS ) adalah X N + 1 ( β OLS - β * r )β∗rXN+1(β−β^OLS)XN+1(β^OLS−β∗r)
Mengingat kita mengasumsikan iid , cara alami untuk mengambil sampel dari bagian ϵ N + 1 dari persamaan adalah dengan menggunakan residu yang kita miliki dari regresi, { e ∗ 1 , e ∗ 2 , ... , e ∗ N } . Residual memiliki varian yang berbeda dan umumnya terlalu kecil, jadi kami ingin mengambil sampel dari { s 1 - ¯ s , s 2 - ¯ s , ... , s N - ¯ s }ϵϵN+1{e∗1,e∗2,…,e∗N}{s1−s¯¯¯,s2−s¯¯¯,…,sN−s¯¯¯}, varians-residuals yang dikoreksi, di mana danhiadalah leverage dari pengamatani.si=e∗i/(1−hi)−−−−−−√hii
Dan, akhirnya, algoritma untuk membuat interval prediksi 90% untuk , mengingat bahwa X adalah X N + 1 adalah:YN+1XXN+1
- Membuat prediksi .YpN+1=XN+1β^OLS
- Buat residu yang disesuaikan dengan varians, , di mana s i = e i / √{s1−s¯¯¯,s2−s¯¯¯,…,sN−s¯¯¯}.si=ei/(√1−hi)
- Untuk replikasi :
r=1,2,…,R
- Gambar kali pada residu yang disesuaikan untuk membuat resid bootstrap
{ ϵ ∗ 1 , ϵ ∗ 2 , … , ϵ ∗ N }N{ϵ∗1,ϵ∗2,…,ϵ∗N}
- Menghasilkan bootstrap Y∗=Xβ^OLS+ϵ∗
- Hitung estimator bootstrap OLS untuk replikasi ini,
β∗r=(X′X)−1X′Y∗
- Dapatkan sisa bootstrap dari replikasi ini, e∗r=Y∗−Xβ∗r
- Hitung residu yang disesuaikan dengan varian bootstrap dari replikasi ini, s∗−s∗¯¯¯¯¯
- Menarik salah satu bootstrap varians-disesuaikan residual dari replikasi ini, ϵ∗N+1,r
- epN+1ep∗r=XN+1(β^OLS−β∗r)+ϵ∗N+1,r
- 5th95thepN+1e5,e95
- YN+1[YpN+1+e5,YpN+1+e95].
Here is R
code:
# This script gives an example of the procedure to construct a prediction interval
# for a linear regression model using a bootstrap method. The method is the one
# described in Section 6.3.3 of Davidson and Hinckley (1997),
# _Bootstrap Methods and Their Application_.
#rm(list=ls())
set.seed(12344321)
library(MASS)
library(Hmisc)
# Generate bivariate regression data
x <- runif(n=100,min=0,max=100)
y <- 1 + x + (rexp(n=100,rate=0.25)-4)
my.reg <- lm(y~x)
summary(my.reg)
# Predict y for x=78:
y.p <- coef(my.reg)["(Intercept)"] + coef(my.reg)["x"]*78
y.p
# Create adjusted residuals
leverage <- influence(my.reg)$hat
my.s.resid <- residuals(my.reg)/sqrt(1-leverage)
my.s.resid <- my.s.resid - mean(my.s.resid)
reg <- my.reg
s <- my.s.resid
the.replication <- function(reg,s,x_Np1=0){
# Make bootstrap residuals
ep.star <- sample(s,size=length(reg$residuals),replace=TRUE)
# Make bootstrap Y
y.star <- fitted(reg)+ep.star
# Do bootstrap regression
x <- model.frame(reg)[,2]
bs.reg <- lm(y.star~x)
# Create bootstrapped adjusted residuals
bs.lev <- influence(bs.reg)$hat
bs.s <- residuals(bs.reg)/sqrt(1-bs.lev)
bs.s <- bs.s - mean(bs.s)
# Calculate draw on prediction error
xb.xb <- coef(my.reg)["(Intercept)"] - coef(bs.reg)["(Intercept)"]
xb.xb <- xb.xb + (coef(my.reg)["x"] - coef(bs.reg)["x"])*x_Np1
return(unname(xb.xb + sample(bs.s,size=1)))
}
# Do bootstrap with 10,000 replications
ep.draws <- replicate(n=10000,the.replication(reg=my.reg,s=my.s.resid,x_Np1=78))
# Create prediction interval
y.p+quantile(ep.draws,probs=c(0.05,0.95))
# prediction interval using normal assumption
predict(my.reg,newdata=data.frame(x=78),interval="prediction",level=0.90)
# Quick and dirty Monte Carlo to see which prediction interval is better
# That is, what are the 5th and 95th percentiles of Y_{N+1}
#
# To do it properly, I guess we would want to do the whole procedure above
# 10,000 times and then see what percentage of the time each prediction
# interval covered Y_{N+1}
y.np1 <- 1 + 78 + (rexp(n=10000,rate=0.25)-4)
quantile(y.np1,probs=c(0.05,0.95))