Aşağıda ortaya konan yöntem, Davidson ve Hinckley (1997), Bölüm 6.3.3, Bootstrap Yöntemleri ve Uygulamaları bölümünde tarif edilen yöntemdir
. Glen_b ve onun yorumuna teşekkürler burada . Bu konuyla ilgili Validated Cross hakkında birkaç soru olduğu göz önüne alındığında, yazmaya değeceğini düşündüm.
Doğrusal regresyon modeli:
Yi=Xiβ+ϵi
olarak tahmin etmek için kullandığımız verisine sahibiz :
i=1,2,…,Nβ
β^OLS=(X′X)−1X′Y
Şimdi, ne tahmin etmek istiyorum bildiğimiz düşünülürse, yeni bir veri noktası için olacak bunun için. Bu tahmin sorunudur. Yeni (bildiğimiz) ve yeni (tahmin etmek istediğimiz), . Genel tahmin ( kimliğini ve ile ilişkisini koruduğunu varsayarsak ):
X, X, X , N + 1 , Y -Y , N + 1 ε i X, Y, p , N + 1YXXXN+1YYN+1ϵiX
YpN-+ 1= XN-+ 1β^EKK
Bu tahmin tarafından yapılan tahmin hatası:
epN-+ 1= YN-+ 1- YpN-+ 1
Bu denklemi şu şekilde yeniden yazabiliriz:
YN-+ 1= YpN-+ 1+ epN-+ 1
Şimdi, zaten hesapladık. Bu nedenle, 'i belirli bir aralıkta, örneğin, zamanın% 90'ını sınırlamak istiyorsak , tek yapmamız gereken tutarlı bir şekilde ve yüzdelik / kuantillerini tahmin etmektir . , onları olarak adlandırın ve tahmin aralığı . , Y , N + 1 5 ton saat 95 T h e s , N + 1 e 5 , e 95 [ Y'nin s , N + 1 + E 5 ,YpN-+ 1YN-+ 15t h95t hepN-+ 1e5, e95[ YpN-+ 1+ e5, YpN-+ 1+ e95]
in miktarları / yüzdelikleri nasıl tahmin edilir ? Eh, biz yazabiliriz:
e p N + 1epN-+ 1
epN-+ 1= YN-+ 1- YpN-+ 1= XN-+ 1β+ ϵN-+ 1- XN-+ 1β^EKK= XN-+ 1( β- β^EKK) + ϵN-+ 1
Strateji, den birçok kez (bir bootstrap türünde) örnekleme yapmak ve daha sonra her zamanki gibi yüzdelik değerleri hesaplamak olacaktır. Öyleyse, belki de den 10.000 kez numune alacağız ve ardından ve yüzdelik oranlarını ve en küçük üyeler olarak tahmin edeceğiz . örnek. e p N + 1 5 t sa 95 t saepN-+ 1epN-+ 15t h95t h 9 , 500 t sa500t h9 , 500t h
üzerine çizmek için hataları önyükleyebiliriz (durumlar da iyi olabilir, ancak kimliğini kabul ediyoruz) yine de hataları). Öyleyse, her önyükleme çoğaltmasında, varyansa göre ayarlanan artıklardan değiştirerek kez (sonraki paragrafa bakın) , sonra yeni , sonra bu çoğaltmanın değerini almak için yeni veri setinde OLS'yi çalıştırın, . Sonunda, bu çoğaltma in , N ε * ı -Y * ı = X i β En Küçük Kareler + ε * ı ( Y * , X ) β * r X , N + 1 ( β - β en küçük kareler ) X, N + 1 ( β En Küçük Kareler - β * rXN-+ 1( β- β^EKK)N-ε*benY*ben= Xbenβ^EKK+ ϵ*ben( Y*, X)β*rXN-+ 1( β- β^EKK)XN-+ 1( β^EKK- β*r)
İid farz edersek , denklemin bölümünden örneklemenin doğal yolu , regresyondan kalan kalıntıları kullanmaktır, . Artıkların farklı ve genellikle çok küçük farklılıkları vardır, bu yüzden varyans düzeltilmiş artıklar, ve gözlem kaldıraç .εεN-+ 1{ e*1, e*2, … , E*N-}{ s1- s¯¯¯, s2- s¯¯¯, … , SN-- s¯¯¯}sben= e*ben/ ( 1 - sben)------√hbenben
Ve son olarak, bir% 90 tahmini aralığını yapmak için algoritma göz önüne alındığında, bir olduğu:YN-+ 1XXN-+ 1
- Tahminini yapın .YpN-+ 1= XN-+ 1β^EKK
- göre ayarlanan artıkları yapın, , burada .{ s1- s¯¯¯, s2- s¯¯¯, … , SN-- s¯¯¯}sben= eben/ (√1 - sben)
- Çoğaltmalar için :
r = 1 , 2 , … , R
- Önyükleme artıkları yapmak için ayarlanan kalıntılara kez
çizinN-{ ϵ*1, ϵ*2, … , Ε*N-}
- Önyükleme oluşturY*= Xβ^EKK+ ϵ*
- Bu çoğaltma için önyükleme OLS tahmincisini hesaplayın,
β*r= ( X'X)- 1X'Y*
- Önyükleme artıklarını bu çoğaltmadan alın,e∗r=Y∗−Xβ∗r
- Önyükleme sapma ayarlı artıkları bu çoğaltmadan hesaplayın,s∗−s∗¯¯¯¯¯
- Bu çoğaltmadan önyükleme sapması ayarlanmış artıklardan birini çizin,ϵ∗N+1,r
- Bu çoğaltmanın çekilişini
,epN+1ep∗r=XN+1(β^OLS−β∗r)+ϵ∗N+1,r
- ve , yüzdeliklerini bulun.5th95thepN+1e5,e95
- % 90 tahmini aralığı olduğu
.YN+1[YpN+1+ e5, YpN-+ 1+ e95]
İşte R
kod:
# 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))