Interval prediksi bootstrap

29

Apakah ada teknik bootstrap yang tersedia untuk menghitung interval prediksi untuk prediksi titik yang diperoleh misalnya dari regresi linier atau metode regresi lainnya (k-tetangga terdekat, pohon regresi dll)?

Entah bagaimana saya merasa bahwa cara yang kadang-kadang diusulkan untuk hanya menghapus prediksi titik (lihat misalnya interval prediksi untuk regresi kNN ) tidak memberikan interval prediksi tetapi interval kepercayaan.

Contoh dalam R

# STEP 1: GENERATE DATA

set.seed(34345)

n <- 100 
x <- runif(n)
y <- 1 + 0.2*x + rnorm(n)
data <- data.frame(x, y)


# STEP 2: COMPUTE CLASSIC 95%-PREDICTION INTERVAL
fit <- lm(y ~ x)
plot(fit) # not shown but looks fine with respect to all relevant aspects

# Classic prediction interval based on standard error of forecast
predict(fit, list(x = 0.1), interval = "p")
# -0.6588168 3.093755

# Classic confidence interval based on standard error of estimation
predict(fit, list(x = 0.1), interval = "c")
# 0.893388 1.54155


# STEP 3: NOW BY BOOTSTRAP
B <- 1000
pred <- numeric(B)
for (i in 1:B) {
  boot <- sample(n, n, replace = TRUE)
  fit.b <- lm(y ~ x, data = data[boot,])
  pred[i] <- predict(fit.b, list(x = 0.1))
}
quantile(pred, c(0.025, 0.975))
# 0.8699302 1.5399179

Jelas, interval bootstrap dasar 95% cocok dengan interval kepercayaan 95%, bukan interval prediksi 95%. Jadi pertanyaan saya: Bagaimana cara melakukannya dengan benar?

Michael M.
sumber
Setidaknya dalam kasus kuadrat terkecil biasa, Anda akan membutuhkan lebih dari sekadar prediksi titik; Anda ingin menggunakan kesalahan residual yang diperkirakan untuk membuat interval prediksi juga.
Kodiologist
@duplo: terima kasih telah menunjukkan ini. Panjang interval prediksi klasik yang benar adalah bergantung langsung pada asumsi normalitas istilah kesalahan, jadi jika terlalu optimis, maka tentunya versi bootstrap akan jika diturunkan dari sana. Saya ingin tahu apakah ada metode bootstrap umum yang bekerja dalam regresi (tidak harus OLS).
Michael M
1
Saya pikir \ textit {konformal inferensi} dapat menjadi apa yang Anda inginkan, yang memungkinkan Anda membuat interval prediksi berdasarkan resampling yang memiliki cakupan sampel terbatas yang valid, dan tidak terlalu banyak menutupi. Ada sebuah makalah yang bagus yang tersedia di arxiv.org/pdf/1604.04173.pdf , yang mungkin dibaca sebagai pengantar topik, dan paket R yang tersedia dari github.com/ryantibs/conformal .
Simon Boge Brant

Jawaban:

26

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=(XX)1XY

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

YN+1p=XN+1β^OLS

Kesalahan perkiraan yang dibuat oleh prediksi ini adalah:

eN+1p=YN+1YN+1p

Kita dapat menulis ulang persamaan ini seperti:

YN+1=YN+1p+eN+1p

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 NYN+1pYN+15th95theN+1pe5,e95.[YN+1p+e5,YN+1p+e95]

Bagaimana cara memperkirakan kuantil / persentil dari ? Kita bisa menulis: e p N + 1eN+1p

eN+1p=YN+1YN+1p=XN+1β+ϵN+1XN+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.eN+1peN+1p5th95th500th9,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ϵiYi=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{e1,e2,,eN}{s1s¯,s2s¯,,sNs¯}, varians-residuals yang dikoreksi, di mana danhiadalah leverage dari pengamatani.si=ei/(1hi)hii

Dan, akhirnya, algoritma untuk membuat interval prediksi 90% untuk , mengingat bahwa X adalah X N + 1 adalah:YN+1XXN+1

  1. Membuat prediksi .YN+1p=XN+1β^OLS
  2. Buat residu yang disesuaikan dengan varians, , di mana s i = e i / {s1s¯,s2s¯,,sNs¯}.si=ei/(1hi)
  3. 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=(XX)1XY
    • Dapatkan sisa bootstrap dari replikasi ini, er=YXβr
    • Hitung residu yang disesuaikan dengan varian bootstrap dari replikasi ini, ss¯
    • Menarik salah satu bootstrap varians-disesuaikan residual dari replikasi ini, ϵN+1,r
    • eN+1perp=XN+1(β^OLSβr)+ϵN+1,r
  4. 5th95theN+1pe5,e95
  5. YN+1[YN+1p+e5,YN+1p+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))
Bill
sumber
Thank you for the useful, detailed explanations. Following these lines, I think that a general technique outside OLS (tree based techniques, nearest neighbour etc.) wont be easily available, right?
Michael M
1
There is this one for random forests: stats.stackexchange.com/questions/49750/… which sounds similar.
Bill
As far as I can tell, if you abstract Xβ to f(X,θ), this technique works for any model.
shadowtalker
How do you generalise the "variance adjusted residuals" - the OLS approach relies on the leverage - is there a leverage calculation for an arbitrary f(X) estimator?
David Waterworth