Wie berechnet man Vorhersageintervalle für LOESS?

17

Ich habe einige Daten, die ich mit einem LOESS-Modell in R angepasst habe.

Bildbeschreibung hier eingeben

Die Daten haben einen Prädiktor und eine Antwort und sind heteroskedastisch.

Ich habe auch Konfidenzintervalle hinzugefügt. Das Problem ist, dass die Intervalle Konfidenzintervalle für die Linie sind, während ich mich für die Vorhersageintervalle interessiere. Beispielsweise ist das untere Bedienfeld variabler als das obere Bedienfeld, dies wird jedoch nicht in den Intervallen erfasst.

Diese Frage ist ein wenig verwandt: Das Verständnis des Konfidenzbandes aus einer polynomialen Regression , insbesondere die Antwort von @AndyW. In seinem Beispiel verwendet er jedoch das relativ einfache interval="predict"Argument, das in vorhanden predict.lmist, es fehlt jedoch predict.loess.

Ich habe also zwei sehr verwandte Fragen:

  1. Wie erhalte ich die punktweisen Vorhersageintervalle für LOESS?
  2. Wie kann ich Werte vorhersagen, die dieses Intervall erfassen, dh eine Reihe von Zufallszahlen generieren, die möglicherweise den Originaldaten ähneln?

Es ist möglich, dass ich LÖSS nicht benötige und etwas anderes verwenden sollte, aber ich bin mit meinen Optionen nicht vertraut. Grundsätzlich sollte die Linie mit lokaler Regression oder multipler linearer Regression angepasst werden, wobei ich Fehlerabschätzungen für die Linien und außerdem verschiedene Varianzen für verschiedene erklärende Variablen erhalte, damit ich die Verteilung der Antwortvariablen (y) bei bestimmten x-Werten vorhersagen kann .

Gimelist
quelle
Ist das ein punktweises Vorhersageintervall?
Glen_b
Was meinst du damit"? Und ich bin nicht sicher, ob es sinnvoll ist oder nicht. Meine Frage 2 ist das, wonach ich suche - leider kenne ich mich mit der Nomenklatur nicht aus.
Gimelist
Mit "dies" meine ich "das,
worüber sich
Ich bin mir also nicht sicher - siehe meinen vorherigen Kommentar. Grundsätzlich suche ich ein Intervall, das die tatsächliche Varianz in den Datenpunkten erfasst, wie in meiner Frage beschrieben.
Gimelist
1
Der Spread kann variabel sein (deshalb habe ich mich zuerst für die lokale Regression entschieden). Einzelner Prädiktor.
Gimelist

Antworten:

12

Ich weiß nicht, wie man Vorhersagebänder mit der ursprünglichen loessFunktion erstellt, aber es gibt eine Funktion loess.sdim msirPaket , die genau das tut! Fast wörtlich aus der msirDokumentation:

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)

Bildbeschreibung hier eingeben

Ihre zweite Frage ist etwas kniffliger, da loess.sdsie nicht mit einer Vorhersagefunktion ausgestattet ist. Sie können sie jedoch hacken, indem Sie die vorhergesagten Mittelwerte und SDs, aus denen Sie herauskommen, linear interpolieren loess.sd(verwenden approx). Diese können wiederum verwendet werden, um Daten unter Verwendung einer Normalverteilung mit den vorhergesagten Mitteln und SDs zu simulieren:

# 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)

Bildbeschreibung hier eingeben

Rasmus Bååth
quelle
Genau das, wonach ich gesucht habe. Wenn er sich die Methode ansieht, mit der er den Code gesehen hat loess.sd, unterscheidet sie sich nicht allzu sehr von dem, was @rnso in einem Kommentar zu einer anderen Frage von mir vorgeschlagen hat . Vielen Dank!
Gimelist
Bootstrap zur Generierung der Intervalle?
SmallChess