## -----------------------------------------------------------------------------
# Load the package
library(onlineforecast)
# Set the data in D to simplify notation
D <- Dbuilding

## -----------------------------------------------------------------------------
# Print the first time point
D$t[1]
# Set the score period 
D$scoreperiod <- in_range("2010-12-22", D$t)
# Plot to see it
plot(D$t, D$scoreperiod, xlab="Time", ylab="Scoreperiod")

## -----------------------------------------------------------------------------
# Exclude other points example
scoreperiod2 <- D$scoreperiod
scoreperiod2[in_range("2010-12-30",D$t,"2011-01-02")] <- FALSE

## -----------------------------------------------------------------------------
# Generate new object (R6 class)
model <- forecastmodel$new()
# Set the model output
model$output = "heatload"
# Inputs (transformation step)
model$add_inputs(Ta = "Ta",
                 mu = "one()")
# Regression step parameters
model$add_regprm("rls_prm(lambda=0.9)")
# Optimization bounds for parameters
model$add_prmbounds(lambda = c(0.9, 0.99, 0.9999))
# Set the horizons for which the model will be fitted
model$kseq <- 1:36

## -----------------------------------------------------------------------------
# Generate new object
model <- forecastmodel$new()
# Set the model output
model$output = "heatload"

## -----------------------------------------------------------------------------
# Inputs (transformation step)
model$add_inputs(Ta = "Ta",
                 mu = "one()")

## -----------------------------------------------------------------------------
# Regression step parameters
model$add_regprm("rls_prm(lambda=0.9)")

## -----------------------------------------------------------------------------
# The evaluation happens with
eval(parse(text="rls_prm(lambda=0.9)"))
# and the result is stored in
model$regprm 

## -----------------------------------------------------------------------------
# Optimization bounds for parameters
model$add_prmbounds(lambda = c(0.9, 0.99, 0.9999))

## -----------------------------------------------------------------------------
# Set the horizons for which the model will be fitted
model$kseq <- 1:36

## ----output.lines=15----------------------------------------------------------
# Call the optim() wrapper
rls_optim(model, D, kseq = c(3,18))

## -----------------------------------------------------------------------------
# Optimized lambda
model$prm

## -----------------------------------------------------------------------------
# Fit for all on entire period in D
fit1 <- rls_fit(model$prm, model, D)

## -----------------------------------------------------------------------------
# See the summary of the fit
summary(fit1)

## -----------------------------------------------------------------------------
# Put the forecasts in D
D$Yhat1 <- fit1$Yhat
# Plot them for selected horizons
plot_ts(D, c("^heatload$|^Y"), kseq = c(1,6,18,36))

## ----fig.height=4-------------------------------------------------------------
# Select a point
i <- 996-48
# and kseq steps ahead
iseq <- i+model$kseq
# The observations ahead in time
plot(D$t[iseq], D$heatload[iseq], type = "b", xlab = "t", ylab = "y")
title(main=pst("Forecast available at ",D$t[i]))
# The forecasts
lines(D$t[iseq], D$Yhat1[i, ], type = "b", col = 2)
legend("topright", c("Observations",pst("Predictions (",min(model$kseq)," to ",max(model$kseq)," steps ahead)")), lty = 1, col = 1:2)

## ----eval=FALSE---------------------------------------------------------------
#  # This will give error
#  one()

## -----------------------------------------------------------------------------
# Evaluate input expressions
datatr <- model$transform_data(D)
# See what came out
summary.default(datatr)
# In particular for the mu = "one()"
head(datatr$mu)

## ----eval=FALSE---------------------------------------------------------------
#  # Set the function to debug (uncomment the line)
#  #debug(one)
#  # Run the input transformation now and it will stop in one()
#  datatr <- model$transform_data(D)
#  # Set to undebug
#  #undebug(one)

## -----------------------------------------------------------------------------
# Just update the Ta input by
model$add_inputs(Ta = "lp(Ta, a1=0.9)")

## -----------------------------------------------------------------------------
# Define a new model with low-pass filtering of the Ta input
model <- forecastmodel$new()
model$output = "heatload"
model$add_inputs(Ta = "lp(Ta, a1=0.9)",
                 mu = "one()")
model$add_regprm("rls_prm(lambda=0.99)")
model$add_prmbounds(Ta__a1 = c(0.5, 0.9, 0.9999),
                    lambda = c(0.9, 0.99, 0.9999))
model$kseq <- c(3,18)

## -----------------------------------------------------------------------------
model$prmbounds

## -----------------------------------------------------------------------------
# Low-pass filter Ta (with a1=0.9 as defined above)
datatr <- model$transform_data(D)
# Actually, lp() can be called directly (although two warnings are thrown)
Talp <- lp(D$Ta, a1=0.99)

## -----------------------------------------------------------------------------
# Plot the Ta$k1 forecasts
plot(D$t, D$Ta$k1, type="l")
# Add the filtered with a1=0.9
lines(D$t, datatr$Ta[ ,"k1"], col=2)
# Add the filtered with a1=0.99
lines(D$t, Talp[ ,"k1"], col=3)

## ----output.lines=15----------------------------------------------------------
# Optimize the parameters
model$prm <- rls_optim(model, D)$par

## ----fig.height=4-------------------------------------------------------------
# Fit for all horizons
model$kseq <- 1:36
# Fit with RLS
fit2 <- rls_fit(model$prm, model, D)
# Take the forecasts
D$Yhat2 <- fit2$Yhat
# Plot all
plot_ts(D, c("^heatload$|^Y"), kseq = c(1,18))

## -----------------------------------------------------------------------------
summary(fit2)

## -----------------------------------------------------------------------------
# Calculate the score
RMSE1 <- summary(fit1, printit=FALSE)$scoreval
RMSE2 <- summary(fit2, printit=FALSE)$scoreval

## -----------------------------------------------------------------------------
# Check that all NAs in the scoreperiod are at the same positions
all(is.na(fit1$Yhat[fit1$data$scoreperiod, ]) == is.na(fit2$Yhat[fit2$data$scoreperiod, ]))

## -----------------------------------------------------------------------------
# Plot the score for the two models
plot(RMSE1, xlab="Horizon k", ylab="RMSE", type="b", ylim=range(RMSE1,RMSE2))
lines(RMSE2, type="b", col=2)
legend("topleft", c("Input: Ta","Input: Low-pass Ta"), lty=1, col=1:2)

## ----output.lines=28----------------------------------------------------------
make_tday(D$t, kseq=1:3)

## -----------------------------------------------------------------------------
D$tday <- make_tday(D$t, 1:36)

## -----------------------------------------------------------------------------
D$Tao <- make_input(D$Taobs, kseq=1:36)
model$add_inputs(Tao = "lp(Tao, a1=0.99)")

## -----------------------------------------------------------------------------
m1 <- model$clone_deep()

