Il metodo illustrato di seguito è quello descritto nella Sezione 6.3.3 di Davidson e Hinckley (1997),
Metodi Bootstrap e loro applicazione . Grazie a Glen_b e al suo commento qui . Dato che c'erano diverse domande su Cross Validated su questo argomento, ho pensato che valesse la pena scrivere.
Il modello di regressione lineare è:
Yi=Xiβ+ϵi
Abbiamo i dati, , che usiamo per stimare la come:
ß ß OLSi=1,2,…,Nβ
β^OLS=(X′X)−1X′Y
Ora, vogliamo prevedere quale sarà per un nuovo punto dati, dato che conosciamo per questo. Questo è il problema di previsione. Chiamiamo la nuova (che conosciamo) e la nuova (che vorremmo prevedere), . La previsione abituale (se stiamo assumendo che sia iid e non correlato a ) è:
X X X N + 1 Y Y N + 1 ϵ i X Y p N + 1YXXXN+1YYN+1ϵiX
YpN+ 1= XN+ 1β^OLS
L'errore di previsione fatto da questa previsione è:
epN+ 1= YN+ 1- YpN+ 1
Possiamo riscrivere questa equazione come:
YN+ 1= YpN+ 1+ epN+ 1
Ora, abbiamo già calcolato. Quindi, se vogliamo legare in un intervallo, diciamo, il 90% delle volte, tutto ciò che dobbiamo fare è stimare coerentemente i e percentili / quantili di , chiamali e l'intervallo di previsione sarà . 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]
Come stimare i quantili / percentili di ? Bene, possiamo scrivere:
e p N + 1epN+ 1
epN+ 1= YN+ 1- YpN+ 1= XN+ 1β+ ϵN+ 1- XN+ 1β^OLS= XN+ 1( β- β^OLS) + ϵN+ 1
La strategia sarà quella di campionare (in un modo bootstrap) molte volte da e quindi calcolare i percentili nel solito modo. Quindi, forse campioneremo 10.000 volte da , e quindi stimeremo i percentili e come i membri e più piccoli di il campione. e p N + 1 5 t h 95 t h 500 t h 9 , 500 t hepN+ 1epN+ 15t h95t h500t h9 , 500t h
Per attingere a , possiamo avviare gli errori di bootstrap (anche i casi andrebbero bene, ma supponiamo che errori comunque). Quindi, su ogni replica bootstrap, si disegna volte con la sostituzione dai residui adattati alla varianza (vedere il paragrafo successivo) per ottenere , quindi creare un nuovo , quindi esegui OLS sul nuovo set di dati, per ottenere questa replica . Alla fine, il sorteggio di questa replica su è N ε * i Y * i = X i β OLS + ε * i ( Y * , X ) β * r X N + 1 ( β - β OLS ) X N + 1 ( β OLS - β * rXN+ 1( β- β^OLS)Nε*ioY*io= Xioβ^OLS+ ϵ*io( Y*, X)β*rXN+ 1( β- β^OLS)XN+ 1( β^OLS- β*r)
Dato che stiamo assumendo iid , il modo naturale di campionare dalla parte dell'equazione è utilizzare i residui che abbiamo dalla regressione, . I residui hanno varianze diverse e generalmente troppo piccole, quindi vorremmo campionare da , i residui corretti dalla varianza, dove e è l' leva dell'osservazione .ϵ N + 1 { e ∗ 1 , e ∗ 2 , … , e ∗ N } { s 1 - ¯ s , s 2 - ¯ s , ... , s N - ¯ s } s i = e ∗ i / √εεN+ 1{ e*1, e*2, ... , e*N}{ s1- s¯¯¯, s2- s¯¯¯, ... , sN- s¯¯¯} hiiSio= e*io/ ( 1 - hio)------√hioio
E, infine, l'algoritmo per fare un intervallo di previsione del 90% per , dato che è è: X X N + 1YN+ 1XXN+ 1
- Fai la previsione .YpN+ 1= XN+ 1β^OLS
- Crea i residui aggiustati per la varianza, , dove . s i = e i / √{ s1- s¯¯¯, s2- s¯¯¯, ... , sN- s¯¯¯}Sio= eio/ (√1 - hio)
- Per repliche :
r = 1 , 2 , … , R
- Disegna volte sui residui corretti per creare residui bootstrap
N{ ϵ*1, ϵ*2, ... , ϵ*N}
- Genera bootstrapY*= Xβ^OLS+ ϵ*
- Calcola lo stimatore OLS bootstrap per questa replica,
β*r= ( X'X)- 1X'Y*
- Ottieni i residui del bootstrap da questa replica,e*r= Y*- Xβ*r
- Calcola i residui adattati alla varianza del bootstrap da questa replica,S*- s*¯¯¯¯¯
- Disegna uno dei residui adattati alla varianza del bootstrap da questa replica,ε*N+ 1 , r
- Calcola il disegno di questa replica su
,epN+ 1ep ∗r= XN+ 1( β^OLS- β*r) + ϵ*N+ 1 , r
- Trova percentili e di ,5t h95t hepN+ 1e5, e95
- L'intervallo di previsione del 90% per è
.[ Y p N + 1 + e 5 , Y p N + 1 + e 95 ]YN+ 1[ YpN+ 1+ e5, YpN+ 1+ e95]
Ecco il R
codice:
# 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))