data <- read_csv("DailyDelhiClimateTrain.csv")
#we convert the csv into a timeseries object here.
series <- ts(data$meantemp, frequency = 365, start = c(2013, 1))
Εδω πέρα κάναμε αποσύνθεση τις χρονοσειράς. Υπάρχει εποχικότητα, ωστόσο η τάση μας δεν αυξάνεται γραμμικά, έχουμε multiplicative χρονοσειρά καθώς η τάση μεγαλώνει εκθετικά (Trend diagram). Δεν έχουμε σταθερή διακύμανση.
Ωστόσο έχουμε εποχικότητα.
# Επειδή είδαμε ότι το πλάτος μεγαλώνει → multiplicative
dec_mult <- decompose(series, type = "multiplicative")
autoplot(dec_mult) +
ggtitle("Multiplicative Decomposition — Temperatures")
adf.test(series)
##
## Augmented Dickey-Fuller Test
##
## data: series
## Dickey-Fuller = -1.8526, Lag order = 11, p-value = 0.6407
## alternative hypothesis: stationary
αρχικά το p-value μας είναι 0.64, η σειρά δεν είναι στάσιμη, δεν έχουμε σταθερή μέση τιμή και διακύμανση όσο διασχίζουμε την χρονοσειρά, για την μετατροπή θα χρησιμοποιήσουμε λογάριθμο (log) για να γίνει additive.
#εδω πέρα αφαιρέσαμε την τάση και την εποχικότητα (εφόσον έχουμε ετήσια εποχικότητα.
temp_diff <- diff(diff(log(series)), lag = 365)
autoplot(temp_diff) +
ggtitle("Μετά από log + 1η διαφόριση + εποχιακή διαφόριση")
# Ξανά ελέγχουμε
adf.test(temp_diff)
##
## Augmented Dickey-Fuller Test
##
## data: temp_diff
## Dickey-Fuller = -14.046, Lag order = 10, p-value = 0.01
## alternative hypothesis: stationary
εδω πέρα παρατηρούμε πως το p-value είναι 0.01 και η σειρά μας έγινε στάσιμη!
Στο pacf εδώ διακρίνουμε οτι ένα χρόνο πριν στην ημέρα 365 έχουμε στατιστική σημαντικότητα, με την φετινή ίδια μέρα, οτι ώς ενα βαθμό παίζει μεγάλο ρόλο η περσινή ίδια μέρα!
p1 <- ggAcf(temp_diff) + ggtitle("ACF")
p2 <- ggPacf(temp_diff) + ggtitle("PACF")
grid.arrange(p1, p2, ncol = 2)
Παρακάτω δείχνουμε το PACF για τις προηγούμενες 30 ημέρες (30 lags) για να γίνει πιο φανερό.
ggPacf(temp_diff,lag.max=30) + ggtitle("pacf")
auto.arima(temp_diff)
## Series: temp_diff
## ARIMA(5,0,0) with zero mean
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5
## -0.1768 -0.1139 -0.1909 -0.1149 -0.0983
## s.e. 0.0303 0.0306 0.0302 0.0307 0.0305
##
## sigma^2 = 0.009783: log likelihood = 982.89
## AIC=-1953.77 AICc=-1953.7 BIC=-1923.78
Μπορούμε να δούμε καλύτερα στο PACF διάγραμμα οτι οι 5 προηγούμενες μέρες (5 lags) έχουν σημαντική επίδραση στην αμέσως επόμενη ημερομηνία. Και μάλιστα η αμέσως προηγούμενη μέρα είναι στατιστικά σημαντική, φθίνει σταδιακά
για παράδειγμα το pacf μας λεει οτι η θερμοκρασία του σαββάτου μπορεί να εξηγηθεί σε μεγάλο βαθμο απο τις θερμοκρασίες απο Δευτέρα εώς Παρασκευή με την Παρασκευή να επιδρά σημαντικά (η αμέσως προηγούμενη μέρα του Σαββάτου)
Το auto_arima επέλεξε το μοντέλο ARIMA(5,0,0) και σημαίνει πως χρησιμοποεί 5 παρελθοντικά lags (5 προηγούμενες ημέρες) και το q = 0 (Moving Average = 0)
Το ACF μας δείχνει την συσχέτιση ολων των προηγούμενων lags στο τωρινό lag, ενώ το PACF μας δείχνει την επίδραση του κάθε lag μεμονωμένα.. μειώνει τα ενδιάμεσα lags. Ενώ το ACF μας λέει οτι η επίδραση του καθενός προστίθεται στο επόμενο.. και στο επόμενο..
ggAcf(temp_diff,lag.max=30) + ggtitle("ACF")
auto.arima(temp_diff)
## Series: temp_diff
## ARIMA(5,0,0) with zero mean
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5
## -0.1768 -0.1139 -0.1909 -0.1149 -0.0983
## s.e. 0.0303 0.0306 0.0302 0.0307 0.0305
##
## sigma^2 = 0.009783: log likelihood = 982.89
## AIC=-1953.77 AICc=-1953.7 BIC=-1923.78
επιλέχθηκε το μοντέλο ARIMA(5,0,0).
test <- read_csv("DailyDelhiClimateTest.csv")
seriesTest <- ts(test$meantemp, frequency = 365, start = c(2017, 1), end=c(2017,31))
fit_arima <- auto.arima(seriesTest, lambda = 0) # lambda=0 → log transformation
summary(fit_arima)
## Series: seriesTest
## ARIMA(1,0,0) with non-zero mean
## Box Cox transformation: lambda= 0
##
## Coefficients:
## ar1 mean
## 0.6826 2.7460
## s.e. 0.1230 0.0596
##
## sigma^2 = 0.01348: log likelihood = 23.48
## AIC=-40.96 AICc=-40.07 BIC=-36.66
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.09142271 1.764448 1.380199 -0.7078768 8.936664 NaN -0.06191349
παρατηρούμε πως το Mean absolute error είναι 1.38 ενώ το RMSE 1.76, είμαστε πολύ κοντά στην πραγματική πρόβλεψη θερμοκρασίας και η απόκλιση είναι πολύ μικρή.
στο test dataset όλα πέφτουν εντός των μπλέ γραμμών (θόρυβος) και έχουμε σχεδόν κανονική κατανομή.
checkresiduals(fit_arima)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,0,0) with non-zero mean
## Q* = 2.2054, df = 5, p-value = 0.8201
##
## Model df: 1. Total lags used: 6