Analisis Regresi Spline Truncated Multivariabel

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

1. Statistika Deskriptif

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

2. Eksplorasi Hubungan Y dengan Variabel Prediktor

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'

3. Deteksi Multikolinieritas

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

4. Regresi Spline Truncated dengan 1, 2, dan 3 Titik Knot

4.1 Fungsi pembentuk matriks desain

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
}

4.2 Fungsi pemilihan titik knot optimal berdasarkan GCV

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
  ))
}

4.3 Fungsi uji signifikansi simultan dan parsial

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
  ))
}

5. Menjalankan Model 1, 2, dan 3 Titik Knot

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

6. Perbandingan Model

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")
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)

7. Menghitung Y Asli, Y Topi, dan Residual

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")
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)

8. Kesimpulan

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.