La méthode présentée ci-dessous est celle décrite à la section 6.3.3 de Davidson et Hinckley (1997),
Bootstrap Methods and Their Application . Merci à Glen_b et à son commentaire ici . Étant donné qu'il y avait plusieurs questions sur la validation croisée sur ce sujet, j'ai pensé que cela valait la peine d'être écrit.
Le modèle de régression linéaire est:
Yi=Xiβ+ϵi
Nous avons des données, , que nous utilisons pour estimer la comme:
ß la ß OLSi=1,2,…,Nβ
β^OLS=(X′X)−1X′Y
Maintenant, nous voulons prédire ce que sera pour un nouveau point de données, étant donné que nous connaissons pour cela. C'est le problème de prédiction. Appelons le nouveau (que nous connaissons) et le nouveau (que nous aimerions prédire), . La prédiction habituelle (si nous supposons que les sont iid et non corrélés avec ) est:
X X X N + 1 Y Y N + 1 ϵ i X Y p N + 1YXXXN+1YYN+1ϵiX
YpN+1=XN+1β^OLS
L'erreur de prévision faite par cette prédiction est:
epN+1=YN+1−YpN+1
Nous pouvons réécrire cette équation comme:
YN+1=YpN+1+epN+1
Maintenant, nous avons déjà calculé. Donc, si nous voulons dans un intervalle, disons, 90% du temps, tout ce que nous devons faire est d'estimer de manière cohérente les et percentiles / quantiles de , appelez-les , et l'intervalle de prédiction sera . Y N + 1 5 t h 95 t h e p N + 1 e 5 , e 95YpN+1YN+15th95thepN+1e5,e95[YpN+1+e5,YpN+1+e95]
Comment estimer les quantiles / centiles de ? Eh bien, nous pouvons écrire:
e p N + 1epN+1
epN+1=YN+1−YpN+1=XN+1β+ϵN+1−XN+1β^OLS=XN+1(β−β^OLS)+ϵN+1
La stratégie consistera à échantillonner (de manière bootstrap) plusieurs fois à partir de , puis à calculer les centiles de la manière habituelle. Ainsi, nous allons peut-être échantillonner 10 000 fois à partir de , puis estimer les et centiles comme les et plus petits membres de l'échantillon. e p N + 1 5 t h 95 t h 500 t h 9 , 500 t hepN+1epN+15th95th500th9,500th
Pour dessiner sur , nous pouvons amorcer des erreurs (les cas seraient bien aussi, mais nous supposons iid erreurs de toute façon). Ainsi, à chaque réplication bootstrap, vous tirez fois avec remplacement à partir des résidus ajustés à la variance (voir paragraphe suivant) pour obtenir , puis créez de nouveaux , puis exécutez OLS sur le nouveau jeu de données, pour obtenir le cette réplication . Enfin, le tirage de cette réplication sur est N ε * i Y * i = X i β OLS + ε * i ( Y * , X ) β * r X N + 1 ( β - β OLS ) X N + 1 ( β OLS - β * rXN+1(β−β^OLS)Nϵ∗iY∗i=Xiβ^OLS+ϵ∗i(Y∗,X)β∗rXN+1(β−β^OLS)XN+1(β^OLS−β∗r)
Étant donné que nous supposons iid , la façon naturelle d'échantillonner à partir de la partie de l'équation est d'utiliser les résidus que nous avons de la régression, . Les résidus ont des écarts différents et généralement trop faibles, nous allons donc vouloir échantillonner à partir de , les résidus corrigés de la variance, où et est l'effet de levier de l'observation .ϵ 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¯¯¯} hiisi=e∗i/(1−hi)−−−−−−√hii
Et, enfin, l'algorithme pour faire un intervalle de prédiction de 90% pour , étant donné que est est: X X N + 1YN+1XXN+1
- Faites la prédiction .YpN+1=XN+1β^OLS
- Faites les résidus ajustés à la variance, , où .{s1−s¯¯¯,s2−s¯¯¯,…,sN−s¯¯¯}si=ei/(√1−hi)
- Pour les réplications :
r=1,2,…,R
- Dessinez fois sur les résidus ajustés pour créer des résidus de bootstrap
N{ϵ∗1,ϵ∗2,…,ϵ∗N}
- Générer le bootstrapY∗=Xβ^OLS+ϵ∗
- Calculer l'estimateur OLS bootstrap pour cette réplication,
β∗r=(X′X)−1X′Y∗
- Obtenez les résidus d'amorçage de cette réplication,e∗r=Y∗−Xβ∗r
- Calculer les résidus ajustés à la variance bootstrap à partir de cette réplication,s∗−s∗¯¯¯¯¯
- Dessinez l'un des résidus bootstrap ajustés à la variance de cette réplication,ϵ∗N+1,r
- Calculez le tirage de cette réplication sur
,epN+1ep∗r=XN+1(β^OLS−β∗r)+ϵ∗N+1,r
- Trouvez les et centiles de ,5th95thepN+1e5,e95
- L'intervalle de prédiction à 90% pour est
.YN+1[YpN+1+e5,YpN+1+e95]
Voici le 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))