Jak obliczyć przedziały prognoz dla LOESS?

17

Mam dane, które dopasowałem za pomocą modelu LOESS w R, co daje mi to:

wprowadź opis zdjęcia tutaj

Dane mają jeden predyktor i jedną odpowiedź i są heteroscedastyczne.

Dodałem również przedziały ufności. Problem polega na tym, że przedziały są przedziałami ufności dla linii, podczas gdy mnie interesują przedziały prognozowania. Na przykład dolny panel jest bardziej zmienny niż górny, ale nie jest to rejestrowane w odstępach.

To pytanie jest nieco powiązane: Zrozumienie przedziału ufności z regresji wielomianowej , szczególnie odpowiedź @AndyW, jednak w swoim przykładzie używa stosunkowo prostego interval="predict"argumentu, który istnieje predict.lm, ale go nie ma predict.loess.

Mam więc dwa bardzo powiązane pytania:

  1. Jak uzyskać przedziały prognozowania punktowego dla LOESS?
  2. Jak mogę przewidzieć wartości, które będą przechwytywać ten przedział, tj. Wygenerować wiązkę liczb losowych, które ostatecznie będą wyglądać trochę jak oryginalne dane?

Możliwe, że nie potrzebuję MIŁOŚCI i powinienem użyć czegoś innego, ale nie znam moich opcji. Zasadniczo powinien pasować do linii za pomocą regresji lokalnej lub wielokrotnej regresji liniowej, dając mi oszacowania błędów dla linii, a ponadto różne wariancje dla różnych zmiennych objaśniających, dzięki czemu mogę przewidzieć rozkład zmiennej odpowiedzi (y) przy pewnych wartościach x .

Lista życzeń
źródło
Czy to przedział przewidywania punktowego?
Glen_b
Co przez to rozumiesz"? I nie jestem pewien, czy jest to punktowe, czy nie. Moje pytanie 2 jest tym, czego szukam - niestety nie znam nomenklatury.
Gimelist
Przez „to” mam na myśli „to, o co pytanie pyta w tytule”
Glen_b
Więc nie jestem pewien - patrz mój poprzedni komentarz. Zasadniczo szukam przedziału, który uchwyci rzeczywistą wariancję punktów danych, jak opisano w moim pytaniu.
Gimelist
1
Spread może być zmienny (dlatego właśnie zdecydowałem się na regresję lokalną). Jeden predyktor.
Gimelist

Odpowiedzi:

12

Nie wiem, jak zrobić pasma predykcyjne z oryginalną loessfunkcją, ale loess.sdw msirpakiecie jest taka funkcja ! Prawie dosłownie z msirdokumentacji:

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)

wprowadź opis zdjęcia tutaj

Twoje drugie pytanie jest nieco trudniejsze, ponieważ loess.sdnie ma funkcji przewidywania, ale możesz zhakować je razem, interpolując liniowo przewidywane środki i SD, z których się wydostajesz loess.sd(używasz approx). Można je z kolei wykorzystać do symulacji danych przy użyciu rozkładu normalnego z przewidywanymi średnimi i SD:

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

wprowadź opis zdjęcia tutaj

Rasmus Bååth
źródło
Właśnie tego szukałem. Patrząc na metodę, której użył, widząc kod loess.sd, nie różni się zbytnio od tego, co @rnso zasugerował w komentarzu do innego mojego pytania . Dzięki!
Gimelista,
Bootstrap, aby wygenerować interwały?
SmallChess