Comment calculer les intervalles de prédiction pour LOESS?

17

J'ai quelques données que j'ai ajustées en utilisant un modèle LOESS dans R, me donnant ceci:

entrez la description de l'image ici

Les données ont un prédicteur et une réponse, et elles sont hétéroscédastiques.

J'ai également ajouté des intervalles de confiance. Le problème est que les intervalles sont des intervalles de confiance pour la ligne, alors que je m'intéresse aux intervalles de prédiction. Par exemple, le panneau inférieur est plus variable que le panneau supérieur, mais cela n'est pas capturé dans les intervalles.

Cette question est légèrement liée: comprendre la bande de confiance d'une régression polynomiale , en particulier la réponse de @AndyW, mais dans son exemple, il utilise l' interval="predict"argument relativement simple qui existe dans predict.lm, mais il est absent de predict.loess.

J'ai donc deux questions très liées:

  1. Comment obtenir les intervalles de prédiction ponctuels pour LOESS?
  2. Comment puis-je prédire des valeurs qui captureront cet intervalle, c'est-à-dire générer un tas de nombres aléatoires qui ressembleront finalement un peu aux données d'origine?

Il est possible que je n'aie pas besoin de LOESS et que je doive utiliser autre chose, mais je ne connais pas mes options. Fondamentalement, il devrait correspondre à la ligne en utilisant une régression locale ou une régression linéaire multiple, me donnant des estimations d'erreur pour les lignes, et en plus également des variances différentes pour différentes variables explicatives, afin que je puisse prédire la distribution de la variable de réponse (y) à certaines valeurs de x .

Gimelist
la source
S'agit-il d'un intervalle de prédiction ponctuel?
Glen_b -Reinstate Monica
Que veux-tu dire par là"? Et je ne sais pas si c'est ponctuel ou non. Ma question 2 est ce que je recherche - malheureusement, je ne connais pas la nomenclature.
Gimelist
Par «ceci», je veux dire «la chose à propos de laquelle la question se pose dans le titre»
Glen_b -Reinstate Monica
Je ne suis donc pas sûr - voir mon commentaire précédent. Fondamentalement, je recherche un intervalle qui capturera la variance réelle des points de données, comme décrit dans ma question.
Gimelist
1
L'écart peut être variable (c'est pourquoi j'ai opté pour la régression locale en premier lieu). Prédicteur unique.
Gimelist

Réponses:

12

Je ne sais pas comment faire des bandes de prédiction avec la loessfonction d' origine mais il y a une fonction loess.sddans le msirpackage qui fait exactement ça! Presque mot pour mot de la msirdocumentation:

library(msir)
data(cars)
# Calculates and plots a 1.96 * SD prediction band, that is,
# a 95% prediction band
l <- loess.sd(cars, nsigma = 1.96)
plot(cars, main = "loess.sd(cars)", col="red", pch=19)
lines(l$x, l$y)
lines(l$x, l$upper, lty=2)
lines(l$x, l$lower, lty=2)

entrez la description de l'image ici

Votre deuxième question est un peu plus délicate car loess.sdelle ne comporte pas de fonction de prédiction, mais vous pouvez la pirater ensemble en interpolant linéairement les moyennes et les SD prédites dont vous sortez loess.sd(en utilisant approx). Ceux-ci peuvent, à leur tour, être utilisés pour simuler des données en utilisant une distribution normale avec les moyennes et les SD prédits:

# Simulate x data uniformly and y data acording to the loess fit
sim_x <- runif(100, min(cars[,1]), max(cars[,1]))
pred_mean <- approx(l$x, l$y, xout = sim_x)$y
pred_sd <- approx(l$x, l$sd, xout = sim_x)$y
sim_y <- rnorm(100, pred_mean, pred_sd) 

# Plots 95% prediction bands with simulated data 
plot(cars, main = "loess.sd(cars)", col="red", pch=19)
points(sim_x, sim_y, col="blue")
lines(l$x, l$y)
lines(l$x, l$upper, lty=2)
lines(l$x, l$lower, lty=2)

entrez la description de l'image ici

Rasmus Bååth
la source
Exactement ce que je cherchais. Quand on regarde la méthode qu'il a utilisée en voyant le code avec loess.sd, ce n'est pas trop différent de ce que @rnso a suggéré dans un commentaire à une autre de mes questions . Merci!
Gimelist
Bootstrap pour générer les intervalles?
SmallChess