The Forecast Mean After BackTransformation
Join the DZone community and get the full member experience.
Join For FreeMany functions in the forecast package for R will allow a BoxCox transformation. The models are fitted to the transformed data and the forecasts and prediction intervals are backtransformed. This preserves the coverage of the prediction intervals, and the backtransformed point forecast can be considered the median of the forecast densities (assuming the forecast densities on the transformed scale are symmetric). For many purposes, this is acceptable, but occasionally the mean forecast is required. For example, with hierarchical forecasting the forecasts need to be aggregated, and medians do not aggregate but means do.
It is easy enough to derive the mean forecast using a Taylor series expansion. Suppose represents the backtransformation function, is the mean on the transformed scale and is the variance on the transformed scale. Then using the first three terms of a Taylor expansion around , the mean on the original scale is given by
BoxCox transformations
For a BoxCox transformation,
So
and the backtransformed mean is given by
Therefore, to adjust the backtransformed mean obtained by R, the following code can be used.
library(fpp) fit < ets(eggs, 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 < ets(eggs, 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*(1fit$lambda)/(fc$mean)^(2*fit$lambda)) lines(fc$mean,col='red')
The second of these plots is shown below. The blue line shows the forecast medians while the red line shows the forecast means.
Scaled logistic transformation
In my previous post on transformations, I described the scaled logit transformation for bounding a forecast between specified limits and . In this case,
and so
and the backtransformed mean is given by
In R, this can be calculated as follows.
# Bounds a < 50 b < 400 # Transform data y < log((eggsa)/(beggs)) fit < ets(y) fc < forecast(fit, h=50, level=0.95) fvar < ((fc$upper=fc$lower)/qnorm(0.975)/2)^2 emu < exp(fc$mean) # Backtransform forecasts fc$mean < (ba)*exp(fc$mean)/(1+exp(fc$mean)) + a fc$lower < (ba)*exp(fc$lower)/(1+exp(fc$lower)) + a fc$upper < (ba)*exp(fc$upper)/(1+exp(fc$upper)) + a fc$x < eggs # Plot result on original scale plot(fc) # Compute forecast mean fc$mean < 1/(1+emu)^3*((a+b*emu)*(1+emu)^2 + fvar*(ba)*emu*(1emu)/2) lines(fc$mean,col='red')
Published at DZone with permission of Rob J Hyndman, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Trending

Auditing Tools for Kubernetes

A Complete Guide to AWS File Handling and How It Is Revolutionizing Cloud Storage

Observability Architecture: Financial Payments Introduction

The SPACE Framework for Developer Productivity
Comments