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
#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
Sebelum menentukan metode regresi, lakukan visualisasi data untuk melihat apakah hubungan antara X dan Y bersifat non-linear.
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.
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.
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.
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.
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 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 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 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)