Pendahuluan

Kita sering membutuhkan analisis prediksi untuk membantu kita dalam membuat keputusan.Salah satu hal penting dalam melakukan prediksi kita memerlukan data lampau untuk memprediksi data masa depan. Prediksi ini sering disebut dengan peramalan. Peramalan banyak dibutuhkan dalam banyak situasi salah satunya pada masalah ketahanan pangan. Pemerintahan Indonesia menjadikan ketahanan pangan sebagai prioritas kebijakan jangka panjang, karena kekurangan gizi dan kerawanan pangan masih menjadi masalah di Indonesia.Dalam konteks ketahanan pangan nasional, padi memegang peranan penting sebagai komoditas pangan utama. Ketersediaan beras, yang dihasilkan dari tanaman padi, sangat bergantung pada luas panen yang tercapai setiap tahunnya. Oleh karena itu, perkembangan luas panen padi menjadi indikator penting dalam menentukan produksi padi nasional yang pada akhirnya turut memengaruhi stabilitas ketahanan pangan di Indonesia.Data yang digunakan adalah data luas panen padi di Indonesia.Data berupa data bulanan periode Januari 2018 hingga Desember 2024.Data dalam analisis ini, terdapat 3 variabel dummy dimana D1 merupakan variabel dummy 1 bulan sebelum musim panen,D2 merupakan variabel dummy saat musim panen, D3 merupakan variabel dummy 1 bulan setelah musim panen dan dalam analisis ini dibagi menjadi dua yaitu data in sampel dan out sampel. Data In sampel diambil mulai dari periode Januari 2018 hingga Agustus 2023 dan data out sampel dimulai dari periode September 2023 hingga Desember 2024.

Import Library

library(MASS)
library(hms)
library(car)
## Loading required package: carData
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(tseries)
library(timeSeries)
## Loading required package: timeDate
## 
## Attaching package: 'timeSeries'
## The following objects are masked from 'package:graphics':
## 
##     lines, points
library(quadprog)
library(zoo)
## 
## Attaching package: 'zoo'
## The following object is masked from 'package:timeSeries':
## 
##     time<-
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(fracdiff)
library(fUnitRoots)
library(lmtest)
library(MLmetrics)
## Warning: package 'MLmetrics' was built under R version 4.4.3
## 
## Attaching package: 'MLmetrics'
## The following object is masked from 'package:base':
## 
##     Recall

#Menginput Data

data<-read.csv(file.choose(),header=TRUE)
head(data)
##     LP t D1 D2 D3
## 1  540 1  0  0  0
## 2 1070 2  1  0  0
## 3 1770 3  0  1  0
## 4 1410 4  0  0  1
## 5 1000 5  0  0  0
## 6  890 6  0  0  0
80/100*84 #banyaknya pembagian
## [1] 67.2
#In Sample - Out Sample
Yt=data$LP[1:68]
t=data$t[1:68]
ts.plot(as.ts(Yt),lwd=5,ylab="Zt",col="red")

D1=data$D1[1:68]
D2=data$D2[1:68]
D3=data$D3[1:68]
Ytout=data$LP[69:84]

#Pembentukan model TSR

#Regresi Runtun Waktu
model1=lm(Yt~t+D1+D2+D3)
summary(model1)
## 
## Call:
## lm(formula = Yt ~ t + D1 + D2 + D3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -463.28 -193.87   54.28  152.50  540.02 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 787.7361    65.2180  12.079  < 2e-16 ***
## t            -0.9571     1.5588  -0.614    0.541    
## D1           36.2238   108.9713   0.332    0.741    
## D2          890.5142   108.9147   8.176 1.76e-11 ***
## D3          744.8046   108.8803   6.841 3.79e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 252 on 63 degrees of freedom
## Multiple R-squared:  0.6248, Adjusted R-squared:  0.6009 
## F-statistic: 26.22 on 4 and 63 DF,  p-value: 8.066e-13
#Seleksi Variabel
model2=lm(Yt~D2+D3)
summary(model2)
## 
## Call:
## lm(formula = Yt ~ D2 + D3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -468.39 -195.89   41.61  164.11  541.61 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   758.39      33.28  22.786  < 2e-16 ***
## D2            888.27     106.99   8.302 8.48e-12 ***
## D3            741.61     106.99   6.932 2.29e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 249.1 on 65 degrees of freedom
## Multiple R-squared:  0.6217, Adjusted R-squared:  0.6101 
## F-statistic: 53.42 on 2 and 65 DF,  p-value: 1.898e-14

Model akhir yang terbentuk adalah Yt = D2 + D3

#Prediksi & Peramalana TSR

TSR=758.39+888.27*data$D2+741.61*data$D3
TSR
##  [1]  758.39  758.39 1646.66 1500.00  758.39  758.39  758.39  758.39  758.39
## [10]  758.39  758.39  758.39  758.39  758.39 1646.66 1500.00  758.39  758.39
## [19]  758.39  758.39  758.39  758.39  758.39  758.39  758.39  758.39 1646.66
## [28] 1500.00  758.39  758.39  758.39  758.39  758.39  758.39  758.39  758.39
## [37]  758.39  758.39 1646.66 1500.00  758.39  758.39  758.39  758.39  758.39
## [46]  758.39  758.39  758.39  758.39  758.39 1646.66 1500.00  758.39  758.39
## [55]  758.39  758.39  758.39  758.39  758.39  758.39  758.39  758.39 1646.66
## [64] 1500.00  758.39  758.39  758.39  758.39  758.39  758.39  758.39  758.39
## [73]  758.39  758.39 1646.66 1500.00  758.39  758.39  758.39  758.39  758.39
## [82]  758.39  758.39  758.39  758.39  758.39 1646.66 1500.00  758.39  758.39
predinTSR=TSR[1:68]
predoutTSR=TSR[69:84]
ramalTSR=TSR[85:90]

#Akurasi Model TSR

library(MLmetrics)
#Akurasi Insampel TSR
RMSEINTSR=RMSE(predinTSR,Yt)
RMSEINTSR
## [1] 243.5126
MAPEINTSR=mean(abs(Yt-(predinTSR))/(Yt))*100
MAPEINTSR
## [1] 31.23996
smape <- function(actual, forecast) {
  return(mean(200 * abs(forecast - actual) / (abs(actual) + abs(forecast)), na.rm = TRUE))
}
SMAPEINTSR=smape(Yt,predinTSR)
SMAPEINTSR
## [1] 25.8103
#Akurasi Outsampel TSR
RMSEOUTTSR=RMSE(predoutTSR,Ytout)
RMSEOUTTSR
## [1] 303.3278
MAPEOUTTSR=mean(abs(Ytout-(predoutTSR))/(Ytout))*100
MAPEOUTTSR
## [1] 45.17288
smape <- function(actual, forecast) {
  return(mean(200 * abs(forecast - actual) / (abs(actual) + abs(forecast)), na.rm = TRUE))
}
SMAPEOUTTSR=smape(Ytout,predoutTSR)
SMAPEOUTTSR
## [1] 34.43411

Pemodelan ARIMAX

#Residual dari model TSR
res=resid(model2) 
res
##           1           2           3           4           5           6 
## -218.392857  311.607143  123.333333  -90.000000  241.607143  131.607143 
##           7           8           9          10          11          12 
##  311.607143  331.607143  251.607143 -128.392857 -238.392857 -388.392857 
##          13          14          15          16          17          18 
## -348.392857  -28.392857   73.333333  180.000000  161.607143  121.607143 
##          19          20          21          22          23          24 
##  191.607143  421.607143   41.607143 -158.392857 -288.392857 -438.392857 
##          25          26          27          28          29          30 
## -438.392857 -278.392857 -456.666667  360.000000  541.607143  -18.392857 
##          31          32          33          34          35          36 
##  131.607143  441.607143  261.607143   21.607143 -188.392857 -468.392857 
##          37          38          39          40          41          42 
## -348.392857   11.607143  143.333333  -40.000000   21.607143   41.607143 
##          43          44          45          46          47          48 
##  311.607143   91.607143   71.607143   -8.392857 -238.392857 -388.392857 
##          49          50          51          52          53          54 
## -288.392857   11.607143  113.333333  -80.000000   71.607143  111.607143 
##          55          56          57          58          59          60 
##  171.607143   51.607143   81.607143   31.607143 -148.392857 -398.392857 
##          61          62          63          64          65          66 
## -308.392857  181.607143    3.333333 -330.000000  211.607143  191.607143 
##          67          68 
##   71.607143  101.607143
#Identifikasi Apakah Residual dari TSR Sudah WN
acf(res,68,lwd=1,col="blue")

x<-res
pv2<-rep(1,length(x))
for(i in 1:length(x))
  pv2[i]=Box.test(x,lag=i,type="Ljung")$p.value
plot(pv2,type="p",main="Ljung-Box TSR",xlab="lag",ylab="p value",ylim=c(0,1))
abline(h=0.05,lty=1,col="red")

pv2
##  [1] 1.810882e-05 7.405289e-05 2.692312e-04 1.112853e-04 9.839038e-07
##  [6] 2.605304e-09 4.156342e-12 4.009015e-13 1.149192e-12 1.448064e-12
## [11] 5.662137e-15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [16] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [21] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [26] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [31] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [36] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [41] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [46] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [51] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [56] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [61] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## [66] 0.000000e+00 0.000000e+00           NA

Berdasarkan residual dari model TSR diketahui Residual tidak memenuhi asumsi white noise, maka dilanjutkan dengan model ARIMAX

#Pemodelan ARIMA dari Data Residual TSR

ts.plot(res,ylab="Residual TSR",col="red",lwd=3)

acf(res,68,col="blue",lwd=1) #Membuat ACF

pacf(res,68,col="blue",lwd=1) #Membuat PACF

Berdasarkan grafik runtun waktu dari residual model TSR, diperoleh bahwa data tidak stasioner

#Stasioneritas dalam Variansi

min(res)
## [1] -468.3929
res=resid(model2) #Residual dari model TSR
res
##           1           2           3           4           5           6 
## -218.392857  311.607143  123.333333  -90.000000  241.607143  131.607143 
##           7           8           9          10          11          12 
##  311.607143  331.607143  251.607143 -128.392857 -238.392857 -388.392857 
##          13          14          15          16          17          18 
## -348.392857  -28.392857   73.333333  180.000000  161.607143  121.607143 
##          19          20          21          22          23          24 
##  191.607143  421.607143   41.607143 -158.392857 -288.392857 -438.392857 
##          25          26          27          28          29          30 
## -438.392857 -278.392857 -456.666667  360.000000  541.607143  -18.392857 
##          31          32          33          34          35          36 
##  131.607143  441.607143  261.607143   21.607143 -188.392857 -468.392857 
##          37          38          39          40          41          42 
## -348.392857   11.607143  143.333333  -40.000000   21.607143   41.607143 
##          43          44          45          46          47          48 
##  311.607143   91.607143   71.607143   -8.392857 -238.392857 -388.392857 
##          49          50          51          52          53          54 
## -288.392857   11.607143  113.333333  -80.000000   71.607143  111.607143 
##          55          56          57          58          59          60 
##  171.607143   51.607143   81.607143   31.607143 -148.392857 -398.392857 
##          61          62          63          64          65          66 
## -308.392857  181.607143    3.333333 -330.000000  211.607143  191.607143 
##          67          68 
##   71.607143  101.607143
res=res+550
boxcox(res~1) 

p<-powerTransform(res)
p
## Estimated transformation parameter 
##      res 
## 1.006816

#Stasioneritas dalam Rata-Rata ADF

library(urca)
## 
## Attaching package: 'urca'
## The following objects are masked from 'package:fUnitRoots':
## 
##     punitroot, qunitroot, unitrootTable
test=ur.df(res)
summary(test)
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression none 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -470.1 -126.1   36.3  155.8  823.2 
## 
## Coefficients:
##            Estimate Std. Error t value Pr(>|t|)  
## z.lag.1    -0.08139    0.04855  -1.676   0.0986 .
## z.diff.lag -0.00572    0.12056  -0.047   0.9623  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 232.6 on 64 degrees of freedom
## Multiple R-squared:  0.04457,    Adjusted R-squared:  0.01471 
## F-statistic: 1.493 on 2 and 64 DF,  p-value: 0.2325
## 
## 
## Value of test-statistic is: -1.6763 
## 
## Critical values for test statistics: 
##      1pct  5pct 10pct
## tau1 -2.6 -1.95 -1.61
diff1 = diff(res, differences = 2)
head(diff1)
##          3          4          5          6          7          8 
## -718.27381  -25.05952  544.94048 -441.60714  290.00000 -160.00000
adf.test(diff1)
## Warning in adf.test(diff1): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff1
## Dickey-Fuller = -5.9066, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
acf(diff1,68,col="blue",lwd=1) #Membuat ACF

pacf(diff1,68,col="blue",lwd=1) #Membuat PACF

#Pemodelan ARIMA

fit1=arima(x=res,order=c(0,2,1))
coeftest(fit1) #Signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ma1 -0.999994   0.038889 -25.714 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit2=arima(x=res,order=c(0,2,2))
coeftest(fit2)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)    
## ma1 -1.10383    0.20604 -5.3575 8.44e-08 ***
## ma2  0.10383    0.20231  0.5132   0.6078    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit3=arima(x=res,order=c(0,2,3))
coeftest(fit3) #Signifikan
## 
## z test of coefficients:
## 
##     Estimate Std. Error  z value  Pr(>|z|)    
## ma1 -1.33455    0.10179 -13.1110 < 2.2e-16 ***
## ma2 -0.31829    0.16145  -1.9714   0.04867 *  
## ma3  0.66070    0.09019   7.3257 2.376e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit4=arima(x=res,order=c(1,2,0))
coeftest(fit4) #Sigifikan
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)   
## ar1 -0.34834    0.11864  -2.936 0.003325 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit5=arima(x=res,order=c(1,2,1))
coeftest(fit5)
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value Pr(>|z|)    
## ar1 -0.036735   0.127558  -0.288   0.7734    
## ma1 -0.999999   0.038979 -25.655   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit6=arima(x=res,order=c(1,2,2))
coeftest(fit6)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)    
## ar1 -0.59956    0.26948 -2.2249  0.02609 *  
## ma1 -0.24653    0.21512 -1.1460  0.25179    
## ma2 -0.75347    0.21362 -3.5272  0.00042 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit7=arima(x=res,order=c(1,2,3))
coeftest(fit7)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value  Pr(>|z|)    
## ar1  0.18302    0.18003  1.0166    0.3093    
## ma1 -1.42674    0.15248 -9.3570 < 2.2e-16 ***
## ma2 -0.13361    0.28180 -0.4741    0.6354    
## ma3  0.56822    0.14458  3.9302 8.488e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit8=arima(x=res,order=c(2,2,0))
coeftest(fit8) #Signifikan
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value  Pr(>|z|)    
## ar1 -0.55115    0.10576 -5.2115 1.873e-07 ***
## ar2 -0.56333    0.10326 -5.4556 4.881e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit9=arima(x=res,order=c(2,2,1))
coeftest(fit9)
## 
## z test of coefficients:
## 
##      Estimate Std. Error  z value  Pr(>|z|)    
## ar1 -0.050588   0.119697  -0.4226  0.672560    
## ar2 -0.342031   0.118610  -2.8837  0.003931 ** 
## ma1 -0.999999   0.040542 -24.6658 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit10=arima(x=res,order=c(2,2,2))
coeftest(fit10)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)   
## ar1 -0.36683    0.26209 -1.3997 0.161617   
## ar2 -0.35343    0.12023 -2.9397 0.003286 **
## ma1 -0.63802    0.26864 -2.3750 0.017548 * 
## ma2 -0.36196    0.26604 -1.3605 0.173663   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fit11=arima(x=res,order=c(2,2,3))
coeftest(fit11)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value  Pr(>|z|)    
## ar1 -1.00581    0.15302 -6.5730 4.930e-11 ***
## ar2 -0.85860    0.11696 -7.3408 2.123e-13 ***
## ma1  0.12384    0.19807  0.6252  0.531835    
## ma2 -0.36371    0.12224 -2.9754  0.002926 ** 
## ma3 -0.76013    0.19345 -3.9294 8.516e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

#Pemeriksaan Diagnostik

res1=resid(fit1)
res3=resid(fit3)
res4=resid(fit4)
res8=resid(fit8)

#White Noise
x<-res1
pv2<-rep(1,length(x))
for(i in 1:length(x))
  pv2[i]=Box.test(x,lag=i,type="Ljung")$p.value
plot(pv2,type="p",main="Ljung-Box",xlab="lag",ylab="p value",ylim=c(0,1))
abline(h=0.05,lty=1,col="red")

pv2
##  [1] 0.98019050 0.02937485 0.05221548 0.10242136 0.08719959 0.14225353
##  [7] 0.15540206 0.20352561 0.27336266 0.32557213 0.37308150 0.11106943
## [13] 0.14594580 0.18669180 0.21322365 0.11625462 0.14344609 0.18343967
## [19] 0.22717501 0.24545196 0.28956530 0.34191892 0.28388259 0.24675016
## [25] 0.26936904 0.31585886 0.31752569 0.24587944 0.25339709 0.24129817
## [31] 0.27531544 0.17229965 0.17111386 0.13046864 0.07079262 0.08190493
## [37] 0.03227560 0.04011869 0.04766834 0.05155209 0.06020203 0.06820081
## [43] 0.08287040 0.08625002 0.10238309 0.12162089 0.12543109 0.13127874
## [49] 0.14813162 0.16975241 0.19512981 0.21535305 0.24342387 0.27028846
## [55] 0.29256412 0.32554673 0.31568293 0.33007921 0.20841023 0.14400400
## [61] 0.16476916 0.09474894 0.10778288 0.12160327 0.13865254 0.15838475
## [67] 0.17976028         NA
x<-res3
pv2<-rep(1,length(x))
for(i in 1:length(x))
  pv2[i]=Box.test(x,lag=i,type="Ljung")$p.value
plot(pv2,type="p",main="Ljung-Box",xlab="lag",ylab="p value",ylim=c(0,1))
abline(h=0.05,lty=1,col="red")

x<-res4
pv2<-rep(1,length(x))
for(i in 1:length(x))
  pv2[i]=Box.test(x,lag=i,type="Ljung")$p.value
plot(pv2,type="p",main="Ljung-Box",xlab="lag",ylab="p value",ylim=c(0,1))
abline(h=0.05,lty=1,col="red")

x<-res8
pv2<-rep(1,length(x))
for(i in 1:length(x))
  pv2[i]=Box.test(x,lag=i,type="Ljung")$p.value
plot(pv2,type="p",main="Ljung-Box",xlab="lag",ylab="p value",ylim=c(0,1))
abline(h=0.05,lty=1,col="red")

#Cek Normalitas
library(nortest)
lillie.test(res1)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  res1
## D = 0.071771, p-value = 0.5211
lillie.test(res3)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  res3
## D = 0.065702, p-value = 0.6618
lillie.test(res4)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  res4
## D = 0.056773, p-value = 0.8484
lillie.test(res8)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  res8
## D = 0.069812, p-value = 0.5662

Setelah melakukan pengujian signifikansi parameter dan pengujian diagnostik didapatkan model ARIMA terbaik adalah model ARIMA (2,2,0)

Pemodelan ARIMAX

library(TSA)
## Registered S3 methods overwritten by 'TSA':
##   method       from    
##   fitted.Arima forecast
##   plot.Arima   forecast
## 
## Attaching package: 'TSA'
## The following objects are masked from 'package:timeDate':
## 
##     kurtosis, skewness
## The following objects are masked from 'package:stats':
## 
##     acf, arima
## The following object is masked from 'package:utils':
## 
##     tar
xreg<-data.frame(D2,D3)
Yt=data$LP[1:68]
modelarimax=arima(Yt,order=c(2,2,0),xreg=xreg)
coeftest(modelarimax)
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ar1  -0.46618    0.14681 -3.1754  0.001496 ** 
## ar2  -0.51959    0.11636 -4.4652 8.000e-06 ***
## D2  823.23968  101.58947  8.1036 5.336e-16 ***
## D3  619.48787   96.36059  6.4289 1.286e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Pemodelan ARIMAX (2,2,0)
#Pengecekkan Diagnostik
#WNhite Noise
x<-resid(modelarimax)
pv2<-rep(1,length(x))
for(i in 1:length(x))
  pv2[i]=Box.test(x,lag=i,type="Ljung")$p.value
plot(pv2,type="p",main="Ljung-Box",xlab="lag",ylab="p value",ylim=c(0,1))
abline(h=0.05,lty=1,col="red")

#Normalitas
lillie.test(x)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  x
## D = 0.083837, p-value = 0.2778

Setelah melakukan pengujian signifikansi parameter dan pengujian diagnostik didapatkan model ARIMAX terbaik adalah model ARIMA (2,2,0)

#Prediksi & Peramalan Model ARIMAX

#Prediksi In Sample
fits.ARIMA=as.ts(fitted(modelarimax))
Pred_in=fits.ARIMA
Pred_in
## Time Series:
## Start = 1 
## End = 68 
## Frequency = 1 
##  [1]  539.75850 1069.53937 2301.22521 1609.43106  989.06725 1056.13846
##  [7]  738.90812 1280.80866 1033.90898 1059.75241  441.81390  440.00668
## [13]   98.35868  382.20859 1643.98656 1608.96182 1305.28790  922.89397
## [19]  951.23467  916.49492 1278.25595  621.23808  633.03540  213.84135
## [25]  142.95254  260.46419 1310.71213  917.25439 1796.11647 1226.25591
## [31]  891.87671 1030.88777 1066.50335  985.29603  822.56899  377.18975
## [37]   27.04523  379.89762 1633.52050 1734.40716  949.66259  856.67403
## [43]  748.31090 1181.62095  728.53314  971.36120  594.05349  391.10283
## [49]  260.64345  411.88704 1670.10601 1681.20515  874.75129  939.66389
## [55]  818.98500  975.21435  763.52133  893.59821  699.35655  532.17091
## [61]  210.17926  417.86865 1890.10636 1406.39400  663.69176 1149.84421
## [67]  773.38624  984.97086
#Prediksi Out Sample
Ytnew=data$LP[69:84]
D2new=data$D2[69:84]
D3new=data$D3[69:84]
xregnewbgt=data.frame(D2new,D3new)
fore.ARIMA=predict(modelarimax,newYt=Ytnew,newxreg=xregnewbgt,16)$pred
se.fore.ARIMA=predict(modelarimax,newxreg=xregnewbgt,16)$se
Pred_out=fore.ARIMA
Pred_out
## Time Series:
## Start = 69 
## End = 84 
## Frequency = 1 
##  [1]  872.0312  814.5010  798.7356  799.6433  771.0779  747.5892 1560.2874
##  [8] 1337.3205  695.9338  679.7928  662.3620  642.5408  624.5041  606.8776
## [15]  588.1326  569.6959
#Forecast
Ytnewnew=data$Zt[85:90]
D2newnew=data$D2[85:90]
D3newnew=data$D3[85:90]
xregnewbgtbgt=data.frame (D2newnew,D3newnew)
fore.ARIMAA=predict(modelarimax,NewYt=Ytnewnew,newxreg=xregnewbgtbgt,6)$pred
se.fore.ARIMAA=predict(modelarimax,newxreg=xregnewbgtbgt,6)$se
Forecastt=fore.ARIMAA
Forecastt
## Time Series:
## Start = 69 
## End = 74 
## Frequency = 1 
## [1]  872.0312  814.5010 1621.9753 1419.1312  771.0779  747.5892
se_foree=se.fore.ARIMAA

#Akurasi Model ARIMAX

library(MLmetrics)
#Akurasi Insampel ARIMAX
RMSEINARIMAX=RMSE(Pred_in,Yt)
RMSEINARIMAX
## [1] 262.1192
MAPEINARIMAX=mean(abs(Yt-(Pred_in))/(Yt))*100
MAPEINARIMAX
## [1] 25.42295
smape <- function(actual, forecast) {
  return(mean(200 * abs(forecast - actual) / (abs(actual) + abs(forecast)), na.rm = TRUE))
}
SMAPEINARIMAX=smape(Yt,Pred_in)
SMAPEINARIMAX
## [1] 28.13487
#Akurasi Outsampel ARIMAX
RMSEOUTARIMAX=RMSE(Pred_out,Ytout)
RMSEOUTARIMAX
## [1] 322.8926
MAPEOUTARIMAX=mean(abs(Ytout-(Pred_out))/(Ytout))*100
MAPEOUTARIMAX
## [1] 44.5743
smape <- function(actual, forecast) {
  return(mean(200 * abs(forecast - actual) / (abs(actual) + abs(forecast)), na.rm = TRUE))
}
SMAPEOUTARIMAX=smape(Ytout,Pred_out)
SMAPEOUTARIMAX
## [1] 36.14227

Plot Perbandingan IN SAMPLE, OUT SAMPLE, PREDIKSI ARIMAX, PERAMALAN ARIMAX

#Model ARIMAX Dengan Data Aktual
prediksii=c(Pred_in,Pred_out,Forecastt)
prediksii
##  [1]  539.75850 1069.53937 2301.22521 1609.43106  989.06725 1056.13846
##  [7]  738.90812 1280.80866 1033.90898 1059.75241  441.81390  440.00668
## [13]   98.35868  382.20859 1643.98656 1608.96182 1305.28790  922.89397
## [19]  951.23467  916.49492 1278.25595  621.23808  633.03540  213.84135
## [25]  142.95254  260.46419 1310.71213  917.25439 1796.11647 1226.25591
## [31]  891.87671 1030.88777 1066.50335  985.29603  822.56899  377.18975
## [37]   27.04523  379.89762 1633.52050 1734.40716  949.66259  856.67403
## [43]  748.31090 1181.62095  728.53314  971.36120  594.05349  391.10283
## [49]  260.64345  411.88704 1670.10601 1681.20515  874.75129  939.66389
## [55]  818.98500  975.21435  763.52133  893.59821  699.35655  532.17091
## [61]  210.17926  417.86865 1890.10636 1406.39400  663.69176 1149.84421
## [67]  773.38624  984.97086  872.03120  814.50101  798.73558  799.64334
## [73]  771.07787  747.58916 1560.28736 1337.32045  695.93376  679.79275
## [79]  662.36198  642.54079  624.50411  606.87756  588.13260  569.69593
## [85]  872.03120  814.50101 1621.97526 1419.13121  771.07787  747.58916
plot(prediksii,xlim=c(0,90),ylim=c(0,3000),main="Plot Data Padi ARIMAX",xlab= "Waktu",ylab="Jumlah Padi",col="white")
lines(data$LP,col="black",lwd=4)
points(data$LP[1:68],cex=1,col="black",pch=19)
lines(69:84, data$LP[69:84],col="darkgrey",lwd=4)
points(69:84, data$LP[69:84],cex=1,col="darkgrey",pch=19)
lines(prediksii[1:69],col="coral2",lwd=4)
points(prediksii[1:68],cex=1,col="coral2",pch=19)
lines(69:85, prediksii[69:85], col="green", lwd=4, cex=1.5)
points(69:84, prediksii[69:84],cex=1,col="green",pch=19)
points(85:90, Forecastt,cex=1,col="blue",pch=19)
lines(85:90, Forecastt,col="blue",lwd=4,cex=1.5)
grid()
legend("topright",legend=c("In Sample","Out Sample","Prediksi In Sample","Prediksi Out Sample","Forecasting"),cex=0.5,lty=1,col=c("black","darkgrey","coral2","green","blue"))
grid()

#Model TSR Dengan Data Aktual
prediksi2=c(predinTSR,predoutTSR,ramalTSR)
prediksi2
##  [1]  758.39  758.39 1646.66 1500.00  758.39  758.39  758.39  758.39  758.39
## [10]  758.39  758.39  758.39  758.39  758.39 1646.66 1500.00  758.39  758.39
## [19]  758.39  758.39  758.39  758.39  758.39  758.39  758.39  758.39 1646.66
## [28] 1500.00  758.39  758.39  758.39  758.39  758.39  758.39  758.39  758.39
## [37]  758.39  758.39 1646.66 1500.00  758.39  758.39  758.39  758.39  758.39
## [46]  758.39  758.39  758.39  758.39  758.39 1646.66 1500.00  758.39  758.39
## [55]  758.39  758.39  758.39  758.39  758.39  758.39  758.39  758.39 1646.66
## [64] 1500.00  758.39  758.39  758.39  758.39  758.39  758.39  758.39  758.39
## [73]  758.39  758.39 1646.66 1500.00  758.39  758.39  758.39  758.39  758.39
## [82]  758.39  758.39  758.39  758.39  758.39 1646.66 1500.00  758.39  758.39
plot(prediksi2,xlim=c(0,90),ylim=c(0,3000),main="Plot Data Padi TSR",xlab= "Waktu",ylab="Jumlah Padi",col="white")
lines(data$LP,col="black",lwd=4)
points(data$LP[1:69],cex=1,col="black",pch=19)
lines(69:84, data$LP[69:84],col="palegreen3",lwd=4)
points(69:84, data$LP[69:84],cex=1,col="palegreen3",pch=19)
lines(TSR[1:69],col="orange",lwd=4)
points(TSR[1:68],cex=1,col="orange",pch=19)
lines(69:85, TSR[69:85], col="ivory3", lwd=4, cex=1.5)
points(69:84, TSR[69:84],cex=1,col="ivory3",pch=19)
points(85:90, TSR[85:90],cex=1,col="skyblue1",pch=19)
lines(85:90, TSR[85:90],col="skyblue1",lwd=4,cex=1.5)
grid()
legend("topright",legend=c("In Sample","Out Sample","Prediksi In Sample","Prediksi Out Sample","Forecasting"),cex=0.5,lty=1,col=c("black","palegreen3","orange","ivory3","skyblue1"))
grid()

Kesimpulan:

Berdasarkan hasil analisis diketehaui bahwa model ARIMAX lebih baik dibandingkan model TSR (Time Series Reggression). Hal ini dapat dilihat dari perbandingan grafik model ARIMAX dan model TSR dimana pola data prediksi ARIMAX cenderung lebih mengikuti pola aktual daripada pola data prediksi TSR. Selain itu, nilai akurasi model ARIMAX menghasilkan nilai yang lebih kecil dibandingkan nilai akurasi model TSR.