1 PENDAHULUAN

1.1 Latar Belakang

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.

1.2 Rumusan Masalah

  1. Bagaimana kinerja model regresi parametrik dalam memodelkan RH2M?

  2. Bagaimana estimasi komponen nonparametrik berbasis waktu menggunakan local kernel smoothing?

1.3 Tujuan Penelitian

Menerapkan dan mengevaluasi model regresi semiparametrik pada data klimatologis RH2M.

2 TINJAUAN PUSTAKA

2.1 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.

2.2 Regresi Nonparametrik

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.

2.3 Regresi Semiparametrik

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\).

3 METODOLOGI PENELITIAN

3.1 Library yang Dibutuhkan

library(tidyverse) # Data wrangling & plotting
library(car) #Analisis regresi dan diagnostik model statistik
library(readxl) # Membaca Excel

3.2 Data penelitian

Data yang digunakan merupakan data deret waktu klimatologis dari Kota Langsa, Provinsi Aceh (1 April 2012 – 2 Januari 2026). Variabel penelitian meliputi:

Deskripsi Variabel Penelitian
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        X2_T2MDEW     X3_PRECTOTCORR       X4_T2M     
##  Min.   :71.15   Min.   :19.44   Min.   : 0.000   Min.   :22.95  
##  1st Qu.:82.21   1st Qu.:22.68   1st Qu.: 1.130   1st Qu.:25.49  
##  Median :84.73   Median :23.16   Median : 2.870   Median :26.04  
##  Mean   :84.69   Mean   :23.14   Mean   : 5.495   Mean   :26.03  
##  3rd Qu.:87.25   3rd Qu.:23.62   3rd Qu.: 6.570   3rd Qu.:26.57  
##  Max.   :95.55   Max.   :25.92   Max.   :88.330   Max.   :29.02  
##       X1_t     
##  Min.   :   1  
##  1st Qu.:1248  
##  Median :2495  
##  Mean   :2495  
##  3rd Qu.:3742  
##  Max.   :4989

Korelasi Pearson X dan Y

Matriks Korelasi Pearson antara Y dan Variabel X
Y_RH2M X2_T2MDEW X3_PRECTOTCORR X4_T2M X1_t
Y_RH2M 1.0000 0.1637 0.2128 -0.4202 0.0137
X2_T2MDEW 0.1637 1.0000 0.0728 0.4735 0.2349
X3_PRECTOTCORR 0.2128 0.0728 1.0000 -0.2399 0.0078
X4_T2M -0.4202 0.4735 -0.2399 1.0000 0.2079
X1_t 0.0137 0.2349 0.0078 0.2079 1.0000

3.3 Pembagian Data

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]

3.4 Model Parametrik (OLS)

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 
## -9.6539 -1.9987  0.0336  1.9716 10.4982 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 108.034187   1.991680  54.243   <2e-16 ***
## X2            2.241647   0.081667  27.449   <2e-16 ***
## X3            0.011427   0.007553   1.513     0.13    
## X4           -2.897597   0.076412 -37.921   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.965 on 3488 degrees of freedom
## Multiple R-squared:  0.3375, Adjusted R-squared:  0.3369 
## F-statistic: 592.2 on 3 and 3488 DF,  p-value: < 2.2e-16

3.5 Model Nonparametrik

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] 1140.307
g_train <- local_linear_smoother(t_train, resid_train, h_opt)
g_test  <- local_linear_smoother(t_train, resid_train, h_opt, x_eval = t_test)

3.6 Model Semiparametrik

Model semiparametrik diperoleh dengan menggabungkan prediksi OLS dan komponen nonparametrik:

\[ Y_i = \beta_0 + \beta_1 X_{2i} + \beta_2 X_{3i} + \beta_3 X_{4i} + g(t_i) + \varepsilon_i \]

yhat_semi_train <- yhat_ols_train + g_train
yhat_semi_test  <- yhat_ols_test  + g_test

4 Hasil dan Pembahasan

4.1 Evaluasi Model

Evaluasi Kinerja Regresi Semiparametrik Local Kernel Smoothing dengan Local Linear Estimator
Model R..Training MAPE.Trening…. MAPE.Testing…. RMSE.Training RMSE.Testing
Semiparametrik 0.3384 2.7953 3.0846 2.9613 3.2512

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.

4.2 Visualisasi Prediksi Training dan Testing

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.

4.3 Uji Coba Model Adaptif

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 
## Ŷ =  108.0342  +  2.2416 ( 22.84 )  +  0.0114 ( 1.08 )  +  -2.8976 ( 25 )  + g( 4990 )  =  85.84
## Data ke- 2 
## Ŷ =  108.0975  +  2.243 ( 23.38 )  +  0.0112 ( 1.25 )  +  -2.9011 ( 25.33 )  + g( 4991 )  =  86.54
## Data ke- 3 
## Ŷ =  108.1018  +  2.2436 ( 22.9 )  +  0.0111 ( 3.45 )  +  -2.9018 ( 25.19 )  + g( 4992 )  =  86
## Data ke- 4 
## Ŷ =  108.1262  +  2.2441 ( 23.1 )  +  0.0111 ( 16.4 )  +  -2.9031 ( 24.88 )  + g( 4993 )  =  87.69
## Data ke- 5 
## Ŷ =  108.1244  +  2.244 ( 22.86 )  +  0.0111 ( 15.96 )  +  -2.903 ( 24.79 )  + g( 4994 )  =  87.41
## Data ke- 6 
## Ŷ =  108.1491  +  2.2443 ( 22.59 )  +  0.0112 ( 5.22 )  +  -2.9042 ( 24.35 )  + g( 4995 )  =  88.11
## Data ke- 7 
## Ŷ =  108.173  +  2.2445 ( 22.57 )  +  0.0111 ( 9.42 )  +  -2.9053 ( 24.68 )  + g( 4996 )  =  87.22
## Data ke- 8 
## Ŷ =  108.2161  +  2.2446 ( 22.76 )  +  0.0112 ( 16.11 )  +  -2.907 ( 24.77 )  + g( 4997 )  =  87.61
## Data ke- 9 
## Ŷ =  108.225  +  2.2446 ( 22.68 )  +  0.0112 ( 7.2 )  +  -2.9074 ( 24.72 )  + g( 4998 )  =  87.5
## Data ke- 10 
## Ŷ =  108.2475  +  2.2448 ( 21.99 )  +  0.0112 ( 2.76 )  +  -2.9084 ( 24.15 )  + g( 4999 )  =  87.63

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.

4.4 Evaluasi Prediksi

Hasil Evaluasi Model Semiparametrik pada Data Ujicoba
Metrik Nilai
MAPE 2.343
RMSE 2.705

4.5 Interpretasi Hasil

Hasil evaluasi menunjukkan bahwa model regresi semiparametrik memiliki kinerja yang baik dalam mengestimasi dan memprediksi kelembapan relatif udara (RH2M). Hal ini ditunjukkan oleh nilai MAPE dan RMSE yang relatif rendah, yang mengindikasikan tingkat kesalahan prediksi yang kecil. Dengan demikian, model regresi semiparametrik mampu memberikan kemampuan fitting dan generalisasi yang memadai terhadap data klimatologis.

Keunggulan model regresi semiparametrik terletak pada komponen nonparametrik berbasis waktu yang mampu menangkap fluktuasi dan dinamika temporal yang kompleks. Penggunaan metode local kernel smoothing dengan local linear estimator memungkinkan pemodelan hubungan yang lebih fleksibel dan adaptif terhadap perubahan pola data dari waktu ke waktu. Oleh karena itu, pendekatan regresi semiparametrik dinilai sesuai untuk analisis risiko hidrometeorologi di Kota Langsa yang memiliki karakteristik data deret waktu yang nonlinier dan dinamis.