O método descrito abaixo é o descrito na Seção 6.3.3 de Davidson e Hinckley (1997),
Bootstrap Methods e Their Application . Graças a Glen_b e seu comentário aqui . Dado que havia várias perguntas sobre a Validação cruzada sobre esse tópico, achei que valia a pena escrever.
O modelo de regressão linear é:
YEu= XEuβ+ ϵEu
Temos dados, , que usamos para estimar o β como:
beta OLSi = 1 , 2 , … , Nβ
β^OLS= ( X′X)- 1X′Y
Agora, queremos prever o que será para um novo ponto de dados, já que sabemos X para ele. Esse é o problema de previsão. Vamos chamar o novo X (que sabemos) X N + 1 e o novo Y (que gostaríamos de prever), Y N + 1 . A predição habitual (se do princípio de que o ε i ii d e não correlacionada com X ) é:
Y p N + 1YXXXN+ 1YYN+ 1ϵEuX
YpN+ 1= XN+ 1β^OLS
O erro de previsão feito por esta previsão é:
epN+ 1= YN+1- YpN+ 1
Podemos reescrever esta equação como:
YN+ 1=YpN+ 1+ epN+ 1
Agora, já calculamos. Então, se quisermos obrigado Y N + 1 em um intervalo, digamos, 90% do tempo, tudo o que precisamos fazer é estimar de forma consistente os 5 t h e 95 t h percentis / quantis de e p N + 1 , chamada eles e 5 , e 95 , e o intervalo de previsão será [ Y p N + 1 + e 5 , Y p NYpN+ 1YN+ 15t h95t hepN+ 1e5, e95.[ YpN+ 1+ e5, YpN+ 1+ e95]
Como estimar os quantis / percentis de ? Bem, podemos escrever:
e p N + 1epN+ 1
epN+ 1= YN+ 1- YpN+ 1= XN+ 1β+ ϵN+ 1- XN+1β^OLS=XN+1( β- β^OLS) + ϵN+ 1
A estratégia será coletar amostras (de um modo de inicialização) muitas vezes de e, em seguida, calcular percentis da maneira usual. Assim, talvez que vai provar 10.000 vezes a partir de e p N + 1 , e em seguida, estimar os 5 t h e 95 t h percentis como o 500 t h e 9 , 500 t h mais pequenos da amostra.epN+ 1epN+ 15t h95t h500t h9 , 500t h
Para desenhar em , que pode inicializar erros (casos seria bom, também, mas estamos assumindo erros iid de qualquer maneira). Assim, em cada replicação de inicialização, você desenha N vezes com a substituição dos resíduos ajustados pela variância (veja o próximo parágrafo) para obter ε * i , em seguida, fazer nova Y * i = X i beta OLS + ε * i , OLS, em seguida, executados no novo conjunto de dados ( Y ∗ , X )XN+ 1( β- β^OLS)Nϵ∗EuY∗Eu= XEuβ^OLS+ ϵ∗Eu( Y∗, X)para obter o dessa replicação . Por fim, este sorteio de replicação em X N + 1 ( β - β OLS ) é X N + 1 ( β OLS - β * r )β∗rXN+ 1( β- β^OLS)XN+1( β^OLS- β∗r)
ϵϵN+ 1{ e∗1, e∗2, … , E∗N}{ s1- s¯¯¯, s2- s¯¯¯, … , SN- s¯¯¯}sEu= e∗Eu/ ( 1 - hEu)------√hEuEu
YN+ 1XXN+ 1
- YpN+ 1= XN+ 1β^OLS
- { s1- s¯¯¯, s2- s¯¯¯, … , SN- s¯¯¯}sEu= eEu/ (√1 - hEu)
- r = 1 , 2 , … , R
- N{ ϵ∗1, ϵ∗2, … , Ε∗N}
- Y∗= Xβ^OLS+ ϵ∗
- β∗r= ( X′X)- 1X′Y∗
- e∗r= Y∗- Xβ∗r
- s∗- s∗¯¯¯¯¯
- ϵ∗N+ 1 , r
- epN+ 1ep ∗r= XN+ 1( β^OLS- β∗r) + ϵ∗N+ 1 , r
- 5t h95t hepN+ 1e5, e95
- YN+ 1[YpN+ 1+e5, YpN+ 1+ e95]
Aqui está o R
código:
# 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))