library(dLagM)
## Warning: package 'dLagM' was built under R version 4.2.3
## Loading required package: nardl
## Warning: package 'nardl' was built under R version 4.2.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Loading required package: dynlm
## Warning: package 'dynlm' was built under R version 4.2.3
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(dynlm)
library(MLmetrics)
## Warning: package 'MLmetrics' was built under R version 4.2.3
##
## Attaching package: 'MLmetrics'
## The following object is masked from 'package:dLagM':
##
## MAPE
## The following object is masked from 'package:base':
##
## Recall
library(lmtest)
library(car)
## Loading required package: carData
# Yt = TS [Earth Skin Temperature (C)]
# Xt = T2M [Temperature at 2 Meters (C)]
library(rio)
## Warning: package 'rio' was built under R version 4.2.3
datatug <- Import("https://raw.githubusercontent.com/afhkaniase/praktikum-mpdw/main/Pertemuan%203/Data%20Latihan%203.csv")
t <- datatug$Date
Yt <- datatug$TS
Xt <- datatug$T2M
data3 <- data.frame(Yt,Xt)
str(data3)
## 'data.frame': 123 obs. of 2 variables:
## $ Yt: num 2.95 3.17 3.3 3.02 3.08 3.77 3.73 3 3.07 3.37 ...
## $ Xt: num 4.53 7.36 5.97 2.85 2.55 4.96 3.64 0.44 1.97 2.8 ...
data3
## Yt Xt
## 1 2.95 4.53
## 2 3.17 7.36
## 3 3.30 5.97
## 4 3.02 2.85
## 5 3.08 2.55
## 6 3.77 4.96
## 7 3.73 3.64
## 8 3.00 0.44
## 9 3.07 1.97
## 10 3.37 2.80
## 11 3.53 2.43
## 12 3.67 3.18
## 13 3.90 3.58
## 14 4.02 5.53
## 15 4.58 6.40
## 16 4.70 5.44
## 17 4.53 6.01
## 18 4.56 6.88
## 19 4.64 6.82
## 20 5.00 7.49
## 21 5.41 7.91
## 22 6.05 9.55
## 23 6.22 7.40
## 24 6.72 10.98
## 25 6.93 11.74
## 26 7.21 12.94
## 27 7.14 12.00
## 28 7.07 11.75
## 29 7.22 9.82
## 30 7.32 8.29
## 31 6.65 7.81
## 32 6.51 9.73
## 33 7.05 12.24
## 34 7.14 12.13
## 35 7.15 9.80
## 36 7.42 10.91
## 37 8.05 10.32
## 38 8.20 8.83
## 39 8.72 10.96
## 40 9.15 12.66
## 41 9.57 14.78
## 42 8.87 11.76
## 43 8.07 8.33
## 44 7.88 8.66
## 45 8.25 9.36
## 46 8.92 10.63
## 47 9.88 12.51
## 48 10.75 13.58
## 49 11.71 15.44
## 50 12.38 16.07
## 51 13.31 16.65
## 52 13.31 16.65
## 53 13.91 16.36
## 54 14.64 16.32
## 55 14.31 14.86
## 56 14.21 15.84
## 57 14.06 16.58
## 58 13.82 16.44
## 59 13.73 15.37
## 60 14.05 16.02
## 61 14.40 16.00
## 62 15.86 17.33
## 63 17.37 20.02
## 64 17.67 19.36
## 65 17.66 18.79
## 66 18.33 19.95
## 67 19.41 21.21
## 68 20.32 22.07
## 69 20.99 21.59
## 70 21.87 22.79
## 71 21.80 22.20
## 72 21.00 21.03
## 73 19.69 19.35
## 74 18.46 19.03
## 75 18.26 19.15
## 76 18.48 20.34
## 77 18.51 19.15
## 78 19.42 20.95
## 79 19.70 21.63
## 80 19.67 21.71
## 81 19.16 19.08
## 82 18.95 18.04
## 83 19.19 19.61
## 84 19.30 19.10
## 85 19.80 19.86
## 86 20.57 21.54
## 87 20.99 22.63
## 88 20.92 22.07
## 89 20.73 21.37
## 90 20.80 20.80
## 91 20.85 20.04
## 92 20.94 20.65
## 93 21.10 21.20
## 94 20.89 20.53
## 95 20.44 18.05
## 96 20.15 17.97
## 97 19.75 18.46
## 98 19.92 19.90
## 99 20.28 20.34
## 100 20.65 21.14
## 101 21.16 22.05
## 102 21.73 22.79
## 103 21.37 21.13
## 104 21.44 21.54
## 105 21.72 21.63
## 106 22.15 22.50
## 107 22.11 22.29
## 108 21.87 21.39
## 109 21.76 21.01
## 110 21.26 19.19
## 111 21.06 19.30
## 112 21.24 21.77
## 113 21.25 21.00
## 114 21.30 21.68
## 115 21.74 22.34
## 116 21.85 22.57
## 117 21.71 21.35
## 118 21.46 20.94
## 119 21.39 21.62
## 120 20.78 19.52
## 121 20.61 19.40
## 122 20.13 17.69
## 123 20.05 20.02
#SPLIT DATA
data3_train<-data3[1:98,]
data3_test<-data3[99:123,]
#data time series
train.ts<-ts(data3_train)
test.ts<-ts(data3_test)
data.ts<-ts(data3)
Model Koyck didasarkan pada asumsi bahwa semakin jauh jarak lag peubah independen dari periode sekarang maka semakin kecil pengaruh peubah lag terhadap peubah dependen.
Koyck mengusulkan suatu metode untuk menduga model dinamis distributed lag dengan mengasumsikan bahwa semua koefisien \(\beta\) mempunyai tanda sama.
Model kyock merupakan jenis paling umum dari model infinite distributed lag dan juga dikenal sebagai geometric lag
\[ y_t=a(1-\lambda)+\beta_0X_t+\beta_1Z_t+\lambda Y_{t-1}+V_t \]
dengan \[V_t=u_t-\lambda u_{t-1}\]
Pemodelan model Koyck dengan R dapat menggunakan
dLagM::koyckDlm() . Fungsi umum dari koyckDlm
adalah sebagai berikut.
Fungsi koyckDlm() akan menerapkan model lag
terdistribusi dengan transformasi Koyck satu prediktor. Nilai
x dan y tidak perlu sebagai objek time
series (ts). intercept dapat dibuat
TRUE untuk memasukkan intersep ke dalam model.
data3_model.koyck <- koyckDlm(x = data3_train$Xt, y = data3_train$Yt)
summary(data3_model.koyck)
##
## Call:
## "Y ~ (Intercept) + Y.1 + X.t"
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.306328 -0.256056 0.002453 0.208640 1.226161
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.10931 0.13987 0.782 0.436
## Y.1 0.94879 0.03327 28.518 <2e-16 ***
## X.t 0.04974 0.03587 1.387 0.169
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4528 on 94 degrees of freedom
## Multiple R-Squared: 0.9953, Adjusted R-squared: 0.9952
## Wald test: 1.002e+04 on 2 and 94 DF, p-value: < 2.2e-16
##
## Diagnostic tests:
## NULL
##
## alpha beta phi
## Geometric coefficients: 2.134555 0.04973701 0.9487908
AIC(data3_model.koyck)
## [1] 126.5151
BIC(data3_model.koyck)
## [1] 136.814
Dari hasil tersebut, didapat bahwa peubah \(y_{t-1}\) memiliki nilai \(P-Value<0.05\). Hal ini menunjukkan bahwa peubah \(y_{t-1}\) berpengaruh signifikan terhadap \(y\). Adapun model keseluruhannya adalah sebagai berikut
\[ \hat{Y_t} = 0.10931 + 0.04974X_t + 0.94879Y_{t-1} \]
Berikut adalah hasil peramalan y untuk 25 periode kedepan menggunakan model koyck
fore.koyck <- forecast(model = data3_model.koyck, x=data3_test$Xt, h=25)
fore.koyck
## $forecasts
## [1] 20.02087 20.15637 20.33019 20.53191 20.64074 20.76439 20.88618 21.04501
## [9] 21.18526 21.27357 21.33845 21.30949 21.28748 21.38945 21.44790 21.53718
## [17] 21.65471 21.77766 21.83364 21.86636 21.93123 21.88832 21.84165 21.71231
## [25] 21.70548
##
## $call
## forecast.koyckDlm(model = data3_model.koyck, x = data3_test$Xt,
## h = 25)
##
## attr(,"class")
## [1] "forecast.koyckDlm" "dLagM"
#akurasi data testing
mape.koyck.test <- MAPE(fore.koyck$forecasts, data3_test$Yt)
mape.koyck.test
## [1] 0.02981854
#akurasi data training
mape.koyck.train <- GoF(data3_model.koyck)
mape.koyck.train
## n MAE MPE MAPE sMAPE MASE
## data3_model.koyck 97 0.3315851 -0.003443496 0.03339684 0.0331023 0.8322136
## MSE MRAE GMRAE
## data3_model.koyck 0.1986777 26649597 0.9770295
Berdasarkan akurasi di atas, terlihat bahwa nilai MAPE keduanya tidak
jauh berbeda. Artinya, model regresi dengan distribusi lag ini tidak
overfitted atau underfitted.
Pemodelan model Regression with Distributed Lag dengan R
dapat menggunakan dLagM::dlm() . Fungsi umum dari
dlm adalah sebagai berikut.
dlm(formula , data , x , y , q , remove )
Fungsi dlm() akan menerapkan model lag terdistribusi
dengan satu atau lebih prediktor. Nilai x dan
y tidak perlu sebagai objek time series
(ts). \(q\) adalah integer
yang mewakili panjang lag yang terbatas.
#penentuan lag optimum
finiteDLMauto(formula = Yt ~ Xt,
data = data.frame(data3_train),
model.type = "dlm", error.type = "AIC")
## q - k MASE AIC BIC GMRAE MBRAE R.Adj.Sq Ljung-Box
## 10 10 2.25323 295.2537 327.4591 3.20525 0.52278 0.96212 2.220446e-16
Diperoleh lag optimum untuk peubah Xt = T2M [Temperature at 2 Meters (C)] adalah 10 hari sebelumnya. Selanjutnya dilakukan pemodelan kembali dengan \(q=10\)
model.dlm <- dlm(x = data3_train$Xt,y = data3_train$Yt , q = 10)
summary(model.dlm)
##
## Call:
## lm(formula = model.formula, data = design)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.54205 -0.77300 0.09346 0.73706 2.58880
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.31919 0.37736 -6.146 3.39e-08 ***
## x.t 0.49601 0.10758 4.610 1.59e-05 ***
## x.1 0.10451 0.15465 0.676 0.5012
## x.2 0.10045 0.15370 0.654 0.5154
## x.3 0.02629 0.14969 0.176 0.8611
## x.4 0.06991 0.14891 0.469 0.6401
## x.5 0.11779 0.14813 0.795 0.4290
## x.6 0.03569 0.14565 0.245 0.8071
## x.7 -0.01543 0.14543 -0.106 0.9158
## x.8 -0.04417 0.14569 -0.303 0.7626
## x.9 0.02276 0.14328 0.159 0.8742
## x.10 0.16909 0.09796 1.726 0.0884 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.202 on 76 degrees of freedom
## Multiple R-squared: 0.9669, Adjusted R-squared: 0.9621
## F-statistic: 201.9 on 11 and 76 DF, p-value: < 2.2e-16
##
## AIC and BIC values for the model:
## AIC BIC
## 1 295.2537 327.4591
AIC(model.dlm)
## [1] 295.2537
BIC(model.dlm)
## [1] 327.4591
Dari hasil diatas, didapat bahwa \(P-value\) dari intercept dan \(x_{t}<0.05\). Hal ini menunjukkan bahwa intercept dan \(x_{t}\) berpengaruh signifikan terhadap \(y\). Adapun model keseluruhan yang terbentuk adalah sebagai berikut
\[ \hat{Y_t} = - 2.31919 + 0.49601X_t + 0.10451X_{t-1} + 0.10045X_{t-2} + 0.02629X_{t-3} + 0.06991X_{t-4} + 0.11779X_{t-5} + 0.03569X_{t-6} - 0.01543X_{t-7} - 0.04417X_{t-8} + 0.02276X_{t-9} + 0.16909X_{t-10} \]
Berikut merupakan hasil peramalan \(y\) untuk 25 periode kedepan
fore.dlm <- forecast(model = model.dlm, x=data3_test$Xt, h=25)
fore.dlm
## $forecasts
## [1] 19.49596 19.62555 20.05032 20.94346 20.71624 20.82975 20.47847 21.03166
## [9] 21.12570 20.81076 20.56632 19.76291 19.89415 20.94923 20.35982 20.69972
## [17] 20.92367 21.46341 21.19640 20.86884 20.99687 19.66869 19.51093 18.65288
## [25] 19.37090
##
## $call
## forecast.dlm(model = model.dlm, x = data3_test$Xt, h = 25)
##
## attr(,"class")
## [1] "forecast.dlm" "dLagM"
#akurasi data testing
mape.dlm.test <- MAPE(fore.dlm$forecasts, data3_test$Yt)
mape.dlm.test
## [1] 0.04159384
#akurasi data training
mape.dlm.train <- GoF(model.dlm)
mape.dlm.train
## n MAE MPE MAPE sMAPE MASE MSE
## model.dlm 88 0.9269329 0.009663972 0.1142461 0.1263623 2.253232 1.248352
## MRAE GMRAE
## model.dlm 96906248 3.205253
Berdasarkan akurasi di atas, terlihat bahwa nilai MAPE antara data
training dengan data testing didapatkan jauh berbeda, artinya, model
regresi dengan distribution lag ini overfitted .
Peubah dependen dipengaruhi oleh peubah independen pada waktu sekarang, serta dipengaruhi juga oleh peubah dependen itu sendiri pada satu waktu yang lalu maka model tersebut disebut autoregressive (Gujarati 2004).
Pemodelan Autoregressive dilakukan menggunakan fungsi
dLagM::ardlDlm() . Fungsi tersebut akan menerapkan
autoregressive berordo \((p,q)\) dengan satu prediktor. Fungsi umum
dari ardlDlm() adalah sebagai berikut.
ardlDlm(formula = NULL , data = NULL , x = NULL , y = NULL , p = 1 , q = 1 ,
remove = NULL )
Dengan \(p\) adalah integer yang mewakili panjang lag yang terbatas dan \(q\) adalah integer yang merepresentasikan ordo dari proses autoregressive.
#penentuan lag optimum
model.ardl.opt <- ardlBoundOrders(data = data.frame(data3), ic = "AIC",
formula = Yt ~ Xt )
min_p=c()
for(i in 1:15){
min_p[i]=min(model.ardl.opt$Stat.table[[i]])
}
q_opt=which(min_p==min(min_p, na.rm = TRUE))
p_opt=which(model.ardl.opt$Stat.table[[q_opt]] ==
min(model.ardl.opt$Stat.table[[q_opt]], na.rm = TRUE))
data.frame("q_optimum" = q_opt, "p_optimum" = p_opt,
"AIC"=model.ardl.opt$min.Stat)
## q_optimum p_optimum AIC
## 1 2 1 30.82842
Dari tabel di atas, dapat terlihat bahwa nilai AIC terendah didapat
ketika \(p=1\) dan \(q=2\), yaitu sebesar 30.82842.
Artinya, model autoregressive optimum didapat ketika \(p=1\) dan \(q=2\). Selanjutnya nilai ini akan
dimasukkan ke dalam proses pembentukan model ardl.
model.ardl <- ardlDlm(x = data3_train$Xt, y = data3_train$Yt, p = 1 , q = 2)
summary(model.ardl)
##
## Time series regression with "ts" data:
## Start = 3, End = 98
##
## Call:
## dynlm(formula = as.formula(model.text), data = data, start = 1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.66789 -0.20311 0.03346 0.17545 0.94769
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.03384 0.08123 0.417 0.678
## X.t 0.21466 0.02292 9.367 5.37e-15 ***
## X.1 -0.18353 0.02535 -7.239 1.40e-10 ***
## Y.1 1.42815 0.07840 18.215 < 2e-16 ***
## Y.2 -0.46053 0.06785 -6.787 1.14e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.295 on 91 degrees of freedom
## Multiple R-squared: 0.998, Adjusted R-squared: 0.998
## F-statistic: 1.16e+04 on 4 and 91 DF, p-value: < 2.2e-16
AIC(model.ardl)
## [1] 44.89524
BIC(model.ardl)
## [1] 60.28133
Hasil di atas menunjukkan bahwa terdapat 4 peubah yang berpengaruh signifikan terhadap nilai T2M [Temperature at 2 Meters (C)] pada selang kepercayaan 95% yaitu peubah \(x_t\), \(x_{t-1}\), \(y_{t-1}\), \(y_{t-2}\). Artinya, menurut model ARDL dengan \(p=1\) dan \(q=2\), nilai T2M [Temperature at 2 Meters (C)] saat ini dipengaruhi oleh TS [Earth Skin Temperature (C)] pada saat ini, serta 8 hari sebelumnya. Model ini sangat baik dengan nilai R-Square sebesar 99.8%. Model keseluruhannya adalah sebagai berikut:
\[ \hat{Y} = 0.03384 + 0.21466X_t - 0.18353X_{t-1} + 1.42815Y_{t-1} - 0.46053Y_{t-2} \]
fore.ardl <- forecast(model = model.ardl, x=data3_test$Xt, h=25)
fore.ardl
## $forecasts
## [1] 20.10104 20.37227 20.72478 21.09513 20.96957 21.01235 21.07536 21.31587
## [9] 21.42559 21.31687 21.19468 20.74931 20.52716 20.92502 20.97693 21.15512
## [17] 21.40257 21.60215 21.46913 21.32313 21.39710 20.99440 20.74486 20.22891
## [25] 20.42095
##
## $call
## forecast.ardlDlm(model = model.ardl, x = data3_test$Xt, h = 25)
##
## attr(,"class")
## [1] "forecast.ardlDlm" "dLagM"
Data di atas merupakan hasil peramalan untuk 25 periode ke depan menggunakan Model Autoregressive dengan \(p=1\) dan \(q=2\).
#akurasi data testing
mape.ardl.test <- MAPE(fore.ardl$forecasts, data3_test$Yt)
mape.ardl.test
## [1] 0.0171622
#akurasi data training
mape.ardl.train <- GoF(model.ardl)
mape.ardl.train
## n MAE MPE MAPE sMAPE MASE MSE
## model.ardl 96 0.2300173 -0.000136184 0.02438607 0.02433235 0.5732331 0.08247844
## MRAE GMRAE
## model.ardl 57837119 0.7241981
Berdasarkan akurasi di atas, terlihat bahwa nilai MAPE keduanya jauh
berbeda. Artinya, model regresi dengan distribusi lag ini
underfitted.
akurasi <- matrix(c(mape.koyck.test, mape.dlm.test, mape.ardl.test))
row.names(akurasi)<- c("Koyck","DLM","Autoregressive")
colnames(akurasi) <- c("MAPE")
akurasi
## MAPE
## Koyck 0.02981854
## DLM 0.04159384
## Autoregressive 0.01716220
Berdasarkan nilai MAPE, model paling optimum didapat pada Model Koyck karena memiliki nilai MAPE yang terkecil dibandingkan Model DLM dan Model ARDL.
par(mfrow=c(1,1))
plot(data3_test$Xt, data3_test$Yt, type="b", col="black")
points(data3_test$Xt, fore.koyck$forecasts,col="red")
lines(data3_test$Xt, fore.koyck$forecasts,col="red")
points(data3_test$Xt, fore.dlm$forecasts,col="blue")
lines(data3_test$Xt, fore.dlm$forecasts,col="blue")
points(data3_test$Xt, fore.ardl$forecasts,col="green")
lines(data3_test$Xt, fore.ardl$forecasts,col="green")
legend("topleft",c("Aktual", "Koyck","DLM", "Autoregressive"), lty=1, col=c("black","red","blue","green"), cex=0.8)
Berdasarkan plot tersebut, terlihat bahwa model Autoregressive Distributed Lag merupakan metode yang paling sesuai untuk melakukan peramalan pada data suhu di US karena memiliki pola data aktual. Sehingga dapat disimpulkan model terbaik dalam hal ini adalah model regresi Autoregressive Distributed Lag.