Phương pháp được trình bày dưới đây là phương pháp được mô tả trong Phần 6.3.3 của Davidson và Hinckley (1997),
Phương pháp Bootstrap và Ứng dụng của chúng . Cảm ơn Glen_b và bình luận của anh ấy ở đây . Cho rằng có một số câu hỏi về Xác thực chéo về chủ đề này, tôi nghĩ rằng nó đáng để viết lên.
Mô hình hồi quy tuyến tính là:
Ytôi= Xtôiβ+ εtôi
Chúng tôi có dữ liệu, , chúng tôi sử dụng để ước tính là:
beta beta OLSi = 1 , 2 , ... , Nβ
β^TUỔI= ( X'X)- 1X'Y
Bây giờ, chúng tôi muốn dự đoán sẽ là gì cho một điểm dữ liệu mới, với điều kiện là chúng tôi biết cho nó. Đây là vấn đề dự đoán. Chúng ta hãy gọi mới (mà chúng ta biết) và mới (mà chúng ta muốn dự đoán), . Dự đoán thông thường (nếu chúng ta giả sử rằng là iid và không tương thích với ) là:
X X X N + 1 Y Y N + 1 ϵ i X Y p N + 1YXXXN+ 1YYN+ 1εtôiX
YpN+ 1= XN+ 1β^TUỔI
Lỗi dự báo được thực hiện bởi dự đoán này là:
epN+ 1= YN+ 1- YpN+ 1
Chúng ta có thể viết lại phương trình này như:
YN+ 1= YpN+ 1+ epN+ 1
Bây giờ, chúng tôi đã tính toán. Vì vậy, nếu chúng ta muốn ràng buộc trong một khoảng thời gian, giả sử, 90% thời gian, tất cả những gì chúng ta cần làm là ước tính nhất quán và phần trăm / lượng tử của , gọi chúng là và khoảng dự đoán sẽ là . Y N + 1 5 t h 95 t h e p N + 1 e 5 , e 95 [ Y p N + 1 + e 5 , Y p N + 1 + e 95 ]YpN+ 1YN+ 15t h95t hepN+ 1e5, e95[ YpN+ 1+ e5, YpN+ 1+ e95]
Làm cách nào để ước tính số lượng / phần trăm của ? Chà, chúng ta có thể viết:
e p N + 1epN+ 1
epN+ 1= YN+ 1- YpN+ 1= XN+ 1β+ εN+ 1- XN+ 1β^TUỔI= XN+ 1( β- β^TUỔI) + ΕN+ 1
Chiến lược sẽ là lấy mẫu (theo kiểu bootstrap) nhiều lần từ và sau đó tính toán phần trăm theo cách thông thường. Vì vậy, có thể chúng tôi sẽ lấy mẫu 10.000 lần từ , và sau đó ước tính tỷ lệ phần trăm và là thành viên nhỏ nhất và mẫu. e p N + 1 5 t h 95 t h 500 t h 9 , 500 t hepN+ 1epN+ 15t h95t h500t h9 , 500t h
Để vẽ trên , chúng tôi có thể bootstrap lỗi (trường hợp cũng sẽ ổn, nhưng chúng tôi đang giả sử iid dù sao cũng có lỗi). Vì vậy, trên mỗi lần sao chép bootstrap, bạn rút ra lần thay thế từ phần dư được điều chỉnh phương sai (xem đoạn tiếp theo) để nhận , sau đó tạo , sau đó chạy OLS trên tập dữ liệu mới, để có bản sao này . Cuối cùng, bản sao này được vẽ trên là N ε * i Y * i = X i β OLS + ε * i ( Y * , X ) β * r X N + 1 ( β - β OLS ) X N + 1 ( β OLS - β * rXN+ 1( β- β^TUỔI)Nε*tôiY*tôi= Xtôiβ^TUỔI+ ε*tôi( Y*, X)β*rXN+ 1( β- β^TUỔI)XN+ 1( β^TUỔI- β*r)
Vì chúng ta đang giả sử iid , cách tự nhiên để lấy mẫu từ phần của phương trình là sử dụng phần dư chúng ta có từ hồi quy, . Phần dư có các phương sai khác nhau và thường quá nhỏ, vì vậy chúng tôi sẽ muốn lấy mẫu từ , phần dư được hiệu chỉnh phương sai, trong đó và là đòn bẩy quan sát .εεN+ 1{ e*1, e*2, Lọ , e*N}{ s1- s¯¯¯,s2−s¯¯¯,…,sN−s¯¯¯}si=e∗i/(1−hi)−−−−−−√hitôi
Và cuối cùng, thuật toán tạo khoảng dự đoán 90% cho , với điều kiện là là:YN+ 1XXN+ 1
- Đưa ra dự đoán .YpN+ 1= XN+ 1β^TUỔI
- Tạo các phần dư được điều chỉnh phương sai, , trong đó .{ s1- s¯¯¯, s2- s¯¯¯, Lọ , sN- s¯¯¯}Stôi= etôi/ (√1 - htôi)
- Đối với các bản sao :
r = 1 , 2 , ... , R
- Vẽ lần trên các phần dư được điều chỉnh để tạo phần dư bootstrap
N{ ε*1, ε*2, ... , ε*N}
- Tạo bootstrapY*= Xβ^TUỔI+ ε*
- Tính toán công cụ ước tính OLS bootstrap cho bản sao này,
β*r= ( X'X)- 1X'Y*
- Có được phần dư bootstrap từ bản sao này,e*r= Y*- Xβ*r
- Tính toán phần dư được điều chỉnh phương sai bootstrap từ bản sao này,S*- s*¯¯¯¯¯
- Vẽ một trong các phần dư được điều chỉnh phương sai bootstrap từ bản sao này,ε*N+ 1 , r
- Tính toán bản sao của bản sao này trên
,epN+ 1ep *r= XN+ 1( β^TUỔI- β*r) + Ε*N+ 1 , r
- Tìm và phần trăm của ,5t h95t hepN+ 1e5, e95
- Khoảng dự đoán 90% cho là
.YN+ 1[ YpN+ 1+ e5, YpN+ 1+ e95]
Đây là R
mã:
# 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))