Regresi Nonparametrik dengan Spline

13.3. Regresi Nonparametrik dengan Spline

Seperti pada estimasi regresi nonparametrik dengan kernel, R juga menyediakan fasilitas estimasi regresi nonparametrik dengan spline, yaitu dengan menggunakan perintah smooth.spline. Misalkan diketahui ada n pasangan data ( x i , y i ) . Suatu penghalusan (smoothing) spline meminimumkan suatu kompromi antara fit (taksiran) dan derajat dari penghalus (smoothness) dalam bentuk

∑ w [ y − f ( x )] i 2 i i + λ ∫ ( f ′′ ( x )) 2 dx

pada semua fungsi (terukur yang dapat diturunkan dua kali) f . Ini adalah suatu spline kubik dengan knot‐knot pada x i , tetapi tidak menginterpolasi titik‐titik data untuk λ > 0 dan derajat dari fit dikontrol oleh λ . Penentuan λ dapat ditetapkan tertentu atau dipilih secara otomatis dengan metode cross‐validation.

Perintah dan argumen untuk aplikasi regresi nonparametrik dengan spline kubik pada R adalah sebagai berikut.

smooth.spline(x, y = NULL, w = NULL, df, spar = NULL, cv = FALSE, all.knots = FALSE, nknots = NULL, keep.data = TRUE, df.offset = 0, penalty = 1, control.spar = list())

Berikut ini adalah penjelasan tentang pilihan argumen yang dapat digunakan dalam perintah smooth.spline.

Argumen Keterangan

x a vector giving the values of the predictor variable, or a list or a two‐column matrix specifying x and y.

y responses. If y is missing, the responses are assumed to be specified by x. w optional vector of weights of the same length as x; defaults to all 1. df the desired equivalent number of degrees of freedom (trace of the smoother

matrix). spar smoothing parameter, typically (but not necessarily) in (0,1]. The coefficient λ of

the integral of the squared second derivative in the fit (penalized log likelihood) criterion is a monotone function of spar, see the details below.

cv ordinary (TRUE) or ‘generalized’ cross‐validation (GCV) when FALSE. all.knots if TRUE, all distinct points in x are used as knots. If FALSE (default), a subset of x[]

is used, specifically x[j] where the nknots indices are evenly spaced in 1:n, see also the next argument nknots.

nknots integer giving the number of knots to use when all.knots=FALSE. Per default, this is less than n, the number of unique x values for n > 49.

keep.data logical specifying if the input data should be kept in the result. If TRUE (as per default), fitted values and residuals are available from the result.

df.offset allows the degrees of freedom to be increased by df.offset in the GCV criterion. penalty the coefficient of the penalty for degrees of freedom in the GCV criterion.

control.spar optional list with named components controlling the root finding when the smoothing parameter spar is computed, i.e., missing or NULL, see below. Note that this is partly experimental and may change with general spar computation improvements!

Di bawah ini adalah script untuk implementasi regresi nonparametrik dengan spline kubik pada data cars yaitu variabel speed sebagai x dan dist sebagai y yang sudah tersedia di R, serta output yang dihasilkan.

> attach(cars) > plot(speed, dist, main = "data(cars) & smoothing splines") > cars.spl <‐ smooth.spline(speed, dist) > (cars.spl)

Call:

smooth.spline(x = speed, y = dist)

Smoothing Parameter spar= 0.7801305 lambda= 0.1112206 (11 iterations) Equivalent Degrees of Freedom (Df): 2.635278 Penalized Criterion: 4187.776 GCV: 244.1044

> lines(cars.spl, col = "blue") > lines(smooth.spline(speed, dist, df=10), lty=2, col = "red") > legend(5,120,c(paste("default [C.V.] => df =",round(cars.spl$df,1)), + "s( * , df = 10)"), col = c("blue","red"), lty = 1:2, bg='bisque')

Gambar

13.6. Grafik hasil regresi spline kubik pada data cars

Pengecekan kebaikan model regresi nonparametrik spline kubik ini dapat dilakukan dengan melihat analisis residual model. Berikut ini adalah script untuk plot residual dari model di atas.

> ## Residual (Tukey Anscombe) plot: > plot(residuals(cars.spl) ~ fitted(cars.spl)) > abline(h = 0, col="gray")

Output yang dihasilkan dari script ini adalah seperti gambar berikut ini.

Gambar

13.7. Grafik analisis residual dari regresi nonparametrik spline kubik

Hasil di atas menunjukkan bahwa residual cenderung mempunyai pola yang tidak homogen, yaitu cenderung membesar seiring meningkatnya nilai prediksi (fitted).

Sebagai tambahan, berikut ini adalah contoh script lain untuk implementasi regresi nonparametrik dengan spline kubik pada suatu data simulasi, dengan berbagai parameter smoothing (spar) dan prediksi pada data training dan testing.

# Contoh smoothing pada data simulasi simulasi y18 <‐ c(1:3,5,4,7:3,2*(2:5),rep(10,4))

xx <‐ seq(1,length(y18), len=201)

# Regresi spline kubik dengan x=1:18 dan y=y18 (s2 <‐ smooth.spline(y18)) # Smoothing parameter dgn GCV (s02 <‐ smooth.spline(y18, spar = 0.2)) # Smoothing parameter 0.2

# Plot perbandingan hasil regresi spline kubik dengan berbagai x dan spar plot(y18, main="Smoothing dengan spline kubik") lines(s2, col = "green") # Hasil prediksi dengan x lines(predict(s2, xx), col = “red”) # Hasil prediksi "GCV" dengan xx lines(predict(s02, xx), col = "blue") # Hasil prediksi "spar=0.2" dengan x

Output perbandingan grafik dari script ini dapat dilihat pada Gambar 13.8. Perhatikan pilihan warna pada script untuk mengetahui pilihan regresi kubik spline yang digunakan.

Gambar

13.8. Output regresi spline kubik pada data simulasi

Selain spline kubik, paket R juga menyediakan fasilitas untuk implementasi jenis spline yang lain. Ada banyak library yang dapat digunakan, salah satunya adalah library splines yang menyediakan fasilitas untuk B‐spline. Berikut ini adalah contoh script untuk implementasi regresi nonparametrik dengan B‐spline pada data cars, dengan variabel speed sebagai x dan dist sebagai y yang sudah tersedia di R.

library(splines) bs(cars$speed, df = 3) summary(fm3 <‐ lm(dist ~ bs(speed, df = 3), data = cars)) bs(cars$speed, df = 5) summary(fm5 <‐ lm(dist ~ bs(speed, df = 5), data = cars)) bs(cars$speed, df = 10) summary(fm10 <‐ lm(dist ~ bs(speed, df = 10), data = cars)) ## Contoh menyimpan dan menampilkan prediksi plot(cars, xlab = "dist (in)", ylab = "speed (lb)", main="Regresi B‐spline") ht <‐ seq(4, 25, length.out = 200) lines(ht, predict(fm3, data.frame(speed=ht)), col="blue") lines(ht, predict(fm5, data.frame(speed=ht)), col="red") lines(ht, predict(fm10, data.frame(speed=ht)), col="green")

Ada dua output utama yang akan dihasilkan dari script tersebut, yaitu hasil‐hasil estimasi B‐spline yang terdiri dari nilai prediksi, knots, dan koefisien dari model regresi spline, serta output grafik hasil prediksi. Berikut adalah sebagian hasil dari script diatas.

> bs(cars$speed, df = 5) 1 2 3 4 5

[1,] 0.000000000 0.0000000000 0.00000000 0.000000000 0.000000000 …… [50,] 0.000000000 0.0000000000 0.00000000 0.000000000 1.000000000 attr(,"degree") [1] 3 attr(,"knots") 33.33333% 66.66667%

attr(,"Boundary.knots") [1] 4 25 attr(,"intercept") [1] FALSE attr(,"class") [1] "bs" "basis"

Hasil output grafik hasil prediksi regresi nonparametrik dengan B‐spline untuk berbagai derajat spline dapat dilihat pada gambar berikut ini. Untuk mengetahui perbedaan efek dari derajat spline terhadap hasil smoothing yang diperoleh, perhatikan pilihan warna pada script diatas.

Gambar

13.9. Grafik hasil regresi B‐spline pada data cars