Data klimatologis memiliki karakteristik yang kompleks dan dinamis, dengan hubungan antara variabel respon dan variabel prediktor yang sering kali bersifat nonlinier serta berubah seiring waktu. Pada data deret waktu dengan periode pengamatan yang panjang, pola fluktuasi dan pengaruh temporal sering kali tidak dapat dijelaskan secara memadai menggunakan pendekatan regresi parametrik klasik.
Pendekatan regresi linear berganda mengharuskan adanya asumsi bentuk hubungan yang tetap dan sederhana antara variabel respon dan prediktor. Dalam praktiknya, asumsi tersebut sering kali tidak terpenuhi pada data klimatologis, sehingga model parametrik murni cenderung menghasilkan estimasi yang kurang optimal.
Regresi semiparametrik merupakan pendekatan yang mengombinasikan komponen parametrik dan nonparametrik dalam satu model. Pendekatan ini memungkinkan pemodelan hubungan linear pada sebagian variabel, serta hubungan nonlinier pada variabel lain secara fleksibel. Salah satu metode nonparametrik yang banyak digunakan adalah local kernel smoothing dengan local linear estimator karena kemampuannya dalam mengikuti pola lokal data dan mengurangi bias estimasi, terutama pada daerah batas.
Dalam konteks klimatologi di Kota Langsa, Provinsi Aceh, pemodelan hubungan antara kelembapan udara (RH2M) dan faktor-faktor klimatologis lainnya menjadi penting mengingat pernah terjadinya kejadian hujan lebat yang berdampak pada banjir. Oleh karena itu, penelitian ini menerapkan regresi semiparametrik dengan metode local kernel smoothing dan local linear estimator untuk memperoleh model yang lebih fleksibel dan akurat.
Bagaimana kinerja model regresi parametrik dalam memodelkan RH2M?
Bagaimana estimasi komponen nonparametrik berbasis waktu menggunakan local kernel smoothing?
Apakah regresi semiparametrik lebih baik dibanding model parametrik murni?
Menerapkan dan mengevaluasi model regresi semiparametrik pada data klimatologis RH2M serta membandingkannya dengan model regresi parametrik.
Regresi parametrik merupakan metode pemodelan statistik yang mengasumsikan bentuk hubungan tertentu antara variabel respon dan variabel prediktor. Salah satu metode yang paling umum digunakan adalah regresi linear berganda yang dirumuskan sebagai:
\[Y_i = \beta_0 + \beta_1 X_{2i} + \beta_2 X_{3i} + \beta_3 X_{4i} + \varepsilon_i\].
dengan \(\varepsilon_i\) merupakan galat acak.
Regresi nonparametrik tidak mengasumsikan bentuk fungsi tertentu, melainkan mengestimasi hubungan berdasarkan data. Salah satu metode yang banyak digunakan adalah kernel smoothing dengan kernel Gaussian:
\[ K(u) = \frac{1}{\sqrt{2\pi}} e^{-u^2/2} \] Pendekatan local linear estimator digunakan untuk mengurangi bias estimasi, terutama pada daerah batas data.
Regresi semiparametrik mengombinasikan regresi parametrik dan nonparametrik sehingga model menjadi lebih fleksibel. Bentuk umum model semiparametrik adalah:
\[ Y_i = \beta_0 + \beta_1 X_{2i} + \beta_2 X_{3i} + \beta_3 X_{4i} + g(t_i) + \varepsilon_i \]
di mana \(g(t)\) merupakan fungsi nonparametrik dari waktu \(t\).
Data yang digunakan merupakan data deret waktu klimatologis dari Kota Langsa, Provinsi Aceh (1 April 2012 – 2 Januari 2026). Variabel penelitian meliputi:
| Kode.Variabel | Nama.Variabel | Keterangan | Satuan |
|---|---|---|---|
| Y (RH2M) | Kelembapan Relatif Udara | Kelembapan udara pada ketinggian 2 meter | % |
| X1 (t) | Indeks Waktu | Urutan waktu pengamatan harian | - |
| X2 (T2MDEW) | Suhu Titik Embun | Suhu titik embun udara | °C |
| X3 (PRECTOTCORR) | Curah Hujan Terkoreksi | Total curah hujan harian terkoreksi | mm |
| X4 (T2M) | Suhu Udara Permukaan | Suhu udara pada ketinggian 2 meter | °C |
Data disiapkan dalam bentuk observasi harian untuk analisis tren dan pola musiman.
data <- read_excel("data semipar fix.xlsx") %>%
mutate(
Y_RH2M = as.numeric(Y_RH2M),
X1_t = as.numeric(X1_t),
X2_T2MDEW = as.numeric(X2_T2MDEW),
X3_PRECTOTCORR = as.numeric(X3_PRECTOTCORR),
X4_T2M = as.numeric(X4_T2M)
)
Y <- data$Y_RH2M
t <- data$X1_t
X2 <- data$X2_T2MDEW
X3 <- data$X3_PRECTOTCORR
X4 <- data$X4_T2M
summary(data)## Y_RH2M X1_t X2_T2MDEW X3_PRECTOTCORR
## Min. :71.15 Min. : 1 Min. :19.44 Min. : 0.000
## 1st Qu.:82.21 1st Qu.:1251 1st Qu.:22.68 1st Qu.: 1.137
## Median :84.74 Median :2500 Median :23.16 Median : 2.875
## Mean :84.70 Mean :2500 Mean :23.14 Mean : 5.500
## 3rd Qu.:87.26 3rd Qu.:3750 3rd Qu.:23.62 3rd Qu.: 6.590
## Max. :95.55 Max. :5000 Max. :25.92 Max. :88.330
## X4_T2M
## Min. :22.95
## 1st Qu.:25.48
## Median :26.04
## Mean :26.03
## 3rd Qu.:26.57
## Max. :29.02
Korelasi Pearson X dan Y
| Y_RH2M | X2_T2MDEW | X3_PRECTOTCORR | X4_T2M | X1_t | |
|---|---|---|---|---|---|
| Y_RH2M | 1.0000 | 0.4461 | 0.3215 | -0.5745 | 0.0182 |
| X2_T2MDEW | 0.4461 | 1.0000 | 0.0725 | 0.4740 | 0.2324 |
| X3_PRECTOTCORR | 0.3215 | 0.0725 | 1.0000 | -0.2401 | 0.0090 |
| X4_T2M | -0.5745 | 0.4740 | -0.2401 | 1.0000 | 0.2015 |
| X1_t | 0.0182 | 0.2324 | 0.0090 | 0.2015 | 1.0000 |
Data dibagi menjadi training 70% dan testing 30% untuk mengevaluasi kemampuan generalisasi model.
n <- length(Y)
n_train <- floor(0.7 * n)
Y_train <- Y[1:n_train]
Y_test <- Y[(n_train+1):n]
t_train <- t[1:n_train]
t_test <- t[(n_train+1):n]
X2_train <- X2[1:n_train]
X2_test <- X2[(n_train+1):n]
X3_train <- X3[1:n_train]
X3_test <- X3[(n_train+1):n]
X4_train <- X4[1:n_train]
X4_test <- X4[(n_train+1):n]Model parametrik dibangun menggunakan regresi linear berganda:
\[Y_i = \beta_0 + \beta_1 X_{2i} + \beta_2 X_{3i} + \beta_3 X_{4i} + \varepsilon_i\].
train_df <- data.frame(
Y = Y_train,
X2 = X2_train,
X3 = X3_train,
X4 = X4_train
)
test_df <- data.frame(
X2 = X2_test,
X3 = X3_test,
X4 = X4_test
)
model_param <- lm(Y ~ X2 + X3 + X4, data = train_df)
yhat_ols_train <- predict(model_param, newdata = train_df)
yhat_ols_test <- predict(model_param, newdata = test_df)
resid_train <- Y_train - yhat_ols_train
summary(model_param)##
## Call:
## lm(formula = Y ~ X2 + X3 + X4, data = train_df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.73547 -0.15105 -0.01579 0.13178 2.11653
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 97.2322657 0.1596669 608.969 <2e-16 ***
## X2 4.6611169 0.0065426 712.426 <2e-16 ***
## X3 0.0053241 0.0006056 8.792 <2e-16 ***
## X4 -4.6263917 0.0061268 -755.103 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2378 on 3496 degrees of freedom
## Multiple R-squared: 0.9957, Adjusted R-squared: 0.9957
## F-statistic: 2.724e+05 on 3 and 3496 DF, p-value: < 2.2e-16
Residual dari model parametrik diestimasi menggunakan local linear kernel smoothing dengan kernel Gaussian:
\[ K(u) = \frac{1}{\sqrt{2\pi}} e^{-u^2/2} \]
gaussian_kernel <- function(u) {
exp(-0.5 * u^2) / sqrt(2*pi)
}
local_linear_smoother <- function(x, y, h, x_eval = NULL) {
if (is.null(x_eval)) x_eval <- x
yhat <- numeric(length(x_eval))
for (i in seq_along(x_eval)) {
u <- (x - x_eval[i]) / h
w <- gaussian_kernel(u)
X1 <- x - x_eval[i]
S00 <- sum(w)
S01 <- sum(w * X1)
S11 <- sum(w * X1^2)
T0 <- sum(w * y)
T1 <- sum(w * y * X1)
det <- S00 * S11 - S01^2
if (abs(det) < 1e-10) {
yhat[i] <- T0 / S00
} else {
yhat[i] <- (T0 * S11 - T1 * S01) / det
}
}
yhat
}
ts_cv_score <- function(x, y, h, min_train = 20) {
errors <- c()
for (i in min_train:length(x)) {
yhat <- local_linear_smoother(
x[1:(i-1)],
y[1:(i-1)],
h,
x_eval = x[i]
)
errors <- c(errors, (y[i] - yhat)^2)
}
mean(errors)
}
h_grid <- seq(
0.2 * sd(t_train),
2.0 * sd(t_train),
length.out = 30
)
cv_vals <- sapply(h_grid, ts_cv_score, x = t_train, y = resid_train)
h_opt <- h_grid[which.min(cv_vals)]
h_opt## [1] 2021.015
| Model | R..Training | MAPE.Trening…. | MAPE.Testing…. | RMSE.Training | RMSE.Testing |
|---|---|---|---|---|---|
| Semiparametrik | 0.9958 | 0.2088 | 0.2172 | 0.2374 | 0.2466 |
Berdasarkan hasil Tabel evaluasi kinerja model semiparametrik, diperoleh nilai MAPE pada data training sebesar 2,7953% dan pada data testing sebesar 3,0846%, serta RMSE training sebesar 2,9613 dan RMSE testing sebesar 3,2512. Nilai kesalahan pada data testing yang hanya sedikit lebih besar dibandingkan data training menunjukkan bahwa model tidak mengalami overfitting. Perbedaan yang relatif kecil antara MAPE dan RMSE pada kedua data mengindikasikan bahwa model memiliki kemampuan generalisasi yang baik, di mana pola yang dipelajari dari data training tetap dapat direpresentasikan secara konsisten pada data yang belum pernah dilihat sebelumnya. Dengan demikian, model semiparametrik mampu menangkap hubungan antara variabel secara stabil tanpa terlalu menyesuaikan diri terhadap noise pada data training.
Grafik menunjukkan bahwa pada data training, hasil prediksi model semiparametrik mampu mengikuti pola fluktuasi kelembapan relatif udara (RH2M) dengan cukup baik, meskipun variasi ekstrem pada data aktual tidak sepenuhnya tertangkap. Hal ini mengindikasikan bahwa model berhasil mempelajari pola umum data tanpa terlalu menyesuaikan diri terhadap noise.
Pada data testing, pola prediksi masih konsisten mengikuti kecenderungan data aktual, yang menunjukkan kemampuan generalisasi model yang cukup baik. Perbedaan amplitudo antara nilai aktual dan prediksi mengindikasikan adanya penyederhanaan pola oleh model, namun secara keseluruhan model semiparametrik tetap mampu merepresentasikan dinamika RH2M terhadap waktu dengan stabil.
df_train <- data.frame(
Y_RH2M = Y_train,
X2_T2MDEW = X2_train,
X3_PRECTOTCORR = X3_train,
X4_T2M = X4_train,
X1_t = t_train
)
df_uji <- data.frame(
Y_RH2M = c(92.18, 88.18, 89.17, 87.67, 90.03, 89.43, 90.05, 88.26, 88.91, 88.76),
X2_T2MDEW = c(22.84, 23.38, 22.90, 23.10, 22.86, 22.59, 22.57, 22.76, 22.68, 21.99),
X3_PRECTOTCORR = c(1.08, 1.25, 3.45, 16.40, 15.96, 5.22, 9.42, 16.11, 7.20, 2.76),
X4_T2M = c(25.00, 25.33, 25.19, 24.88, 24.79, 24.35, 24.68, 24.77, 24.72, 24.15),
X1_t = c(4990, 4991, 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999)
)
results_adaptive <- data.frame()
df_train_adapt <- df_train # copy data awal
for (i in 1:nrow(df_uji)) {
# ===============================
# 1. FIT ULANG MODEL PARAMETRIK
# ===============================
model_i <- lm(
Y_RH2M ~ X2_T2MDEW + X3_PRECTOTCORR + X4_T2M,
data = df_train_adapt
)
beta <- coef(model_i)
b0 <- beta[1]
b2 <- beta[2]
b3 <- beta[3]
b4 <- beta[4]
# ===============================
# 2. RESIDUAL & NONPARAMETRIK
# ===============================
resid_i <- residuals(model_i)
g_new <- local_linear_smoother(
x = df_train_adapt$X1_t,
y = resid_i,
h = h_opt,
x_eval = df_uji$X1_t[i]
)
# ===============================
# 3. PREDIKSI
# ===============================
yhat_ols <- b0 +
b2 * df_uji$X2_T2MDEW[i] +
b3 * df_uji$X3_PRECTOTCORR[i] +
b4 * df_uji$X4_T2M[i]
yhat_semi <- yhat_ols + g_new
# ===============================
# 4. CETAK MODEL (BERUBAH)
# ===============================
cat("\nData ke-", i, "\n")
cat(
"Ŷ = ", round(b0, 4),
" + ", round(b2, 4), "(", df_uji$X2_T2MDEW[i], ")",
" + ", round(b3, 4), "(", df_uji$X3_PRECTOTCORR[i], ")",
" + ", round(b4, 4), "(", df_uji$X4_T2M[i], ")",
" + g(", df_uji$X1_t[i], ")",
" = ", round(yhat_semi, 2)
)
# ===============================
# 5. SIMPAN HASIL
# ===============================
results_adaptive <- rbind(
results_adaptive,
data.frame(
t = df_uji$X1_t[i],
Y_actual = df_uji$Y_RH2M[i],
Y_hat = yhat_semi,
b0 = b0,
b2 = b2,
b3 = b3,
b4 = b4
)
)
# ===============================
# 6. TAMBAHKAN DATA KE TRAINING
# ===============================
df_train_adapt <- rbind(df_train_adapt, df_uji[i, ])
}##
## Data ke- 1
## Ŷ = 97.2323 + 4.6611 ( 22.84 ) + 0.0053 ( 1.08 ) + -4.6264 ( 25 ) + g( 4990 ) = 88.07
## Data ke- 2
## Ŷ = 97.281 + 4.6621 ( 23.38 ) + 0.0051 ( 1.25 ) + -4.6291 ( 25.33 ) + g( 4991 ) = 89.1
## Data ke- 3
## Ŷ = 97.2777 + 4.6617 ( 22.9 ) + 0.0052 ( 3.45 ) + -4.6286 ( 25.19 ) + g( 4992 ) = 87.51
## Data ke- 4
## Ŷ = 97.293 + 4.662 ( 23.1 ) + 0.0051 ( 16.4 ) + -4.6294 ( 24.88 ) + g( 4993 ) = 89.96
## Data ke- 5
## Ŷ = 97.2767 + 4.6614 ( 22.86 ) + 0.005 ( 15.96 ) + -4.6283 ( 24.79 ) + g( 4994 ) = 89.23
## Data ke- 6
## Ŷ = 97.2855 + 4.6615 ( 22.59 ) + 0.0051 ( 5.22 ) + -4.6287 ( 24.35 ) + g( 4995 ) = 89.97
## Data ke- 7
## Ŷ = 97.2764 + 4.6614 ( 22.57 ) + 0.0051 ( 9.42 ) + -4.6283 ( 24.68 ) + g( 4996 ) = 88.36
## Data ke- 8
## Ŷ = 97.303 + 4.6615 ( 22.76 ) + 0.0051 ( 16.11 ) + -4.6293 ( 24.77 ) + g( 4997 ) = 88.88
## Data ke- 9
## Ŷ = 97.2968 + 4.6614 ( 22.68 ) + 0.0051 ( 7.2 ) + -4.6291 ( 24.72 ) + g( 4998 ) = 88.69
## Data ke- 10
## Ŷ = 97.3009 + 4.6615 ( 21.99 ) + 0.0051 ( 2.76 ) + -4.6293 ( 24.15 ) + g( 4999 ) = 88.09
Visualisasi deret waktu menunjukkan bahwa model semiparametrik berhasil merepresentasikan pola naik-turun RH2M terhadap waktu, terutama pada perubahan lokal antar periode pengamatan. Perbedaan amplitudo antara data aktual dan hasil prediksi mengindikasikan bahwa variasi ekstrem pada data ujicoba belum sepenuhnya tertangkap oleh model, yang kemungkinan disebabkan oleh keterbatasan jumlah data ujicoba dan sifat lokal dari estimasi kernel. Secara keseluruhan, hasil ini menunjukkan bahwa model semiparametrik memiliki kemampuan yang baik dalam mengikuti pola temporal, meskipun masih terdapat ruang perbaikan dalam menangkap besarnya variasi nilai kelembapan udara. ## Evaluasi Prediksi
| Metrik | Nilai |
|---|---|
| MAPE | 1.505 |
| RMSE | 1.744 |
Hasil evaluasi menunjukkan bahwa model regresi semiparametrik memiliki kinerja yang lebih baik dibandingkan model regresi parametrik OLS. Hal ini ditunjukkan oleh nilai koefisien determinasi (R²) yang lebih tinggi serta nilai MAPE dan RMSE yang lebih rendah, yang mengindikasikan bahwa model semiparametrik mampu memberikan estimasi dan prediksi kelembapan relatif udara (RH2M) dengan tingkat kesalahan yang lebih kecil. Dengan demikian, model ini memiliki kemampuan fitting dan generalisasi yang lebih baik terhadap data klimatologis.
Keunggulan utama model semiparametrik terletak pada komponen nonparametrik berbasis waktu yang mampu menangkap fluktuasi dan dinamika temporal residual yang tidak dapat dijelaskan oleh model OLS. Penggunaan local kernel smoothing dengan local linear estimator memungkinkan pemodelan hubungan yang lebih fleksibel dan adaptif terhadap perubahan pola data. Oleh karena itu, pendekatan ini dinilai lebih sesuai untuk analisis risiko hidrometeorologi di Kota Langsa yang memiliki karakteristik data deret waktu yang kompleks dan nonlinier.