Lembaga : Universitas Islam Negeri Maulana Malik Ibrahim Malang
Jurusan : Teknik Informatika
Smoothing splines adalah pendekatan yang ampuh untuk memperkirakan hubungan fungsional antara prediktor X dan respons Y. Smoothing splines dapat ditampung baik menggunakan fungsi smooth.spline (dalam paket stats) atau fungsi ss (dalam paket npreg). Dokumen ini memberikan latar belakang teoritis tentang smoothing splines, serta contoh-contoh yang menggambarkan bagaimana menggunakan fungsi smooth.spline dan ss. Seperti yang saya tunjukkan dalam tutorial ini, kedua fungsi memiliki sintaks yang sangat mirip, tetapi fungsi ss menawarkan beberapa opsi tambahan. Dibandingkan dengan fungsi smooth.spline, fungsi ss memiliki
lebih banyak metode pemilihan parameter penghalusan lebih banyak jenis spline (linier, kubik, quintic) opsi untuk batasan periodisitas opsi untuk nilai simpul yang ditentukan pengguna ringkasan yang sesuai dan metode plot
Untuk melihat bagaimana kinerja fungsi-fungsi ini dalam praktiknya, mari kita lihat contoh simulasinya. Secara khusus, mari simulasikan beberapa data dengan hubungan fungsional (berkala) yang memiliki beberapa gangguan.
library(readxl)
covidmobilityjakarta <- read_excel(path = "DataCovid19 DKI Jakarta.xlsx")
covidmobilityjakarta
plot(covidmobilityjakarta$Tanggal,covidmobilityjakarta$Dirawat)
library(jmv)
## Warning: package 'jmv' was built under R version 4.1.3
# Use the descritptives function to get the descritptive data
descriptives(covidmobilityjakarta, vars = vars(Dirawat, retail_and_recreation_percent_change_from_baseline), freq = TRUE)
##
## DESCRIPTIVES
##
## Descriptives
## ----------------------------------------------------------------------------------------
## Dirawat retail_and_recreation_percent_change_from_baseline
## ----------------------------------------------------------------------------------------
## N 31 31
## Missing 0 0
## Mean 1634.839 7.451613
## Median 781.0000 7.000000
## Standard deviation 1930.584 3.085868
## Minimum 116.0000 1.000000
## Maximum 6809.000 14.00000
## ----------------------------------------------------------------------------------------
hist(covidmobilityjakarta$Dirawat, main="Distribusi Dirawat di RS untuk Covid 19", xlab="Dirawat di RS Untuk Covid 19", xlim=c(3000,6000),ylim=c(0,15)) # histogram variabel wt
mean=mean(covidmobilityjakarta$Dirawat) # Menghitung nilai mean variabel wt
abline(v=mean, col="red",lwd=2) # Menambahkan garis vertical pada plot
# 2. Density plot
d<-density(covidmobilityjakarta$Dirawat) # menghitung density variabel wt
plot(d, xlab="Dirawat di RS untuk Covid 19", main="Distribusi Dirawat di RS untuk Covid 19")
library(npreg)
## Warning: package 'npreg' was built under R version 4.1.3
# fit using ss
mod.ss <- ss( covidmobilityjakarta$Tanggal,covidmobilityjakarta$Dirawat, nknots = 10)
mod.ss
##
## Call:
## ss(x = covidmobilityjakarta$Tanggal, y = covidmobilityjakarta$Dirawat,
## nknots = 10)
##
## Smoothing Parameter spar = 0.01776397 lambda = 8.009766e-08
## Equivalent Degrees of Freedom (Df) 10.76019
## Penalized Criterion (RSS) 55189.81
## Generalized Cross-Validation (GCV) 4176.454
# fit using smooth.spline
mod.smsp <- smooth.spline( covidmobilityjakarta$Tanggal,covidmobilityjakarta$Dirawat, nknots = 10)
mod.smsp
## Call:
## smooth.spline(x = covidmobilityjakarta$Tanggal, y = covidmobilityjakarta$Dirawat,
## nknots = 10)
##
## Smoothing Parameter spar= -0.05618678 lambda= 1.0263e-06 (16 iterations)
## Equivalent Degrees of Freedom (Df): 11.7885
## Penalized Criterion (RSS): 20919.79
## GCV: 1757.101
# rmse between solutions
sqrt(mean(( mod.ss$y - mod.smsp$y )^2))
## [1] 32.00289
# rmse between solutions and f(x)
sqrt(mean(( covidmobilityjakarta$Dirawat - mod.ss$y )^2))
## [1] 42.1938
sqrt(mean(( covidmobilityjakarta$Dirawat - mod.smsp$y )^2))
## [1] 25.97753
covidmobilityjakarta$prediksi_ss <- mod.ss$y
covidmobilityjakarta$prediksi_smsp <- mod.smsp$y
covidmobilityjakarta
# plot results
plot(covidmobilityjakarta$Tanggal, covidmobilityjakarta$Dirawat)
lines(covidmobilityjakarta$Tanggal, covidmobilityjakarta$prediksi_ss , lty = 2, col = 'black', lwd = 4)
lines(covidmobilityjakarta$Tanggal, covidmobilityjakarta$prediksi_smsp, lty = 4, col = 'red', lwd = 2)
# plot method
plot(covidmobilityjakarta$Tanggal, covidmobilityjakarta$Dirawat, lty = 10, col = 'black', lwd =5)
#plot(mod.ss)
# add lm fit
abline(coef(lm( covidmobilityjakarta$Dirawat ~ covidmobilityjakarta$Tanggal , data = covidmobilityjakarta)), lty = 10, col = 'blue', lwd =5)
rug(covidmobilityjakarta$Tanggal) # add rug to plot
#points(covidmobilityjakarta$Tanggal, covidmobilityjakarta$Dirawat, lty = 2, col = 2, lwd = 2)
points(covidmobilityjakarta$Tanggal,mod.ss$y , lty = 2, col = 'red', lwd = 4)
#points(covidmobilityjakarta$Tanggal,mod.smsp$y , lty = 2, col = 4, lwd = 2)
legend("topright",
legend = c("Real", "Model SS", "Trends"),
lty = 1:3, col = c("Black","Red","Blue"), lwd = 3, bty = "p")
library(npreg)
# fit using ss
mod.ss1 <- ss( covidmobilityjakarta$Tanggal,covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline, nknots = 10)
mod.ss1
##
## Call:
## ss(x = covidmobilityjakarta$Tanggal, y = covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline,
## nknots = 10)
##
## Smoothing Parameter spar = 0.2344568 lambda = 2.945537e-06
## Equivalent Degrees of Freedom (Df) 8.355361
## Penalized Criterion (RSS) 96.48915
## Generalized Cross-Validation (GCV) 5.833233
# fit using smooth.spline
mod.smsp1 <- smooth.spline( covidmobilityjakarta$Tanggal,covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline, nknots = 10)
mod.smsp1
## Call:
## smooth.spline(x = covidmobilityjakarta$Tanggal, y = covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline,
## nknots = 10)
##
## Smoothing Parameter spar= -0.004828107 lambda= 2.409043e-06 (15 iterations)
## Equivalent Degrees of Freedom (Df): 11.55074
## Penalized Criterion (RSS): 55.17046
## GCV: 4.52129
covidmobilityjakarta$prediksi_ss1 <- mod.ss1$y
covidmobilityjakarta$prediksi_smsp1 <- mod.smsp1$y
covidmobilityjakarta
# plot results
plot(covidmobilityjakarta$Tanggal, covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline, lty = 10, col = 'black', lwd =5)
# add lm fit
abline(coef(lm( covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline ~ covidmobilityjakarta$Tanggal , data = covidmobilityjakarta)), lty = 10, col = 'blue', lwd =5)
lines(covidmobilityjakarta$Tanggal, covidmobilityjakarta$prediksi_ss1 , lty = 2, col = 'black', lwd = 4)
lines(covidmobilityjakarta$Tanggal, covidmobilityjakarta$prediksi_smsp1, lty = 4, col = 'red', lwd = 2)
Korelasi Pearson adalah alat analisis statistik yang digunakan untuk melihat keeratan hubungan linier antara 2 variabel yang skala datanya adalah interval atau rasio. Korelasi Pearson Untuk melakukan analisis korelasi Pearson cukup sederhana. Semisal kita ingin mengetahui hubungan antara mobilityjakartaMeninggaldanmobilityjakartaretail_and_recreation_percent_change_from_baseline,
cor.test(covidmobilityjakarta$Dirawat,covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline)
##
## Pearson's product-moment correlation
##
## data: covidmobilityjakarta$Dirawat and covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline
## t = 1.6015, df = 29, p-value = 0.1201
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.07707823 0.58073124
## sample estimates:
## cor
## 0.2850471
Dari output tersebut dapat kita simpulkan bahwa tidak ada hubungan yang signifikan antara mobilityjakartaPOSITIF dan mobilityjakartaretail_and_recreation_percent_change_from_baseline (p-value<0,01). Nilai p-value dalam output R dituliskan 0.2033 Nilai koefisien korelasi r adalah sebesar 0.2479615 yang menunjukkan hubungan yang lemah dan terbalik.
model <- lm(covidmobilityjakarta$Dirawat ~ covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline, data = covidmobilityjakarta)
summary(model)
##
## Call:
## lm(formula = covidmobilityjakarta$Dirawat ~ covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline,
## data = covidmobilityjakarta)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2662.6 -1193.6 -388.6 503.0 4615.4
##
## Coefficients:
## Estimate
## (Intercept) 306.0
## covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline 178.3
## Std. Error
## (Intercept) 896.0
## covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline 111.4
## t value
## (Intercept) 0.342
## covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline 1.601
## Pr(>|t|)
## (Intercept) 0.735
## covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline 0.120
##
## Residual standard error: 1882 on 29 degrees of freedom
## Multiple R-squared: 0.08125, Adjusted R-squared: 0.04957
## F-statistic: 2.565 on 1 and 29 DF, p-value: 0.1201
Rumus linear regresi menjadi y = 5577.47 + 20.77 mobilityjakarta$retail_and_recreation
model$coefficients
## (Intercept)
## 305.9820
## covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline
## 178.3314
model$fitted.values
## 1 2 3 4 5 6 7 8
## 840.9763 2267.6276 2802.6218 2267.6276 2445.9590 2089.2962 1375.9705 1732.6334
## 9 10 11 12 13 14 15 16
## 1554.3019 1554.3019 484.3135 1197.6391 1732.6334 1375.9705 1197.6391 1375.9705
## 17 18 19 20 21 22 23 24
## 1197.6391 484.3135 1375.9705 1375.9705 1554.3019 1375.9705 1554.3019 1732.6334
## 25 26 27 28 29 30 31
## 1732.6334 1910.9648 2089.2962 1554.3019 1910.9648 1732.6334 2802.6218
covidmobilityjakarta$prediksi_linear <- model$fitted.values
covidmobilityjakarta
# Function to add histograms
panel.hist <- function(x, ...) {
usr <- par("usr")
on.exit(par(usr))
par(usr = c(usr[1:2], 0, 1.5))
his <- hist(x, plot = FALSE)
breaks <- his$breaks
nB <- length(breaks)
y <- his$counts
y <- y/max(y)
rect(breaks[-nB], 0, breaks[-1], y, col = rgb(0, 1, 1, alpha = 0.5), ...)
# lines(density(x), col = 2, lwd = 2) # Uncomment to add density lines
}
# Equivalent with a formula
pairs(covidmobilityjakarta$Dirawat~covidmobilityjakarta$retail_and_recreation_percent_change_from_baseline, data = covidmobilityjakarta,
upper.panel = NULL, # Disabling the upper panel
diag.panel = panel.hist) # Adding the histograms
# plot method
plot(covidmobilityjakarta$Tanggal, covidmobilityjakarta$Dirawat, lty = 10, col = 'black', lwd =5)
#plot(mod.ss)
# add lm fit
abline(coef(lm( covidmobilityjakarta$Dirawat ~ covidmobilityjakarta$Tanggal , data = covidmobilityjakarta)), lty = 10, col = 'blue', lwd =5)
rug(covidmobilityjakarta$Tanggal) # add rug to plot
#points(covidmobilityjakarta$Tanggal, covidmobilityjakarta$Dirawat, lty = 2, col = 2, lwd = 2)
lines(covidmobilityjakarta$Tanggal,mod.ss$y , lty = 2, col = 'red', lwd = 4)
#points(covidmobilityjakarta$Tanggal,mod.smsp$y , lty = 2, col = 4, lwd = 2)
lines(covidmobilityjakarta$Tanggal, covidmobilityjakarta$prediksi_linear, lty = 2, col = 6, lwd = 4)
legend("topright",
legend = c("Real", "Model SS", "Trends", "Linear Regresi"),
lty = 1:4, col = c("Black","Red","Blue","Pink"), lwd = 3, bty = "p")