library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.2
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(TTR)
## Warning: package 'TTR' was built under R version 4.3.3
library(forecast)
## Warning: package 'forecast' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(orcutt)
## Warning: package 'orcutt' was built under R version 4.3.3
library(HoRM)
## Warning: package 'HoRM' was built under R version 4.3.3
Data yang digunakan dalam kesempatan kali ini adalah data GDP Sri Langka periode tahun 1960-2023.
library(readxl)
DataSL <- read_xlsx("D:/STATATISTIKA/SEM5/MPDW/Data Sri Langka.xlsx")
DataSL
## # A tibble: 64 × 2
## Tahun GDP
## <chr> <dbl>
## 1 1960 1409873950.
## 2 1961 1444327731.
## 3 1962 1434156379.
## 4 1963 1240672269.
## 5 1964 1309747899.
## 6 1965 1698319328.
## 7 1966 1751470588.
## 8 1967 1859465021.
## 9 1968 1801344538.
## 10 1969 1965546218.
## # ℹ 54 more rows
Sebelum melakukan regresi, akan diperlihatkan plot time-series dari GDP Sri Langka
#Membentuk objek time series
data.sl<-ts(DataSL$GDP)
data.sl
## Time Series:
## Start = 1
## End = 64
## Frequency = 1
## [1] 1409873950 1444327731 1434156379 1240672269 1309747899 1698319328
## [7] 1751470588 1859465021 1801344538 1965546218 2296470588 2369308600
## [13] 2553936348 2875625000 3574586466 3791298146 3591319857 4104509583
## [19] 2733183857 3364611432 4024621900 4415844156 4768765017 5167913302
## [25] 6043474843 5978460972 6405210564 6682167120 6978371581 6987267684
## [31] 8032551173 9000362582 9703011636 10338679636 11717604209 13029697561
## [37] 13897738375 15091913884 15794972847 15656327860 16330814180 15749753805
## [43] 16536535647 18881765437 20662525941 24405791045 28279802406 32350238760
## [49] 40713826215 42066224093 58636161082 67753284044 70447216891 77000578167
## [55] 82528535714 85140955389 88012282206 94376237797 94493871201 89014978344
## [61] 84304298771 88609332762 74144875098 84356860421
#Membuat plot time series
ts.plot(data.sl, xlab="Time Period ", ylab="GDP", main= "Time Series Plot of GDP")
points(data.sl)
Selanjutnya akan dilakukan ramalan dan pemulusan dengan metode DMA dan DES karena terlihat pada plot di atas menunjukkan adanya trend.
dt.sma <- SMA(data.sl, n=3)
dma <- SMA(dt.sma, n = 3)
At <- 2*dt.sma - dma
Bt <- 2/(3-1)*(dt.sma - dma)
dt.dma<- At+Bt
dt.ramal<- c(NA, dt.dma)
t = 1:5
f = c()
for (i in t) {
f[i] = At[length(At)] + Bt[length(Bt)]*(i)
}
dt.gab <- cbind(aktual = c(data.sl,rep(NA,5)),
pemulusan1 = c(dt.sma,rep(NA,5)),
pemulusan2 = c(dt.dma, rep(NA,5)),
At = c(At, rep(NA,5)),
Bt = c(Bt,rep(NA,5)),
ramalan = c(dt.ramal, f[-1]))
dt.gab
## aktual pemulusan1 pemulusan2 At Bt ramalan
## [1,] 1409873950 NA NA NA NA NA
## [2,] 1444327731 NA NA NA NA NA
## [3,] 1434156379 1429452686 NA NA NA NA
## [4,] 1240672269 1373052126 NA NA NA NA
## [5,] 1309747899 1328192182 1230778550 1279485366 -48706816 NA
## [6,] 1698319328 1416246499 1503745624 1459996062 43749563 1230778550
## [7,] 1751470588 1586512605 1872236958 1729374781 142862176 1503745624
## [8,] 1859465021 1769751646 2127581104 1948666375 178914729 1872236958
## [9,] 1801344538 1804093382 1972041725 1888067553 83974171 2127581104
## [10,] 1965546218 1875451926 1993491141 1934471533 59019608 1972041725
## [11,] 2296470588 2021120448 2262917507 2142018978 120898530 1993491141
## [12,] 2369308600 2210441802 2559982623 2385212213 174770410 2262917507
## [13,] 2553936348 2406571846 2794292806 2600432326 193860480 2559982623
## [14,] 2875625000 2599623316 2987778639 2793700978 194077661 2794292806
## [15,] 3574586466 3001382605 3665762637 3333572621 332190016 2987778639
## [16,] 3791298146 3413836537 4231614639 3822725588 408889051 3665762637
## [17,] 3591319857 3652401490 4245457381 3948929435 296527946 4231614639
## [18,] 4104509583 3829042529 4223607215 4026324872 197282343 4245457381
## [19,] 2733183857 3476337766 3123825441 3300081603 -176256162 4223607215
## [20,] 3364611432 3400768291 3064872482 3232820386 -167947904 3123825441
## [21,] 4024621900 3374139063 3288253776 3331196419 -42942644 3064872482
## [22,] 4415844156 3935025829 4665122033 4300073931 365048102 3288253776
## [23,] 4768765017 4403077024 5401069795 4902073409 498996385 4665122033
## [24,] 5167913302 4784174158 5604337800 5194255979 410081821 5401069795
## [25,] 6043474843 5326717721 6304173893 5815445807 488728086 5604337800
## [26,] 5978460972 5729949706 6629288061 6179618883 449669177 6304173893
## [27,] 6405210564 6142382126 6961113344 6551747735 409365609 6629288061
## [28,] 6682167120 6355279552 6914097733 6634688642 279409091 6961113344
## [29,] 6978371581 6688583088 7274919421 6981751254 293168166 6914097733
## [30,] 6987267684 6882602128 7363496539 7123049334 240447205 7274919421
## [31,] 8032551173 7332730146 8062246863 7697488505 364758359 7363496539
## [32,] 9000362582 8006727146 9205475158 8606101152 599374006 8062246863
## [33,] 9703011636 8911975130 10568303776 9740139453 828164323 9205475158
## [34,] 10338679636 9680684618 11309129257 10494906937 814222320 10568303776
## [35,] 11717604209 10586431827 12306567764 11446499795 860067969 11309129257
## [36,] 13029697561 11695327135 13777685686 12736506410 1041179275 12306567764
## [37,] 13897738375 12881680048 15202747471 14042213760 1160533712 13777685686
## [38,] 15091913884 14006449940 16297045071 15151747505 1145297565 15202747471
## [39,] 15794972847 14928208369 16907066201 15917637285 989428916 16297045071
## [40,] 15656327860 15514404863 16910505809 16212455336 698050473 16907066201
## [41,] 16330814180 15927371629 16868791646 16398081637 470710009 16910505809
## [42,] 15749753805 15912298615 16167512440 16039905527 127606912 16868791646
## [43,] 16536535647 16205701211 16586855996 16396278603 190577393 16167512440
## [44,] 18881765437 17056018296 18385376141 17720697219 664678922 16586855996
## [45,] 20662525941 18693609009 21443941349 20068775179 1375166170 18385376141
## [46,] 24405791045 21316694141 25905868126 23611281134 2294586992 21443941349
## [47,] 28279802406 24449373131 30375001872 27412187501 2962814371 25905868126
## [48,] 32350238760 28345277404 35628269094 31986773249 3641495845 30375001872
## [49,] 40713826215 33781289127 43626574274 38703931700 4922642573 35628269094
## [50,] 42066224093 38376763023 48128069366 43252416194 4875653172 43626574274
## [51,] 58636161082 47138737130 61885018537 54511877833 7373140703 48128069366
## [52,] 67753284044 56151889740 74010742624 65081316182 8929426442 61885018537
## [53,] 70447216891 65612220672 84234763656 74923492164 9311271492 74010742624
## [54,] 77000578167 71733693034 86202543472 78968118253 7234425219 84234763656
## [55,] 82528535714 76658776924 87306537019 81982656971 5323880047 86202543472
## [56,] 85140955389 81556689757 91370629460 86463659608 4906969852 87306537019
## [57,] 88012282206 85227257770 93386623675 89306940722 4079682953 91370629460
## [58,] 94376237797 89176491797 96889182510 93032837153 3856345356 93386623675
## [59,] 94493871201 92294130401 99083804558 95688967480 3394837079 96889182510
## [60,] 89014978344 92628362447 95152430912 93890396679 1262034232 99083804558
## [61,] 84304298771 89271049438 85017453457 87144251448 -2126797991 95152430912
## [62,] 88609332762 87309536626 82455977536 84882757081 -2426779545 85017453457
## [63,] 74144875098 82352835544 74436225559 78394530551 -3958304992 82455977536
## [64,] 84356860421 82370356094 79089249439 80729802767 -1640553327 74436225559
## [65,] NA NA NA NA NA 79089249439
## [66,] NA NA NA NA NA 77448696112
## [67,] NA NA NA NA NA 75808142785
## [68,] NA NA NA NA NA 74167589458
## [69,] NA NA NA NA NA 72527036131
#Plot time series
ts.plot(dt.gab[,1], xlab="Time Period ", ylab="GDP",
main= "DMA N=3 Data GDP")
points(dt.gab[,1])
points(dt.gab[,3])
points(dt.gab[,6])
lines(dt.gab[,3],col="yellow",lwd=2)
lines(dt.gab[,6],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"),
lty=8, col=c("black","yellow","red"), cex=0.8)
Selanjutnya akan dilihat keakuratan dari metode DMA
#Menghitung nilai keakuratan
error.dma = data.sl-dt.ramal[1:length(data.sl)]
SSE.dma = sum(error.dma[6:length(data.sl)]^2)
MSE.dma = mean(error.dma[6:length(data.sl)]^2)
MAPE.dma = mean(abs((error.dma[6:length(data.sl)]/data.sl[6:length(data.sl)])*100))
akurasi.dma <- matrix(c(SSE.dma, MSE.dma, MAPE.dma))
row.names(akurasi.dma)<- c("SSE", "MSE", "MAPE")
colnames(akurasi.dma) <- c("Akurasi m = 3")
akurasi.dma
## Akurasi m = 3
## SSE 7.148121e+20
## MSE 1.211546e+19
## MAPE 8.460205e+00
Selanjutnya akan digunakan metode Double Exponential Smoothing dengan cara sebagai berikut.
Pertama akan data akan dibagi menjadi data training dan data testing.
#membagi training dan testing
training<-DataSL[1:50,2]
testing<-DataSL[51:70,2]
#data time series
training.ts<-ts(training)
testing.ts<-ts(testing,start=51)
#eksplorasi data
plot(data.sl, col="red",main="Plot semua data")
points(data.sl)
plot(training.ts, col="blue",main="Plot data training")
points(training.ts)
Selanjutnya akan dilakukan pemulusan dengan DES, kali ini langsung dicari lambda dan gamma optimum sebagai berikut. Nilai lambda dan gamma optimum dapat dilihat pada smoothing parameters alpha untuk nilai lambda dan beta untuk nilai gamma.
#Lamda dan gamma optimum
des.opt<- HoltWinters(training.ts, gamma = FALSE)
des.opt
## Holt-Winters exponential smoothing with trend and without seasonal component.
##
## Call:
## HoltWinters(x = training.ts, gamma = FALSE)
##
## Smoothing parameters:
## alpha: 0.5819323
## beta : 1
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 43627991175
## b 4641090788
plot(des.opt)
legend("topleft", c("Data Aktual", "Peramalan"), col = c("black", "red"),
lty = c(1,1))
#ramalan
ramalandesopt<- forecast(des.opt, h=5)
ramalandesopt
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 51 48269081963 46900703861 49637460065 46176328250 50361835676
## 52 52910172752 50810445388 55009900115 49698916864 56121428639
## 53 57551263540 54370737351 60731789728 52687068490 62415458590
## 54 62192354328 57691095358 66693613299 55308272794 69076435862
## 55 66833445116 60823968464 72842921769 57642743687 76024146546
Selanjutnya akan dicari akurasi dari metode DES.
ssedes.train<-des.opt$SSE
msedes.train<-ssedes.train/length(training.ts)
sisaandes<-ramalandesopt$residuals
head(sisaandes)
## Time Series:
## Start = 1
## End = 6
## Frequency = 1
## x
## [1,] NA
## [2,] NA
## [3,] -44625134
## [4,] -220625413
## [5,] 96743342
## [6,] 492622698
mapedes.train <- sum(abs(sisaandes[3:length(training.ts)]/training.ts[3:length(training.ts)])*100)/length(training.ts)
akurasides.opt <- matrix(c(ssedes.train,msedes.train,mapedes.train))
row.names(akurasides.opt)<- c("SSE", "MSE", "MAPE")
colnames(akurasides.opt) <- c("Akurasi lamda dan gamma optimum")
akurasides.opt
## Akurasi lamda dan gamma optimum
## SSE 5.488986e+19
## MSE 1.097797e+18
## MAPE 7.834821e+00
#Akurasi data testing
selisihdesopt<-ramalandesopt$mean-testing.ts
selisihdesopt
## Time Series:
## Start = 51
## End = 55
## Frequency = 1
## testing.ts
## [1,] -10367079118
## [2,] -14843111292
## [3,] -12895953351
## [4,] -14808223839
## [5,] -15695090597
SSEtestingdesopt<-sum(selisihdesopt^2)
SSEtestingdesopt<-SSEtestingdesopt/length(testing.ts)
MAPEtestingdesopt<-sum(abs(selisihdesopt/testing.ts)*100)/length(testing.ts)
akurasiDesTesting <- matrix(c(SSEtestingdesopt,SSEtestingdesopt,MAPEtestingdesopt))
row.names(akurasiDesTesting)<- c("SSE", "MSE", "MAPE")
colnames(akurasiDesTesting) <- c("Akurasi lamda dan gamma optimum")
akurasiDesTesting
## Akurasi lamda dan gamma optimum
## SSE 4.798596e+19
## MSE 4.798596e+19
## MAPE 4.807143e+00
Setelah didapatkan nilai akurasi untuk metode DMA dan DES, selanjutnya akan dibandingkan keakuratan antar metode keduanya.
cbind(akurasi.dma, akurasides.opt)
## Akurasi m = 3 Akurasi lamda dan gamma optimum
## SSE 7.148121e+20 5.488986e+19
## MSE 1.211546e+19 1.097797e+18
## MAPE 8.460205e+00 7.834821e+00
Berdasarkan perbandingan akurasi tersebut, terlihat nilai SSE, MSE, dan MAPE metode DES lebih kecil dibandingkan dengan metode DMA. Oleh karena itu, metode peramalan dan pemulusan yang terbaik antara keduanya adalah dengan metode DES.
Setelah melakukan peramalan, data yang telah dimasukkan kemudian dieksplorasi. Eksplorasi pertama yang dilakukan adalah dengan menggunakan scatter plot.
#Eksplorasi Data
#Pembuatan Scatter Plot
DataSL$Tahun <- as.numeric(DataSL$Tahun)
DataSL$GDP <- as.numeric(DataSL$GDP)
tahun <- DataSL$Tahun
GDP <- DataSL$GDP
plot(tahun,GDP, pch = 20, col = "red",
main = "Scatter Plot Tahun vs Nilai GDP",
xlab = "Tahun",
ylab = "Nilai GDP")
#Menampilkan Nilai Korelasi
cor(tahun,GDP)
## [1] 0.8537009
Berdasarkan scatter plot di atas, terlihat adanya hubungan / korelasi positif antara peubah tahun dengan nilai GDP, terlihat titik-titik pada plot yang naik ke arah kanan atas.
Setalah mengetahui adanya hubungan antar dua peubah, maka model regresi dapat ditentukan.
#Pembuatan Model Regresi
#model regresi
model<- lm(GDP~tahun, data = DataSL)
summary(model)
##
## Call:
## lm(formula = GDP ~ tahun, data = DataSL)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.396e+10 -1.543e+10 -1.710e+09 1.435e+10 3.223e+10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.849e+12 2.227e+11 -12.79 <2e-16 ***
## tahun 1.444e+09 1.118e+08 12.91 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.653e+10 on 62 degrees of freedom
## Multiple R-squared: 0.7288, Adjusted R-squared: 0.7244
## F-statistic: 166.6 on 1 and 62 DF, p-value: < 2.2e-16
Model yang dihasilkan adalah \[y_i=-2.849e+12+1.444e+09x_t\] Berdasarkan ringkasan model dapat diketahui bahwa hasil uji F memiliki p-value < \(\alpha\) (5%). Artinya, minimal terdapat satu variabel yang berpengaruh nyata terhadap model. Hasil uji-t parsial kedua parameter regresi, yaitu intersep dan koefisien regresi juga menunjukkan hal yang sama, yaitu memiliki p-value < \(\alpha\) (5%) sehingga nyata dalam taraf 5%. Selanjutnya dapat dilihat juga nilai \(R^2=0.7288\). Artinya, sebesar 72.88% keragaman nilai GDP dapat dijelaskan oleh peubah tahun. Hasil ini menunjukkan hasil yang bagus, seolah mendapatkan hasil terbaik. Namun, kita perlu melakukan uji terhadap sisaannya seperti berikut ini.
#sisaan dan fitted value
sisaan<- residuals(model)
fitValue<- predict(model)
#Diagnostik dengan eksploratif
par(mfrow = c(2,2))
qqnorm(sisaan)
qqline(sisaan, col = "steelblue", lwd = 2)
plot(fitValue, sisaan, col = "steelblue", pch = 20, xlab = "Sisaan", ylab = "Fitted Values", main = "Sisaan vs Fitted Values")
abline(a = 0, b = 0, lwd = 2)
hist(sisaan, col = "steelblue")
plot(seq(1,64,1), sisaan, col = "steelblue", pch = 20, xlab = "Sisaan", ylab = "Order", main = "Sisaan vs Order")
lines(seq(1,64,1), sisaan, col = "red")
abline(a = 0, b = 0, lwd = 2)
Dua plot di samping kiri digunakan untuk melihat apakah sisaan menyebar normal. Normal Q-Q Plot di atas menunjukkan bahwa sisaan cenderung menyebar normal, tetapi histogram dari sisaan tidak menunjukkan demikian. Selanjutnya, dua plot di samping kanan digunakan untuk melihat autokorelasi. Plot Sisaan vs Fitted Value dan Plot Sisaan vs Order menunjukkan adanya pola pada sisaan. Untuk lebih lanjut akan digunakan uji formal melihat normalitas sisaan dan plot ACF dan PACF untuk melihat apakah ada autokorelasi atau tidak.
#Melihat Sisaan Menyebar Normal/Tidak
#H0: sisaan mengikuti sebaran normal
#H1: sisaan tidak mengikuti sebaran normal
shapiro.test(sisaan)
##
## Shapiro-Wilk normality test
##
## data: sisaan
## W = 0.93854, p-value = 0.003246
ks.test(sisaan, "pnorm", mean=mean(sisaan), sd=sd(sisaan))
##
## Exact one-sample Kolmogorov-Smirnov test
##
## data: sisaan
## D = 0.1126, p-value = 0.3643
## alternative hypothesis: two-sided
Berdasarkan uji formal Saphiro-Wilk dan Kolmogorov-Smirnov didapatkan nilai p-value > \(\alpha\) (5%). Artinya, cukup bukti untuk menyatakan sisaan berdistribusi normal.
#ACF dan PACF identifikasi autokorelasi
par(mfrow = c(1,2))
acf(sisaan)
pacf(sisaan)
Berdasarkan plot ACF dan PACF, terlihat semua dalam rentang batas dan tidak ada lag yang signifikan. Namun, untuk lebih memastikan akan dilakukan uji formal dengan uji Durbin Watson.
#Deteksi autokorelasi dengan uji-Durbin Watson
#H0: tidak ada autokorelasi
#H1: ada autokorelasi
dwtest(model)
##
## Durbin-Watson test
##
## data: model
## DW = 0.053876, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
Berdasarkan hasil DW Test, didapatkan nilai \(DW = 0.053876\) dan p-value = \(2.2e-16\). Berdasarkan tabel Durbin-Watson diperoleh nilai \(DL = 1.42\) dan \(DU = 1.58\). Nilai DW yang sangat jauh di bawah nilai DL dan DU. Artinya, menunjukkan bahwa model ini berada di daerah autokorelasi positif yang kuat. Dengan p-value yang sangat kecil (< 0.05), kita dapat menolak hipotesis nol, yang berarti ada cukup bukti untuk menyimpulkan adanya autokorelasi positif yang signifikan dalam residual model. Oleh karena itu, perlu dilakukan penanganan terhadap autokorelasi ini, misalnya dengan menggunakan metode Cochrane-Orcutt atau Hildreth-Lu untuk memperbaiki model dan menghilangkan pengaruh autokorelasi.
Penanganan metode Cochrane-Orcutt dapat dilakukan dengan bantuan
packages Orcutt pada aplikasi R maupun secara manual.
Berikut ini ditampilkan cara menggunakan bantuan library
packages Orcutt.
#Penanganan Autokorelasi Cochrane-Orcutt
modelCO<-cochrane.orcutt(model, max.iter = 1000)
modelCO
## Cochrane-orcutt estimation for first order autocorrelation
##
## Call:
## lm(formula = GDP ~ tahun, data = DataSL)
##
## number of interaction: 119
## rho 0.96566
##
## Durbin-Watson statistic
## (original): 0.05388 , p-value: 8.276e-46
## (transformed): 1.82806 , p-value: 2.063e-01
##
## coefficients:
## (Intercept) tahun
## -5.982145e+12 2.992340e+09
Hasil keluaran model setelah dilakukan penanganan adalah sebagai berikut. \[y_i=-5.982145e+12+2.992340e+09x_t\] asil juga menunjukkan bahwa nilai Durbin-Watson (DW) dan p-value meningkat secara signifikan, dengan DW berubah dari 0.05388 menjadi 1.82806 dan p-value meningkat menjadi 0.2063. Nilai DW sudah berada pada rentang DU < DW < 4-DU atau \(1.331 < DW < 2.669\). Hal tersebut juga didukung dengan nilai p-value > 0.05, artinya belum cukup bukti menyatakan bahwa sisaan terdapat autokorelasi pada taraf nyata 5%. Untuk nilai \(ρ ̂\) optimum yang digunakan adalah \(0.96566\). Nilai tersebut dapat diketahui dengan syntax berikut.
#Rho optimum
rho<- modelCO$rho
rho
## [1] 0.96566
Selanjutnya akan dilakukan transformasi secara manual dengan syntax berikut ini.
GDP
## [1] 1409873950 1444327731 1434156379 1240672269 1309747899 1698319328
## [7] 1751470588 1859465021 1801344538 1965546218 2296470588 2369308600
## [13] 2553936348 2875625000 3574586466 3791298146 3591319857 4104509583
## [19] 2733183857 3364611432 4024621900 4415844156 4768765017 5167913302
## [25] 6043474843 5978460972 6405210564 6682167120 6978371581 6987267684
## [31] 8032551173 9000362582 9703011636 10338679636 11717604209 13029697561
## [37] 13897738375 15091913884 15794972847 15656327860 16330814180 15749753805
## [43] 16536535647 18881765437 20662525941 24405791045 28279802406 32350238760
## [49] 40713826215 42066224093 58636161082 67753284044 70447216891 77000578167
## [55] 82528535714 85140955389 88012282206 94376237797 94493871201 89014978344
## [61] 84304298771 88609332762 74144875098 84356860421
GDP[-1]
## [1] 1444327731 1434156379 1240672269 1309747899 1698319328 1751470588
## [7] 1859465021 1801344538 1965546218 2296470588 2369308600 2553936348
## [13] 2875625000 3574586466 3791298146 3591319857 4104509583 2733183857
## [19] 3364611432 4024621900 4415844156 4768765017 5167913302 6043474843
## [25] 5978460972 6405210564 6682167120 6978371581 6987267684 8032551173
## [31] 9000362582 9703011636 10338679636 11717604209 13029697561 13897738375
## [37] 15091913884 15794972847 15656327860 16330814180 15749753805 16536535647
## [43] 18881765437 20662525941 24405791045 28279802406 32350238760 40713826215
## [49] 42066224093 58636161082 67753284044 70447216891 77000578167 82528535714
## [55] 85140955389 88012282206 94376237797 94493871201 89014978344 84304298771
## [61] 88609332762 74144875098 84356860421
#Transformasi Manual
GDP.trans<- GDP[-1]-GDP[-12]*rho
tahun.trans<- tahun[-1]-tahun[-12]*rho
modelCOmanual<- lm(GDP.trans~tahun.trans)
summary(modelCOmanual)
##
## Call:
## lm(formula = GDP.trans ~ tahun.trans)
##
## Residuals:
## Min 1Q Median 3Q Max
## -894667687 -464608685 -126640471 474242394 993575460
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.332e+11 9.921e+09 -13.43 <2e-16 ***
## tahun.trans 1.956e+09 1.447e+08 13.52 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 542500000 on 61 degrees of freedom
## Multiple R-squared: 0.7498, Adjusted R-squared: 0.7457
## F-statistic: 182.8 on 1 and 61 DF, p-value: < 2.2e-16
Hasil model transformasi bukan merupakan model sesungguhnya. Koefisien regresi masih perlu dicari kembali mengikuti \(β_0^*=β_0+ρ ̂β_0\) dan \(β_1^*=β_1\).
#Mencari Penduga Koefisien Regresi setelah Transformasi ke Persamaan Awal
b0bintang <- modelCOmanual$coefficients[-2]
b0 <- b0bintang/(1-rho)
b1 <- modelCOmanual$coefficients[-1]
b0
## (Intercept)
## -3.879787e+12
b1
## tahun.trans
## 1955988878
Hasil perhitungan koefisien regresi tersebut akan menghasilkan hasil yang sama dengan model yang dihasilkan menggunakan packages.
Penanganan kedua adalah menggunakan metode Hildreth-Lu. Metode ini
akan mencari nilai SSE terkecil dan dapat dicari secara manual maupun
menggunakan packages. Jika menggunakan packages, gunakan
library packages HORM.
#Penanganan Autokorelasi Hildreth lu
# Hildreth-Lu
hildreth.lu.func<- function(r, model){
x <- model.matrix(model)[,-1]
y <- model.response(model.frame(model))
n <- length(y)
t <- 2:n
y <- y[t]-r*y[t-1]
x <- x[t]-r*x[t-1]
return(lm(y~x))
}
#Pencariab rho yang meminimumkan SSE
r <- c(seq(0.1,1.5, by= 0.05))
tab <- data.frame("rho" = r, "SSE" = sapply(r, function(i){deviance(hildreth.lu.func(i, model))}))
round(tab, 4)
## rho SSE
## 1 0.10 1.337501e+22
## 2 0.15 1.196781e+22
## 3 0.20 1.064429e+22
## 4 0.25 9.404476e+21
## 5 0.30 8.248356e+21
## 6 0.35 7.175934e+21
## 7 0.40 6.187208e+21
## 8 0.45 5.282178e+21
## 9 0.50 4.460846e+21
## 10 0.55 3.723210e+21
## 11 0.60 3.069270e+21
## 12 0.65 2.499028e+21
## 13 0.70 2.012482e+21
## 14 0.75 1.609633e+21
## 15 0.80 1.290481e+21
## 16 0.85 1.055025e+21
## 17 0.90 9.032659e+20
## 18 0.95 8.352036e+20
## 19 1.00 9.113604e+20
## 20 1.05 9.501692e+20
## 21 1.10 1.133197e+21
## 22 1.15 1.399922e+21
## 23 1.20 1.750343e+21
## 24 1.25 2.184461e+21
## 25 1.30 2.702276e+21
## 26 1.35 3.303787e+21
## 27 1.40 3.988995e+21
## 28 1.45 4.757900e+21
## 29 1.50 5.610502e+21
Pertama-tama akan dicari di mana kira-kira \(ρ\) yang menghasilkan SSE minimum. Pada hasil di atas terlihat \(ρ\) minimum ketika 0.1. Namun, hasil tersebut masih kurang teliti sehingga akan dicari kembali \(ρ\) yang lebih optimum dengan ketelitian yang lebih. Jika sebelumnya jarak antar \(ρ\) yang dicari adalah 0.1, kali ini jarak antar \(ρ\) adalah 0.001 dan dilakukan pada selang 0.2 sampai dengan 0.5.
#Rho optimal di sekitar 0.4
rOpt <- seq(0.5,1.0, by= 0.001)
tabOpt <- data.frame("rho" = rOpt, "SSE" = sapply(rOpt, function(i){deviance(hildreth.lu.func(i, model))}))
head(tabOpt[order(tabOpt$SSE),])
## rho SSE
## 467 0.966 8.311004e+20
## 466 0.965 8.311058e+20
## 468 0.967 8.311286e+20
## 465 0.964 8.311446e+20
## 469 0.968 8.311902e+20
## 464 0.963 8.312169e+20
#Grafik SSE optimum
par(mfrow = c(1,1))
plot(tab$SSE ~ tab$rho , type = "l", xlab = "Rho", ylab = "SSE")
abline(v = tabOpt[tabOpt$SSE==min(tabOpt$SSE),"rho"], lty = 2, col="red",lwd=2)
text(x=0.965, y=2.0e+21, labels = "rho=0.965", cex = 0.8)
Perhitungan yang dilakukan aplikasi R menunjukkan bahwa
nilai \(ρ\) optimum. Selanjutnya, model
dapat didapatkan dengan mengevaluasi nilai \(ρ\) ke dalam fungsi
hildreth.lu.func, serta dilanjutkan dengan pengujian
autokorelasi dengan uji Durbin-Watson. Namun, setelah pengecekan
tersebut tidak lupa koefisien regresi tersebut digunakan untuk
transformasi balik. Persamaan hasil transformasi itulah yang menjadi
persamaan sesungguhnya.
#Model terbaik
modelHL <- hildreth.lu.func(0.341, model)
summary(modelHL)
##
## Call:
## lm(formula = y ~ x)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.615e+10 -9.980e+09 -2.183e+09 9.835e+09 2.218e+10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.958e+12 1.517e+11 -12.91 <2e-16 ***
## x 1.505e+09 1.155e+08 13.03 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.099e+10 on 61 degrees of freedom
## Multiple R-squared: 0.7355, Adjusted R-squared: 0.7312
## F-statistic: 169.7 on 1 and 61 DF, p-value: < 2.2e-16
#Transformasi Balik
cat("y = ", coef(modelHL)[1]/(1-0.341), "+", coef(modelHL)[2],"x", sep = "")
## y = -2.971386e+12+1504521724x
Setelah dilakukan tranformasi balik, didapatkan model dengan metode Hildreth-Lu sebagai berikut. \[y_i=-1.958e+12+1.505e+09x_t\]
#Deteksi autokorelasi
dwtest(modelHL)
##
## Durbin-Watson test
##
## data: modelHL
## DW = 0.12874, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
Hasil uji Durbin-Watson juga menunjukkan bawah nilai DW sebesar \(0.12874\) berada jauh di bawah batas bawah DL dan jauh dari rentang yang menunjukkan tidak adanya autokorelasi, yaitu pada rentang DU < DW < 4-DU atau \(1.331 < DW < 2.669\). Hal tersebut juga didukung oleh p-value yang kecil dengan nilai \(2.2e-16\), di mana p-value < \(\alpha\)=5%. Oleh karena itu, hipotesis nol (H0) ditolak, yang berarti ada cukup bukti untuk menyimpulkan bahwa terdapat autokorelasi dalam data GDP dengan metode Hildreth-Lu pada taraf nyata 5%. Dengan adanya autokorelasi ini, diperlukan penanganan lebih lanjut untuk memperbaiki model dan mengatasi masalah autokorelasi.
Terakhir, akan dibandingkan nilai SSE dari ketiga metode (metode awal, metode Cochrane-Orcutt, dan Hildreth-Lu).
#Perbandingan
sseModelawal <- anova(model)$`Sum Sq`[-1]
sseModelCO <- anova(modelCOmanual)$`Sum Sq`[-1]
sseModelHL <- anova(modelHL)$`Sum Sq`[-1]
mseModelawal <- sseModelawal/length(GDP)
mseModelCO <- sseModelCO/length(GDP)
mseModelHL <- sseModelHL/length(GDP)
akurasi <- matrix(c(sseModelawal,sseModelCO,sseModelHL,
mseModelawal,mseModelCO,mseModelHL),nrow=2,ncol=3,byrow = T)
colnames(akurasi) <- c("Model Awal", "Model Cochrane-Orcutt", "Model Hildreth-Lu")
row.names(akurasi) <- c("SSE","MSE")
akurasi
## Model Awal Model Cochrane-Orcutt Model Hildreth-Lu
## SSE 1.693479e+22 1.795485e+19 7.362793e+21
## MSE 2.646060e+20 2.805446e+17 1.150436e+20
Berdasarkan hasil tersebut, dapat diketahui bahwa penanganan autokorelasi dengan metode Cochrane-Orcutt dan Hildreth-Lu memberikan hasil yang berbeda dalam hal Sum of Squared Errors (SSE) dan Mean Squared Error (MSE). Model Cochrane-Orcutt menghasilkan SSE sebesar 1.795485e+19 dan MSE sebesar 2.805446e+17, yang menunjukkan peningkatan signifikan dibandingkan model awal yang memiliki SSE sebesar 1.693479e+22 dan MSE sebesar 2.646060e+20. Model Hildreth-Lu, meskipun lebih baik daripada model awal, masih memiliki SSE sebesar 7.362793e+21dan MSE sebesar 1.150436e+20, yang lebih tinggi dibandingkan dengan model Cochrane-Orcutt. Ini menunjukkan bahwa metode Cochrane-Orcutt lebih efektif dalam mengurangi kesalahan dibandingkan dengan Hildreth-Lu, sehingga memberikan model yang lebih akurat setelah penanganan autokorelasi.