IPM (Indeks Pembangunan Manusia) merupakan indikator penting untuk mengukur keberhasilan dalam upaya membangun kualitas hidup manusia (masyarakat/penduduk). IPM menjelaskan bagaimana penduduk dapat mengakses hasil pembangunan dalam memperoleh pendapatan, kesehatan, pendidikan, dan sebagainya. IPM merupakan data strategis bagi Indonesia karena IPM digunakan sebagai salah satu alokato penentuan Dana Alokasi Umum (DAU).
Nilai IPB berkisar antara 0 sampai dengan 100. Semakin tinggi nilai IPM suatu negara/daerah, menunjukkan pencapaian pembangunan manusia di kawasan tersebut semakin baik. Capaian IPM di suatu wilayah dapat dikelompokkan menjadi empat kategori yaitu Rendah (IPM < 60), Sedang (60 ≤ IPM < 70), Tinggi (70 ≤ IPM < 80), dan Sangat Tinggi (IPM ≥ 80) (www.bps.go.id)
Pertama-tama, set beberapa library seperti di bawah ini.
library(readxl)
## Warning: package 'readxl' was built under R version 4.0.5
library(orcutt)
## Warning: package 'orcutt' was built under R version 4.0.5
## Loading required package: lmtest
## Warning: package 'lmtest' was built under R version 4.0.5
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.0.5
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(lmtest)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.5
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.4 v dplyr 1.0.7
## v tidyr 1.1.3 v stringr 1.4.0
## v readr 2.0.1 v forcats 0.5.1
## Warning: package 'ggplot2' was built under R version 4.0.5
## Warning: package 'tibble' was built under R version 4.0.5
## Warning: package 'tidyr' was built under R version 4.0.5
## Warning: package 'readr' was built under R version 4.0.5
## Warning: package 'purrr' was built under R version 4.0.5
## Warning: package 'dplyr' was built under R version 4.0.5
## Warning: package 'stringr' was built under R version 4.0.5
## Warning: package 'forcats' was built under R version 4.0.5
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(forecast)
## Warning: package 'forecast' was built under R version 4.0.5
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
Kemudian, tentukan directory dari file data yang akan digunakan. Data yang digunakan pada kasus ini adalah data IPM Provinsi Sumatera Utara pada tahun 2010 - 2021.
setwd("C:/Users/LENOVO/Downloads/Project-20220127")
sumut <- read_excel("sumut.xlsx")
attach(sumut)
Selanjutnya, data IPM Sumatera Utara diubah menjadi data time series dan didapatkan peramalan 10 periode ke depan sebagai berikut.
sumut.ts<-ts(sumut$ipm)
desregresi.opt<- HoltWinters(sumut.ts, gamma = FALSE)
desregresi.opt
## Holt-Winters exponential smoothing with trend and without seasonal component.
##
## Call:
## HoltWinters(x = sumut.ts, gamma = FALSE)
##
## Smoothing parameters:
## alpha: 1
## beta : 0.7131977
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 72.000000
## b 0.217053
plot(desregresi.opt)
ramalandesopt<- forecast(desregresi.opt, h=10)
ramalandesopt
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 13 72.21705 71.94012 72.49399 71.79352 72.64059
## 14 72.43411 71.88475 72.98346 71.59394 73.27427
## 15 72.65116 71.78322 73.51909 71.32377 73.97855
## 16 72.86821 71.63969 74.09674 70.98934 74.74708
## 17 73.08526 71.45809 74.71244 70.59671 75.57382
## 18 73.30232 71.24159 75.36305 70.15070 76.45394
## 19 73.51937 70.99271 76.04604 69.65517 77.38357
## 20 73.73642 70.71352 76.75933 69.11328 78.35956
## 21 73.95348 70.40574 77.50122 68.52768 79.37928
## 22 74.17053 70.07083 78.27023 67.90059 80.44047
plot(ramalandesopt)
Data nilai IPM Sumatera Utara Tahun 2010 - 2021 merupakan data trend sehingga nilai peramalan 10 periode ke depan tidak konstan.
Untuk mengidentifikasi sebaran data, dibuat diagram pencar seperti di bawah ini.
plot(sumut$ipm~sumut$tahun, main = "Scatter Plot IPM Sumatera Utara vs Tahun", xlab = "Tahun", ylab = "IPM",
pch = 19, col="#ab6881")
cor(tahun,ipm)
## [1] 0.9932939
Berdasarkan diagram pencar di atas, terlihat bahwa nilai IPM cenderung meningkat setiap tahunnya dan terdapat hubungan positif antara nilai IPM dengan tahun. Diketahui pula nilai korelasi yang cukup tinggi antara peubah IPM dan Tahun yaitu sebesar 0.9932939.
Apabla data diregresikan, maka model regresi sederhana yang dihasilkan adalah sebagai berikut
model <- lm(ipm~tahun, data=sumut)
summary(model)
##
## Call:
## lm(formula = ipm ~ tahun, data = sumut)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.40333 -0.11958 0.00167 0.13542 0.32667
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -927.99167 36.72254 -25.27 2.16e-10 ***
## tahun 0.49500 0.01822 27.17 1.06e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2179 on 10 degrees of freedom
## Multiple R-squared: 0.9866, Adjusted R-squared: 0.9853
## F-statistic: 738.1 on 1 and 10 DF, p-value: 1.056e-10
Berdasarkan hasil regresi di atas, model yang terbentuk adalah y = -927.99167 + 0.49500x. Hasil uji F dengan p-value = 1.056e-10 < 0.05 menunjukkan bahwa terdapat minimal satu variabel yang berpengaruh nyata pada model pada taraf nyata 5%. Hasil uji parsial juga menunjukkan baik intersep maupun peubah tahun signifikan pada taraf nyata 5%. Nilai R-squared = 0.9853 menunjukkan bahwa sebesar 98.53% keragaman IPM Sumatera Utara dapat dijelaskan oleh peubah tahun.
Sisaan model kemudian diplotkan untuk mengidentifikasi autokorelasi secara eksploratif.
residu <- residuals(model)
fit <- predict(model)
par(mfrow = c(2,2))
qqnorm(residu)
qqline(residu, col = "#ab6881", lwd = 2)
plot(fit, residu, col = "#ab6881", pch = 20, xlab = "Sisaan", ylab = "Fitted Values", main = "Sisaan vs Fitted Values")
abline(a = 0, b = 0, lwd = 2)
hist(residu, col = "#ab6881")
plot(seq(1,12,1), residu, col = "#ab6881", pch = 20, xlab = "Sisaan", ylab = "Order", main = "Sisaan vs Order")
lines(seq(1,12,1), residu, col = "red")
abline(a = 0, b = 0, lwd = 2)
Berdasarkan grafik di ats, Normal Q-Q Plot menunjukkan sisaan dari model regresi cenderung menyebar normal. Plot Sisaan vs Fitted Values juga menunjukkan bahwa ragam sisaan homogen karena tidak menunjukkan adanya pola. Autokorelasi dapat diidentifikasi dari plot Sisaan vs Order yang memiliki pola naik-turun.
par(mfrow = c(1,2))
acf(residu)
pacf(residu)
Berdasarkan hasil plot di atas, data tersebut tidak memiliki autokorelasi karena data masih terlihat berada di antara batas autokorelasi. Untuk memastikan hal tersebut, dilakukan uji lain dalam mengidentifikasi autokorelasi.
dwtest(model)
##
## Durbin-Watson test
##
## data: model
## DW = 0.87521, p-value = 0.00352
## alternative hypothesis: true autocorrelation is greater than 0
H0: Tidak ada autokorelasi vs H1: Ada autokorelasi. Berdasarkan hasil uji Durbin-Watson, didapatkan p-value = 0.00352 < 0.05 yang artinya Tolak H0. Cukup bukti untuk menyatakan bahwa data IPM Sumatera Utara tahun 2010-2021 memiliki autokorelasi pada taraf nyata 5%.
bgtest(ipm~tahun, data=sumut, order=1)
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: ipm ~ tahun
## LM test = 3.1615, df = 1, p-value = 0.07539
H0: Ada autokorelasi vs H1: Tidak ada autokorelasi. Berdasarkan hasil uji Breusch-Godgrey, didapatkan p-value = 0.07539 > 0.05 yang artinya tak tolak H0. Tidak cukup bukti untuk menyatakan bahwa data IPM Sumatera Utara tahun 2010-2021 tidak memiliki autokorelasi pada taraf nyata 5%.
modelco <- cochrane.orcutt(model)
modelco
## Cochrane-orcutt estimation for first order autocorrelation
##
## Call:
## lm(formula = ipm ~ tahun, data = sumut)
##
## number of interaction: 28
## rho 0.673825
##
## Durbin-Watson statistic
## (original): 0.87521 , p-value: 3.52e-03
## (transformed): 1.01601 , p-value: 1.053e-02
##
## coefficients:
## (Intercept) tahun
## -880.82056 0.47157
summary(modelco)
## Call:
## lm(formula = ipm ~ tahun, data = sumut)
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -880.820555 114.547419 -7.690 3.032e-05 ***
## tahun 0.471570 0.056761 8.308 1.635e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1942 on 9 degrees of freedom
## Multiple R-squared: 0.8846 , Adjusted R-squared: 0.8718
## F-statistic: 69 on 1 and 9 DF, p-value: < 1.635e-05
##
## Durbin-Watson statistic
## (original): 0.87521 , p-value: 3.52e-03
## (transformed): 1.01601 , p-value: 1.053e-02
rho <- modelco$rho
rho
## [1] 0.6738248
y.trans<- ipm[-1]-ipm[-12]*rho
x.trans<- tahun[-1]-tahun[-12]*rho
modelcorho<- lm(y.trans~x.trans)
summary(modelcorho)
##
## Call:
## lm(formula = y.trans ~ x.trans)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.29120 -0.16472 0.05668 0.14722 0.21480
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -287.30179 37.36252 -7.690 3.03e-05 ***
## x.trans 0.47157 0.05676 8.308 1.63e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1942 on 9 degrees of freedom
## Multiple R-squared: 0.8846, Adjusted R-squared: 0.8718
## F-statistic: 69.02 on 1 and 9 DF, p-value: 1.635e-05
Berdasarkan hasil tersebut, didapatkan persamaan hasil yang belum ditransformasi balik sebesar y = -287.30179 + 0.47157.
cat("y = ", coef(modelcorho)[1]/(1-rho), "+", coef(modelcorho)[2], "x", sep = "")
## y = -880.8206+0.4715699x
Berdasarkan hasil tersebut, didapatkan persamaan hasil yang sudah ditransformasi balik sebesar y = -880.82056 + 0.47157x dengan rho optimum sebesar 0.6738248. Didapatkan pula nilai p-value Durbin-Watson yang baru hasil transformasi sebesar 1.053e-02. Sehingga dapat disimpulkan bahwa cukup bukti untuk menyatakan bahwa data memiliki autokorelasi pada taraf nyata 5%. Oleh karena itu, Cochrane-Orcutt belum mampu menangani masalah autokorelasi pada kasus ini.
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))
}
r <- c(seq(0.1,0.8, by= 0.1), seq(0.9,0.99, by= 0.01))
tab <- data.frame("rho" = r, "SSE" = sapply(r, function(i){deviance(hildreth.lu.func(i, model))}))
round(tab, 4)
## rho SSE
## 1 0.10 0.4197
## 2 0.20 0.3941
## 3 0.30 0.3734
## 4 0.40 0.3576
## 5 0.50 0.3467
## 6 0.60 0.3407
## 7 0.70 0.3395
## 8 0.80 0.3432
## 9 0.90 0.3518
## 10 0.91 0.3530
## 11 0.92 0.3541
## 12 0.93 0.3554
## 13 0.94 0.3566
## 14 0.95 0.3580
## 15 0.96 0.3593
## 16 0.97 0.3607
## 17 0.98 0.3622
## 18 0.99 0.3637
Berdasarkan hasil di atas, rho optimum ada di kisaran 0.7 karena memiliki SSE yang paling kecil yaitu sebesar 0.3395. Untuk melihat secara spesifik rho yang optimum, maka selang di sekitar 0.7 dapat diperkecil.
r <- seq(0.65,0.70, by= 0.01)
tab <- data.frame("rho" = r, "SSE" = sapply(r, function(i){deviance(hildreth.lu.func(i, model))}))
round(tab, 4)
## rho SSE
## 1 0.65 0.3395
## 2 0.66 0.3394
## 3 0.67 0.3393
## 4 0.68 0.3393
## 5 0.69 0.3394
## 6 0.70 0.3395
Pada tabel di atas terlihat bahwa nilai rho optimum sebesar 0.67. Plot antara rho dan SSE dapat dilihat di bawah ini.
plot(tab$SSE ~ tab$rho , type = "l", xlab = "Nilai Rho", ylab = "SSE",
main = "Plot SSE vs Rho Hildreth-Lu", lwd = 1.5)
abline(v = 0.67, lty = 2, col = "#ab6881", lwd = 2)
text(x = 0.67, y = 0.35, labels = "rho = 0.67", cex = 0.72)
modelhlu <- hildreth.lu.func(0.67, model)
summary(modelhlu)
##
## Call:
## lm(formula = y ~ x)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.29043 -0.16445 0.05684 0.14709 0.21505
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -291.0211 37.3621 -7.789 2.74e-05 ***
## x 0.4721 0.0561 8.415 1.47e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1942 on 9 degrees of freedom
## Multiple R-squared: 0.8872, Adjusted R-squared: 0.8747
## F-statistic: 70.81 on 1 and 9 DF, p-value: 1.475e-05
Dengan memasukkan nilai rho optimum 0.67, didapatkan persamaan yang belum ditransformasi balik yaitu y = -291.0211 + 0.4721x
# Transformasi Balik
cat("y = ", coef(modelhlu)[1]/(1-0.67), "+", coef(modelhlu)[2],"x", sep = "")
## y = -881.8823+0.4720964x
Dengan memasukkan nilai rho optimum 0.67, didapatkan persamaan yang sudah ditransformasi balik yaitu y = -881.8823 + 0.4720964x
dwtest(modelhlu)
##
## Durbin-Watson test
##
## data: modelhlu
## DW = 1.0135, p-value = 0.01037
## alternative hypothesis: true autocorrelation is greater than 0
Setelah dilakukan uji Durbin Watson pada data yang telah ditangani, didapatkan p-value sebesar 0.01037 < 0.05 yang artinya tolak H0. Cukup bukti untuk menyatakan bahwa data tersebut memiiki autokorelasi pada taraf nyata 5%. Oleh karena itu, metode Hildreth Lu belum mampu menangani masalah autokorelasi pada kasus ini.
Untuk membandingkan antara model OLS, model hasil penanganan metode Cochrane-Orcutt, dan model hasil penanganan metode Hildreth-Lu, dicari nilai MSE dari masing-masing model.
modelolser <- mean(model$residual^2)
modelolser
## [1] 0.03955972
modelcoerr <- mean(modelco$residual^2)
modelcoerr
## [1] 0.0488397
modelhluer <- mean(modelhlu$residual^2)
modelhluer
## [1] 0.03084947
Berdasarkan hasil di atas, nilai MSE model hasil penanganan metode Hildreth-Lu lebih kecil dibandingkan model lain sehingga model ini dianggap sebagai model yang paling baik.
Baik penanganan Cochrane-Orcutt maupun Hildreth-Lu belum dapat menghilangkan autokorelasi pada kasus ini. Namun, jika dihitung nilai MSE-nya, model hasil penanganan Hildreth-Lu memiliki nilai yang lebih kecil dibandingkan model lain sehingga model ini dianggap sebagai model yang paling baik.