How to Back Transform Log Data in R
Forecasting with transformations
All fable models with formula-based model specification support a highly flexible specification of transformations. Specified transformations are automatically back-transformed and bias adjusted to produce forecast means and fitted values on the original scale of the data.
The transformation used for the model is defined on the left of the tilde (~
) in the formula. For example, when forecasting Melbourne Trips
from the tsibble::tourism
dataset, a square root transformation can applied using sqrt(Trips)
.
library(fable) library(tsibble) library(dplyr) tourism %>% filter(Region == "Melbourne") %>% model(ETS(sqrt(Trips))) #> # A mable: 4 x 4 #> # Key: Region, State, Purpose [4] #> Region State Purpose `ETS(sqrt(Trips))` #> <chr> <chr> <chr> <model> #> 1 Melbourne Victoria Business <ETS(A,N,A)> #> 2 Melbourne Victoria Holiday <ETS(A,A,A)> #> 3 Melbourne Victoria Other <ETS(A,N,N)> #> 4 Melbourne Victoria Visiting <ETS(M,N,A)>
Combining transformations
Multiple transformations can be combined using this interface, allowing more complicated transformations to be used. A simple example of a combined transformation is \(f(x) = log(x+1)\), as it involves both a log
transformation, and a +1
transformation. This transformation is commonly used to overcome a limitation of using log transformations to preserve non-negativity, on data which contains zeroes.
Simple combined transformations and backtransformations can be constructed automatically.
library(tsibble) tourism %>% filter(Region == "Melbourne") %>% model(ETS(log(Trips + 1))) #> # A mable: 4 x 4 #> # Key: Region, State, Purpose [4] #> Region State Purpose `ETS(log(Trips + 1))` #> <chr> <chr> <chr> <model> #> 1 Melbourne Victoria Business <ETS(A,N,A)> #> 2 Melbourne Victoria Holiday <ETS(M,A,A)> #> 3 Melbourne Victoria Other <ETS(A,N,N)> #> 4 Melbourne Victoria Visiting <ETS(M,N,A)>
Custom transformations
It is possible to extend the supported transformations by defining your own transformation with an appropriate back-transformation function. It is assumed that the first argument of your function is your data which is being transformed.
A useful transformation which is not readily supported by fable is the scaled logit, which allows the forecasts to be bounded by a given interval (forecasting within limits). The appropriate transformation to ensure the forecasted values are between \(a\) and \(b\) (where \(a<b\)) is given by:
\[f(x) = \log\left(\dfrac{x-a}{b-x}\right)\]
Inverting this transformation gives the appropriate back-transformation of:
\[f^{-1}(x) = \dfrac{a + be^x}{1 + e^x} = \dfrac{(b-a)e^x}{1 + e^x} + a\] To use this transformation for modelling, we can pair the transformation with its back transformation using the new_transformation
function from fabletools
. This function which accepts two inputs: first the transformation, and second the back-transformation.
scaled_logit <- function(x, lower= 0, upper= 1){ log((x-lower)/(upper-x)) } inv_scaled_logit <- function(x, lower= 0, upper= 1){ (upper-lower)* exp(x)/(1 + exp(x)) + lower } my_scaled_logit <- new_transformation(scaled_logit, inv_scaled_logit)
Once you define your transformation as above, it is ready to use anywhere you would normally use a transformation.
cbind(mdeaths, fdeaths) %>% as_tsibble(pivot_longer = FALSE) %>% model(ETS(my_scaled_logit(mdeaths, 750, 3000) ~ error("A") + trend("N") + season("A"))) %>% report() #> Series: mdeaths #> Model: ETS(A,N,A) #> Transformation: my_scaled_logit(mdeaths, 750, 3000) #> Smoothing parameters: #> alpha = 0.1427297 #> gamma = 0.0001000037 #> #> Initial states: #> l[0] s[0] s[-1] s[-2] s[-3] s[-4] s[-5] #> -0.576581 0.7181113 -0.1305675 -0.4690919 -1.197746 -1.114423 -0.7727465 #> s[-6] s[-7] s[-8] s[-9] s[-10] s[-11] #> -0.6240044 -0.275529 0.4140919 0.9658113 1.272782 1.213311 #> #> sigma^2: 0.1489 #> #> AIC AICc BIC #> 185.2488 193.8202 219.3988
How to Back Transform Log Data in R
Source: https://cran.r-project.org/web/packages/fable/vignettes/transformations.html
0 Response to "How to Back Transform Log Data in R"
Post a Comment