Tujuan dan Deskripsi data

Penelitian data bertujuan untuk melakukan pemodelan terhadap saham Microsoft dengan saham Yahoo (Peubah X-nya Saham Microsoft dab peubah Y-nya saham Yahoo) menggunakan beberapa metode regresi dengan peubah lag. Data saham yang diambil adalah data nilai saham kedua perusahaan dalam rentang 1 tahun dari tanggal 21 November 2019 hinggga 20 November 2020. Sumber data didapatkan dari Kaggle

Microsoft: https://www.kaggle.com/datasets/vijayvvenkitesh/microsoft-stock-time-series-analysis
Yahoo: https://www.kaggle.com/datasets/arashnic/time-series-forecasting-with-yahoo-stock-price

Package

library(dLagM)
library(lmtest)

Data

#membuka file data
yahoo_data <- read.csv("C:/Users/ZHILLAN/Documents/Materi Kuliah/Semester 5/Metode Peramalan Deret Waktu/yahoo_stock.csv")
microsoft_data <- read.csv("C:/Users/ZHILLAN/Documents/Materi Kuliah/Semester 5/Metode Peramalan Deret Waktu/Microsoft_Stock.csv")
yahoo_data <- yahoo_data[1460:1825,]
microsoft_data <- microsoft_data[1058:1423,]

t = tibble::num(1:366)
Yt <- yahoo_data$Close
Xt <- microsoft_data$Close
data.utama = data.frame(t,Xt,Yt)
head(data.utama)
##   t     Xt      Yt
## 1 1 132.32 3103.54
## 2 2 132.45 3110.29
## 3 3 132.85 3110.29
## 4 4 135.16 3110.29
## 5 5 135.69 3133.64
## 6 6 136.95 3140.52

Split data

Split data bertujuan untuk memisahkan data yang akan dipakai untuk proses train dan test. Data train sebagai data sebelum inisiasi peramalan (forecast) dan data test sebagai data peramalannya.

#SPLIT DATA
train<-data.utama[1:274,]
test<-data.utama[275:366,]
train <- as.data.frame(train)
test <- as.data.frame(test)

#data time series
train.ts<-ts(train)
test.ts<-ts(test)
data.ts<-ts(data.utama)

MODEL KOYCK

Metode Koyck didasarkan 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 𝛽 mempunyai tanda sama.

Model Koyck merupakan jenis paling umum dari model infinite distributed lag dan juga dikenal sebagai geometric lag.

#MODEL KOYCK
model.koyck = dLagM::koyckDlm(x = train$Xt, y = train$Yt)
summary(model.koyck)
## 
## Call:
## "Y ~ (Intercept) + Y.1 + X.t"
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -332.472   -8.319    2.955   18.443  218.438 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  45.0936    47.1542   0.956    0.340    
## Y.1           0.9798     0.0130  75.392   <2e-16 ***
## X.t           0.1131     0.1561   0.724    0.469    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 54.32 on 270 degrees of freedom
## Multiple R-Squared: 0.9547,  Adjusted R-squared: 0.9543 
## Wald test:  2842 on 2 and 270 DF,  p-value: < 2.2e-16 
## 
## Diagnostic tests:
## NULL
## 
##                             alpha      beta       phi
## Geometric coefficients:  2234.623 0.1131059 0.9798205

AIC dan BIC

AIC (Akaike’s Information Criteria) BIC (Bayesian Information Criteria) adalah suatu metrik yang digunakan untuk mengukur kebaikan model. Perbedaan AIC dan BIC adalah BIC memiliki perhitungan yang lebih kompleks. Semakin kecil nilai AIC/BIC yang diperoleh, semakin bagus suatu model.

AIC(model.koyck)
## [1] 2960.948
BIC(model.koyck)
## [1] 2975.386
#ramalan
fore.koyck <- forecast(model = model.koyck, x=test$Xt, h=nrow(test));fore.koyck
## $forecasts
##  [1] 3385.816 3385.650 3385.370 3386.082 3386.457 3387.163 3386.814 3386.332
##  [9] 3386.147 3385.760 3385.611 3385.447 3385.411 3386.681 3387.557 3388.376
## [17] 3389.565 3390.291 3390.525 3390.203 3390.544 3390.823 3391.120 3391.566
## [25] 3392.140 3392.500 3393.405 3394.115 3394.887 3395.957 3397.536 3399.696
## [33] 3402.076 3404.027 3406.134 3408.695 3409.580 3410.103 3409.305 3409.498
## [41] 3409.018 3408.397 3407.943 3407.881 3407.397 3406.681 3405.695 3404.972
## [49] 3404.815 3403.889 3403.276 3403.199 3403.306 3403.165 3403.374 3403.820
## [57] 3403.547 3403.754 3403.451 3403.598 3403.826 3404.642 3406.073 3407.640
## [65] 3408.950 3410.097 3411.222 3411.708 3412.233 3412.765 3413.296 3413.968
## [73] 3413.930 3414.252 3413.372 3412.741 3411.867 3410.996 3410.606 3411.350
## [81] 3412.859 3414.387 3415.281 3415.323 3415.990 3416.518 3417.156 3417.863
## [89] 3418.243 3418.232 3418.374 3418.282
## 
## $call
## forecast.koyckDlm(model = model.koyck, x = test$Xt, h = nrow(test))
## 
## attr(,"class")
## [1] "forecast.koyckDlm" "dLagM"
#mape data testing
mape.koyck <- MLmetrics::MAPE(fore.koyck$forecasts, test$Yt)

#akurasi data training
mape_train <- GoF(model.koyck)["MAPE"]

c("MAPE_testing" = mape.koyck, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.02411605
## 
## $MAPE_training.MAPE
## [1] 0.01045755

Regresi dengan peubah Lag

Lag yang dimaksud dalam regresi dengan peubah lag adalah Waktu yang diperlukan bagi peubah bebas X dalam mempengaruhi peubah tak bebas Y. Pada data, lag yang digunakan sebesar 4 agar data menjadi stationer. ## Regression with Distributed Lag (lag=4)

model.dlm = dlm(x = train$Xt,y = train$Yt , q = 4)
summary(model.dlm)
## 
## Call:
## lm(formula = model.formula, data = design)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -835.67 -143.40   68.23  180.72  339.29 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 3084.8459   121.0151  25.491   <2e-16 ***
## x.t            1.1460     4.4920   0.255    0.799    
## x.1            1.6113     5.1341   0.314    0.754    
## x.2            0.5885     5.5478   0.106    0.916    
## x.3           -1.7611     5.1578  -0.341    0.733    
## x.4           -1.6884     4.5812  -0.369    0.713    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 257.6 on 264 degrees of freedom
## Multiple R-squared:  0.002463,   Adjusted R-squared:  -0.01643 
## F-statistic: 0.1304 on 5 and 264 DF,  p-value: 0.9854
## 
## AIC and BIC values for the model:
##        AIC     BIC
## 1 3771.951 3797.14
AIC(model.dlm)
## [1] 3771.951
BIC(model.dlm)
## [1] 3797.14
#ramalan
#meramal 5 periode ke depan
fore.dlm <- forecast(model = model.dlm, x=test$Xt, h=92)
fore.dlm
## $forecasts
##  [1] 3042.677 3050.930 3051.806 3056.084 3074.036 3086.801 3065.801 3041.603
##  [9] 3036.635 3049.072 3067.696 3067.325 3068.458 3082.863 3095.207 3094.670
## [17] 3073.921 3061.031 3058.058 3037.969 3035.350 3055.267 3073.845 3073.450
## [25] 3068.232 3069.417 3070.070 3070.630 3072.866 3070.641 3075.386 3092.240
## [33] 3100.386 3090.527 3070.981 3063.544 3057.199 3035.802 2998.508 3005.806
## [41] 3035.706 3055.272 3055.580 3056.732 3071.055 3064.407 3047.611 3045.635
## [49] 3063.275 3072.627 3067.942 3061.193 3075.830 3085.619 3074.034 3069.469
## [57] 3068.626 3062.852 3051.857 3059.059 3066.811 3077.118 3093.036 3098.854
## [65] 3091.727 3069.314 3054.194 3048.311 3045.528 3045.218 3055.396 3065.593
## [73] 3059.767 3053.867 3040.730 3036.471 3035.760 3046.438 3063.840 3082.296
## [81] 3112.710 3123.198 3097.380 3051.619 3030.533 3042.505 3067.200 3071.799
## [89] 3063.016 3055.092 3046.477 3047.983
## 
## $call
## forecast.dlm(model = model.dlm, x = test$Xt, h = 92)
## 
## attr(,"class")
## [1] "forecast.dlm" "dLagM"

MAPE

MAPE (Mean Absolute Percentage Error) ukuran akurasi prediksi metode peramalan dalam statistik.

#mape data testing
mape.dlm <- MLmetrics::MAPE(fore.dlm$forecasts, test$Yt)

#akurasi data training
mape_train <- GoF(model.dlm)["MAPE"]

c("MAPE_testing" = mape.dlm, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.1055809
## 
## $MAPE_training.MAPE
## [1] 0.0694788

Penentuan Lag Optimum

Lag optimum ditentukan dengan melihat masing-masing nilai AIC, BIC, serta MAPE yang optimum

finiteDLMauto(formula = Yt ~ Xt,
              data = data.frame(train), q.min = 1, q.max = 4 ,
              model.type = "dlm", error.type = "AIC", trace =FALSE) ##q max lag maksimum
##   q - k    MASE      AIC     BIC    GMRAE   MBRAE R.Adj.Sq Ljung-Box
## 4     4 7.03117 3771.951 3797.14 22673.71 0.83705 -0.01643         0
#model dlm dengan lag optimum
model.dlm2 = dlm(x = train$Xt,y = train$Yt , q = 4) #terdapat lag yang tidak signifikan sehingga dapat dikurangi jumlah lagnya 
summary(model.dlm2)
## 
## Call:
## lm(formula = model.formula, data = design)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -835.67 -143.40   68.23  180.72  339.29 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 3084.8459   121.0151  25.491   <2e-16 ***
## x.t            1.1460     4.4920   0.255    0.799    
## x.1            1.6113     5.1341   0.314    0.754    
## x.2            0.5885     5.5478   0.106    0.916    
## x.3           -1.7611     5.1578  -0.341    0.733    
## x.4           -1.6884     4.5812  -0.369    0.713    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 257.6 on 264 degrees of freedom
## Multiple R-squared:  0.002463,   Adjusted R-squared:  -0.01643 
## F-statistic: 0.1304 on 5 and 264 DF,  p-value: 0.9854
## 
## AIC and BIC values for the model:
##        AIC     BIC
## 1 3771.951 3797.14
AIC(model.dlm2)
## [1] 3771.951
BIC(model.dlm2)
## [1] 3797.14
#ramalan
(fore.dlm2 <- forecast(model = model.dlm2, x=test$Xt, h=92))
## $forecasts
##  [1] 3042.677 3050.930 3051.806 3056.084 3074.036 3086.801 3065.801 3041.603
##  [9] 3036.635 3049.072 3067.696 3067.325 3068.458 3082.863 3095.207 3094.670
## [17] 3073.921 3061.031 3058.058 3037.969 3035.350 3055.267 3073.845 3073.450
## [25] 3068.232 3069.417 3070.070 3070.630 3072.866 3070.641 3075.386 3092.240
## [33] 3100.386 3090.527 3070.981 3063.544 3057.199 3035.802 2998.508 3005.806
## [41] 3035.706 3055.272 3055.580 3056.732 3071.055 3064.407 3047.611 3045.635
## [49] 3063.275 3072.627 3067.942 3061.193 3075.830 3085.619 3074.034 3069.469
## [57] 3068.626 3062.852 3051.857 3059.059 3066.811 3077.118 3093.036 3098.854
## [65] 3091.727 3069.314 3054.194 3048.311 3045.528 3045.218 3055.396 3065.593
## [73] 3059.767 3053.867 3040.730 3036.471 3035.760 3046.438 3063.840 3082.296
## [81] 3112.710 3123.198 3097.380 3051.619 3030.533 3042.505 3067.200 3071.799
## [89] 3063.016 3055.092 3046.477 3047.983
## 
## $call
## forecast.dlm(model = model.dlm2, x = test$Xt, h = 92)
## 
## attr(,"class")
## [1] "forecast.dlm" "dLagM"
#akurasi testing
mape.dlm2 <- MLmetrics::MAPE(fore.dlm2$forecasts, test$Yt)

#akurasi data training
mape_train <- GoF(model.dlm2)["MAPE"]

c("MAPE_testing" = mape.dlm2, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.1055809
## 
## $MAPE_training.MAPE
## [1] 0.0694788

Model Autoregressive / Dynamic Regression

Model Autoregressive atau Dynamic Regression Model yang mana apabila peubah dependen dipengaruhi oleh peubah independen pada waktu sekarang, serta dipengaruhi juga oleh peubah dependen itu sendiri pada satu waktu yang lalu

model.ardl = ardlDlm(x = train$Xt, y = train$Yt, p = 1 , q = 1) #p:lag x, q:lag y
summary(model.ardl)
## 
## Time series regression with "ts" data:
## Start = 2, End = 274
## 
## Call:
## dynlm(formula = as.formula(model.text), data = data, start = 1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -331.90   -8.83    3.07   18.53  218.16 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 45.69368   47.07875   0.971    0.333    
## X.t         -0.86235    0.84981  -1.015    0.311    
## X.1          0.96665    0.85622   1.129    0.260    
## Y.1          0.98017    0.01299  75.440   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 54.29 on 269 degrees of freedom
## Multiple R-squared:  0.9549, Adjusted R-squared:  0.9544 
## F-statistic:  1897 on 3 and 269 DF,  p-value: < 2.2e-16
AIC(model.ardl)
## [1] 2961.615
BIC(model.ardl)
## [1] 2979.662
#ramalan
(fore.ardl <- forecast(model = model.ardl, x=test$Xt, h=92))
## $forecasts
##  [1] 3386.056 3389.844 3390.471 3382.560 3385.694 3383.423 3392.040 3392.652
##  [9] 3389.854 3391.155 3388.902 3388.803 3387.595 3377.541 3381.634 3382.806
## [17] 3380.676 3385.222 3389.584 3393.971 3388.553 3389.281 3389.348 3388.418
## [25] 3387.796 3389.900 3386.024 3388.287 3388.419 3386.800 3383.863 3380.827
## [33] 3381.090 3386.515 3387.065 3385.508 3400.591 3404.134 3414.653 3406.318
## [41] 3411.595 3412.201 3410.309 3406.883 3409.998 3411.292 3412.665 3409.720
## [49] 3404.704 3410.395 3407.128 3402.447 3400.937 3402.903 3400.075 3398.434
## [57] 3404.291 3400.359 3404.409 3400.677 3400.162 3395.872 3391.903 3392.156
## [65] 3395.541 3397.960 3399.171 3405.049 3405.181 3405.597 3406.072 3405.469
## [73] 3411.476 3408.686 3418.131 3415.412 3416.659 3415.827 3411.340 3402.317
## [81] 3397.150 3398.385 3404.607 3411.918 3407.172 3408.833 3408.466 3408.519
## [89] 3411.656 3414.967 3413.791 3415.683
## 
## $call
## forecast.ardlDlm(model = model.ardl, x = test$Xt, h = 92)
## 
## attr(,"class")
## [1] "forecast.ardlDlm" "dLagM"
#akurasi testing
mape.ardl <- MLmetrics::MAPE(fore.ardl$forecasts, test$Yt) 

#akurasi data training
mape_train <- GoF(model.ardl)["MAPE"]

c("MAPE_testing" = mape.ardl, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.02397046
## 
## $MAPE_training.MAPE
## [1] 0.01045527
#penentuan lag optimum
ardlBoundOrders(data = train , formula = Yt ~ Xt)
## $p
##   Xt
## 1 15
## 
## $q
## [1] 15
## 
## $Stat.table
##           q = 1    q = 2    q = 3    q = 4    q = 5    q = 6    q = 7    q = 8
## p = 1  2939.520 2929.885 2921.770 2910.329 2902.259 2890.031 2879.022 2866.665
## p = 2  2931.681 2931.769 2923.673 2912.215 2904.145 2891.903 2880.891 2868.620
## p = 3  2922.192 2922.192 2923.930 2912.219 2904.093 2891.965 2880.801 2868.478
## p = 4  2914.582 2915.938 2915.938 2914.210 2906.079 2893.963 2882.801 2870.470
## p = 5  2901.360 2903.360 2904.729 2904.729 2906.347 2894.488 2883.412 2871.196
## p = 6  2894.323 2895.827 2897.817 2896.255 2896.255 2893.857 2882.542 2870.170
## p = 7  2885.276 2886.021 2887.664 2882.674 2884.089 2884.089 2882.765 2870.641
## p = 8  2876.197 2877.707 2879.705 2878.886 2880.520 2875.018 2875.018 2872.575
## p = 9  2868.564 2869.117 2870.704 2866.309 2868.231 2868.533 2862.890 2862.890
## p = 10 2860.174 2861.268 2863.142 2861.151 2862.996 2860.318 2859.620 2855.246
## p = 11 2852.746 2853.278 2854.879 2851.618 2853.615 2853.080 2849.813 2849.177
## p = 12 2839.864 2841.485 2843.470 2842.989 2843.976 2838.197 2839.601 2830.269
## p = 13 2832.873 2834.178 2836.123 2834.620 2835.966 2831.073 2831.980 2824.232
## p = 14 2819.629 2821.533 2823.523 2822.908 2824.171 2817.953 2819.512 2809.295
## p = 15 2812.526 2814.167 2816.139 2814.824 2816.264 2811.273 2812.491 2805.611
##           q = 9   q = 10   q = 11   q = 12   q = 13   q = 14   q = 15
## p = 1  2857.158 2847.796 2818.235 2809.641 2796.192 2786.860 2776.397
## p = 2  2859.072 2849.725 2819.800 2811.298 2797.973 2788.621 2778.123
## p = 3  2859.126 2849.509 2819.815 2811.531 2797.588 2788.361 2777.950
## p = 4  2861.112 2851.506 2821.648 2813.378 2799.204 2789.813 2779.344
## p = 5  2861.721 2852.032 2822.589 2814.421 2800.339 2790.673 2780.500
## p = 6  2860.663 2851.171 2821.865 2813.761 2800.249 2790.639 2779.890
## p = 7  2861.163 2851.646 2821.939 2813.865 2800.443 2790.516 2779.963
## p = 8  2863.077 2853.557 2823.845 2815.753 2802.316 2792.391 2781.697
## p = 9  2862.964 2853.379 2823.279 2815.137 2802.079 2792.176 2781.358
## p = 10 2855.246 2855.377 2825.272 2817.134 2804.076 2794.176 2783.358
## p = 11 2847.472 2847.472 2827.230 2819.096 2805.999 2796.107 2785.245
## p = 12 2832.039 2817.072 2817.072 2818.756 2805.382 2795.251 2784.261
## p = 13 2826.230 2818.050 2809.544 2809.544 2806.041 2796.055 2784.778
## p = 14 2811.036 2799.599 2794.917 2795.811 2795.811 2795.238 2784.099
## p = 15 2807.475 2802.221 2790.661 2792.513 2785.692 2785.692 2784.814
## 
## $min.Stat
## [1] 2776.397
#PEMODELAN DLM dan ARDL dengan library dynlm
#library(dynlm)

#sama dengan model dlm p=1
cons_lm1 <- dynlm::dynlm(Yt ~ Xt+L(Xt),data = train.ts)

#sama dengan model ardl p=0 q=1
cons_lm2 <- dynlm::dynlm(Yt ~ Xt+L(Yt),data = train.ts)

#sama dengan ardl p=1 q=1
cons_lm3 <- dynlm::dynlm(Yt ~ Xt+L(Xt)+L(Yt),data = train.ts)

#sama dengan dlm p=2
cons_lm4 <- dynlm::dynlm(Yt ~ Xt+L(Xt)+L(Xt,2),data = train.ts)
#Ringkasan Model
summary(cons_lm1)
## 
## Time series regression with "ts" data:
## Start = 2, End = 274
## 
## Call:
## dynlm::dynlm(formula = Yt ~ Xt + L(Xt), data = train.ts)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -834.99 -141.49   68.64  178.92  318.24 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 3069.6092   116.0136  26.459   <2e-16 ***
## Xt             0.6265     3.9917   0.157    0.875    
## L(Xt)         -0.6156     4.0216  -0.153    0.878    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 255.1 on 270 degrees of freedom
## Multiple R-squared:  9.142e-05,  Adjusted R-squared:  -0.007315 
## F-statistic: 0.01234 on 2 and 270 DF,  p-value: 0.9877
summary(cons_lm2)
## 
## Time series regression with "ts" data:
## Start = 2, End = 274
## 
## Call:
## dynlm::dynlm(formula = Yt ~ Xt + L(Yt), data = train.ts)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -332.68   -7.94    2.35   18.43  218.15 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 50.16922   46.93540   1.069    0.286    
## Xt           0.08129    0.15356   0.529    0.597    
## L(Yt)        0.97981    0.01300  75.397   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 54.32 on 270 degrees of freedom
## Multiple R-squared:  0.9547, Adjusted R-squared:  0.9543 
## F-statistic:  2842 on 2 and 270 DF,  p-value: < 2.2e-16
summary(cons_lm3)
## 
## Time series regression with "ts" data:
## Start = 2, End = 274
## 
## Call:
## dynlm::dynlm(formula = Yt ~ Xt + L(Xt) + L(Yt), data = train.ts)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -331.90   -8.83    3.07   18.53  218.16 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 45.69368   47.07875   0.971    0.333    
## Xt          -0.86235    0.84981  -1.015    0.311    
## L(Xt)        0.96665    0.85622   1.129    0.260    
## L(Yt)        0.98017    0.01299  75.440   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 54.29 on 269 degrees of freedom
## Multiple R-squared:  0.9549, Adjusted R-squared:  0.9544 
## F-statistic:  1897 on 3 and 269 DF,  p-value: < 2.2e-16
summary(cons_lm4)
## 
## Time series regression with "ts" data:
## Start = 3, End = 274
## 
## Call:
## dynlm::dynlm(formula = Yt ~ Xt + L(Xt) + L(Xt, 2), data = train.ts)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -835.82 -141.42   69.08  180.70  325.18 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 3072.8627   117.4423  26.165   <2e-16 ***
## Xt             1.3370     4.4143   0.303    0.762    
## L(Xt)          0.3422     4.7485   0.072    0.943    
## L(Xt, 2)      -1.6939     4.4473  -0.381    0.704    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 255.9 on 268 degrees of freedom
## Multiple R-squared:  0.0006346,  Adjusted R-squared:  -0.01055 
## F-statistic: 0.05672 on 3 and 268 DF,  p-value: 0.9822
#SSE
deviance(cons_lm1)
## [1] 17566736
deviance(cons_lm2)
## [1] 796590.9
deviance(cons_lm3)
## [1] 792834.2
deviance(cons_lm4)
## [1] 17555685

Uji Non-Autokorelasi

#uji model
if(require("lmtest")) encomptest(cons_lm1, cons_lm2)
## Encompassing test
## 
## Model 1: Yt ~ Xt + L(Xt)
## Model 2: Yt ~ Xt + L(Yt)
## Model E: Yt ~ Xt + L(Xt) + L(Yt)
##           Res.Df Df         F Pr(>F)    
## M1 vs. ME    269 -1 5691.2015 <2e-16 ***
## M2 vs. ME    269 -1    1.2746 0.2599    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Diagnostik
#durbin watson
dwtest(cons_lm1)
## 
##  Durbin-Watson test
## 
## data:  cons_lm1
## DW = 0.046503, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
dwtest(cons_lm2)
## 
##  Durbin-Watson test
## 
## data:  cons_lm2
## DW = 2.4779, p-value = 0.9999
## alternative hypothesis: true autocorrelation is greater than 0
dwtest(cons_lm3)
## 
##  Durbin-Watson test
## 
## data:  cons_lm3
## DW = 2.4689, p-value = 0.9999
## alternative hypothesis: true autocorrelation is greater than 0
dwtest(cons_lm4)
## 
##  Durbin-Watson test
## 
## data:  cons_lm4
## DW = 0.047277, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

Uji Heterogenitas

#heterogenitas
bptest(cons_lm1)
## 
##  studentized Breusch-Pagan test
## 
## data:  cons_lm1
## BP = 0.18904, df = 2, p-value = 0.9098
bptest(cons_lm2)
## 
##  studentized Breusch-Pagan test
## 
## data:  cons_lm2
## BP = 29.215, df = 2, p-value = 4.529e-07
bptest(cons_lm3)
## 
##  studentized Breusch-Pagan test
## 
## data:  cons_lm3
## BP = 29.662, df = 3, p-value = 1.625e-06
bptest(cons_lm4)
## 
##  studentized Breusch-Pagan test
## 
## data:  cons_lm4
## BP = 0.23267, df = 3, p-value = 0.9722

Uji Normalitas

#shapiro wilk
shapiro.test(residuals(cons_lm1))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(cons_lm1)
## W = 0.90033, p-value = 1.891e-12
shapiro.test(residuals(cons_lm2))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(cons_lm2)
## W = 0.78707, p-value < 2.2e-16
shapiro.test(residuals(cons_lm3))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(cons_lm3)
## W = 0.78737, p-value < 2.2e-16
shapiro.test(residuals(cons_lm4))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(cons_lm4)
## W = 0.90112, p-value = 2.298e-12

Perbandingan Keakuratan Ramalan

#PERBANDINGAN
akurasi <- matrix(c(mape.koyck, mape.dlm, mape.dlm2, mape.ardl))
row.names(akurasi)<- c("Koyck","DLM 1","DLM 2","Autoregressive")
colnames(akurasi) <- c("MAPE")
akurasi
##                      MAPE
## Koyck          0.02411605
## DLM 1          0.10558087
## DLM 2          0.10558087
## Autoregressive 0.02397046

Hasil perbandingan menunjukkan bahwa model Koyck dan Autoregressive memiliki nilai MAPE terkecil sehingga model tersebut lebih baik.