Spline dalam regresi nonparametrik digunakan untuk memodelkan hubungan antar variabel dengan menggunakan fungsi polinomial di berbagai interval. Spline memungkinkan fleksibilitas yang tinggi dalam penyesuaian kurva untuk menjaga kekasaran kurva pada tingkat yang dapat diterima (Eubank, 1999).
Dalam berbagai kebutuhan, Spline banyak digunakan untuk interpolasi/fitting data. Berikut adalah beberapa yang umum digunakan:
Cubic spline adalah jenis spline yang paling umum digunakan, terutama dalam fitting data. Cubic spline adalah serangkaian fungsi polinomial derajat tiga yang terhubung pada titik-titik tertentu (disebut knots) sehingga fungsi spline dan turunannya kontinu di seluruh rentang data.
Untuk setiap interval \([x_i, x_{i+1}]\), cubic spline \(S_i(x)\) dapat dituliskan sebagai:
\[ S_i(x) = a_i + b_i (x - x_i) + c_i (x - x_i)^2 + d_i (x - x_i)^3 \]
Dimana:
\(a_i\), \(b_i\), \(c_i\), dan \(d_i\) adalah koefisien yang ditentukan oleh kondisi-kondisi berikut:
Keterhubungan: \(S_i(x_i) = y_i\) dan \(S_i(x_{i+1}) = y_{i+1}\)
Keterbatasan pertama turunan: \(S_i'(x_{i+1}) = S_{i+1}'(x_{i+1})\)
Keterbatasan kedua turunan: \(S_i''(x_{i+1}) = S_{i+1}''(x_{i+1})\)
Kondisi batas (biasanya ditentukan, seperti batas derajat kedua atau bebas dari batas luar)
B-Spline (Basis Spline) adalah generalisasi dari cubic spline yang lebih fleksibel dan dapat digunakan untuk interpolasi atau smoothing data. B-Spline memiliki beberapa derajat dan knot yang menentukan polinomial spline. Fungsi B-spline dibentuk menggunakan fungsi basis B-spline.
Fungsi Basis B-spline
Untuk interval \([x_i, x_{i+1}]\), fungsi basis B-spline \(N_{i,p}(x)\) adalah fungsi polinomial yang ditentukan oleh derajat \(p\) dan knot vector \(\{t_j\}\). Fungsi basis B-spline memiliki bentuk rekursif, yaitu:
Basis Fungsi B-spline Derajat 0
Untuk derajat \(p = 0\), fungsi basis B-spline \(N_{i,0}(x)\) adalah:
\[ N_{i,0}(x) = \begin{cases} 1 & \text{if } t_i \leq x < t_{i+1} \\ 0 & \text{otherwise} \end{cases} \]
Basis Fungsi B-spline Derajat \(p\)
Untuk derajat \(p > 0\), fungsi basis B-spline \(N_{i,p}(x)\) didefinisikan secara rekursif sebagai:
\[ N_{i,p}(x) = \frac{x - t_i}{t_{i+p} - t_i} N_{i,p-1}(x) + \frac{t_{i+p+1} - x}{t_{i+p+1} - t_{i+1}} N_{i+1,p-1}(x) \]
dimana \(N_{i,p-1}(x)\) adalah fungsi basis B-spline derajat \(p-1\) yang lebih rendah.
Keterangan
Penjelasan Rumus
Fungsi Basis B-spline Derajat 0: Fungsi basis B-spline derajat 0 adalah fungsi langkah yang aktif di interval antara dua knot.
Fungsi Basis B-spline Derajat \(p\): Fungsi basis B-spline derajat \(p\) diperoleh dengan menggabungkan dua fungsi basis B-spline derajat \(p-1\) menggunakan parameter yang dinyatakan dalam rumus rekursif.
Knot Vector: Knot vector menentukan batas-batas di mana fungsi basis berubah. Knot yang sama pada batas-batas interval memastikan bahwa spline kontinu dan memiliki turunan yang sesuai pada batasnya.
Natural spline adalah jenis cubic spline dimana kedua turunan pada ujung-ujung rentang data adalah nol (yaitu, spline memiliki batas kedua turunan yang nol pada batas luar).
Natural spline meminimalkan interpolasi di luar batas data dan memastikan bahwa turunan kedua pada batas interval adalah nol. Natural spline adalah jenis spline yang memastikan bahwa spline tidak melengkung berlebihan di luar batas data.
Fungsi basis natural spline adalah spline kubik yang ditentukan dengan basis fungsi B-spline dengan tambahan syarat turunan kedua pada batas interval adalah nol.
Rumus matematis untuk natural spline dapat dituliskan dalam dua langkah:
Basis Fungsi B-spline: Basis fungsi B-spline untuk natural spline menggunakan knot vector \(\{t_j\}\) yang didefinisikan sama dengan B-spline cubic spline.
Fungsi basis B-spline derajat 3 (cubic spline) untuk interval \([t_i, t_{i+1}]\) adalah:
\[ N_{i,3}(x) = \frac{(x - t_i)^3}{(t_{i+3} - t_i)} - \frac{(x - t_i)^2}{(t_{i+3} - t_i)} \frac{(x - t_{i+1})}{(t_{i+2} - t_{i+1})} \]
Kondisi Natural Spline: Fungsi natural spline adalah cubic spline yang memenuhi syarat tambahan bahwa turunan kedua pada batas interval adalah nol.
Jika \(S(x)\) adalah fungsi natural spline, maka:
\[ S''(t_0) = 0 \] \[ S''(t_{n}) = 0 \]
Dimana \(t_0\) dan \(t_n\) adalah batas interval, dan \(S''(x)\) adalah turunan kedua dari spline.
Penjelasan Rumus
Basis Fungsi B-spline Derajat 3: Fungsi basis B-spline derajat 3 adalah fungsi polinomial kubik yang didefinisikan di antara knot dan diinterpolasi di luar batas.
Kondisi Natural Spline: Natural spline memastikan bahwa spline memiliki turunan kedua yang nol pada batas interval. Ini membantu menghindari overfitting di luar data dan memberikan kelancaran tambahan pada spline.
pacman::p_load(splines, ggplot2, writexl)
Data yang digunakan adalah data TBC (tuberkulosis) Indonesia dari tahun 2000 hingga 2023 yang kemudian digunakan sebagai dasar prediksi 2024-2044 dengan tahun 2045 sudah dipasang angka target oleh pemerintah (benchmark).
# Remove rows with missing Year values
df <- df[!is.na(df$Year), ]
# Remove rows with missing Estimated_TB values for fitting
df_fit <- df[!is.na(df$Estimated_TB), ]
Secara ringkas:
Cubic Spline adalah bentuk regresi spline yang menggunakan polinomial orde 3 untuk kemulusan tiap segmen.
B-spline adalah bentuk lebih fleksibel dari cubic spline, dimana dapat diatur jumlah knots secara eksplisit.
Natural spline adalah bentuk spesifik dari regresi spline yang memiliki pembatasan linier di bagian ujung (boundary constraints) sehingga mengurangi overfitting dibandingkan cubic spline atau B-spline.
# Predict missing values
df$Cubic_Spline_Imputed <- predict(cubic_spline_fit, newdata = df)
df$B_Spline_Imputed <- predict(b_spline_fit, newdata = df)
df$Natural_Spline_Imputed <- predict(natural_spline_fit, newdata = df)
# Remove rows with any remaining NA before plotting
df_plot <- df[complete.cases(df[, c("Cubic_Spline_Imputed", "B_Spline_Imputed", "Natural_Spline_Imputed")]), ]
RMSE
Root Mean Squared Error (RMSE) adalah ukuran statistik yang digunakan untuk mengevaluasi seberapa baik model prediktif atau regresi sesuai dengan data yang sebenarnya. RMSE mengukur seberapa besar rata-rata deviasi antara nilai yang diprediksi oleh model dan nilai aktualnya (Hair dkk, 2006).
RMSE adalah ukuran error yang digunakan untuk mengukur perbedaan antara nilai yang diprediksi dan nilai yang sebenarnya. RMSE adalah akar kuadrat dari rata-rata kuadrat error. Semakin kecil nilai RMSE, semakin baik model dalam memprediksi nilai yang sebenarnya.
Rumus untuk RMSE adalah:
\[ \text{RMSE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2} \] dimana:
R-square
R-squared (\(R^2\)) memberikan gambaran umum tentang seberapa baik model dalam menjelaskan variasi dalam data dibandingkan dengan model yang hanya menggunakan rata-rata sebagai prediksi.
Rumus untuk R-squared adalah (Gujarati & Porter, 2009):
\[ R^2 = 1 - \frac{RSS}{TSS} \]
dimana:
R-squared memberikan gambaran umum tentang seberapa baik model dalam menjelaskan variasi dalam data dibandingkan dengan model yang hanya menggunakan rata-rata sebagai prediksi.
MAD
MAD adalah rata-rata dari nilai absolut selisih setiap data terhadap rata-rata dataset.
Rumusnya adalah:
\[ MAD = \frac{\sum_{i=1}^{n} |x_i - \bar{x}|}{n} \]
dengan:
\(x_i\) adalah nilai individu dalam dataset,
\(\bar{x}\) adalah rata-rata dari dataset,
\(n\) adalah jumlah data.
Menghitung goodness-of-fit metrics tiap model
compute_metrics <- function(actual, predicted) {
rmse <- sqrt(mean((actual - predicted)^2, na.rm = TRUE))
mad <- mean(abs(actual - predicted), na.rm = TRUE)
ss_total <- sum((actual - mean(actual, na.rm = TRUE))^2, na.rm = TRUE)
ss_residual <- sum((actual - predicted)^2, na.rm = TRUE)
r_squared <- 1 - (ss_residual / ss_total)
return(c(RMSE = rmse, MAD = mad, R2 = r_squared))
}
Ukuran metrik setiap model
metrics_cubic_spline <- compute_metrics(df_fit$Estimated_TB, predict(cubic_spline_fit, newdata = df_fit))
metrics_b_spline <- compute_metrics(df_fit$Estimated_TB, predict(b_spline_fit, newdata = df_fit))
metrics_natural_spline <- compute_metrics(df_fit$Estimated_TB, predict(natural_spline_fit, newdata = df_fit))
comparison_table <- data.frame(
Model = c("Cubic Spline", "B-Spline", "Natural Spline"),
RMSE = c(metrics_cubic_spline["RMSE"], metrics_b_spline["RMSE"], metrics_natural_spline["RMSE"]),
MAD = c(metrics_cubic_spline["MAD"], metrics_b_spline["MAD"], metrics_natural_spline["MAD"]),
R2 = c(metrics_cubic_spline["R2"], metrics_b_spline["R2"], metrics_natural_spline["R2"])
)
print(comparison_table)
## Model RMSE MAD R2
## 1 Cubic Spline 10.138652 6.908274 0.9676241
## 2 B-Spline 8.238697 5.463191 0.9786214
## 3 Natural Spline 13.656244 8.546090 0.9412613
Berdasarkan hasil perbandingan tiga model spline—Cubic Spline, B-Spline, dan Natural Spline:
B-Spline memiliki kesalahan terkecil (RMSE & MAD) dan koefisien determinasi (R²) terbesar dibandingkan model lainnya. Model ini paling akurat dalam menangkap pola data dan memiliki prediksi yang lebih stabil.
Cubic Spline masih menunjukkan performa yang cukup baik, tetapi tidak sebaik B-Spline. Model ini mampu menangkap tren dengan cukup baik, tetapi lebih rentan terhadap variasi lokal dibandingkan B-Spline.
Natural Spline memiliki kesalahan terbesar (RMSE & MAD) dan koefisien determinasi terendah (R²) dibandingkan model lainnya. Model ini mengalami kesulitan dalam menangkap pola data TB dengan baik. Hal ini mungkin disebabkan oleh pembatasan linier di ujung spline, yang menyebabkan model kurang fleksibel.
ggplot(df_plot, aes(x = Year)) +
geom_point(aes(y = Estimated_TB), color = "black", alpha = 0.5, size = 2) +
geom_line(aes(y = Cubic_Spline_Imputed, color = "Cubic Spline"), size = 1) +
geom_line(aes(y = B_Spline_Imputed, color = "B-Spline"), size = 1) +
geom_line(aes(y = Natural_Spline_Imputed, color = "Natural Spline"), size = 1) +
scale_color_manual(values = c("Cubic Spline" = "purple", "B-Spline" = "orange", "Natural Spline" = "brown")) +
labs(title = "Comparison of Cubic Spline, B-Spline, and Natural Spline Models", x = "Year", y = "Estimated TB Cases", color = "Model") +
theme_minimal()
Export Data
write_xlsx(df, "dataTBC Pred.xls")
Kesimpulan
Kelebihan B-Spline:
Lebih fleksibel daripada cubic spline, karena memungkinkan kontrol lebih lanjut atas posisi knots.
Dapat menangani perubahan pola data dengan lebih baik dibanding spline biasa.
Membantu menghindari overfitting, terutama jika jumlah knots disesuaikan dengan baik.
Kelebihan Natural Spline:
Lebih stabil di bagian ujung data dibandingkan cubic spline atau B-spline.
Menghindari osilasi (pola naik-turun berulang) yang berlebihan dengan memaksakan kondisi linier di luar knots.
Bekerja lebih baik untuk data yang memiliki tren panjang tanpa fluktuasi tajam.
[1] Damodar, Gujarati & Dawn C. Porter. (2009). Basic Econometric 5th Edition. McGraw–Hill: New York.
[2] Eubank, R.L. (1999). Nonparametric Regression and Spline Smoothing. 2nd ed.. Dekker: New York.
[3] Hair, J. F., dkk. (2006). Multivariate Data Analysis Sixth Edition. Pearson Education Inc: New Jersey.
Direktorat Statistik Kesejahteraan Rakyat, BPS, saptahas@bps.go.id