Loading [MathJax]/jax/element/mml/optable/GeneralPunctuation.js

5 votos

Cómo obtener la previsión de la media real utilizando el paquete Arima con una transformación Box-Cox

En el paquete Arima, el uso de una transformación Box-Cox da resultados erróneos cuando se aplica posteriormente al método de previsión.

Por ejemplo, considere estos datos:

library(forecast)
data<-c(2,3,2,3,2,3)

Y para simplificar, consideremos un modelo ARIMA(0,0,0). (La media de esta serie es 2,5.)

La previsión media realizada sin transformación Box-Cox es correcta:

forecast(Arima(data,order=c(0,0,0)))$mean
 [1] 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5

Sin embargo, si utilizamos una transformación Box-Cox, como una transformación logarítmica con lambda=0, la previsión "media" es errónea:

forecast(Arima(data,order=c(0,0,0), lambda=0))$mean
[1] 2.44949 2.44949 2.44949 2.44949 2.44949 2.44949 2.44949 2.44949 2.44949 2.44949

Parece que para producir la previsión media de Y=exp(X), hace E(Y)=exp(E(X)).

¿Hay alguna forma de corregirlo? ¿Existe algún paquete con una implementación correcta de previsiones con transformaciones Box-Cox?

6voto

Senseful Puntos 116

El enfoque adoptado por la forecast es ajustar un modelo a los datos transformados y retrotransformar tanto las previsiones puntuales como los intervalos de predicción. Esto no es "erróneo". Es una opción legítima. De este modo se mantiene la cobertura de los intervalos de predicción, y la previsión puntual retrotransformada puede considerarse el mediana de las densidades de previsión (suponiendo que las densidades de previsión en la escala transformada sean simétricas). Para muchos propósitos, esto es aceptable, pero ocasionalmente se requiere la previsión media. Por ejemplo, en las previsiones jerárquicas es necesario agregar las previsiones, y las medianas no se agregan, pero las medias sí.

Es bastante fácil deducir la previsión media utilizando una expansión de la serie de Taylor. Supongamos f(x) representa la función de retrotransformación, μ es la media en la escala transformada y σ2 es la varianza en la escala transformada. A continuación, utilizando los tres primeros términos de una expansión de Taylor en torno a μ la media en la escala original viene dada por f(μ)+12σ2f

Para una transformación Box-Cox, f(x) = \left\{\begin{array}{ll} (\lambda x+1)^{1/\lambda} & \text{if $\lambda\ne0$;}\\ e^x & \text{if $\lambda=0$.}\end{array}\right. Así que f''(x) = \left\{\begin{array}{ll} (1-\lambda)(\lambda x+1)^{1/\lambda-2} & \text{if $\lambda\ne0$;}\\ e^x & \text{if $\lambda=0$.}\end{array}\right. y la media retrotransformada viene dada por \left\{\begin{array}{ll} (\lambda \mu+1)^{1/\lambda}\left[1 + \frac{\sigma^2(1-\lambda)}{2(\lambda \mu+1)^{2}}\right] & \text{if $\lambda\ne0$;}\\ e^\mu\left[1 + \frac{\sigma^2}{2}\right] & \text{if $\lambda=0$.}\end{array}\right. Por lo tanto, para ajustar la media retrotransformada obtenida por R, se puede utilizar el siguiente código.

library(forecast)

fit <- auto.arima(AirPassengers, lambda=0)
fc <- forecast(fit, h=50, level=95)
fvar <- ((BoxCox(fc$upper,fit$lambda)-BoxCox(fc$lower,fit$lambda))/qnorm(0.975)/2)^2
plot(fc)
fc$mean <- fc$mean * (1 + 0.5*fvar)
lines(fc$mean,col='red')

fit <- auto.arima(AirPassengers, lambda=0.2)
fc <- forecast(fit, h=50, level=95)
fvar <- ((BoxCox(fc$upper,fit$lambda)-BoxCox(fc$lower,fit$lambda))/qnorm(0.975)/2)^2
plot(fc)
fc$mean <- fc$mean * (1 + 0.5*fvar*(1-fit$lambda)/(fc$mean)^(2*fit$lambda))
lines(fc$mean,col='red')

Una versión ampliada de esta respuesta se encuentra en mi blog .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X