library(tidyverse)
library(readxl)
library(ggplot2)
library(lubridate)
library(forecast)
library(writexl)
library(tseries)
library(magrittr)
2, Linear Regression
acf(ti$price, na.action = na.pass)

pacf(ti$price, na.action = na.pass)

There is no obvious seasonal variation or fluctuation. So linear regression is used to model the trend. Then, arima model is used to remove the correlation in residuals.
lm <- lm(price ~ bi_annual, ti)
acf(lm$residuals)

pacf(lm$residuals)

3, ARIMA Model of Residuals from Linear Regression
mod_resi_lm <- auto.arima(lm$residuals)
mod_resi_lm
Series: lm$residuals
ARIMA(1,0,0) with zero mean
Coefficients:
ar1
0.8613
s.e. 0.0854
sigma^2 estimated as 0.0001835: log likelihood=83.43
AIC=-162.87 AICc=-162.4 BIC=-160.13
acf(mod_resi_lm$residuals)

pacf(mod_resi_lm$residuals)

3, Forecast
Forecast is the combination of those from linear regression model and arima model.
pred_resi_lm <- predict(mod_resi_lm, n.ahead = 21 * 2)
pred_lm <- predict(
lm, newdata = data.frame(bi_annual = seq(2019.5, 2019.5 + 20.5, by = 0.5))
)
ti_fore <- ti %>%
bind_rows(
tibble(
bi_annual = seq(2019.5, 2019.5 + 20.5, by = 0.5),
price = as.numeric(pred_resi_lm$pred) + pred_lm,
observation = rep(FALSE, length(pred_lm))
)
)
ti_fore %>%
ggplot() +
geom_line(mapping = aes(x = bi_annual, y = price, color = observation)) +
labs(
title = "Forecast of Bi-Annual Electricity Price in Malta",
subtitle = "with all included from 19F to 40F using data from 03f to 09s",
y = "Price (Euro / Kilo-Watt-Hour)",
x = "Bi-Annual"
)

4, Annual Averaged Price Forecast
ti_annual <-
tibble(
year = round(seq(2019 - 0.01, 2019 - 0.01 + 20.5, by = 0.5)),
price = c(0.1305, (pred_resi_lm$pred + pred_lm)[1:41]), bi = rep(1:2, 21)
) %>%
spread(key = "bi", value = "price") %>%
mutate(price_ave = (.$`1` + .$`2`) / 2) %>%
select(year, price_ave)
ti_annual
LS0tCnRpdGxlOiAiRm9yZWNhc3QgQmktQW5udWFsIEVsZWN0cmljaXR5IFByaWNlIGluIE1hbHRhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZGF0ZTogT2N0IDIwdGgsIDIwMTkKYXV0aG9yOiBFZHdhcmQgSi4gWHUgKDxlZHh1OTZAb3V0bG9vay5jb20+KQotLS0KCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CnJtKGxpc3QgPSBscygpKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgY29sbGFwc2UgPSBUUlVFLAogIGNvbW1lbnQgPSAiIz4iLAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogIGZpZy5hc3AgPSA5LzE2LAogIGZpZy53aWR0aCA9IDcsCiAgd2FybmluZyA9IEZBTFNFCikKYGBgCgpgYGB7ciwgd2FybmluZz1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGZvcmVjYXN0KQpsaWJyYXJ5KHdyaXRleGwpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeShtYWdyaXR0cikKYGBgCgojIyAxLCBEYXRhCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KdGkgPC0KICByZWFkeGw6OnJlYWRfZXhjZWwoIn4vR2l0SHViL0VuZXJneVN0b3JhZ2UvZS1wcmljZS1mb3JlY2FzdC9lLXByaWNlLnhsc3giKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICB0KCkgJT4lCiAge3RpYmJsZShiaV9hbm51YWwgPSBhcy5udW1lcmljKHJvd25hbWVzKC4pKSwgcHJpY2UgPSAuWywxXSl9ICU+JQogIG11dGF0ZShvYnNlcnZhdGlvbiA9IHJlcChUUlVFLCBsZW5ndGgoLiRiaV9hbm51YWwpKSkKCnRpWzE1OjIzLCAyXSA8LSBjKDE2LjQ3LCAxNi41MywgMTYuNTEsIDE2LjY2LCAxNi43MywgMTYuNzgsIDE2LjY0LCAxNi44OSwgMTQuNzQpIC8gMTAwCmBgYAoKSGVyZSBpcyB0aGUgYmktc25udWFsIGVsZWN0cmljaXR5IHByaWNlIGluIE1hbHRhIChFdXJvIC8gS2lsb3dhdHQtaG91cikgd2l0aCBhbGwgdGF4ZXMgYW5kIGxldmllcyBpbmNsdWRlZCwgd2hpY2ggaXMgZG93bmxvYWRlZCBmcm9tIDxodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdC9kYXRhL2RhdGFiYXNlPiBhbmQgPGh0dHBzOi8vd3d3LnN0YXRpc3RhLmNvbS9zdGF0aXN0aWNzLzQxODEwNC9lbGVjdHJpY2l0eS1wcmljZXMtZm9yLWhvdXNlaG9sZHMtaW4tbWFsdGEvPi4gVGhlIGRhdGEgaW4gMjAwOCBhbmQgMjAwOSBpcyBtaXNzaW5nLgoKYGBge3J9CmhlYWQodGkpCmBgYAoKYGBge3J9CnRpICU+JQogIGdncGxvdCgpICsKICAgIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBiaV9hbm51YWwsIHkgPSBwcmljZSkpICsKICAgIGxhYnMoCiAgICAgIHRpdGxlID0gIkJpLUFubnVhbCBFbGVjdHJpY2l0eSBQcmljZSBpbiBNYWx0YSIsCiAgICAgIHN1YnRpdGxlID0gIndpdGggQWxsIHRheGVzIGFuZCBsZXZpZXMgaW5jbHVkZWQgZnJvbSAyMDAzZiB0byAyMDA5cyIsCiAgICAgIHkgPSAiUHJpY2UgKEV1cm8gLyBLaWxvd2F0dC1ob3VyKSIsCiAgICAgIHggPSAiSW5kZXggKEJpLUFubnVhbCkiCiAgICAgICkKYGBgCgojIyAyLCBMaW5lYXIgUmVncmVzc2lvbgoKYGBge3J9CmFjZih0aSRwcmljZSwgbmEuYWN0aW9uID0gbmEucGFzcykKYGBgCgpgYGB7cn0KcGFjZih0aSRwcmljZSwgbmEuYWN0aW9uID0gbmEucGFzcykKYGBgCgpUaGVyZSBpcyBubyBvYnZpb3VzIHNlYXNvbmFsIHZhcmlhdGlvbiBvciBmbHVjdHVhdGlvbi4gU28gbGluZWFyIHJlZ3Jlc3Npb24gaXMgdXNlZCB0byBtb2RlbCB0aGUgdHJlbmQuIFRoZW4sIGFyaW1hIG1vZGVsIGlzIHVzZWQgdG8gcmVtb3ZlIHRoZSBjb3JyZWxhdGlvbiBpbiByZXNpZHVhbHMuCgpgYGB7cn0KbG0gPC0gbG0ocHJpY2UgfiBiaV9hbm51YWwsIHRpKQpgYGAKCmBgYHtyfQphY2YobG0kcmVzaWR1YWxzKQpgYGAKCmBgYHtyfQpwYWNmKGxtJHJlc2lkdWFscykKYGBgCgojIyAzLCBBUklNQSBNb2RlbCBvZiBSZXNpZHVhbHMgZnJvbSBMaW5lYXIgUmVncmVzc2lvbgoKYGBge3J9Cm1vZF9yZXNpX2xtIDwtIGF1dG8uYXJpbWEobG0kcmVzaWR1YWxzKQptb2RfcmVzaV9sbQpgYGAKCmBgYHtyfQphY2YobW9kX3Jlc2lfbG0kcmVzaWR1YWxzKQpgYGAKCmBgYHtyfQpwYWNmKG1vZF9yZXNpX2xtJHJlc2lkdWFscykKYGBgCgojIyAzLCBGb3JlY2FzdAoKRm9yZWNhc3QgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHRob3NlIGZyb20gbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgYW5kIGFyaW1hIG1vZGVsLgoKYGBge3J9CnByZWRfcmVzaV9sbSA8LSBwcmVkaWN0KG1vZF9yZXNpX2xtLCBuLmFoZWFkID0gMjEgKiAyKQpwcmVkX2xtIDwtIHByZWRpY3QoCiAgbG0sIG5ld2RhdGEgPSBkYXRhLmZyYW1lKGJpX2FubnVhbCA9IHNlcSgyMDE5LjUsIDIwMTkuNSArIDIwLjUsIGJ5ID0gMC41KSkKICApCgp0aV9mb3JlIDwtIHRpICU+JQogIGJpbmRfcm93cygKICAgIHRpYmJsZSgKICAgICAgYmlfYW5udWFsID0gc2VxKDIwMTkuNSwgMjAxOS41ICsgMjAuNSwgYnkgPSAwLjUpLAogICAgICBwcmljZSA9IGFzLm51bWVyaWMocHJlZF9yZXNpX2xtJHByZWQpICsgcHJlZF9sbSwKICAgICAgb2JzZXJ2YXRpb24gPSByZXAoRkFMU0UsIGxlbmd0aChwcmVkX2xtKSkKICAgICAgKQogICAgKQpgYGAKCmBgYHtyfQp0aV9mb3JlICU+JQogIGdncGxvdCgpICsKICAgIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBiaV9hbm51YWwsIHkgPSBwcmljZSwgY29sb3IgPSBvYnNlcnZhdGlvbikpICsKICAgIGxhYnMoCiAgICAgIHRpdGxlID0gIkZvcmVjYXN0IG9mIEJpLUFubnVhbCBFbGVjdHJpY2l0eSBQcmljZSBpbiBNYWx0YSIsCiAgICAgIHN1YnRpdGxlID0gIndpdGggYWxsIGluY2x1ZGVkIGZyb20gMTlGIHRvIDQwRiB1c2luZyBkYXRhIGZyb20gMDNmIHRvIDA5cyIsCiAgICAgIHkgPSAiUHJpY2UgKEV1cm8gLyBLaWxvLVdhdHQtSG91cikiLAogICAgICB4ID0gIkJpLUFubnVhbCIKICAgICAgKQpgYGAKCiMjIDQsIEFubnVhbCBBdmVyYWdlZCBQcmljZSBGb3JlY2FzdAoKYGBge3J9CnRpX2FubnVhbCA8LQogIHRpYmJsZSgKICAgIHllYXIgPSByb3VuZChzZXEoMjAxOSAtIDAuMDEsIDIwMTkgLSAwLjAxICsgMjAuNSwgYnkgPSAwLjUpKSwgCiAgICBwcmljZSA9IGMoMC4xMzA1LCAocHJlZF9yZXNpX2xtJHByZWQgKyBwcmVkX2xtKVsxOjQxXSksIGJpID0gcmVwKDE6MiwgMjEpCiAgICApICU+JQogIHNwcmVhZChrZXkgPSAiYmkiLCB2YWx1ZSA9ICJwcmljZSIpICU+JQogIG11dGF0ZShwcmljZV9hdmUgPSAoLiRgMWAgKyAuJGAyYCkgLyAyKSAlPiUKICBzZWxlY3QoeWVhciwgcHJpY2VfYXZlKQpgYGAKCmBgYHtyfQp0aV9hbm51YWwKYGBgCgo=