Regresi Nonparametrik

Regresi nonparametrik digunakan ketika hubungan antara variabel terikat (Y) dan variabel bebas (X) tidak dapat dijelaskan oleh fungsi parametrik tertentu.(misalnya linear, polinomial)

Maka harus mendeteksi pola hubungan antara X dan Y

  1. Instalasi dan Load Library
#install.packages(c("ggplot2", "MASS", "np", "mgcv", "randomForest", "car"))
library(ggplot2)
library(MASS)
library(np)
## Warning: package 'np' was built under R version 4.4.2
## Nonparametric Kernel Methods for Mixed Datatypes (version 0.60-18)
## [vignette("np_faq",package="np") provides answers to frequently asked questions]
## [vignette("np",package="np") an overview]
## [vignette("entropy_np",package="np") an overview of entropy-based methods]
library(mgcv)
## Loading required package: nlme
## This is mgcv 1.9-1. For overview type 'help("mgcv-package")'.
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.4.2
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin
library(car)
## Loading required package: carData
  1. Visualisasi Data Untuk Mendeteksi Pola

Sebelum menentukan metode regresi, lakukan visualisasi data untuk melihat apakah hubungan antara X dan Y bersifat non-linear.

Scatter Plot

set.seed(42)
X <- sort(runif(100))
Y <- sin(2 * pi * X) + rnorm(100, 0, 0.1)

data <- data.frame(X, Y)
data
##                X           Y
## 1   0.0002388966  0.03369356
## 2   0.0015705542 -0.06851597
## 3   0.0039483388  0.18237835
## 4   0.0073341469  0.11035543
## 5   0.0078847387  0.05849708
## 6   0.0374310329  0.26067906
## 7   0.0389364911  0.31014098
## 8   0.0429887960  0.27581743
## 9   0.0824375581  0.19580883
## 10  0.0856120649  0.54083611
## 11  0.0899805163  0.49899996
## 12  0.1174873617  0.69147683
## 13  0.1346665972  0.80690646
## 14  0.1387101677  0.90529583
## 15  0.1404790941  0.69969934
## 16  0.1579052082  0.96745673
## 17  0.1712643304  0.91369086
## 18  0.1894739354  1.03240523
## 19  0.1974103423  1.03797559
## 20  0.2076589728  1.03690832
## 21  0.2085699569  0.86199766
## 22  0.2163854151  0.96876002
## 23  0.2337033986  1.05711407
## 24  0.2405447396  0.90288346
## 25  0.2554288243  0.94513542
## 26  0.2610879638  1.05567383
## 27  0.2712866147  1.06788697
## 28  0.2861395348  1.02070663
## 29  0.3052183695  0.85183749
## 30  0.3330719834  0.75686720
## 31  0.3334272113  1.01700103
## 32  0.3467482482  0.84664870
## 33  0.3590283059  0.78323457
## 34  0.3754899646  0.69283692
## 35  0.3795592405  0.56713038
## 36  0.3881082828  0.70773677
## 37  0.3902034671  0.61472444
## 38  0.3984854114  0.57718181
## 39  0.4317512489  0.50913216
## 40  0.4357715850  0.47487127
## 41  0.4469696281  0.46628001
## 42  0.4577417762  0.21479007
## 43  0.4622928225  0.29974579
## 44  0.4749970816  0.29556362
## 45  0.4793985642  0.01800258
## 46  0.5142117843 -0.17525591
## 47  0.5144077083 -0.20357658
## 48  0.5144129347 -0.23635681
## 49  0.5150633298 -0.08650620
## 50  0.5190959491 -0.05437528
## 51  0.5603327462 -0.24997110
## 52  0.5636468416 -0.28485564
## 53  0.5664884241 -0.50603414
## 54  0.5816040025 -0.30571250
## 55  0.6117786434 -0.71267225
## 56  0.6188382073 -0.66865624
## 57  0.6191592400 -0.72291227
## 58  0.6399787695 -0.78266322
## 59  0.6417455189 -0.75863836
## 60  0.6456318784 -0.78066605
## 61  0.6569922904 -0.83656097
## 62  0.6674265147 -0.85759538
## 63  0.6756072745 -0.94127581
## 64  0.6772768302 -0.94783152
## 65  0.6851697294 -1.08428755
## 66  0.6932048204 -0.97523359
## 67  0.7050647840 -1.01167220
## 68  0.7191122517 -0.71103768
## 69  0.7193558377 -1.11773242
## 70  0.7340943010 -0.98128469
## 71  0.7365883146 -1.14581405
## 72  0.7375956178 -1.14400786
## 73  0.7439746463 -0.98681322
## 74  0.7487953862 -1.09963527
## 75  0.7595442676 -0.99838470
## 76  0.7758233626 -1.02969173
## 77  0.7846927757 -1.03770320
## 78  0.8110551413 -1.12978332
## 79  0.8281584852 -1.00429686
## 80  0.8304476261 -0.85699663
## 81  0.8329160803 -0.81057121
## 82  0.8360042600 -0.90680062
## 83  0.8496897186 -0.81015509
## 84  0.8877549055 -0.53594037
## 85  0.9040313873 -0.42312095
## 86  0.9057381309 -0.66795288
## 87  0.9066014078 -0.56546498
## 88  0.9148060435 -0.38994015
## 89  0.9256447486 -0.49735021
## 90  0.9330341273 -0.41370031
## 91  0.9346722472 -0.40764774
## 92  0.9370754133 -0.47391466
## 93  0.9400145228 -0.41250811
## 94  0.9466682326 -0.33180184
## 95  0.9575765966 -0.30479569
## 96  0.9709666104 -0.07007348
## 97  0.9735399138 -0.21358808
## 98  0.9782264284 -0.17969793
## 99  0.9828171979 -0.03806686
## 100 0.9888917289 -0.17537551
ggplot(data, aes(x = X, y = Y)) +
  geom_point() +
  ggtitle("Scatter Plot untuk Deteksi Pola")

Berdasarkan scatter plot yang ditampilkan, terdapat pola hubungan yang tidak linear antara variabel X dan Y. Data menunjukkan tren gelombang sinusoidal, di mana nilai Y awalnya meningkat seiring bertambahnya X, mencapai puncak, kemudian menurun drastis sebelum kembali meningkat pada nilai X yang lebih tinggi. Pola ini menunjukkan bahwa hubungan antara variabel tidak bisa dijelaskan dengan model linear sederhana seperti regresi linear biasa (OLS).

Bentuk hubungan ini mengindikasikan bahwa metode regresi nonparametrik atau model yang dapat menangani pola non-linear, seperti LOESS regression, spline regression, atau model berbasis pohon keputusan (Random Forest Regression), lebih cocok untuk memodelkan hubungan antara X dan Y. Selain itu, adanya perubahan pola yang signifikan pada berbagai bagian scatter plot menandakan kemungkinan adanya interaksi atau efek lokal yang lebih kompleks, yang tidak dapat ditangkap oleh pendekatan linear konvensional.

Histogram

ggplot(data, aes(x = Y)) +
  geom_histogram(bins = 20, fill = "blue", alpha = 0.5) +
  ggtitle("Histogram Variabel Y")

Berdasarkan histogram yang ditampilkan, distribusi variabel Y menunjukkan pola yang tidak normal dan bersifat multimodal dengan beberapa puncak frekuensi di berbagai rentang nilai. Hal ini mengindikasikan bahwa data memiliki lebih dari satu konsentrasi nilai, yang mungkin disebabkan oleh adanya pola non-linear atau variabel tersembunyi yang memengaruhi distribusi. Selain itu, distribusi yang tidak simetris juga menunjukkan bahwa asumsi normalitas pada regresi linear mungkin tidak terpenuhi.

Pola distribusi ini memberikan indikasi bahwa pendekatan regresi parametrik seperti regresi linear biasa (OLS) mungkin kurang sesuai untuk memodelkan hubungan antara X dan Y. Sebagai alternatif, metode regresi nonparametrik, seperti Kernel Regression, LOESS Regression, atau Generalized Additive Model (GAM), lebih disarankan karena mampu menangkap pola hubungan yang lebih kompleks tanpa asumsi bentuk fungsi tertentu.

  1. Uji Keberlakuan Model Parametrik

Uji Normalitas Residual (Shapiro-Wilk)

model <- lm(Y ~ X, data = data)
shapiro.test(residuals(model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model)
## W = 0.92202, p-value = 1.803e-05

Jika p-value < 0.05, maka residual tidak normal → Model linear kurang cocok.

Uji Homoskedastisitas (Breusch-Pagan Test)

library(lmtest)
## Warning: package 'lmtest' was built under R version 4.4.2
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.4.2
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
bptest(model)
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 0.79967, df = 1, p-value = 0.3712

Jika p-value < 0.05, terjadi heteroskedastisitas → Gunakan regresi nonparametrik.

Uji Linearitas (Ramsey RESET Test)

resettest(model, power = 2)
## 
##  RESET test
## 
## data:  model
## RESET = 0.071811, df1 = 1, df2 = 97, p-value = 0.7893

Jika p-value < 0.05, hubungan tidak linear → Gunakan regresi nonparametrik.

Dalam analisis regresi, bentuk kurva dari fungsi regresi sangat bergantung pada hubungan antara variabel independen (X) dan variabel dependen (Y). Berikut adalah beberapa bentuk kurva regresi yang umum digunakan, beserta sintaks dalam R untuk setiap model.

Regresi Linear Sederhana (Linear Regression)

Regresi linear digunakan ketika hubungan antara X dan Y bersifat linear (garis lurus).

model_linear <- lm(Y ~ X, data = data)
summary(model_linear)
## 
## Call:
## lm(formula = Y ~ X, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.90250 -0.49913  0.03393  0.43511  0.82412 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   0.8367     0.0996    8.40 3.52e-13 ***
## X            -1.7286     0.1648  -10.49  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4951 on 98 degrees of freedom
## Multiple R-squared:  0.5289, Adjusted R-squared:  0.5241 
## F-statistic:   110 on 1 and 98 DF,  p-value: < 2.2e-16
# Plot hasil regresi linear
plot(data$X, data$Y, main="Regresi Linear", pch=16)
abline(model_linear, col="red", lwd=2)

Regresi Kuadratik (Quadratic Regression)

Regresi kuadratik digunakan ketika hubungan antara X dan Y berbentuk parabola (U atau U terbalik).

model_quad <- lm(Y ~ X + I(X^2), data = data)
summary(model_quad)
## 
## Call:
## lm(formula = Y ~ X + I(X^2), data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.92914 -0.50251  0.03666  0.44449  0.80078 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   0.8636     0.1418   6.092 2.25e-08 ***
## X            -1.8959     0.6459  -2.935  0.00416 ** 
## I(X^2)        0.1665     0.6214   0.268  0.78929    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4974 on 97 degrees of freedom
## Multiple R-squared:  0.5293, Adjusted R-squared:  0.5196 
## F-statistic: 54.53 on 2 and 97 DF,  p-value: < 2.2e-16
# Plot hasil regresi kuadratik
x_range <- seq(min(data$X), max(data$X), length=100)
y_pred <- predict(model_quad, newdata=data.frame(X=x_range))
plot(data$X, data$Y, main="Regresi Kuadratik", pch=16)
lines(x_range, y_pred, col="blue", lwd=2)

Regresi Kubik (Cubic Regression)

Regresi kubik digunakan jika hubungan X dan Y lebih kompleks dengan dua titik lengkungan.

model_cubic <- lm(Y ~ X + I(X^2) + I(X^3), data = data)
summary(model_cubic)
## 
## Call:
## lm(formula = Y ~ X + I(X^2) + I(X^3), data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.42557 -0.07885  0.00104  0.07554  0.25387 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -0.11689    0.04227  -2.766  0.00682 ** 
## X            11.63527    0.37584  30.958  < 2e-16 ***
## I(X^2)      -34.40895    0.88649 -38.815  < 2e-16 ***
## I(X^3)       23.08072    0.58323  39.574  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1202 on 96 degrees of freedom
## Multiple R-squared:  0.9728, Adjusted R-squared:  0.972 
## F-statistic:  1145 on 3 and 96 DF,  p-value: < 2.2e-16
# Plot hasil regresi kubik
x_range <- seq(min(data$X), max(data$X), length=100)
y_pred <- predict(model_cubic, newdata=data.frame(X=x_range))
plot(data$X, data$Y, main="Regresi Kubik", pch=16)
lines(x_range, y_pred, col="green", lwd=2)

plot(data$X, data$Y, main="Scatter Plot untuk Menentukan Model", pch=16)