Tugas Individu 2 MPDW: Regresi Peubah Lag

Regresi Peubah Lag

Analisis regresi merupakan salah satu teknik analisis data dalam statistika untuk menentukan hubungan sebab-akibat antara variabel takbebas (y) dengan satu atau lebih variabel bebas (x). Analisis regresi dengan serangkaian pengamatan terhadap suatu peristiwa diambil dari waktu ke waktu merupakan analisis regresi deret waktu. Analisis regresi deret waktu dilakukan untuk melihat atau meramalkan kondisi pada masa depan (Gujarati 2006). Model regresi menggunakan data deret waktu tidak hanya menggunakan pengaruh perubahan variabel bebas (x) terhadap variabel takbebas (y) dalam kurun waktu yang sama dan selama periode pengamatan yang sama, namun juga menggunakan periode waktu sebelumnya. Waktu yang diperlukan bagi variabel bebas (x) dalam memengaruhi variabel takbebas (y) disebut beda kala atau lag (Sarwoko 2005).

Pada penelitian ini, akan dilakukan analisis regresi pada data penjualan mingguan Walmart dengan data Indeks Harga Konsumen. Analisis regresi dilakukan dengan menggunakan metode model koyck, model distributed lag, dan model autoregressive distributed lag.

Data Preparation

Memanggil Package

library(dLagM) 
## Warning: package 'dLagM' was built under R version 4.1.3
## Loading required package: nardl
## Warning: package 'nardl' was built under R version 4.1.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.1.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.1.2
## 
## 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.1.3
## 
## Attaching package: 'MLmetrics'
## The following object is masked from 'package:dLagM':
## 
##     MAPE
## The following object is masked from 'package:base':
## 
##     Recall
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.1.3
library(car)
## Warning: package 'car' was built under R version 4.1.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.1.2
library(caTools)
## Warning: package 'caTools' was built under R version 4.1.3
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.1.3
## -- Attaching packages --------------------------------------- tidyverse 1.3.2 --
## v ggplot2 3.3.6      v purrr   0.3.4 
## v tibble  3.1.8      v dplyr   1.0.10
## v tidyr   1.2.1      v stringr 1.4.1 
## v readr   2.1.2      v forcats 0.5.2
## Warning: package 'ggplot2' was built under R version 4.1.3
## Warning: package 'tibble' was built under R version 4.1.3
## Warning: package 'tidyr' was built under R version 4.1.3
## Warning: package 'readr' was built under R version 4.1.2
## Warning: package 'purrr' was built under R version 4.1.2
## Warning: package 'dplyr' was built under R version 4.1.3
## Warning: package 'stringr' was built under R version 4.1.3
## Warning: package 'forcats' was built under R version 4.1.3
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## x dplyr::recode() masks car::recode()
## x purrr::some()   masks car::some()
library(hrbrthemes)
## Warning: package 'hrbrthemes' was built under R version 4.1.2
## NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
##       Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
##       if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
library(knitr)
## Warning: package 'knitr' was built under R version 4.1.3

Menginput Data

Data yang digunakan adalah data Walmart Sales Forecast dari Kaggle dengan 2 peubah uji yaitu Weekly Sales (Penjualan mingguan Walmart) sebagai peubah respon dan CPI (Indeks Harga Konsumen) sebagai peubah penjelas dengan rentang waktu mingguan dari 31 Desember 2010 hingga 9 Desember 2011 dengan jumlah amatan sebanyak 50 amatan.

#Import data
data1<- read.csv("C:\\Users\\tiasa\\Downloads\\Data1.csv")
data2<- read.csv("C:\\Users\\tiasa\\Downloads\\Data2.csv")

t<-data1[192:241,]$Date
Xt<-data2[231:280,]$CPI
Yt<-data1[192:241,]$Weekly_Sales

df <- as.data.frame(cbind(t, Xt, Yt))

df$t <- as.Date(df$t)
df$Xt <- as.numeric(df$Xt)
df$Yt <- as.numeric(df$Yt)

str(df)
## 'data.frame':    50 obs. of  3 variables:
##  $ t : Date, format: "2011-01-07" "2011-01-14" ...
##  $ Xt: num  211 211 211 212 212 ...
##  $ Yt: num  43202 39857 41597 41651 46829 ...
head(df)
##            t       Xt       Yt
## 1 2011-01-07 211.0649 43202.29
## 2 2011-01-14 211.1177 39857.40
## 3 2011-01-21 211.4865 41596.99
## 4 2011-01-28 211.8553 41651.01
## 5 2011-02-04 212.2241 46829.12
## 6 2011-02-11 212.5929 47595.35

Splitting Data

Data dibagi menjadi data train dan data test dengan proporsi masing-masing 80% dan 20% dari jumlah seluruh amatan.

#Split data
train<-df[1:40,]
test<-df[41:50,]

#Data time series
train.ts<-ts(train)
test.ts<-ts(test)
df.ts<-ts(df)

Analisis Eksplorasi Data

Plot Time Series

data.ts1<-ts(Yt)
plot(data.ts1, main = "Time Series Plot of Weekly Sales", xlab = "Period", ylab="Weekly Sales")
points(data.ts1)

Berdasarkan plot, terlihat bahwa peubah Weekly Sales atau penjualan mingguan Walmart memiliki pola data yang stasioner.

data.ts<-ts(Xt)
plot(data.ts, main = "Time Series Plot of Customer Price Index", xlab = "Period", ylab="Customer Price Index")
points(data.ts)

Berdasarkan plot, terlihat bahwa peubah CPI atau Indeks Harga Konsumen memiliki pola data yang tren positif.

Korelasi dan Scatter Plot Peubah X dan Y

Korelasi

cor(Xt, Yt)
## [1] 0.1675282

Scatter Plot

plot(Xt, Yt, pch = 20, col = "blue", main = "Scatter Plot CPI & Weekly Sales")

Berdasarkan korelasi dan scatter plot antara peubah CPI dan Weekly sales, terlihat bahwa terdapat hubungan positif yang lemah dengan korelasi sebesar 0.1675282.

Model Regresi Awal

model1 <- lm(df$Yt~df$Xt, data = df)
summary(model1)
## 
## Call:
## lm(formula = df$Yt ~ df$Xt, data = df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4737.8 -2305.2  -477.7  1985.2  7848.9 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  -8318.6    45804.4  -0.182    0.857
## df$Xt          250.6      212.9   1.177    0.245
## 
## Residual standard error: 2783 on 48 degrees of freedom
## Multiple R-squared:  0.02807,    Adjusted R-squared:  0.007817 
## F-statistic: 1.386 on 1 and 48 DF,  p-value: 0.2449

Diperoleh model regresi linier data deret waktu yaitu: \(y = -8318.6 + 250.6x\)

Berdasarkan persamaan regresi, nilai dugaan rataan Y bertambah sebesar 250.6 jika X bertambah satu satuan.

Berdasarkan uji t yang dilakukan untuk menguji signifikansi peubah penjelas terhdap variabel dependen, diperoleh bahwa tidak ada peubah yang berpengaruh signifikan pada taraf nyata 5%.

Nilai R-Squared pada model regresi linier deret waktu yaitu 0.007817, artinya keragaman peubah respon yang mampu dijelaskan oleh peubah penjelas adalah sebesar 0.007817.

Uji Autokorelasi

Uji autokorelasi merupakan uji yang dilakukan untuk dapat melihat apakah terjadi korelasi di antara suatu periode dengan periode-periode sebelumnya. Uji statistik yang digunakan untuk pendeteksian autokorelasi uji Breusedch grodfrey.

Hipotesis:

H0: tidak ada autokorelasi

H1: ada autokorelasi

bgtest(model1)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  model1
## LM test = 4.4659, df = 1, p-value = 0.03458

Diperoleh p-value < 5% : Tolak H0, sehingga cukup bukti untuk menyatakan bahwa terdapat autokorelasi (positif) pada taraf 5%. Karena terdeteksi adanya autokorelasi, akan dilakukan penanganan dengan menambahkan lag tertentu. Metode yang digunakan adalah Model Koyck, Distributed Lag, dan Autoregressive Distributed Lag.

Model KOYCK

Model Koyck merupakan suatu model yang mengasumsikan bahwa koefisien dari variabel yang mengalami keterlambatan dapat menurun secara geometris (Gujarati 2006).

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 
## -4338.8 -2224.1  -224.7  1833.0  7422.2 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -2.061e+04  7.260e+04  -0.284   0.7782  
## Y.1          2.793e-01  1.637e-01   1.706   0.0966 .
## X.t          2.498e+02  3.429e+02   0.728   0.4711  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2700 on 36 degrees of freedom
## Multiple R-Squared: 0.1056,  Adjusted R-squared: 0.05588 
## Wald test: 2.012 on 2 and 36 DF,  p-value: 0.1485 
## 
## Diagnostic tests:
## NULL
## 
##                              alpha     beta       phi
## Geometric coefficients:  -28593.59 249.7842 0.2793467
AIC(model.koyck)
## [1] 731.8415
BIC(model.koyck)
## [1] 738.4957

Forecasting Model Koyck

(fore.koyck <- forecast(model = model.koyck, x=test$Xt, h=10))
## $forecasts
##  [1] 47532.33 46916.33 46784.26 46787.38 46828.26 46895.01 46975.10 47058.92
##  [9] 47143.78 47221.63
## 
## $call
## forecast.koyckDlm(model = model.koyck, x = test$Xt, h = 10)
## 
## attr(,"class")
## [1] "forecast.koyckDlm" "dLagM"

Akurasi Model Koyck

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

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

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

Distributed Lag Model (DLM)

Model distributed lag disebut sebagai model dinamis karena efek perubahan satu unit dalam nilai variabel bebas terdistribusi pada sejumlah periode waktu (Gujarati 2006).

lagop<-finiteDLMauto(formula=Yt ~ Xt,
              data = data.frame(train),model.type = "dlm",error.type = "AIC");lagop
##    q - k    MASE      AIC      BIC   GMRAE   MBRAE R.Adj.Sq Ljung-Box
## 10    10 0.65378 566.3786 584.5942 0.70362 0.70537 -0.27964 0.6270995

Diperolah lag optimum untuk peubah Weekly Sales adalah 10 hari sebelumnya.

model.dlm = dLagM::dlm(x = train$Xt,y = train$Yt , q = 10) 
summary(model.dlm)
## 
## Call:
## lm(formula = model.formula, data = design)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2901.7 -1122.1  -443.3  1057.4  4235.0 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)
## (Intercept) -198439.0   206993.6  -0.959    0.350
## x.t              61.2     5771.3   0.011    0.992
## x.1            1952.8    12994.3   0.150    0.882
## x.2           -3805.8    14664.3  -0.260    0.798
## x.3            5919.9    14905.5   0.397    0.696
## x.4            2245.9    15095.4   0.149    0.883
## x.5           -5499.2    15249.6  -0.361    0.723
## x.6           -5225.8    15136.3  -0.345    0.734
## x.7            9801.5    15052.2   0.651    0.523
## x.8            -871.0    14671.3  -0.059    0.953
## x.9           -7023.4    11996.7  -0.585    0.566
## x.10           3576.4     5068.7   0.706    0.489
## 
## Residual standard error: 2547 on 18 degrees of freedom
## Multiple R-squared:  0.2057, Adjusted R-squared:  -0.2796 
## F-statistic: 0.4239 on 11 and 18 DF,  p-value: 0.9256
## 
## AIC and BIC values for the model:
##        AIC      BIC
## 1 566.3786 584.5942

Diperoleh tidak terdapat peubah yang berpengaruh terhadap model dalam tingkat kepercayaan 95%. Berdasarkan R-Squared, model mengindikasikan performa yang kurang baik dengan nilai sebesar 0.2796.

AIC(model.dlm)
## [1] 566.3786
BIC(model.dlm)
## [1] 584.5942

Forecasting DLM

(fore.dlm <- forecast(model = model.dlm, x=test$Xt, h=10)) #meramalkan 12 periode ke depan
## $forecasts
##  [1] 48160.00 49250.94 48698.56 48894.70 49564.72 49094.15 49023.44 49853.33
##  [9] 49515.78 49763.11
## 
## $call
## forecast.dlm(model = model.dlm, x = test$Xt, h = 10)
## 
## attr(,"class")
## [1] "forecast.dlm" "dLagM"

Akurasi DLM

#mape data testing
mape.dlm <- 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.09150085
## 
## $MAPE_training.MAPE
## [1] 0.035039

Autoregressve Distributed Lag Model (ARDLM)

Model regresi dengan memasukkan nilai variabel yang menjelaskan nilai masa kini atau nilai masa lalu dari variabel bebas (X) sebagai tambahan pada model yang memasukkan lag dari variabel takbebas (Y) disebut autoregressive distributed lag (ARDL).

pqop<-ardlBoundOrders(data = data.frame(df) , formula = Yt ~ Xt )
c(p=pqop$p$Xt, q=pqop$q)
##  p  q 
## 14 15

Diperoleh lag optimum untuk peubah Xt adalah 14 hari sebelumnya, dan lag optimum untuk peubah Yt adalah 15 hari sebelumnya.

model.ardl = ardlDlm(x = train$Xt, y = train$Yt, p = 14 , q = 9) #seharusnya nilai q optimum 15, namun karena menghasilkan nilai NaN pada output, q yang optimum pada model bernilai 9
summary(model.ardl)
## 
## Time series regression with "ts" data:
## Start = 15, End = 40
## 
## Call:
## dynlm(formula = as.formula(model.text), data = data, start = 1)
## 
## Residuals:
##       15       16       17       18       19       20       21       22 
## -309.050 1014.842 -807.012 -278.759  552.627 -366.918   92.173  240.044 
##       23       24       25       26       27       28       29       30 
## -151.681  -94.538  -20.120  176.476    8.622 -203.076  -79.241  233.208 
##       31       32       33       34       35       36       37       38 
##   89.059 -155.741 -246.013  184.908  185.278   67.239  210.621 -706.694 
##       39       40 
##  531.407 -167.661 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.745e+05  5.576e+05  -0.492    0.709
## X.t         -2.153e+03  7.476e+03  -0.288    0.821
## X.1          8.040e+02  1.550e+04   0.052    0.967
## X.2          6.702e+03  1.769e+04   0.379    0.769
## X.3         -8.296e+03  1.800e+04  -0.461    0.725
## X.4          7.618e+03  1.790e+04   0.426    0.744
## X.5          3.343e+03  1.745e+04   0.192    0.880
## X.6         -1.221e+04  1.536e+04  -0.795    0.572
## X.7          1.696e+04  1.589e+04   1.067    0.479
## X.8         -1.869e+04  1.569e+04  -1.191    0.445
## X.9          1.391e+04  1.477e+04   0.942    0.519
## X.10         2.370e+03  1.394e+04   0.170    0.893
## X.11        -1.709e+04  1.496e+04  -1.143    0.458
## X.12         6.508e+03  2.134e+04   0.305    0.812
## X.13        -7.316e+03  1.569e+04  -0.466    0.722
## X.14         9.303e+03  6.497e+03   1.432    0.388
## Y.1         -5.030e-01  5.776e-01  -0.871    0.544
## Y.2         -4.523e-01  4.825e-01  -0.938    0.521
## Y.3         -4.634e-01  4.185e-01  -1.107    0.468
## Y.4         -2.748e-01  4.539e-01  -0.605    0.653
## Y.5         -4.995e-01  5.155e-01  -0.969    0.510
## Y.6         -1.763e-01  3.848e-01  -0.458    0.727
## Y.7          6.261e-03  4.225e-01   0.015    0.991
## Y.8          1.978e-01  4.191e-01   0.472    0.719
## Y.9          8.569e-01  3.799e-01   2.256    0.266
## 
## Residual standard error: 1883 on 1 degrees of freedom
## Multiple R-squared:  0.9737, Adjusted R-squared:  0.3415 
## F-statistic:  1.54 on 24 and 1 DF,  p-value: 0.5717

Tidak ada peubah yang berpengaruh terhadap model dalam tingkat kepercayaan 95%. Model tersebut merupakan model yang kurang baik karena memiliki nilai Adjusted R-Squared sebesar 34,15%.

AIC(model.ardl)
## [1] 433.1892
BIC(model.ardl)
## [1] 465.8997

Forecasting ARDLM

#ramalan
(fore.ardl <- forecast(model = model.ardl, x=test$Xt, h=10))
## $forecasts
##  [1] 46697.03 49962.22 49452.46 47756.07 42233.90 44908.22 48147.13 52560.02
##  [9] 50015.07 48202.69
## 
## $call
## forecast.ardlDlm(model = model.ardl, x = test$Xt, h = 10)
## 
## attr(,"class")
## [1] "forecast.ardlDlm" "dLagM"

Akurasi ARDLM

#akurasi testing
mape.ardl <- MAPE(fore.ardl$forecasts, test$Yt) #data testing

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

c("MAPE_testing" = mape.ardl, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.08337594
## 
## $MAPE_training.MAPE
## [1] 0.006089235

Perbandingan Metode Penanganan Autokorelasi

Perbandingan Secara Eksploratif

#plot
par(mfrow=c(1,1))
plot(test$Xt, test$Yt, type="b", col="black")
points(test$Xt, fore.koyck$forecasts,col="red")
points(test$Xt, fore.dlm$forecasts,col="blue")
points(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)

Secara eksploratif, belum terlihat metode yang paling sesuai dan mendekati pola aktual.

Perbandingan Keakuratan Forecasting

akurasi <- matrix(c(mape.koyck,mape.dlm, mape.ardl))
row.names(akurasi)<- c("Koyck","DLM","Autoregressive")
colnames(akurasi) <- c("MAPE")
akurasi
##                      MAPE
## Koyck          0.06506840
## DLM            0.09150085
## Autoregressive 0.08337594

Berdasarkan akurasi ramalan, diperoleh nilai error model Koyck yang terendah daripada model lainnya. Maka, dapat disimpulkan bahwa model Koyck merupakan model terbaik untuk modelling dan forecasting.

Uji Diagnostik Model

Uji Autokorelasi

Hipotesis:

H0: tidak ada autokorelasi

H1: ada autokorelasi

bgtest(model.koyck$model)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  model.koyck$model
## LM test = 0.25269, df = 1, p-value = 0.6152

Diperoleh p-value > 0,05, artinya dalam tingkat signifikansi 95%, terdapat cukup bukti untuk menyatakan bahwa tidak terdapat autokorelasi, artinya penanganan autokorelasi dengan menambahkan lag dari peubah respon berhasil.

Daftar Pustaka

Kaggle. 2013. Walmart Sales Forecast. https://www.kaggle.com/datasets/aslanahmedov/walmart-sales-forecast

Gujarati DN. 2006. Essentials of Econometrics. Third Edition. New York: The McGraw-Hill.

Sarwoko. 2005. Dasar-Dasar Ekonometrika. Yogyakarta: Penerbit Andi.