Intervalle de prédiction de bootstrap

29

Existe-t-il une technique de bootstrap pour calculer les intervalles de prédiction pour les prédictions ponctuelles obtenues par exemple à partir d'une régression linéaire ou d'une autre méthode de régression (k-plus proche voisin, arbres de régression, etc.)?

D'une certaine manière, je pense que la manière parfois proposée de simplement lancer la prédiction ponctuelle (voir par exemple les intervalles de prédiction pour la régression kNN ) ne fournit pas un intervalle de prédiction mais un intervalle de confiance.

Un exemple en R

# STEP 1: GENERATE DATA

set.seed(34345)

n <- 100 
x <- runif(n)
y <- 1 + 0.2*x + rnorm(n)
data <- data.frame(x, y)


# STEP 2: COMPUTE CLASSIC 95%-PREDICTION INTERVAL
fit <- lm(y ~ x)
plot(fit) # not shown but looks fine with respect to all relevant aspects

# Classic prediction interval based on standard error of forecast
predict(fit, list(x = 0.1), interval = "p")
# -0.6588168 3.093755

# Classic confidence interval based on standard error of estimation
predict(fit, list(x = 0.1), interval = "c")
# 0.893388 1.54155


# STEP 3: NOW BY BOOTSTRAP
B <- 1000
pred <- numeric(B)
for (i in 1:B) {
  boot <- sample(n, n, replace = TRUE)
  fit.b <- lm(y ~ x, data = data[boot,])
  pred[i] <- predict(fit.b, list(x = 0.1))
}
quantile(pred, c(0.025, 0.975))
# 0.8699302 1.5399179

De toute évidence, l'intervalle de bootstrap de base à 95% correspond à l'intervalle de confiance à 95%, et non à l'intervalle de prédiction à 95%. Alors ma question: comment le faire correctement?

Michael M
la source
Au moins dans le cas des moindres carrés ordinaires, vous aurez besoin de plus que de simples prédictions de points; vous souhaitez également utiliser l'erreur résiduelle estimée pour construire des intervalles de prédiction.
Kodiologist
@duplo: merci de l'avoir signalé. La longueur correcte des intervalles de prédiction classiques repose directement sur l'hypothèse de normalité du terme d'erreur, donc s'il est trop optimiste, alors la version bootstrap sera certainement aussi si elle est dérivée de là. Je me demande s'il existe en général une méthode de bootstrap fonctionnant en régression (pas nécessairement OLS).
Michael M
1
Je pense que \ textit {inférence conforme} pourrait être ce que vous voulez, ce qui vous permet de construire des intervalles de prédiction basés sur le rééchantillonnage qui ont une couverture d'échantillons finis valide, et qui ne couvrent pas trop. Il existe un bon article disponible sur arxiv.org/pdf/1604.04173.pdf , qui peut être lu comme une introduction au sujet, et un package R disponible sur github.com/ryantibs/conformal .
Simon Boge Brant

Réponses:

26

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=(XX)1XY

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

YN+1p=XN+1β^OLS

L'erreur de prévision faite par cette prédiction est:

eN+1p=YN+1YN+1p

Nous pouvons réécrire cette équation comme:

YN+1=YN+1p+eN+1p

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 95YN+1pYN+15th95theN+1pe5,e95[YN+1p+e5,YN+1p+e95]

Comment estimer les quantiles / centiles de ? Eh bien, nous pouvons écrire: e p N + 1eN+1p

eN+1p=YN+1YN+1p=XN+1β+ϵN+1XN+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 heN+1peN+1p5th95th500th9,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ϵiYi=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{e1,e2,,eN}{s1s¯,s2s¯,,sNs¯} hiisi=ei/(1hi)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

  1. Faites la prédiction .YN+1p=XN+1β^OLS
  2. Faites les résidus ajustés à la variance, , où .{s1s¯,s2s¯,,sNs¯}si=ei/(1hi)
  3. 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=(XX)1XY
    • Obtenez les résidus d'amorçage de cette réplication,er=YXβr
    • Calculer les résidus ajustés à la variance bootstrap à partir de cette réplication,ss¯
    • 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 ,eN+1perp=XN+1(β^OLSβr)+ϵN+1,r
  4. Trouvez les et centiles de ,5th95theN+1pe5,e95
  5. L'intervalle de prédiction à 90% pour est .YN+1[YN+1p+e5,YN+1p+e95]

Voici le Rcode:

# 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))
Facture
la source
Merci pour les explications utiles et détaillées. En suivant ces lignes, je pense qu'une technique générale en dehors de l'OLS (techniques basées sur les arbres, le plus proche voisin, etc.) ne sera pas facilement disponible, non?
Michael M
1
Il y a celui-ci pour les forêts aléatoires: stats.stackexchange.com/questions/49750/… qui semble similaire.
Bill
Pour autant que je sache, si vous faites abstraction de to , cette technique fonctionne pour n'importe quel modèle. Xβf(X,θ)
shadowtalker
Comment généralisez-vous les «résidus ajustés à la variance» - l'approche OLS repose sur l'effet de levier - existe-t-il un calcul de l'effet de levier pour un estimateur arbitraire f (X)?
David Waterworth