Laporan ini menyajikan analisis komprehensif menggunakan tiga metode utama dalam Time Series Analysis. Dokumen ini disusun untuk memenuhi kebutuhan UAS Analisis Data Deret Waktu 2 dengan alur sebagai berikut:
Konsep Dasar: Model Fungsi Transfer (Transfer Function Noise Model) menggabungkan model dinamis (hubungan antara Input \(X_t\) dan Output \(Y_t\)) dengan model gangguan (noise). Tujuannya adalah melihat bagaimana variasi pada input mempengaruhi output di masa depan setelah melewati mekanisme delay (penundaan).
Langkah pertama adalah memuat data dan memisahkan variabel menjadi Input (Impor) dan Output (Harga). Data dibagi menjadi training (pembentukan model) dan testing (validasi).
harga = data$Rerata_Harga_Beras
impor_ton = data$Kuantitas_Impor/1000
beras <- data.frame(harga=harga, impor=impor_ton)
head(beras)Melihat karakteristik dasar data seperti rata-rata dan penyebaran data (standar deviasi).
## harga impor
## Min. :10860 Min. : 2000
## 1st Qu.:11519 1st Qu.: 22081
## Median :12304 Median : 38788
## Mean :12452 Mean :103310
## 3rd Qu.:13272 3rd Qu.:113208
## Max. :17086 Max. :567211
## [1] 1166.619
## [1] 131011.8
Interpretasi: Output summary memberikan
gambaran rentang data (Min, Max, Mean). Standar deviasi
(sd) menunjukkan seberapa besar fluktuasi harga dan volume
impor dari rata-ratanya. Nilai SD yang tinggi menandakan volatilitas
data yang tinggi.
Data dibagi menjadi 81% untuk pelatihan model (training) dan 19% untuk pengujian (testing).
##PARTISI DATA ----------
datatraining <- head(beras, round(0.81*nrow(data)))
datatesting <- tail(beras, round(0.19*nrow(data)))
nrow(datatraining)## [1] 103
## [1] 24
Visualisasi data untuk melihat pola tren atau musiman secara kasat mata.
##PLOT DATA ----------
# HARGA
Yt <- ts(datatraining$harga, start = c(2014,1), freq=12)
plot(Yt, ylab="Rupiah (Rp)", xlab="Tahun", main="Harga Beras (Training)")# IMPOR
Xt <- ts(datatraining$impor, start = c(2014,1), freq=12)
plot(Xt, ylab="Ton", xlab="Tahun", main="Kuantitas Impor Beras (Training)")Interpretasi: Plot deret waktu membantu kita mendeteksi ketidakstasioneran. Jika grafik menunjukkan tren menanjak/menurun atau varians yang melebar, maka data perlu ditangani (transformasi/differencing) sebelum pemodelan.
Mengecek kestasioneran menggunakan plot ACF/PACF dan uji formal Augmented Dickey-Fuller (ADF).
Penanganan Stasioneritas: Dilakukan transformasi Box-Cox (untuk menstabilkan varians) dan Differencing (untuk menstabilkan rata-rata/menghilangkan tren).
##
## Augmented Dickey-Fuller Test
##
## data: Yt
## Dickey-Fuller = -2.1998, Lag order = 4, p-value = 0.4938
## alternative hypothesis: stationary
##
## Augmented Dickey-Fuller Test
##
## data: diff_Yt
## Dickey-Fuller = -4.1857, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
## [1] -0.4086458
## [1] 1.999924
##
## Augmented Dickey-Fuller Test
##
## data: tf_Xt
## Dickey-Fuller = -4.0883, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
##
## Augmented Dickey-Fuller Test
##
## data: diff_tf_Xt
## Dickey-Fuller = -7.3699, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
Interpretasi: Pada uji ADF, jika P-value < 0.05, maka \(H_0\) (data tidak stasioner) ditolak, yang berarti data sudah stasioner. Pastikan data input dan output stasioner sebelum lanjut ke tahap pre-whitening.
Melihat pola autokorelasi pada data yang sudah di-differencing.
##PLOT ACF DAN PACF SETELAH PENANGANAN STASIONERITAS ----------
par(mfrow=c(1,2))
# HARGA
acf(diff_Yt, lag.max=36)
pacf(diff_Yt, lag.max=36)Konsep Pre-whitening: Kita harus “memutihkan” input (menghilangkan pola autokorelasi) agar korelasi yang terukur nanti murni hubungan antara Input dan Output, bukan dipengaruhi oleh masa lalu input itu sendiri.
##IDENTIFIKASI MODEL ARIMA UNTUK Xt ----------
library(lmtest)
modelI1 = Arima(tf_Xt, order=c(1,1,0), method="ML")
coeftest(modelI1) #signifikan##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.295761 0.099824 -2.9628 0.003048 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.356352 0.097481 -3.6556 0.0002566 ***
## ar2 -0.321410 0.102598 -3.1327 0.0017320 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.79271 0.16448 -4.8195 1.439e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.348494 0.093584 3.7239 0.0001962 ***
## ma1 -0.999999 0.028085 -35.6059 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.380490 0.099600 3.8202 0.0001333 ***
## ar2 -0.096427 0.106481 -0.9056 0.3651563
## ma1 -1.000000 0.028980 -34.5064 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.611411 0.101919 -5.9990 1.985e-09 ***
## ma2 -0.388588 0.098339 -3.9515 7.766e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.025741 0.346905 0.0742 0.94085
## ma1 -0.635713 0.343360 -1.8514 0.06411 .
## ma2 -0.364233 0.342262 -1.0642 0.28724
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.45212 0.21893 -2.0651 0.03891 *
## ar2 0.20677 0.14677 1.4088 0.15891
## ma1 -0.15544 0.18724 -0.8302 0.40644
## ma2 -0.84455 0.18662 -4.5254 6.027e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# MODEL ARIMA YANG MEMENUHI ASUMSI UNTUK Xt
model_Xt <- data.frame(modelI1$aic, modelI2$aic, modelI3$aic, modelI4$aic,
modelI6$aic); model_Xt## [1] -527.9554
Interpretasi: Model dengan nilai AIC terkecil dan koefisien yang signifikan dipilih sebagai model pre-whitening terbaik untuk seri Input.
Memastikan sisaan model ARIMA input bersifat acak (white noise).
##UJI ASUMSI RESIDUAL Xt ----------
rX = residuals(modelI6)
# UJI NORMALITAS Xt
nX = length(rX)
meanX = mean(rX)
sdX = sd(rX)
resX = rnorm(nX,meanX,sdX)
ks.test(rX, resX)##
## Asymptotic two-sample Kolmogorov-Smirnov test
##
## data: rX and resX
## D = 0.13592, p-value = 0.2973
## alternative hypothesis: two-sided
##
## Box-Ljung test
##
## data: rX
## X-squared = 0.027134, df = 1, p-value = 0.8692
##
## Box-Ljung test
##
## data: rX^2
## X-squared = 0.9984, df = 1, p-value = 0.3177
Interpretasi: * KS Test (Normalitas): P-value > 0.05 berarti residual berdistribusi normal. * Ljung-Box (Autokorelasi): P-value > 0.05 berarti tidak ada autokorelasi pada residual (sudah white noise).
##
## Box-Ljung test
##
## data: residuals(modelI1)
## X-squared = 0.37154, df = 1, p-value = 0.5422
##
## Box-Ljung test
##
## data: residuals(modelI2)
## X-squared = 0.21803, df = 1, p-value = 0.6405
##
## Box-Ljung test
##
## data: residuals(modelI3)
## X-squared = 6.2105, df = 1, p-value = 0.0127
##
## Box-Ljung test
##
## data: residuals(modelI4)
## X-squared = 0.065996, df = 1, p-value = 0.7973
##
## Box-Ljung test
##
## data: residuals(modelI6)
## X-squared = 0.027134, df = 1, p-value = 0.8692
Menghitung Cross Correlation Function (CCF) antara residual input dan output yang telah difilter. Ini digunakan untuk mengidentifikasi lag (\(b, r, s\)).
##KORELASI SILANG DERET OUTPUT DAN INPUT
library(tfarima)
# ANTARA VARIABEL HARGA DAN IMPOR
umXt <- um(tf_Xt, ar=0, i=1, ma=2)
umYt_Xt <- fit(umXt, diff_Yt)
par(mfrow=c(1,1))
ccf(diff_tf_Xt, diff_Yt, um.x = umXt, um.y = umYt_Xt, lag.max=36)Interpretasi: Lihat lag negatif di mana batang grafik melewati garis batas biru (signifikan). * Lag signifikan pertama menunjukkan \(b\) (delay). * Pola setelahnya menunjukkan orde \(r\) dan \(s\). * Dalam kasus ini, diidentifikasi \(b=22\), \(r=0\), \(s=1\).
Membangun model lengkap yang terdiri dari komponen fungsi transfer (input-output) dan komponen noise (ARIMA).
##IDENTIFIKASI FUNGSI TRANSFER AWAL ----------
library(MTS)
library(forecast)
pre_tf <- tfm1(Yt, tf_Xt, orderN=c(0,1,2), orderX=c(0,1,22))## ARMA coefficients & s.e.:
## ma1 ma2
## coef.arma 0.385 0.259
## se.arma 0.110 0.116
## Transfer function coefficients & s.e.:
## intercept X
## v -17.0 1258 -238
## se.v 43.1 1182 1058
##
## Ljung-Box test
##
## data: Residuals
## Q* = 7.5638, df = 10, p-value = 0.6714
##
## Model df: 0. Total lags used: 10
## Series: pre_tf$residuals
## ARIMA(4,1,0)
##
## Coefficients:
## ar1 ar2 ar3 ar4
## -0.7880 -0.5945 -0.4105 -0.2336
## s.e. 0.1095 0.1334 0.1330 0.1081
##
## sigma^2 = 69828: log likelihood = -544.07
## AIC=1098.15 AICc=1098.98 BIC=1109.93
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.78803 0.10948 -7.1976 6.126e-13 ***
## ar2 -0.59446 0.13342 -4.4556 8.364e-06 ***
## ar3 -0.41054 0.13296 -3.0877 0.002017 **
## ar4 -0.23363 0.10808 -2.1616 0.030647 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Menampilkan polinomial lag dari model akhir.
## 450 + 1300B - 3000B^2
## 1 - 0.12B
## 1 - 0.31B - 0.1B^2 + 0.037B^3 + 0.081B^4
Memastikan sisaan model fungsi transfer akhir (\(a_t\)) bersifat white noise.
##UJI DIAGNOSTIK Y ----------
# WHITE NOISE
rY = residuals(tfm_harga)
Box.test(rY, type="Ljung-Box")##
## Box-Ljung test
##
## data: rY
## X-squared = 9.5897e-05, df = 1, p-value = 0.9922
Interpretasi: Jika P-value Box-Ljung > 0.05, maka model sudah layak digunakan karena sisaannya acak dan tidak mengandung informasi yang tertinggal.
Melakukan peramalan pada data testing dan menghitung akurasi dengan MAPE (Mean Absolute Percentage Error).
##HASIL FORECAST ----------
Ytest <- ts(datatesting$harga)
Xtest <- ts(datatesting$impor)
# FUNGSI MULTI TRANSFER
umx_test <- um(Xtest, ar=0, i=1, ma=2)
umy_test <- fit(umx_test, Ytest)
tf_test <- tfest(Ytest, Xtest, um.x = umx_test, um.y = umy_test)
noise_um_test <- um(Ytest, ar=c(4), i=c(1), ma=c(0))
tfmy_test <- tfarima::tfm(Ytest, inputs=list(tf_test), noise=noise_um_test)
ramal_tfm <- Ytest - residuals(tfmy_test)
##PEMILIHAN MODEL TERBAIK (MAPE) ----------
# PLOT NILAI TESTING DAN PERAMALAN
plot(Ytest, type="l", col="black", xlab=" ", ylab=" "); par(new=TRUE)
plot(ramal_tfm, type="l", col="red", lty=2, main="Harga Beras (Testing)",
ylab="Rupiah (Rp)", xaxt="n", yaxt="n")
legend("bottomright",
c("Data Aktual (Testing)", "Data Peramalan Fungsi Transfer"),
col=c("black", "red"), lty=c(1,2), cex=0.7)mape <- function(Y_aktual, Y_forecast){
rumus = mean(abs(Y_aktual-Y_forecast)/Y_aktual)*100
print(rumus)
}
mape(Ytest, ramal_tfm)## [1] 0.9435526
Interpretasi: Nilai MAPE menunjukkan rata-rata kesalahan prediksi dalam persen. Semakin kecil nilai MAPE, semakin akurat model tersebut.
Menggunakan seluruh data untuk memprediksi nilai masa depan (12 periode ke depan).
## PERIODE BERIKUTNYA ----------
outputY <- ts(beras$harga, start = c(2014,1), freq=12)
inputX <- ts(beras$impor, start = c(2014,1), freq=12)
umx_data <- um(inputX, ar=0, i=1, ma=2)
umy_data <- fit(umx_data, outputY)
tf_data <- tfest(outputY, inputX, um.x = umx_data, um.y = umy_data)
noise_um_data <- um(outputY, ar=c(4), i=c(1), ma=c(0))
tfmy_data <- tfarima::tfm(outputY, inputs=list(tf_data), noise=noise_um_data)
HASIL <- predict.tfm(tfmy_data, n.ahead=12)
HASIL## Forecast RMSE 95% LB 95% UB
## Aug 2024 17621.98 237.9332 17155.64 18088.32
## Sep 2024 18152.69 419.1119 17331.25 18974.14
## Oct 2024 18337.37 598.0999 17165.11 19509.62
## Nov 2024 18485.05 753.2710 17008.66 19961.43
## Dec 2024 18583.93 896.9316 16825.97 20341.88
## Jan 2025 18657.18 1029.2330 16639.92 20674.44
## Feb 2025 18702.43 1152.6165 16443.34 20961.52
## Mar 2025 18733.83 1267.4365 16249.70 21217.96
## Apr 2025 18754.17 1374.9586 16059.31 21449.04
## May 2025 18768.27 1476.0114 15875.34 21661.20
## Jun 2025 18777.53 1571.4771 15697.49 21857.57
## Jul 2025 18783.82 1662.0221 15526.32 22041.33
Konsep Dasar: VAR adalah model sistem persamaan di mana setiap variabel diperlakukan sebagai variabel endogen. Model ini sangat berguna untuk melihat hubungan timbal balik antar variabel. Di sini kita menggunakan studi kasus hubungan antara Income dan Savings.
Memuat pustaka vars dan menyiapkan data multivariat.
library(tidyverse) # read_csv, dplyr, tidyr, ggplot2
library(zoo) # as.yearqtr, as.Date untuk Quarter
library(tseries) # adf.test
library(vars) # VAR, VARselect, IRF, FEVD, uji diagnostikquarter_seq <- seq(from = as.yearqtr("1970 Q1"), to = as.yearqtr("2016 Q3"), by = 0.25)
# Gabungkan ke data
a$Quarter <- quarter_seq
# Lihat hasilnya
head(a)Mengambil subset data agar fokus pada periode tertentu.
# Ambil hanya kolom Quarter, Income, dan Savings
data_var <- a %>%
dplyr::select(Quarter, Income, Savings)
# Lihat hasilnya
head(data_var)# Subsetting Data
data_var <- a[50:110, c("Quarter", "Income", "Savings")]
# Cek hasil subset
head(data_var)Visualisasi untuk melihat korelasi visual atau pola pergerakan bersama (co-movement) antara Income dan Savings.
# Plot sederhana: 1 gambar, 2 garis (Income dan Savings)
plot_df <- data_var %>%
mutate(Date = as.Date(Quarter)) %>%
pivot_longer(cols = c(Income, Savings),
names_to = "Variable", values_to = "Value")
ggplot(plot_df, aes(x = Date, y = Value, linetype = Variable)) +
geom_line() +
labs(title = "Income dan Savings per Kuartal",
x = "Tahun",
y = "Pertumbuhan (%)",
linetype = NULL) +
scale_x_date(date_breaks = "2 years", date_labels = "%Y") +
theme_minimal(base_size = 11)VAR mensyaratkan semua variabel dalam sistem harus stasioner.
##
## Augmented Dickey-Fuller Test
##
## data: data_var$Income
## Dickey-Fuller = -4.2512, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary
##
## Augmented Dickey-Fuller Test
##
## data: data_var$Savings
## Dickey-Fuller = -4.4248, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary
Interpretasi: Jika P-value < 0.05, maka data stasioner. Jika tidak, perlu dilakukan differencing sebelum masuk ke pemodelan VAR.
Menentukan berapa periode masa lalu yang berpengaruh signifikan. Kriteria yang umum digunakan adalah AIC (Akaike), HQ (Hannan-Quinn), dan SC (Schwarz).
## 1 2 3 4 5 6 7
## AIC(n) 2.437840 2.509547 2.485245 2.611974 2.643660 2.672360 2.788128
## HQ(n) 2.527190 2.658464 2.693729 2.880026 2.971278 3.059546 3.234881
## SC(n) 2.676358 2.907078 3.041788 3.327530 3.518227 3.705940 3.980721
## FPE(n) 11.452527 12.320586 12.061391 13.765925 14.332711 14.939153 17.073951
## 8 9 10 11 12 13 14
## AIC(n) 2.940213 2.949924 2.957955 2.762453 2.761289 2.663648 2.694729
## HQ(n) 3.446533 3.515810 3.583408 3.447473 3.505876 3.467802 3.558450
## SC(n) 4.291818 4.460541 4.627584 4.591094 4.748942 4.810314 5.000407
## FPE(n) 20.361185 21.218026 22.275818 19.291750 20.567055 20.244083 23.139452
## 15
## AIC(n) 2.810358
## HQ(n) 3.733646
## SC(n) 5.275048
## FPE(n) 29.553906
## AIC(n) HQ(n) SC(n) FPE(n)
## 1 1 1 1
Interpretasi: Pilih lag yang paling banyak direkomendasikan oleh kriteria informasi (misal SC menyarankan lag 1).
Mengestimasi parameter model VAR dengan lag terpilih (misal \(p=1\)).
##
## VAR Estimation Results:
## =========================
## Endogenous variables: Income, Savings
## Deterministic variables: const
## Sample size: 60
## Log Likelihood: -240.765
## Roots of the characteristic polynomial:
## 0.4129 0.2434
## Call:
## vars::VAR(y = a, p = 1, type = "const")
##
##
## Estimation results for equation Income:
## =======================================
## Income = Income.l1 + Savings.l1 + const
##
## Estimate Std. Error t value Pr(>|t|)
## Income.l1 0.56743 0.18013 3.150 0.00260 **
## Savings.l1 -0.03911 0.01313 -2.980 0.00424 **
## const 0.35742 0.15778 2.265 0.02731 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.5926 on 57 degrees of freedom
## Multiple R-Squared: 0.16, Adjusted R-squared: 0.1305
## F-statistic: 5.428 on 2 and 57 DF, p-value: 0.006952
##
##
## Estimation results for equation Savings:
## ========================================
## Savings = Income.l1 + Savings.l1 + const
##
## Estimate Std. Error t value Pr(>|t|)
## Income.l1 3.2042 2.6048 1.230 0.2237
## Savings.l1 -0.3979 0.1898 -2.096 0.0405 *
## const -1.9647 2.2815 -0.861 0.3928
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 8.57 on 57 degrees of freedom
## Multiple R-Squared: 0.07498, Adjusted R-squared: 0.04253
## F-statistic: 2.31 on 2 and 57 DF, p-value: 0.1085
##
##
##
## Covariance matrix of residuals:
## Income Savings
## Income 0.3512 3.765
## Savings 3.7649 73.436
##
## Correlation matrix of residuals:
## Income Savings
## Income 1.0000 0.7414
## Savings 0.7414 1.0000
Sistem VAR harus stabil agar analisis selanjutnya valid.
## [1] 0.4128588 0.2433829
Interpretasi: Semua akar polinomial karakteristik harus memiliki modulus < 1 (berada di dalam lingkaran satuan) agar model stabil.
Menguji apakah satu variabel berguna untuk memprediksi variabel lain.
## $Granger
##
## Granger causality H0: Income do not Granger-cause Savings
##
## data: VAR object model1
## F-Test = 1.5132, df1 = 1, df2 = 114, p-value = 0.2212
##
##
## $Instant
##
## H0: No instantaneous causality between: Income and Savings
##
## data: VAR object model1
## Chi-squared = 21.281, df = 1, p-value = 3.967e-06
## $Granger
##
## Granger causality H0: Savings do not Granger-cause Income
##
## data: VAR object model1
## F-Test = 8.8775, df1 = 1, df2 = 114, p-value = 0.003529
##
##
## $Instant
##
## H0: No instantaneous causality between: Savings and Income
##
## data: VAR object model1
## Chi-squared = 21.281, df = 1, p-value = 3.967e-06
Interpretasi: Jika P-value < 0.05, maka tolak \(H_0\). Artinya, terdapat hubungan kausalitas (prediktif) dari variabel penyebab ke variabel akibat.
Memastikan residual model memenuhi asumsi: 1. Serial Test: Tidak ada autokorelasi. 2. ARCH Test: Ragam residual konstan (homoskedastis). 3. Normality Test: Residual berdistribusi normal.
##
## Portmanteau Test (asymptotic)
##
## data: Residuals of VAR object model1
## Chi-squared = 43.612, df = 44, p-value = 0.4882
##
## ARCH (multivariate)
##
## data: Residuals of VAR object model1
## Chi-squared = 127.48, df = 108, p-value = 0.09713
## $JB
##
## JB-Test (multivariate)
##
## data: Residuals of VAR object model1
## Chi-squared = 3.0729, df = 4, p-value = 0.5457
##
##
## $Skewness
##
## Skewness only (multivariate)
##
## data: Residuals of VAR object model1
## Chi-squared = 1.0472, df = 2, p-value = 0.5924
##
##
## $Kurtosis
##
## Kurtosis only (multivariate)
##
## data: Residuals of VAR object model1
## Chi-squared = 2.0256, df = 2, p-value = 0.3632
Konsep: IRF menunjukkan respons variabel sistem terhadap guncangan (shock) satu standar deviasi pada salah satu variabel dari waktu ke waktu.
Interpretasi: * Grafik menunjukkan bagaimana variabel merespon guncangan. * Jika garis nol berada di luar interval kepercayaan (garis merah), maka respon tersebut signifikan secara statistik.
Konsep: FEVD menjelaskan seberapa besar persentase varians error suatu variabel yang dijelaskan oleh dirinya sendiri vs variabel lain dalam sistem.
## $Income
## Income Savings
## [1,] 1.0000000 0.0000000
## [2,] 0.8764410 0.1235590
## [3,] 0.8750261 0.1249739
## [4,] 0.8733945 0.1266055
## [5,] 0.8732717 0.1267283
## [6,] 0.8732361 0.1267639
## [7,] 0.8732315 0.1267685
## [8,] 0.8732306 0.1267694
## [9,] 0.8732305 0.1267695
## [10,] 0.8732305 0.1267695
##
## $Savings
## Income Savings
## [1,] 0.5496192 0.4503808
## [2,] 0.5154674 0.4845326
## [3,] 0.5169585 0.4830415
## [4,] 0.5167083 0.4832917
## [5,] 0.5167274 0.4832726
## [6,] 0.5167251 0.4832749
## [7,] 0.5167253 0.4832747
## [8,] 0.5167253 0.4832747
## [9,] 0.5167253 0.4832747
## [10,] 0.5167253 0.4832747
Interpretasi: Jika grafik batang suatu variabel (misal Savings) didominasi oleh warna variabel lain (Income), berarti variabel tersebut sangat dipengaruhi oleh variabel lain dalam sistem (bersifat endogen).
Memprediksi nilai masa depan (8 kuartal ke depan).
## $Income
## fcst lower upper CI
## [1,] 0.5987849 -0.5627170 1.760287 1.161502
## [2,] 0.7634897 -0.4907230 2.017703 1.254213
## [3,] 0.7660564 -0.4988190 2.030932 1.264875
## [4,] 0.7830414 -0.4838127 2.049895 1.266854
## [5,] 0.7861778 -0.4809796 2.053335 1.267157
## [6,] 0.7884161 -0.4787954 2.055628 1.267212
## [7,] 0.7891106 -0.4781099 2.056331 1.267220
## [8,] 0.7894532 -0.4777688 2.056675 1.267222
##
## $Savings
## fcst lower upper CI
## [1,] -1.6952881 -18.49122 15.10064 16.79593
## [2,] 0.6285564 -16.79974 18.05686 17.42830
## [3,] 0.2315312 -17.23187 17.69493 17.46340
## [4,] 0.3977513 -17.07003 17.86553 17.46778
## [5,] 0.3860275 -17.08215 17.85420 17.46817
## [6,] 0.4007428 -17.06750 17.86899 17.46825
## [7,] 0.4020586 -17.06620 17.87032 17.46826
## [8,] 0.4037603 -17.06450 17.87202 17.46826
Visualisasi Hasil Forecast:
# === Plot Hasil Peramalan VAR ===
# Ambil hasil forecast dari objek fcst
fcst_income <- as.data.frame(fcst$fcst$Income)
fcst_savings <- as.data.frame(fcst$fcst$Savings)
# Tambahkan periode waktu ke depan sesuai dengan data terakhir
last_date <- max(as.Date(data_var$Quarter))
future_quarters <- seq(last_date, by = "quarter", length.out = nrow(fcst_income) + 1)[-1]
# Plot Income Forecast
plot(future_quarters, fcst_income$fcst, type = "l", lwd = 2,
ylim = range(c(fcst_income$lower, fcst_income$upper)),
main = "Forecast Income (8 Kuartal ke Depan)",
xlab = "Tahun", ylab = "Income (Forecast)")
lines(future_quarters, fcst_income$lower, lty = 2, col = "red")
lines(future_quarters, fcst_income$upper, lty = 2, col = "red")
points(future_quarters, fcst_income$fcst, pch = 16, col = "blue")
legend("topleft", legend = c("Prediksi", "Interval 95%"),
col = c("blue", "red"), lty = c(1, 2), bty = "n")# Plot Savings Forecast
plot(future_quarters, fcst_savings$fcst, type = "l", lwd = 2,
ylim = range(c(fcst_savings$lower, fcst_savings$upper)),
main = "Forecast Savings (8 Kuartal ke Depan)",
xlab = "Tahun", ylab = "Savings (Forecast)")
lines(future_quarters, fcst_savings$lower, lty = 2, col = "red")
lines(future_quarters, fcst_savings$upper, lty = 2, col = "red")
points(future_quarters, fcst_savings$fcst, pch = 16, col = "blue")
legend("topleft", legend = c("Prediksi", "Interval 95%"),
col = c("blue", "red"), lty = c(1, 2), bty = "n")Mengukur keakuratan model dalam mencocokkan data historis.
# === MAPE In-Sample ===
# Ambil fitted value dari model VAR
fitted_values <- fitted(model1)
# Sesuaikan jumlah observasi aktual dengan fitted values
actual_values <- data_var[(nrow(data_var) - nrow(fitted_values) + 1):nrow(data_var), ]
# Hitung MAPE per variabel
mape_income <- mean(abs((actual_values$Income - fitted_values[, "Income"]) / actual_values$Income)) * 100
mape_savings <- mean(abs((actual_values$Savings - fitted_values[, "Savings"]) / actual_values$Savings)) * 100
cat("MAPE In-Sample Income :", round(mape_income, 3), "%\n")## MAPE In-Sample Income : 109.003 %
## MAPE In-Sample Savings: 259.261 %
# === Plot Aktual vs Fitted (In-Sample) ===
# Ambil lagi fitted value dari model VAR
fitted_values <- fitted(model1)
# Sesuaikan indeks supaya panjangnya sama
idx_start <- nrow(data_var) - nrow(fitted_values) + 1
fit_df <- data.frame(
Date = as.Date(data_var$Quarter[idx_start:nrow(data_var)]),
Income_Actual = data_var$Income[idx_start:nrow(data_var)],
Income_Fitted = fitted_values[, "Income"],
Savings_Actual = data_var$Savings[idx_start:nrow(data_var)],
Savings_Fitted = fitted_values[, "Savings"]
)
# Ubah ke format long untuk ggplot
fit_long <- fit_df %>%
pivot_longer(cols = -Date,
names_to = c("Variable", "Series"),
names_sep = "_",
values_to = "Value")
# Plot: Actual vs Fitted, difacet per variabel
ggplot(fit_long, aes(x = Date, y = Value, linetype = Series)) +
geom_line() +
facet_wrap(~ Variable, ncol = 1, scales = "free_y") +
labs(title = "Aktual vs Fitted (In-Sample) - VAR",
x = "Tahun",
y = "Nilai",
linetype = NULL) +
scale_x_date(date_breaks = "2 years", date_labels = "%Y") +
theme_minimal(base_size = 11)Konsep Dasar: SSA adalah metode non-parametrik yang kuat untuk membedah data deret waktu menjadi komponen: Tren, Osilasi (Musiman), dan Noise. Metode ini tidak memerlukan asumsi distribusi data (seperti normalitas) dan bekerja dengan mengubah deret waktu menjadi matriks trajektori.
Data dummy digunakan untuk mendemonstrasikan algoritma SSA secara manual.
rm(list=ls()) # remove variables
graphics.off() # close figures
# Input Data Contoh (1 s.d 15)
# Menggantikan read_excel sesuai permintaan
DataSSA <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
Y <- as.matrix(DataSSA)
N <- length(Y)
L = 7 # Trial And error (L =< N/2)
K = N - L + 1
# Menampilkan data awal
print(t(Y))## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## [1,] 1 2 3 4 5 6 7 8 9 10 11 12 13 14
## [,15]
## [1,] 15
Konsep: Embedding mengubah data deret waktu 1D menjadi matriks 2D yang disebut Matriks Hankel (Matriks Trajektori). Elemen diagonal dari matriks ini bernilai konstan. * \(L\) (Window Length): Menentukan seberapa besar “jendela” pengamatan pola.
# 1. Embedding
# To produce the Hankel matrix
X <- outer((1:L), (1:K), function(x,y) Y[(x+y-1)])
# Menampilkan sebagian matriks Hankel
print(head(X))## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,] 1 2 3 4 5 6 7 8 9
## [2,] 2 3 4 5 6 7 8 9 10
## [3,] 3 4 5 6 7 8 9 10 11
## [4,] 4 5 6 7 8 9 10 11 12
## [5,] 5 6 7 8 9 10 11 12 13
## [6,] 6 7 8 9 10 11 12 13 14
Konsep: Matriks Trajektori dipecah menggunakan Singular Value Decomposition (SVD) menjadi Eigenvalues (\(\lambda\)) dan Eigenvectors. * Eigenvalues: Menunjukkan “energi” sinyal. Nilai yang besar biasanya merepresentasikan tren utama, sedangkan nilai kecil merepresentasikan noise.
# 2. SVD
# Hankelization R code function definition
UniHankel <- function(Y,L){
k <- length(Y)-L+1
outer((1:L), (1:k), function(x,y) Y[(x+y-1)])
}
# SVD R code function definition
SVD <- function(Y,L){
X <- UniHankel(Y,L)
svd(X)
}
# Eksekusi SVD pada Matriks X
SVD_result <- svd(X)
lambda <- SVD_result$d # to see the eigenvalue
sing.value <- sqrt(lambda)
Lambda <- diag(lambda) # Make singular matrix
U <- SVD_result$u
V <- SVD_result$v
# Menampilkan Eigenvalues
print(lambda)## [1] 6.842069e+01 4.754857e+00 6.924323e-15 1.160704e-15 7.087244e-16
## [6] 4.326742e-16 1.169336e-16
Tahap ini mengembalikan pecahan matriks tadi menjadi bentuk deret waktu melalui proses Grouping dan Diagonal Averaging.
Konsep: Kita memilih komponen-komponen tertentu (berdasarkan besaran Eigenvalue) untuk direkonstruksi. Misalnya, memilih komponen ke-1 saja untuk mengambil tren, dan membuang sisanya sebagai noise.
# 1. Grouping
# Grouping R Code
Group <- function(Y, L, groups){
I <- groups; p <- length(I)
# Memanggil fungsi SVD yang didefinisikan sebelumnya
SVD_res <- SVD(Y, L)
LambdaI <- matrix(diag(SVD_res$d)[I,I], p, p)
SVD_res$u[,I] %*% LambdaI %*% t(SVD_res$v[,I])
}
# Diasumsikan menggunakan komponen pertama -> I <- c(1)
I <- c(1)
p <- length(I)
# Perhitungan manual komponen matriks
U[,I] %*% matrix(Lambda[I,I], p, p)## [,1]
## [1,] 16.60829
## [2,] 19.47749
## [3,] 22.34669
## [4,] 25.21589
## [5,] 28.08509
## [6,] 30.95429
## [7,] 33.82349
XI <- U[,I] %*% matrix(Lambda[I,I], p, p) %*% t(V[,I]) # Compute the SVD using component 1
print(XI[1:5, 1:5]) # Menampilkan sebagian hasil matriks rekonstruksi## [,1] [,2] [,3] [,4] [,5]
## [1,] 2.789869 3.416082 4.042295 4.668508 5.294721
## [2,] 3.271838 4.006234 4.740630 5.475026 6.209422
## [3,] 3.753808 4.596386 5.438965 6.281544 7.124123
## [4,] 4.235777 5.186539 6.137300 7.088062 8.038823
## [5,] 4.717747 5.776691 6.835635 7.894580 8.953524
Konsep: Matriks hasil rekonstruksi (\(XI\)) ditransformasikan kembali menjadi deret waktu satu dimensi dengan merata-ratakan nilai pada arah anti-diagonal (\(i+j=\text{konstan}\)).
# 2. Diagonal Averaging
# Diagonal Averaging R Code
DiagAver <- function(X){
L <- nrow(X); k <- ncol(X); N <- k + L - 1
D <- NULL
for(j in 1:N){
s1 <- max(1, (j - N + L))
s2 <- min(L, j)
place <- (s1:s2) + L * (((j + 1 - s1):(j + 1 - s2)) - 1)
D[j] <- mean(X[place])
}
D
}
# SSA Reconstruction R Code (Fungsi gabungan)
SSA.Rec <- function(Y, L, groups){
N <- length(Y)
I <- groups; p <- length(I)
XI <- Group(Y, L, groups)
Approx <- DiagAver(XI)
Resid <- Y - Approx
list(Approximation = Approx, Residual = Resid)
}
# Implementasi manual loop Diagonal Averaging untuk XI
D <- NULL
N <- length(Y)
for(t in 1:N){
s1 <- max(1, (t - N + L))
s2 <- min(L, t)
place <- (s1:s2) + L * (((t + 1 - s1):(t + 1 - s2)) - 1)
D[t] <- mean(XI[place])
}
# Menampilkan hasil rekonstruksi (dibulatkan)
round(D, 2)## [1] 2.79 3.34 3.93 4.56 5.22 5.92 6.66 7.61 8.56 9.69 10.86 12.06
## [13] 13.30 14.57 15.88
Konsep: Peramalan dilakukan menggunakan Linear Recurrent Formula (LRF). Metode ini memproyeksikan titik data masa depan sebagai kombinasi linear dari titik data sebelumnya, berdasarkan struktur eigen yang telah diekstraksi.
# Forecasting
# SSA LRF Forecasting R Code:
RSSA.Forecasting <- function(L, groups, h, Y){
N <- length(Y)
L <- min(L, (N - L + 1))
X <- UniHankel(Y, L)
U <- matrix(svd(X)$u, L, L)
pi <- array(U[L, groups], dim = length(groups))
V2 <- sum(pi^2)
m <- length(groups)
Udelta <- array(U[1:(L-1), groups], dim = c((L-1), m))
A <- pi %*% t(Udelta) / (1 - V2)
yhat <- array(0, dim = (N + h))
yhat[1:N] <- SSA.Rec(Y, L, groups)$Approximation
for(l in (N+1):(N+h))
yhat[l] <- A %*% yhat[(l - L + 1):(l - 1)]
yhat[(N+1):(N+h)]
}
# Menjalankan fungsi forecasting
# Parameter: L=7, Group=1, h=3 (forecast 3 periode ke depan)
Forecast_Result <- RSSA.Forecasting(L=7, groups=c(1), h=3, Y=Y)
print("Hasil Peramalan 3 periode ke depan:")## [1] "Hasil Peramalan 3 periode ke depan:"
## [1] 17.95759 19.90515 22.04894
Berdasarkan ketiga metode analisis yang telah dilakukan, dapat ditarik kesimpulan sebagai berikut:
Pemilihan metode yang tepat sangat bergantung pada tujuan analisis: apakah untuk kontrol input-output (Fungsi Transfer), analisis kebijakan makroekonomi (VAR), atau dekomposisi sinyal data (SSA).
Bagian ini disusun khusus untuk persiapan ujian tulis (tanpa laptop). Fokus utama adalah pemahaman logika, penulisan rumus manual, dan interpretasi output yang mungkin dicetak di soal.
Tantangan Ujian: Biasanya diberikan plot CCF dan diminta menentukan orde \((b, r, s)\), atau diberikan persamaan dan diminta menghitung nilai ramalan manual.
Jika soal memberikan grafik Cross Correlation Function (CCF) setelah pre-whitening: 1. Cari \(b\) (Delay): Lihat pada lag negatif (kiri). Di lag berapa batang pertama kali keluar garis putus-putus (signifikan)? * Contoh: Batang signifikan pertama di Lag -3 \(\rightarrow\) \(b = 3\). 2. Cari \(r\) (Numerator): Lihat berapa banyak batang signifikan setelah lag \(b\). * Rumus: Jumlah batang signifikan berurutan setelah \(b\). 3. Cari \(s\) (Denominator): Lihat pola batang setelah \(b+r\). * Jika mengecil secara eksponensial (melengkung turun) atau sinus (gelombang) \(\rightarrow\) \(s = 1\) atau \(s = 2\). * Jika langsung putus (tidak ada pola) \(\rightarrow\) \(s = 0\).
Tantangan Ujian: Menuliskan sistem persamaan matriks dan interpretasi hasil (Granger/IRF) dari tabel/gambar. Perhitungan manual biasanya terbatas pada VAR(1) dengan 2 variabel.
Tantangan Ujian: Ini yang paling sering keluar hitungan manualnya. Biasanya diminta membuat Matriks Trajektori (Hankel) dan Diagonal Averaging untuk data kecil (N=5 atau N=10).
Misal Data: \(Y = \{1, 2, 3, 4, 5\}\), Panjang Jendela \(L=3\).
Langkah 1: Tentukan K \[N=5, L=3 \rightarrow K = N - L + 1 = 5 - 3 + 1 = 3\] Matriks akan berukuran \(L \times K\) (\(3 \times 3\)).
Langkah 2: Buat Matriks Trajektori (Embedding) Isi kolom pertama dengan data 1 sampai \(L\). Geser satu langkah untuk kolom kedua, dst. \[ X = \begin{bmatrix} 1 & 2 & 3 \\ 2 & 3 & 4 \\ 3 & 4 & 5 \end{bmatrix} \] Ciri Benar: Diagonal miring (kiri bawah ke kanan atas) angkanya sama (1, lalu 2-2, lalu 3-3-3…).
Langkah 3: Diagonal Averaging (Jika diberikan matriks hasil rekonstruksi) Misal dikasih matriks rekonstruksi \(Y_{rec}\): \[ Y_{rec} = \begin{bmatrix} a & b & c \\ d & e & f \\ g & h & i \end{bmatrix} \] Cara mengembalikan ke deret angka: * \(y_1 = a\) * \(y_2 = (d+b)/2\) * \(y_3 = (g+e+c)/3\) * \(y_4 = (h+f)/2\) * \(y_5 = i\)
Tips Kalkulator: * Latihan merata-ratakan diagonal matriks dengan cepat. * Ingat pola indeks: \(y_k\) adalah rata-rata elemen matriks dimana indeks baris + kolom = \(k+1\).
Jika ditanya konsep SVD tanpa hitungan: \[X = \sum \sqrt{\lambda_i} U_i V_i^T\] * \(\lambda\) (Eigenvalue): “Kekuatan” sinyal. Urutkan dari terbesar. * Grouping: Ambil \(\lambda\) besar untuk Tren. \(\lambda\) yang berpasangan biasanya Musiman. \(\lambda\) kecil adalah Noise.
Semangat UAS Analisis Data Deret Waktu 2! Jangan lupa bawa kalkulator dan penggaris untuk menggambar plot manual jika diminta.