Analisis ini menggunakan data pada file
dataset 2 tugas 2 regnon kelas.txt, yang terdiri atas
variabel respons Y, enam variabel prediktor
X1–X6, dan 514 pengamatan. Pemodelan membandingkan
regresi spline truncated dengan satu, dua, dan tiga titik knot.
Pemilihan knot dilakukan berdasarkan nilai Generalized Cross Validation
(GCV) terkecil.
# Paket yang digunakan
library(MASS)
library(car)
library(pastecs)
library(pracma)
library(ggplot2)
library(gridExtra)
# Membaca data.
# Pastikan file TXT berada dalam folder yang sama dengan file Rmd.
data_awal <- read.table(
"dataset 2 tugas 2 regnon kelas.txt",
header = TRUE,
sep = "",
check.names = FALSE
)
# Menata data agar sesuai dengan fungsi pemodelan:
# kolom pertama adalah Y, diikuti X1 sampai X6.
data <- data_awal[, c("Y", "X1", "X2", "X3", "X4", "X5", "X6")]
names(data) <- c("y", paste0("x", 1:6))
# Pemeriksaan data
cat("Jumlah pengamatan:", nrow(data), "\n")
## Jumlah pengamatan: 514
cat("Jumlah variabel prediktor:", ncol(data) - 1, "\n")
## Jumlah variabel prediktor: 6
cat("Jumlah nilai hilang:", sum(is.na(data)), "\n")
## Jumlah nilai hilang: 0
head(data)
## y x1 x2 x3 x4 x5 x6
## 1 73.84 12.10 34.05 8.50 2.22 64.81 40.2
## 2 76.87 12.45 44.19 10.13 2.20 68.65 32.9
## 3 77.19 13.39 38.66 8.99 1.68 69.07 29.7
## 4 69.08 14.38 26.30 10.04 2.16 69.18 23.6
## 5 78.27 17.86 23.36 10.27 1.46 68.34 33.4
## 6 84.72 13.38 10.06 10.87 1.38 70.14 30.1
Statistika deskriptif digunakan untuk melihat ukuran pemusatan dan penyebaran data pada variabel Y dan X1–X6.
stat.desc(data)
## y x1 x2 x3 x4
## nbr.val 5.140000e+02 514.0000000 5.140000e+02 5.140000e+02 514.0000000
## nbr.null 0.000000e+00 0.0000000 1.000000e+00 0.000000e+00 1.0000000
## nbr.na 0.000000e+00 0.0000000 0.000000e+00 0.000000e+00 0.0000000
## min 1.414000e+01 2.2700000 0.000000e+00 1.280000e+00 0.0000000
## max 9.637000e+01 40.0100000 9.962000e+01 1.274000e+01 86.8200000
## range 8.223000e+01 37.7400000 9.962000e+01 1.146000e+01 86.8200000
## sum 3.860677e+04 5910.9500000 1.474862e+04 4.549390e+03 2072.5100000
## median 7.902500e+01 9.6150000 2.500500e+01 8.800000e+00 1.2600000
## mean 7.511045e+01 11.4999027 2.869381e+01 8.850953e+00 4.0321206
## SE.mean 6.364823e-01 0.3155689 8.844743e-01 6.816275e-02 0.3855870
## CI.mean.0.95 1.250432e+00 0.6199663 1.737637e+00 1.339125e-01 0.7575239
## var 2.082264e+02 51.1860318 4.020996e+02 2.388127e+00 76.4201684
## std.dev 1.443005e+01 7.1544414 2.005242e+01 1.545357e+00 8.7418630
## coef.var 1.921178e-01 0.6221306 6.988412e-01 1.745977e-01 2.1680559
## x5 x6
## nbr.val 5.140000e+02 5.140000e+02
## nbr.null 0.000000e+00 1.500000e+01
## nbr.na 0.000000e+00 0.000000e+00
## min 5.572000e+01 0.000000e+00
## max 7.793000e+01 5.020000e+01
## range 2.221000e+01 5.020000e+01
## sum 3.608291e+04 1.148700e+04
## median 7.045000e+01 2.220000e+01
## mean 7.020021e+01 2.234825e+01
## SE.mean 1.493169e-01 4.045886e-01
## CI.mean.0.95 2.933478e-01 7.948544e-01
## var 1.145990e+01 8.413767e+01
## std.dev 3.385248e+00 9.172659e+00
## coef.var 4.822276e-02 4.104419e-01
summary(data)
## y x1 x2 x3
## Min. :14.14 Min. : 2.270 Min. : 0.00 Min. : 1.280
## 1st Qu.:71.28 1st Qu.: 6.570 1st Qu.:13.65 1st Qu.: 7.985
## Median :79.03 Median : 9.615 Median :25.00 Median : 8.800
## Mean :75.11 Mean :11.500 Mean :28.69 Mean : 8.851
## 3rd Qu.:84.64 3rd Qu.:14.107 3rd Qu.:38.61 3rd Qu.: 9.775
## Max. :96.37 Max. :40.010 Max. :99.62 Max. :12.740
## x4 x5 x6
## Min. : 0.000 Min. :55.72 Min. : 0.00
## 1st Qu.: 0.370 1st Qu.:68.03 1st Qu.:16.62
## Median : 1.260 Median :70.45 Median :22.20
## Mean : 4.032 Mean :70.20 Mean :22.35
## 3rd Qu.: 3.585 3rd Qu.:72.57 3rd Qu.:28.60
## Max. :86.820 Max. :77.93 Max. :50.20
Scatterplot digunakan untuk melihat pola hubungan antara Y dan setiap variabel prediktor.
sp1 <- ggplot(data, aes(x = x1, y = y)) +
geom_point() + geom_smooth() + labs(x = "X1", y = "Y")
sp2 <- ggplot(data, aes(x = x2, y = y)) +
geom_point() + geom_smooth() + labs(x = "X2", y = "Y")
sp3 <- ggplot(data, aes(x = x3, y = y)) +
geom_point() + geom_smooth() + labs(x = "X3", y = "Y")
sp4 <- ggplot(data, aes(x = x4, y = y)) +
geom_point() + geom_smooth() + labs(x = "X4", y = "Y")
sp5 <- ggplot(data, aes(x = x5, y = y)) +
geom_point() + geom_smooth() + labs(x = "X5", y = "Y")
sp6 <- ggplot(data, aes(x = x6, y = y)) +
geom_point() + geom_smooth() + labs(x = "X6", y = "Y")
grid.arrange(sp1, sp2, sp3, sp4, sp5, sp6, ncol = 2)
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Pemeriksaan multikolinieritas dilakukan menggunakan Variance Inflation Factor (VIF) pada model regresi linear dengan enam prediktor.
model_lm <- lm(y ~ x1 + x2 + x3 + x4 + x5 + x6, data = data)
summary(model_lm)
##
## Call:
## lm(formula = y ~ x1 + x2 + x3 + x4 + x5 + x6, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -24.041 -3.610 2.047 5.431 21.434
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 26.47106 11.16110 2.372 0.0181 *
## x1 -0.61512 0.07038 -8.740 < 2e-16 ***
## x2 -0.21398 0.02453 -8.721 < 2e-16 ***
## x3 -0.21664 0.29665 -0.730 0.4656
## x4 -0.42017 0.04933 -8.518 < 2e-16 ***
## x5 0.92267 0.14182 6.506 1.85e-10 ***
## x6 0.03101 0.04248 0.730 0.4657
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.209 on 507 degrees of freedom
## Multiple R-squared: 0.6801, Adjusted R-squared: 0.6763
## F-statistic: 179.7 on 6 and 507 DF, p-value: < 2.2e-16
vif(model_lm)
## x1 x2 x3 x4 x5 x6
## 1.930060 1.842417 1.599757 1.415399 1.754443 1.155668
Fungsi berikut membentuk matriks desain spline truncated untuk sejumlah variabel prediktor dan titik knot.
buat_mx <- function(X, knot, urut = "gcv") {
N <- nrow(X)
m <- ncol(X)
k <- nrow(knot)
if (urut == "gcv") {
trunc <- do.call(cbind, lapply(1:k, function(s) {
sapply(1:m, function(j) pmax(X[, j] - knot[s, j], 0))
}))
mx <- cbind(1, X, trunc)
nama <- c(
"b0",
paste0("x", 1:m),
unlist(lapply(1:k, function(s) {
paste0("(x", 1:m, "-k", s, ")+")
}))
)
} else {
kol <- list(rep(1, N))
nama <- "b0"
for (j in 1:m) {
kol[[length(kol) + 1]] <- X[, j]
nama <- c(nama, paste0("x", j))
for (s in 1:k) {
kol[[length(kol) + 1]] <- pmax(X[, j] - knot[s, j], 0)
nama <- c(nama, paste0("(x", j, "-k", s, ")+"))
}
}
mx <- do.call(cbind, kol)
}
colnames(mx) <- nama
mx
}
Kandidat knot dibentuk dari 50 titik pada rentang masing-masing prediktor. Titik minimum dan maksimum tidak digunakan, sehingga terdapat 48 kandidat indeks. Untuk model dua dan tiga knot, kombinasi indeks knot dipilih tanpa pengulangan dan dengan urutan indeks meningkat.
GCVk <- function(data, k = 2, nk = 50) {
data <- as.matrix(data)
N <- nrow(data)
y <- data[, 1]
X <- data[, 2:ncol(data), drop = FALSE]
m <- ncol(X)
# Grid kandidat knot per variabel; titik min dan max dibuang
grid <- sapply(1:m, function(j) {
seq(min(X[, j]), max(X[, j]), length.out = nk)
})
grid <- grid[2:(nk - 1), , drop = FALSE]
ng <- nrow(grid)
komb <- matrix(t(combn(ng, k)), ncol = k)
nkomb <- nrow(komb)
cat("\nJumlah kombinasi knot (k =", k, "):", nkomb, "\n")
GCV <- rep(NA_real_, nkomb)
Rsq <- rep(NA_real_, nkomb)
knotmat <- matrix(NA_real_, nkomb, k * m)
nama.knot <- as.vector(t(outer(
1:k, 1:m,
function(s, j) paste0("k", s, "_x", j)
)))
for (i in seq_len(nkomb)) {
knot <- matrix(0, k, m)
for (s in 1:k) {
knot[s, ] <- grid[komb[i, s], ]
}
knotmat[i, ] <- as.vector(t(knot))
mx <- buat_mx(X, knot, "gcv")
C <- pinv(t(mx) %*% mx)
B <- C %*% (t(mx) %*% y)
yhat <- mx %*% B
SSE <- sum((y - yhat)^2)
SSR <- sum((yhat - mean(y))^2)
trA <- sum((mx %*% C) * mx)
GCV[i] <- (SSE / N) / (((N - trA) / N)^2)
Rsq[i] <- SSR / (SSR + SSE) * 100
if (i %% 2000 == 0) {
cat("Selesai", i, "dari", nkomb, "kombinasi\n")
}
}
dataAll <- cbind(
GCV = GCV,
Rsq = Rsq,
komb_ke = seq_len(nkomb),
knotmat
)
colnames(dataAll)[4:ncol(dataAll)] <- nama.knot
file.out <- paste0("DATASET_2_GCV_knot", k, ".csv")
write.csv(dataAll, file = file.out, row.names = FALSE)
dataG <- dataAll[order(GCV), -2, drop = FALSE]
cat("\nHasil GCV terkecil dengan", k, "knot\n")
print(dataG[1, ])
cat("\nSepuluh nilai GCV terkecil pertama\n")
print(dataG[1:min(10, nkomb), ])
best <- which.min(GCV)
knotopt <- matrix(
knotmat[best, ],
nrow = k,
byrow = TRUE,
dimnames = list(paste0("knot_", 1:k), paste0("x", 1:m))
)
mxopt <- buat_mx(X, knotopt, "gcv")
Bopt <- pinv(t(mxopt) %*% mxopt) %*% t(mxopt) %*% y
rownames(Bopt) <- colnames(mxopt)
cat("\nKombinasi knot optimal ke-", best, " dengan GCV =", min(GCV), "\n")
print(knotopt)
cat("\nEstimasi parameter pada knot optimal\n")
print(Bopt)
cat("\nFile hasil tersimpan:", file.out, "\n")
invisible(list(
k = k, knotopt = knotopt, mingcv = min(GCV),
B = Bopt, dataAll = dataAll
))
}
Pengujian dilakukan menggunakan taraf signifikansi 10%
(alpha = 0.1), mengikuti pengaturan pada sintaks. Knot yang
digunakan dalam pengujian adalah knot dengan GCV minimum untuk setiap
jumlah knot.
uji_k <- function(data, k = 2, alpha = 0.1) {
data <- as.matrix(data)
y <- data[, 1]
X <- data[, 2:ncol(data), drop = FALSE]
n <- nrow(data)
m <- ncol(X)
file.knot <- paste0("DATASET_2_GCV_knot", k, ".csv")
knot_all <- read.csv(file.knot, header = TRUE, check.names = FALSE)
best <- which.min(knot_all$GCV)
kolom_knot <- grep("^k[0-9]+_x[0-9]+$", names(knot_all))
knot <- matrix(
as.numeric(knot_all[best, kolom_knot]),
nrow = k,
byrow = TRUE,
dimnames = list(paste0("knot_", 1:k), paste0("x", 1:m))
)
cat("\nUji signifikansi model", k, "knot\n")
cat("Kombinasi knot optimal ke-", best,
" dengan GCV =", knot_all$GCV[best], "\n")
print(knot)
mx <- buat_mx(X, knot, "uji")
B <- pinv(t(mx) %*% mx) %*% t(mx) %*% y
p <- nrow(B)
yhat <- mx %*% B
ybar <- mean(y)
res <- y - yhat
SSE <- sum(res^2)
SSR <- sum((yhat - ybar)^2)
SST <- sum((y - ybar)^2)
MSE <- SSE / (n - p)
MSR <- SSR / (p - 1)
Rsq <- SSR / (SSR + SSE) * 100
# Uji simultan
Fhit <- MSR / MSE
pvalue <- pf(Fhit, p - 1, n - p, lower.tail = FALSE)
cat("\nUji simultan\n")
cat("F hitung =", Fhit, "\n")
cat("p-value =", pvalue, "\n")
if (pvalue <= alpha) {
cat("Keputusan: Tolak H0; model signifikan secara simultan.\n")
} else {
cat("Keputusan: Gagal menolak H0; model tidak signifikan secara simultan.\n")
}
# Uji parsial
SE <- sqrt(diag(MSE * pinv(t(mx) %*% mx)))
thit <- B[, 1] / SE
pval <- 2 * pt(abs(thit), df = n - p, lower.tail = FALSE)
cat("\nUji parsial\n")
for (i in seq_len(p)) {
keputusan <- if (pval[i] <= alpha) {
"signifikan"
} else {
"tidak signifikan"
}
cat(
rownames(B)[i], ":", keputusan,
"; p-value =", pval[i], "\n"
)
}
tab <- cbind(
Beta = B[, 1],
SE = SE,
t_hitung = thit,
p_value = pval
)
rownames(tab) <- colnames(mx)
cat("\nTabel estimasi parameter, t hitung, dan p-value\n")
print(tab)
cat("\nRingkasan model\n")
ringkasan <- data.frame(
Knot = k,
Jumlah_parameter = p,
SSE = SSE,
MSE = MSE,
Rsquared_persen = Rsq,
F_hitung = Fhit,
p_value_F = pvalue
)
print(ringkasan)
write.csv(
data.frame(Residual = as.vector(res)),
file = paste0("DATASET_2_residual_knot", k, ".csv"),
row.names = FALSE
)
write.csv(
data.frame(Y_asli = as.vector(y), Y_topi = as.vector(yhat),
Residual = as.vector(res)),
file = paste0("DATASET_2_Y_asli_Y_topi_residual_knot", k, ".csv"),
row.names = FALSE
)
invisible(list(
k = k, B = B, tab = tab, Rsq = Rsq,
MSE = MSE, pvalueF = pvalue, p = p,
SSE = SSE, Fhit = Fhit
))
}
K_set <- 1:3
alpha <- 0.1
hasil <- list()
uji <- list()
for (k in K_set) {
cat("\n\n========================================\n")
cat("PEMODELAN DENGAN", k, "TITIK KNOT\n")
cat("========================================\n")
hasil[[k]] <- GCVk(data, k = k, nk = 50)
uji[[k]] <- uji_k(data, k = k, alpha = alpha)
}
##
##
## ========================================
## PEMODELAN DENGAN 1 TITIK KNOT
## ========================================
##
## Jumlah kombinasi knot (k = 1 ): 48
##
## Hasil GCV terkecil dengan 1 knot
## GCV komb_ke k1_x1 k1_x2 k1_x3 k1_x4 k1_x5 k1_x6
## 60.891404 15.000000 13.823061 30.495918 4.788163 26.577551 62.518980 15.367347
##
## Sepuluh nilai GCV terkecil pertama
## GCV komb_ke k1_x1 k1_x2 k1_x3 k1_x4 k1_x5 k1_x6
## [1,] 60.89140 15 13.82306 30.49592 4.788163 26.57755 62.51898 15.36735
## [2,] 60.90658 16 14.59327 32.52898 5.022041 28.34939 62.97224 16.39184
## [3,] 60.93708 17 15.36347 34.56204 5.255918 30.12122 63.42551 17.41633
## [4,] 61.00914 18 16.13367 36.59510 5.489796 31.89306 63.87878 18.44082
## [5,] 61.03068 19 16.90388 38.62816 5.723673 33.66490 64.33204 19.46531
## [6,] 61.03475 14 13.05286 28.46286 4.554286 24.80571 62.06571 14.34286
## [7,] 61.08612 20 17.67408 40.66122 5.957551 35.43673 64.78531 20.48980
## [8,] 61.22630 21 18.44429 42.69429 6.191429 37.20857 65.23857 21.51429
## [9,] 61.33258 22 19.21449 44.72735 6.425306 38.98041 65.69184 22.53878
## [10,] 61.42555 13 12.28265 26.42980 4.320408 23.03388 61.61245 13.31837
##
## Kombinasi knot optimal ke- 15 dengan GCV = 60.8914
## x1 x2 x3 x4 x5 x6
## knot_1 13.82306 30.49592 4.788163 26.57755 62.51898 15.36735
##
## Estimasi parameter pada knot optimal
## [,1]
## b0 55.235597515
## x1 -0.060206537
## x2 -0.139780329
## x3 4.602967603
## x4 -0.613837239
## x5 0.008921615
## x6 0.059789517
## (x1-k1)+ -0.866308131
## (x2-k1)+ -0.081699055
## (x3-k1)+ -5.057603076
## (x4-k1)+ 0.720183134
## (x5-k1)+ 1.020919184
## (x6-k1)+ -0.129832245
##
## File hasil tersimpan: DATASET_2_GCV_knot1.csv
##
## Uji signifikansi model 1 knot
## Kombinasi knot optimal ke- 15 dengan GCV = 60.8914
## x1 x2 x3 x4 x5 x6
## knot_1 13.82306 30.49592 4.788163 26.57755 62.51898 15.36735
##
## Uji simultan
## F hitung = 108.2327
## p-value = 1.293317e-130
## Keputusan: Tolak H0; model signifikan secara simultan.
##
## Uji parsial
## : tidak signifikan ; p-value = 0.3883954
## : tidak signifikan ; p-value = 0.6170333
## : signifikan ; p-value = 6.567427e-06
## : signifikan ; p-value = 0.003580801
## : tidak signifikan ; p-value = 0.223957
## : signifikan ; p-value = 0.005646631
## : signifikan ; p-value = 0.003879527
## : signifikan ; p-value = 5.156252e-13
## : signifikan ; p-value = 1.687891e-05
## : tidak signifikan ; p-value = 0.9927584
## : tidak signifikan ; p-value = 0.3135006
## : tidak signifikan ; p-value = 0.6565236
## : tidak signifikan ; p-value = 0.4467439
##
## Tabel estimasi parameter, t hitung, dan p-value
## Beta SE t_hitung p_value
## b0 55.235597557 63.98324665 0.863282194 3.883954e-01
## x1 -0.060206537 0.12032368 -0.500371464 6.170333e-01
## (x1-k1)+ -0.866308131 0.19016176 -4.555637852 6.567427e-06
## x2 -0.139780329 0.04775948 -2.926755428 3.580801e-03
## (x2-k1)+ -0.081699055 0.06709957 -1.217579486 2.239570e-01
## x3 4.602967603 1.65596221 2.779633244 5.646631e-03
## (x3-k1)+ -5.057603076 1.74321280 -2.901311348 3.879527e-03
## x4 -0.613837239 0.08276072 -7.417012199 5.156252e-13
## (x4-k1)+ 0.720183134 0.16575456 4.344876881 1.687891e-05
## x5 0.008921615 0.98248945 0.009080621 9.927584e-01
## (x5-k1)+ 1.020919185 1.01189430 1.008918804 3.135006e-01
## x6 0.059789517 0.13436334 0.444983846 6.565236e-01
## (x6-k1)+ -0.129832245 0.17050559 -0.761454471 4.467439e-01
##
## Ringkasan model
## Knot Jumlah_parameter SSE MSE Rsquared_persen F_hitung
## 1 1 13 29735.03 59.35135 72.16346 108.2327
## p_value_F
## 1 1.293317e-130
##
##
## ========================================
## PEMODELAN DENGAN 2 TITIK KNOT
## ========================================
##
## Jumlah kombinasi knot (k = 2 ): 1128
##
## Hasil GCV terkecil dengan 2 knot
## GCV komb_ke k1_x1 k1_x2 k1_x3 k1_x4 k1_x5
## 59.653741 245.000000 6.891224 12.198367 2.683265 10.631020 58.439592
## k1_x6 k2_x1 k2_x2 k2_x3 k2_x4 k2_x5 k2_x6
## 6.146939 22.295306 52.859592 7.360816 46.067755 67.504898 26.636735
##
## Sepuluh nilai GCV terkecil pertama
## GCV komb_ke k1_x1 k1_x2 k1_x3 k1_x4 k1_x5 k1_x6
## [1,] 59.65374 245 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## [2,] 59.71889 239 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## [3,] 59.71968 246 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## [4,] 59.72621 244 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## [5,] 59.72924 238 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## [6,] 59.73756 905 23.065510 54.89265 7.594694 47.83959 67.95816 27.661224
## [7,] 59.76477 237 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## [8,] 59.76563 241 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## [9,] 59.76975 240 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## [10,] 59.77079 242 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## k2_x1 k2_x2 k2_x3 k2_x4 k2_x5 k2_x6
## [1,] 22.29531 52.85959 7.360816 46.06776 67.50490 26.63673
## [2,] 17.67408 40.66122 5.957551 35.43673 64.78531 20.48980
## [3,] 23.06551 54.89265 7.594694 47.83959 67.95816 27.66122
## [4,] 21.52510 50.82653 7.126939 44.29592 67.05163 25.61224
## [5,] 16.90388 38.62816 5.723673 33.66490 64.33204 19.46531
## [6,] 29.22714 71.15714 9.465714 62.01429 71.58429 35.85714
## [7,] 16.13367 36.59510 5.489796 31.89306 63.87878 18.44082
## [8,] 19.21449 44.72735 6.425306 38.98041 65.69184 22.53878
## [9,] 18.44429 42.69429 6.191429 37.20857 65.23857 21.51429
## [10,] 19.98469 46.76041 6.659184 40.75224 66.14510 23.56327
##
## Kombinasi knot optimal ke- 245 dengan GCV = 59.65374
## x1 x2 x3 x4 x5 x6
## knot_1 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## knot_2 22.295306 52.85959 7.360816 46.06776 67.50490 26.636735
##
## Estimasi parameter pada knot optimal
## [,1]
## b0 232.61514751
## x1 -0.21284620
## x2 -0.47339109
## x3 -3.37097474
## x4 -0.93861870
## x5 -2.77940372
## x6 0.78647431
## (x1-k1)+ -0.04625130
## (x2-k1)+ 0.33226449
## (x3-k1)+ 6.15885749
## (x4-k1)+ 0.87768543
## (x5-k1)+ 4.11508130
## (x6-k1)+ -0.91535404
## (x1-k2)+ -1.12800600
## (x2-k2)+ -0.04946566
## (x3-k2)+ -4.00900376
## (x4-k2)+ 0.02702941
## (x5-k2)+ -0.43791153
## (x6-k2)+ 0.05822887
##
## File hasil tersimpan: DATASET_2_GCV_knot2.csv
##
## Uji signifikansi model 2 knot
## Kombinasi knot optimal ke- 245 dengan GCV = 59.65374
## x1 x2 x3 x4 x5 x6
## knot_1 6.891224 12.19837 2.683265 10.63102 58.43959 6.146939
## knot_2 22.295306 52.85959 7.360816 46.06776 67.50490 26.636735
##
## Uji simultan
## F hitung = 75.80013
## p-value = 1.905753e-129
## Keputusan: Tolak H0; model signifikan secara simultan.
##
## Uji parsial
## : tidak signifikan ; p-value = 0.2033832
## : tidak signifikan ; p-value = 0.5802154
## : tidak signifikan ; p-value = 0.9150597
## : signifikan ; p-value = 0.0002143497
## : signifikan ; p-value = 0.001689131
## : signifikan ; p-value = 0.04228767
## : tidak signifikan ; p-value = 0.580082
## : tidak signifikan ; p-value = 0.53971
## : tidak signifikan ; p-value = 0.3171688
## : signifikan ; p-value = 0.002221382
## : signifikan ; p-value = 4.68481e-11
## : signifikan ; p-value = 7.791085e-06
## : tidak signifikan ; p-value = 0.9171649
## : tidak signifikan ; p-value = 0.3726539
## : tidak signifikan ; p-value = 0.2028383
## : tidak signifikan ; p-value = 0.304175
## : tidak signifikan ; p-value = 0.1014708
## : signifikan ; p-value = 0.0736619
## : tidak signifikan ; p-value = 0.7026649
##
## Tabel estimasi parameter, t hitung, dan p-value
## Beta SE t_hitung p_value
## b0 232.61514829 182.63580167 1.2736558 2.033832e-01
## x1 -0.21284620 0.38459113 -0.5534350 5.802154e-01
## (x1-k1)+ -0.04625130 0.43341679 -0.1067132 9.150597e-01
## (x1-k2)+ -1.12800600 0.30248414 -3.7291410 2.143497e-04
## x2 -0.47339109 0.14993211 -3.1573696 1.689131e-03
## (x2-k1)+ 0.33226449 0.16319906 2.0359461 4.228767e-02
## (x2-k2)+ -0.04946566 0.08934786 -0.5536301 5.800820e-01
## x3 -3.37097474 5.49306747 -0.6136780 5.397100e-01
## (x3-k1)+ 6.15885749 6.15083282 1.0013046 3.171688e-01
## (x3-k2)+ -4.00900376 1.30374304 -3.0749953 2.221382e-03
## x4 -0.93861870 0.13945275 -6.7307292 4.684810e-11
## (x4-k1)+ 0.87768543 0.19423483 4.5186820 7.791085e-06
## (x4-k2)+ 0.02702941 0.25975154 0.1040587 9.171649e-01
## x5 -2.77940374 3.11479854 -0.8923222 3.726539e-01
## (x5-k1)+ 4.11508131 3.22702037 1.2751953 2.028383e-01
## (x5-k2)+ -0.43791153 0.42573989 -1.0285894 3.041750e-01
## x6 0.78647431 0.47931898 1.6408161 1.014708e-01
## (x6-k1)+ -0.91535404 0.51065506 -1.7925095 7.366190e-02
## (x6-k2)+ 0.05822887 0.15245290 0.3819466 7.026649e-01
##
## Ringkasan model
## Knot Jumlah_parameter SSE MSE Rsquared_persen F_hitung
## 1 2 19 28437.08 57.44864 73.37854 75.80013
## p_value_F
## 1 1.905753e-129
##
##
## ========================================
## PEMODELAN DENGAN 3 TITIK KNOT
## ========================================
##
## Jumlah kombinasi knot (k = 3 ): 17296
## Selesai 2000 dari 17296 kombinasi
## Selesai 4000 dari 17296 kombinasi
## Selesai 6000 dari 17296 kombinasi
## Selesai 8000 dari 17296 kombinasi
## Selesai 10000 dari 17296 kombinasi
## Selesai 12000 dari 17296 kombinasi
## Selesai 14000 dari 17296 kombinasi
## Selesai 16000 dari 17296 kombinasi
##
## Hasil GCV terkecil dengan 3 knot
## GCV komb_ke k1_x1 k1_x2 k1_x3 k1_x4
## 57.871554 11127.000000 13.052857 28.462857 4.554286 24.805714
## k1_x5 k1_x6 k2_x1 k2_x2 k2_x3 k2_x4
## 62.065714 14.342857 24.605918 58.958776 8.062449 51.383265
## k2_x5 k2_x6 k3_x1 k3_x2 k3_x3 k3_x4
## 68.864694 29.710204 28.456939 69.124082 9.231837 60.242449
## k3_x5 k3_x6
## 71.131020 34.832653
##
## Sepuluh nilai GCV terkecil pertama
## GCV komb_ke k1_x1 k1_x2 k1_x3 k1_x4 k1_x5 k1_x6
## [1,] 57.87155 11127 13.05286 28.46286 4.554286 24.80571 62.06571 14.34286
## [2,] 57.90291 11144 13.05286 28.46286 4.554286 24.80571 62.06571 14.34286
## [3,] 57.91615 11126 13.05286 28.46286 4.554286 24.80571 62.06571 14.34286
## [4,] 57.97474 11655 13.82306 30.49592 4.788163 26.57755 62.51898 15.36735
## [5,] 58.00390 11672 13.82306 30.49592 4.788163 26.57755 62.51898 15.36735
## [6,] 58.01200 11654 13.82306 30.49592 4.788163 26.57755 62.51898 15.36735
## [7,] 58.01834 10566 12.28265 26.42980 4.320408 23.03388 61.61245 13.31837
## [8,] 58.05155 11145 13.05286 28.46286 4.554286 24.80571 62.06571 14.34286
## [9,] 58.07181 10583 12.28265 26.42980 4.320408 23.03388 61.61245 13.31837
## [10,] 58.08304 10565 12.28265 26.42980 4.320408 23.03388 61.61245 13.31837
## k2_x1 k2_x2 k2_x3 k2_x4 k2_x5 k2_x6 k3_x1 k3_x2
## [1,] 24.60592 58.95878 8.062449 51.38327 68.86469 29.71020 28.45694 69.12408
## [2,] 25.37612 60.99184 8.296327 53.15510 69.31796 30.73469 27.68673 67.09102
## [3,] 24.60592 58.95878 8.062449 51.38327 68.86469 29.71020 27.68673 67.09102
## [4,] 24.60592 58.95878 8.062449 51.38327 68.86469 29.71020 28.45694 69.12408
## [5,] 25.37612 60.99184 8.296327 53.15510 69.31796 30.73469 27.68673 67.09102
## [6,] 24.60592 58.95878 8.062449 51.38327 68.86469 29.71020 27.68673 67.09102
## [7,] 24.60592 58.95878 8.062449 51.38327 68.86469 29.71020 28.45694 69.12408
## [8,] 25.37612 60.99184 8.296327 53.15510 69.31796 30.73469 28.45694 69.12408
## [9,] 25.37612 60.99184 8.296327 53.15510 69.31796 30.73469 27.68673 67.09102
## [10,] 24.60592 58.95878 8.062449 51.38327 68.86469 29.71020 27.68673 67.09102
## k3_x3 k3_x4 k3_x5 k3_x6
## [1,] 9.231837 60.24245 71.13102 34.83265
## [2,] 8.997959 58.47061 70.67776 33.80816
## [3,] 8.997959 58.47061 70.67776 33.80816
## [4,] 9.231837 60.24245 71.13102 34.83265
## [5,] 8.997959 58.47061 70.67776 33.80816
## [6,] 8.997959 58.47061 70.67776 33.80816
## [7,] 9.231837 60.24245 71.13102 34.83265
## [8,] 9.231837 60.24245 71.13102 34.83265
## [9,] 8.997959 58.47061 70.67776 33.80816
## [10,] 8.997959 58.47061 70.67776 33.80816
##
## Kombinasi knot optimal ke- 11127 dengan GCV = 57.87155
## x1 x2 x3 x4 x5 x6
## knot_1 13.05286 28.46286 4.554286 24.80571 62.06571 14.34286
## knot_2 24.60592 58.95878 8.062449 51.38327 68.86469 29.71020
## knot_3 28.45694 69.12408 9.231837 60.24245 71.13102 34.83265
##
## Estimasi parameter pada knot optimal
## [,1]
## b0 167.379164850
## x1 0.006721307
## x2 -0.162048384
## x3 3.088515434
## x4 -0.572073896
## x5 -1.828642790
## x6 0.121548312
## (x1-k1)+ -0.884363855
## (x2-k1)+ -0.027020113
## (x3-k1)+ -1.193279345
## (x4-k1)+ 0.756445243
## (x5-k1)+ 3.616134313
## (x6-k1)+ -0.235273051
## (x1-k2)+ 0.860349570
## (x2-k2)+ -0.313063519
## (x3-k2)+ -6.518365931
## (x4-k2)+ 0.935416563
## (x5-k2)+ -2.564442075
## (x6-k2)+ -0.185090874
## (x1-k3)+ -2.205508263
## (x2-k3)+ 0.513304370
## (x3-k3)+ 6.397219439
## (x4-k3)+ -2.197128367
## (x5-k3)+ 2.261039366
## (x6-k3)+ 0.665478503
##
## File hasil tersimpan: DATASET_2_GCV_knot3.csv
##
## Uji signifikansi model 3 knot
## Kombinasi knot optimal ke- 11127 dengan GCV = 57.87155
## x1 x2 x3 x4 x5 x6
## knot_1 13.05286 28.46286 4.554286 24.80571 62.06571 14.34286
## knot_2 24.60592 58.95878 8.062449 51.38327 68.86469 29.71020
## knot_3 28.45694 69.12408 9.231837 60.24245 71.13102 34.83265
##
## Uji simultan
## F hitung = 60.46587
## p-value = 1.15666e-129
## Keputusan: Tolak H0; model signifikan secara simultan.
##
## Uji parsial
## : signifikan ; p-value = 0.030933
## : tidak signifikan ; p-value = 0.9589731
## : signifikan ; p-value = 0.0008273402
## : tidak signifikan ; p-value = 0.3383506
## : signifikan ; p-value = 0.05676414
## : signifikan ; p-value = 0.002971664
## : tidak signifikan ; p-value = 0.7632598
## : tidak signifikan ; p-value = 0.3196921
## : tidak signifikan ; p-value = 0.2179738
## : tidak signifikan ; p-value = 0.1575939
## : tidak signifikan ; p-value = 0.6503021
## : signifikan ; p-value = 0.0001412823
## : signifikan ; p-value = 9.938082e-06
## : signifikan ; p-value = 1.323051e-09
## : signifikan ; p-value = 0.002019186
## : tidak signifikan ; p-value = 0.4230511
## : tidak signifikan ; p-value = 0.1188693
## : tidak signifikan ; p-value = 0.129938
## : signifikan ; p-value = 0.00774821
## : signifikan ; p-value = 0.0005331614
## : signifikan ; p-value = 0.001533134
## : tidak signifikan ; p-value = 0.4278882
## : tidak signifikan ; p-value = 0.2545297
## : tidak signifikan ; p-value = 0.6005636
## : tidak signifikan ; p-value = 0.1704717
##
## Tabel estimasi parameter, t hitung, dan p-value
## Beta SE t_hitung p_value
## b0 167.379165037 77.34026676 2.16419172 3.093300e-02
## x1 0.006721307 0.13059047 0.05146859 9.589731e-01
## (x1-k1)+ -0.884363855 0.26285790 -3.36441804 8.273402e-04
## (x1-k2)+ 0.860349570 0.89772315 0.95836847 3.383506e-01
## (x1-k3)+ -2.205508264 1.15493272 -1.90964221 5.676414e-02
## x2 -0.162048384 0.05427585 -2.98564456 2.971664e-03
## (x2-k1)+ -0.027020113 0.08965733 -0.30137092 7.632598e-01
## (x2-k2)+ -0.313063519 0.31428791 -0.99610423 3.196921e-01
## (x2-k3)+ 0.513304370 0.41612923 1.23352155 2.179738e-01
## x3 3.088515432 2.18211160 1.41537923 1.575939e-01
## (x3-k1)+ -1.193279342 2.63055870 -0.45362202 6.503021e-01
## (x3-k2)+ -6.518365931 1.69914752 -3.83625662 1.412823e-04
## (x3-k3)+ 6.397219439 1.43264913 4.46530789 9.938082e-06
## x4 -0.572073896 0.09251360 -6.18367326 1.323051e-09
## (x4-k1)+ 0.756445243 0.24369214 3.10410199 2.019186e-03
## (x4-k2)+ 0.935416563 1.16662812 0.80181212 4.230511e-01
## (x4-k3)+ -2.197128367 1.40636153 -1.56227849 1.188693e-01
## x5 -1.828642793 1.20551281 -1.51690034 1.299380e-01
## (x5-k1)+ 3.616134316 1.35237864 2.67390671 7.748210e-03
## (x5-k2)+ -2.564442076 0.73549926 -3.48666848 5.331614e-04
## (x5-k3)+ 2.261039366 0.70961060 3.18631001 1.533134e-03
## x6 0.121548312 0.15318553 0.79347125 4.278882e-01
## (x6-k1)+ -0.235273051 0.20624303 -1.14075640 2.545297e-01
## (x6-k2)+ -0.185090874 0.35327308 -0.52393144 6.005636e-01
## (x6-k3)+ 0.665478503 0.48479173 1.37271011 1.704717e-01
##
## Ringkasan model
## Knot Jumlah_parameter SSE MSE Rsquared_persen F_hitung p_value_F
## 1 3 25 26922.77 55.05679 74.79617 60.46587 1.15666e-129
Model dibandingkan berdasarkan GCV minimum, MSE, koefisien determinasi, dan p-value uji simultan. GCV terkecil digunakan sebagai kriteria utama pemilihan model.
perbandingan <- data.frame(
Jumlah_Knot = K_set,
Jumlah_Kombinasi = sapply(K_set, function(k) choose(48, k)),
Jumlah_Parameter = sapply(K_set, function(k) uji[[k]]$p),
GCV_Minimum = sapply(K_set, function(k) hasil[[k]]$mingcv),
MSE = sapply(K_set, function(k) uji[[k]]$MSE),
R_squared_Persen = sapply(K_set, function(k) uji[[k]]$Rsq),
P_value_Simultan = sapply(K_set, function(k) uji[[k]]$pvalueF)
)
knitr::kable(perbandingan, digits = 6,
caption = "Perbandingan Model Regresi Spline Truncated")
| Jumlah_Knot | Jumlah_Kombinasi | Jumlah_Parameter | GCV_Minimum | MSE | R_squared_Persen | P_value_Simultan |
|---|---|---|---|---|---|---|
| 1 | 48 | 13 | 60.89140 | 59.35135 | 72.16346 | 0 |
| 2 | 1128 | 19 | 59.65374 | 57.44864 | 73.37854 | 0 |
| 3 | 17296 | 25 | 57.87155 | 55.05679 | 74.79617 | 0 |
model_terbaik <- perbandingan$Jumlah_Knot[
which.min(perbandingan$GCV_Minimum)
]
cat("Jumlah knot terbaik berdasarkan GCV minimum:", model_terbaik, "\n")
## Jumlah knot terbaik berdasarkan GCV minimum: 3
write.csv(perbandingan, "DATASET_2_perbandingan_knot_1_2_3.csv", row.names = FALSE)
Untuk setiap model, nilai prediksi dihitung sebagai \(\hat{Y}\), sedangkan residual merupakan selisih antara nilai aktual dan nilai prediksi, yaitu \(e_i = Y_i - \hat{Y}_i\).
hasil_y <- data.frame(Y_asli = data$y)
for (k in K_set) {
# Ambil knot optimal dari hasil pencarian GCV
knotopt <- hasil[[k]]$knotopt
X <- as.matrix(data[, -1, drop = FALSE])
y <- data$y
mx <- buat_mx(X, knotopt, "uji")
B <- pinv(t(mx) %*% mx) %*% t(mx) %*% y
yhat <- as.vector(mx %*% B)
residual <- y - yhat
hasil_y[[paste0("Y_topi_", k, "_knot")]] <- yhat
hasil_y[[paste0("Residual_", k, "_knot")]] <- residual
}
knitr::kable(head(hasil_y, 10), digits = 4,
caption = "Sepuluh Baris Pertama Y Asli, Y Topi, dan Residual")
| Y_asli | Y_topi_1_knot | Residual_1_knot | Y_topi_2_knot | Residual_2_knot | Y_topi_3_knot | Residual_3_knot |
|---|---|---|---|---|---|---|
| 73.84 | 70.5433 | 3.2967 | 68.7778 | 5.0622 | 71.0561 | 2.7839 |
| 76.87 | 72.0136 | 4.8564 | 70.4277 | 6.4423 | 72.8363 | 4.0337 |
| 77.19 | 74.6759 | 2.5141 | 73.4479 | 3.7421 | 74.5906 | 2.5994 |
| 69.08 | 76.2971 | -7.2171 | 73.9096 | -4.8296 | 76.6496 | -7.5696 |
| 78.27 | 72.2574 | 6.0126 | 72.1757 | 6.0943 | 72.3900 | 5.8800 |
| 84.72 | 79.7446 | 4.9754 | 77.1155 | 7.6045 | 80.5204 | 4.1996 |
| 76.69 | 70.2979 | 6.3921 | 71.9430 | 4.7470 | 68.1347 | 8.5553 |
| 77.12 | 73.3022 | 3.8178 | 73.8895 | 3.2305 | 72.2544 | 4.8656 |
| 77.54 | 70.3908 | 7.1492 | 70.0936 | 7.4464 | 68.4072 | 9.1328 |
| 46.10 | 67.6618 | -21.5618 | 70.1607 | -24.0607 | 65.9582 | -19.8582 |
write.csv(hasil_y, "DATASET_2_semua_Y_asli_Y_topi_residual.csv", row.names = FALSE)
Kesimpulan akhir ditentukan setelah seluruh kode dijalankan. Model spline truncated yang dipilih adalah model dengan nilai GCV minimum di antara model satu, dua, dan tiga titik knot. Perhatikan pula nilai MSE, koefisien determinasi, dan hasil uji simultan untuk melengkapi interpretasi model.