1. Simulasi Data

Data disimulasikan dengan hubungan non-linier (kuadratik) antara x dan y.

set.seed(123) #digunakan untuk mempertahankan data simulasi tsb
n <- 100
x <- seq(0, 10, length.out = n) #mendefinisikan variabel bebas, sebanyak 100 baris
y <- 5 + 2*x - 0.3*x^2 + rnorm(n, mean = 0, sd = 2) #rnorm adalah data distribusi normal yg dibangkitkan scr acak
data <- data.frame(x = x, y = y)

head(data)
##           x        y
## 1 0.0000000 3.879049
## 2 0.1010101 4.738604
## 3 0.2020202 8.509213
## 4 0.3030303 5.719529
## 5 0.4040404 6.017682
## 6 0.5050505 9.363708
#regresi polinomial adalah model regresi yang dimana variabel responnya berbentuk kuadratik 

Interpretasi:

Berdasarkan output di atas, diketahui data simulasi berhasil dibuat sebanyak 100 observasi, dengan variabel x tersusun merata dari nilai 0 hingga 10. Sementara itu, variabel y dibentuk mengikuti persamaan kuadratik yang ditambahkan komponen acak berdistribusi normal dengan rata-rata 0 dan simpangan baku 2.

2. Pencocokan Model

Tiga model dicocokkan sebagai pembanding: linier, polinomial derajat 2, dan derajat 3.

model_linier <- lm(y ~ x, data = data)
model_poli2  <- lm(y ~ poly(x, 2, raw = TRUE), data = data)
model_poli3  <- lm(y ~ poly(x, 3, raw = TRUE), data = data)

summary(model_linier)
## 
## Call:
## lm(formula = y ~ x, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.4317 -1.4051 -0.0466  2.2166  6.6109 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  9.88171    0.55369  17.847   <2e-16 ***
## x           -0.95028    0.09566  -9.934   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.789 on 98 degrees of freedom
## Multiple R-squared:  0.5017, Adjusted R-squared:  0.4967 
## F-statistic: 98.68 on 1 and 98 DF,  p-value: < 2.2e-16
summary(model_poli2)
## 
## Call:
## lm(formula = y ~ poly(x, 2, raw = TRUE), data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.8136 -1.1977 -0.0533  1.3549  4.3891 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              5.33982    0.53777   9.929   <2e-16 ***
## poly(x, 2, raw = TRUE)1  1.80266    0.24855   7.253    1e-10 ***
## poly(x, 2, raw = TRUE)2 -0.27529    0.02405 -11.447   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.829 on 97 degrees of freedom
## Multiple R-squared:  0.788,  Adjusted R-squared:  0.7837 
## F-statistic: 180.3 on 2 and 97 DF,  p-value: < 2.2e-16
summary(model_poli3)
## 
## Call:
## lm(formula = y ~ poly(x, 3, raw = TRUE), data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.7866 -1.1996 -0.0497  1.3386  4.3777 
## 
## Coefficients:
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              5.282801   0.708433   7.457 3.93e-11 ***
## poly(x, 3, raw = TRUE)1  1.872854   0.616613   3.037  0.00307 ** 
## poly(x, 3, raw = TRUE)2 -0.292931   0.143693  -2.039  0.04424 *  
## poly(x, 3, raw = TRUE)3  0.001176   0.009443   0.125  0.90117    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.838 on 96 degrees of freedom
## Multiple R-squared:  0.7881, Adjusted R-squared:  0.7815 
## F-statistic:   119 on 3 and 96 DF,  p-value: < 2.2e-16

Interpretasi:

Berdasarkan output di atas, dapat dilihat bahwa - Model Linier : Hasil regresi linier menunjukkan nilai R^2≈0.5017, artinya model hanya mampu menjelaskan sekitar 50,17% variasi data. Slope sebesar -0.95058 signifikan, namun arah hubungan negatif ini tidak sesuai dengan pola kuadratik yang sebenarnya. -Model Polinomial derajat 2 : Model ini memberikan peningkatan yang signifikan dengan R^2≈0.788, sehingga mampu menjelaskan hampir 78,8% variasi data. Koefisien kuadratik (-0,27529) dan linear (1,80266) keduanya signifikan, sesuai dengan persamaan simulasi yang dirancang. -Model Polinomial derajat 3 : Nilai R^2 hanya sedikit lebih tinggi (0,7881) , artinya model hanya mampu menjelaskan sekitar 78,81% variasi data dibanding derajat 2, sehingga tidak memberikan peningkatan berarti. Koefisien kubik (0,001176) tidak signifikan (p-value ≈ 0.90), menandakan bahwa tambahan suku kubik tidak berkontribusi dalam menjelaskan data.

3. Perbandingan Model

3.1 Uji ANOVA Bertingkat

anova(model_linier, model_poli2, model_poli3)
## Analysis of Variance Table
## 
## Model 1: y ~ x
## Model 2: y ~ poly(x, 2, raw = TRUE)
## Model 3: y ~ poly(x, 3, raw = TRUE)
##   Res.Df    RSS Df Sum of Sq        F Pr(>F)    
## 1     98 762.42                                 
## 2     97 324.33  1    438.09 129.6931 <2e-16 ***
## 3     96 324.28  1      0.05   0.0155 0.9012    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Interpretasi:

Berdasarkan output di atas, dapat dapat diketahui model linier dibandingkan dengan model polinomial derajat 2 menunjukkan penurunan Residual Sum of Squares (RSS) yang sangat besar, dari 762,42 menjadi 324,33, dengan nilai F sebesar 129,69 dan p-value < 0,001, sehingga penambahan suku kuadratik terbukti signifikan dan diperlukan untuk menjelaskan variasi data. Namun, ketika model ditingkatkan dari derajat 2 ke derajat 3, penurunan RSS hampir tidak terlihat (hanya 0,05, dari 324,33 menjadi 324,28), dengan nilai F yang sangat kecil (0.0155) dan p-value sebesar 0,9012, sehingga tambahan suku kubik tidak memberikan kontribusi berarti terhadap model.

3.2 Perbandingan AIC

AIC(model_linier, model_poli2, model_poli3)
##              df      AIC
## model_linier  3 492.9204
## model_poli2   4 409.4469
## model_poli3   5 411.4307

Interpretasi:

Berdasarkan output di atas, dapat dapat diketahui perbandingan nilai AIC menunjukkan bahwa model linier memiliki AIC tertinggi sebesar 492,92, sehingga kualitasnya paling rendah dalam menjelaskan data. Model polinomial derajat 2 justru memiliki AIC terendah, yaitu 409,45, menandakan model ini paling efisien dan optimal. Sementara itu, model polinomial derajat 3 menghasilkan AIC sebesar 411,43, sedikit lebih besar daripada derajat 2, sehingga tidak memberikan peningkatan yang berarti. Dengan demikian, model polinomial derajat 2 menjadi pilihan terbaik karena mampu menjelaskan data dengan baik sekaligus tetap sederhana dibandingkan model derajat 3.

4. Visualisasi Perbandingan Model

data$pred_linier <- predict(model_linier)
data$pred_poli2  <- predict(model_poli2)
data$pred_poli3  <- predict(model_poli3)

ggplot(data, aes(x = x, y = y)) +
  geom_point(alpha = 0.5) +
  geom_line(aes(y = pred_linier, color = "Linier"), linewidth = 1) +
  geom_line(aes(y = pred_poli2, color = "Polinomial derajat 2"), linewidth = 1) +
  geom_line(aes(y = pred_poli3, color = "Polinomial derajat 3"), linewidth = 1) +
  labs(title = "Perbandingan Regresi Linier vs Polinomial",
       x = "X", y = "Y", color = "Model") +
  theme_minimal()

### Interpretasi: Berdasarkan output di atas, dapat dapat diketahui bahwa model linier menghasilkan garis lurus menurun yang jelas tidak sesuai dengan pola data yang berbentuk kuadratik. Sebaliknya, model polinomial derajat 2 dan derajat 3 membentuk kurva parabola yang lebih sesuai dengan distribusi data. Kedua garis polinomial tampak hampir sama dan saling menutupi, sehingga menunjukkan bahwa penambahan suku kubik pada model derajat 3 tidak memberikan peningkatan yang berarti dibandingkan dengan model derajat 2. Oleh karena itu, model polinomial derajat 2 sudah cukup optimal untuk menggambarkan hubungan antara variabel x dan y.

5. Evaluasi dengan RMSE

rmse <- function(actual, predicted) sqrt(mean((actual - predicted)^2))

data.frame(
  Model = c("Linier", "Polinomial derajat 2", "Polinomial derajat 3"),
  RMSE  = c(rmse(data$y, data$pred_linier),
            rmse(data$y, data$pred_poli2),
            rmse(data$y, data$pred_poli3))
)
##                  Model     RMSE
## 1               Linier 2.761195
## 2 Polinomial derajat 2 1.800917
## 3 Polinomial derajat 3 1.800772

Interpretasi:

Berdasarkan output di atas, dapat dapat diketahui bahwa perhitungan RMSE memperlihatkan bahwa model linier memiliki kesalahan prediksi paling besar dengan nilai sekitar 2,761195. Model polinomial derajat 2 mampu menurunkan kesalahan secara signifikan menjadi 1,800917, sehingga jauh lebih tepat dalam menggambarkan pola data. Sementara itu, model polinomial derajat 3 menghasilkan RMSE yang hampir identik dengan derajat 2 (1,800772), sehingga tidak memberikan peningkatan akurasi yang berarti. Oleh karena itu, model polinomial derajat 2 menjadi pilihan terbaik karena mampu mencapai tingkat akurasi tinggi sekaligus tetap sederhana dibandingkan dengan model derajat 3.

6. Pemilihan Derajat Optimal via Cross-Validation

Skema 10-fold cross-validation diulang 5 kali untuk menguji derajat polinomial 1 sampai 6.

names(data)
## [1] "x"           "y"           "pred_linier" "pred_poli2"  "pred_poli3"
library(caret)

set.seed(42)

kontrol <- trainControl(
  method = "repeatedcv",
  number = 10,
  repeats = 5
)

derajat_max <- 6

hasil_cv <- data.frame(
  derajat = integer(),
  RMSE = numeric()
)

for (d in 1:derajat_max) {
  
  data_cv <- data
  
  # Membuat variabel polynomial
  if (d == 1) {
    data_cv$x_poly <- data_cv$x
  } else {
    poly_x <- poly(data_cv$x, degree = d, raw = TRUE)
    
    data_cv$x_poly <- poly_x[, 1]
    
    for (j in 2:d) {
      data_cv[[paste0("x_poly", j)]] <- poly_x[, j]
    }
  }
  
  # Formula sesuai derajat
  if (d == 1) {
    formula_model <- y ~ x_poly
  } else {
    variabel <- paste0("x_poly", 2:d)
    formula_model <- as.formula(
      paste("y ~ x_poly +", paste(variabel, collapse = " + "))
    )
  }
  
  model_cv <- train(
    formula_model,
    data = data_cv,
    method = "lm",
    trControl = kontrol
  )
  
  hasil_cv <- rbind(
    hasil_cv,
    data.frame(
      derajat = d,
      RMSE = min(model_cv$results$RMSE)
    )
  )
}

hasil_cv
##   derajat     RMSE
## 1       1 2.757805
## 2       2 1.825068
## 3       3 1.859968
## 4       4 1.877628
## 5       5 1.871701
## 6       6 1.880719
derajat_optimal <- hasil_cv$derajat[which.min(hasil_cv$RMSE)]
cat("Derajat optimal berdasarkan CV:", derajat_optimal, "\n")
## Derajat optimal berdasarkan CV: 2
ggplot(hasil_cv, aes(x = derajat, y = RMSE)) +
  geom_line(
    color = "steelblue",
    linewidth = 1
  ) +
  geom_point(
    size = 3,
    color = "steelblue"
  ) +
  geom_vline(
    xintercept = derajat_optimal,
    linetype = "dashed",
    color = "firebrick"
  ) +
  scale_x_continuous(
    breaks = 1:derajat_max
  ) +
  labs(
    title = "Pemilihan Derajat Optimal via 10-Fold Cross-Validation",
    x = "Derajat Polinomial",
    y = "RMSE Rata-rata (Validasi Silang)"
  ) +
  theme_minimal()

### Interpretasi: Berdasarkan output di atas, dapat dapat diketahui bahwa validasi silang dengan repeated 10-fold cross-validation memperlihatkan bahwa model polinomial derajat 2 memiliki RMSE rata-rata terendah (≈1,83), sehingga menjadi model yang paling optimal. Model linier menghasilkan RMSE tertinggi (≈2,76), menandakan performa prediksinya paling buruk. Sementara itu, model polinomial derajat 3 hingga 6 justru menunjukkan kenaikan RMSE bertahap (≈1,86-1,88), yang berarti peningkatan kompleksitas tidak memberikan manfaat tambahan. Grafik RMSE terhadap derajat polinomial juga menampilkan titik minimum yang jelas pada derajat 2, dengan garis vertikal putus-putus menandai posisi optimal.

7. Model Final

model_final <- lm(y ~ poly(x, derajat_optimal, raw = TRUE), data = data)
summary(model_final)
## 
## Call:
## lm(formula = y ~ poly(x, derajat_optimal, raw = TRUE), data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.8136 -1.1977 -0.0533  1.3549  4.3891 
## 
## Coefficients:
##                                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                            5.33982    0.53777   9.929   <2e-16 ***
## poly(x, derajat_optimal, raw = TRUE)1  1.80266    0.24855   7.253    1e-10 ***
## poly(x, derajat_optimal, raw = TRUE)2 -0.27529    0.02405 -11.447   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.829 on 97 degrees of freedom
## Multiple R-squared:  0.788,  Adjusted R-squared:  0.7837 
## F-statistic: 180.3 on 2 and 97 DF,  p-value: < 2.2e-16

Interpretasi:

Berdasarkan output di atas, dapat diketahui bahwa model final memperlihatkan bahwa polinomial derajat 2 memang menjadi pilihan terbaik. Koefisien linear (≈1,80266) dan kuadratik (≈-0,27529) keduanya signifikan dengan p-value < 0,001, sehingga benar-benar berperan dalam menjelaskan variasi data. Intercept sebesar 5,34 juga signifikan. Nilai R^2 sebesar 0,788 menunjukkan bahwa sekitar 78,8% variasi data dapat dijelaskan oleh model ini, jauh lebih baik dibandingkan model linier.

Catatan

  • poly(x, derajat, raw = TRUE) digunakan agar koefisien dapat diinterpretasi langsung sebagai \(\beta_1 x + \beta_2 x^2 + \dots\)
  • Untuk derajat tinggi (\(\geq 4\)), sebaiknya x distandardisasi terlebih dahulu (scale(x)) agar model lebih stabil secara numerik.
  • Pertimbangkan aturan one-standard-error rule: pilih derajat terkecil dengan RMSE \(\leq\) (RMSE minimum + 1 SD) untuk model yang lebih sederhana namun performanya setara β_1 x+β_2 x^2+⋯