#Library

library(lmtest) 
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(MASS) 
library(car)
## Loading required package: carData
library(pastecs)
library(pracma)
## 
## Attaching package: 'pracma'
## The following object is masked from 'package:car':
## 
##     logit
library(Matrix)
## 
## Attaching package: 'Matrix'
## The following objects are masked from 'package:pracma':
## 
##     expm, lu, tril, triu

#Memanggil Data

data=read.table(file.choose(), header=TRUE)
data
##        Y    X1    X2    X3    X4
## 1   4.52 67.88 13.00 14.86 72.04
## 2   4.97 71.02 12.89 14.38 51.19
## 3   5.70 61.98 13.58 18.56 73.59
## 4   5.45 68.96 12.78 29.61 43.00
## 5   5.08 67.40 13.31 14.89 74.71
## 6   6.22 69.04 12.55 55.70 71.41
## 7   3.49 76.22 12.50 10.46 67.09
## 8   9.00 62.90 14.13 15.59 80.01
## 9   8.26 65.16 14.70 75.04 30.11
## 10  9.46 69.24 12.90 31.21 80.02
## 11  3.71 74.28 12.60 20.67 67.03
## 12  3.91 75.81 12.08  8.67 47.87
## 13  3.38 71.78 12.39 10.74 65.98
## 14  7.55 64.14 12.33  8.54 25.74
## 15  3.52 70.38 11.56 19.95 65.77
## 16  7.30 60.75 11.79 28.13 67.17
## 17  4.50 75.57 12.02 14.71 36.88
## 18  4.02 74.09 12.04 10.28 65.69
## 19  3.39 77.53 11.57  6.56 64.76
## 20  2.70 73.93 11.15 25.23 25.55
## 21  3.71 65.53 11.81  4.21 22.68
## 22  7.14 67.71 13.64 28.93 67.95
## 23 12.36 60.05 13.64 37.68 79.44
## 24  8.78 63.84 12.89 10.14 41.94
## 25  3.57 72.03 11.96 10.16 69.38
## 26  4.96 64.68 11.92 17.31 68.86
## 27  3.87 72.55 12.28 11.73 59.18
## 28  2.93 74.61 12.38  5.76 66.22
## 29  3.73 70.17 11.86  6.35 70.11
## 30  2.24 73.15 12.10  4.65 48.85
## 31  3.90 71.15 12.19  4.83 68.84
## 32  4.49 70.08 12.88  3.30 65.59
## 33  3.07 69.27 12.59 14.48 72.19
## 34  6.95 70.16 12.36 15.39 50.71
## 35  2.46 76.50 12.37  9.17 68.82
## 36  8.32 62.07 13.92 21.93 77.10
## 37  5.54 66.82 14.80  6.11 79.10
## 38  5.08 66.44 13.29 11.21 71.94
## 39  4.45 67.38 12.99 18.72 41.10
## 40  4.83 67.81 12.20  5.75 66.97
## 41  4.14 66.91 12.63 26.30 45.79
## 42  5.86 65.65 13.73 38.11 75.83
## 43  4.76 73.01 12.71 33.79 72.87
## 44  5.25 67.41 12.69 56.63 71.31
## 45  4.98 70.04 12.90 45.81 69.48
## 46  4.21 64.68 12.54 45.53 70.22
## 47  5.29 71.54 12.48 51.50 30.59
## 48  4.70 65.50 12.11 66.27 68.03
## 49  2.83 70.50 12.47 67.99 70.51
## 50  4.30 65.04 11.98 40.96 37.58
## 51  5.69 64.55 12.51 48.22 68.68
## 52  2.63 72.77 12.40 43.84 68.45
## 53  2.49 71.22 11.77 51.25 70.81
## 54  2.91 77.73 12.82 54.56 21.39
## 55  3.10 63.93 11.74 62.92 67.98
## 56  5.95 62.71 14.94 61.01 80.77

#Analisis Statistika Deskriptif

stat.desc(data)
##                        Y           X1           X2           X3           X4
## nbr.val       56.0000000 5.600000e+01  56.00000000   56.0000000   56.0000000
## nbr.null       0.0000000 0.000000e+00   0.00000000    0.0000000    0.0000000
## nbr.na         0.0000000 0.000000e+00   0.00000000    0.0000000    0.0000000
## min            2.2400000 6.005000e+01  11.15000000    3.3000000   21.3900000
## max           12.3600000 7.773000e+01  14.94000000   75.0400000   80.7700000
## range         10.1200000 1.768000e+01   3.79000000   71.7400000   59.3800000
## sum          277.6000000 3.863250e+03 708.36000000 1476.2800000 3422.8700000
## median         4.5100000 6.914000e+01  12.50500000   18.6400000   67.9650000
## mean           4.9571429 6.898661e+01  12.64928571   26.3621429   61.1226786
## SE.mean        0.2715868 6.008087e-01   0.10790865    2.6750203    2.2021767
## CI.mean.0.95   0.5442721 1.204048e+00   0.21625376    5.3608606    4.4132607
## var            4.1305262 2.021438e+01   0.65207948  400.7210935  271.5766018
## std.dev        2.0323696 4.496041e+00   0.80751438   20.0180192   16.4795814
## coef.var       0.4099881 6.517266e-02   0.06383873    0.7593472    0.2696148

#Scatter Plot

scatterplot = function(x, y, judul, xlab, ylab, warna)
{
  par(bg = "#FBF7F2", mar = c(5, 5, 4, 2))
  plot(x, y, main = judul, xlab = xlab, ylab = ylab,
       pch = 21, bg = warna, col = "white", cex = 1.7, lwd = 1.2,
       font.main = 2, cex.main = 1.1, col.main = "#2F3E46",
       col.lab = "#2F3E46", las = 1, bty = "l")
  grid(col = "#D9D2C5", lty = "dotted", lwd = 1)
  abline(lm(y ~ x), col = "#2F3E46", lwd = 3)
}

#Tingkat Pengangguran Terbuka (Y) dengan Tingkat Partisipasi Angkatan Kerja (X1)
scatterplot(data$X1, data$Y,
            "Scatterplot Tingkat Pengangguran Terbuka dan\nTingkat Partisipasi Angkatan Kerja",
            "Tingkat Partisipasi Angkatan Kerja (X1)",
            "Tingkat Pengangguran Terbuka (Y)", "#2A9D8F")

#Tingkat Pengangguran Terbuka (Y) dengan Harapan Lama Sekolah (X2)
scatterplot(data$X2, data$Y,
            "Scatterplot Tingkat Pengangguran Terbuka dan\nHarapan Lama Sekolah",
            "Harapan Lama Sekolah (X2)",
            "Tingkat Pengangguran Terbuka (Y)", "#E76F51")

#Tingkat Pengangguran Terbuka (Y) dengan PDRB Atas Dasar Harga Berlaku (X3)
scatterplot(data$X3, data$Y,
            "Scatterplot Tingkat Pengangguran Terbuka dan\nPDRB Atas Dasar Harga Berlaku",
            "PDRB Atas Dasar Harga Berlaku (X3)",
            "Tingkat Pengangguran Terbuka (Y)", "#E9A820")

#Tingkat Pengangguran Terbuka (Y) dengan Indeks Pembangunan Manusia (X4)
scatterplot(data$X4, data$Y,
            "Scatterplot Tingkat Pengangguran Terbuka dan\nIndeks Pembangunan Manusia",
            "Indeks Pembangunan Manusia (X4)",
            "Tingkat Pengangguran Terbuka (Y)", "#6C5B9E")

par(bg = "white")

#Deteksi Multikolinearitas

model=(lm(formula=Y~X1+X2+X3+X4,data=data))
model
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + X4, data = data)
## 
## Coefficients:
## (Intercept)           X1           X2           X3           X4  
##   10.498612    -0.237422     0.919839    -0.008344    -0.009455
summary(model)
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + X4, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.1296 -0.9922 -0.1119  0.7639  4.6374 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 10.498612   5.796395   1.811  0.07600 .  
## X1          -0.237422   0.049782  -4.769 1.59e-05 ***
## X2           0.919839   0.278410   3.304  0.00175 ** 
## X3          -0.008344   0.010186  -0.819  0.41651    
## X4          -0.009455   0.012466  -0.758  0.45170    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.453 on 51 degrees of freedom
## Multiple R-squared:  0.526,  Adjusted R-squared:  0.4888 
## F-statistic: 14.15 on 4 and 51 DF,  p-value: 7.786e-08
vif(model)
##       X1       X2       X3       X4 
## 1.304895 1.316581 1.083064 1.099406

#Pemilihan 1 titik knot

GCV1=function(data) 
{ 
  parameter=0 
  data=as.matrix(data) 
  N=nrow(data) 
  M=ncol(data) 
  m=ncol(data)-parameter-1 
  dataA=data[,(parameter+2):M] 
  dataA=as.matrix(dataA) 
  F=diag(N) 
  nk=50 #nk=banyaknya alternatif titik knot yang akan dicoba  
  knot1=matrix(ncol=m,nrow=nk) 
  for (i in (1:m)) #membuat knot 
  { 
    a=seq(min(dataA[,i]),max(dataA[,i]),length.out=nk) 
    knot1[,i]=t(as.matrix(a)) 
  } 
  a1=length(knot1[,1]) 
  knot1=as.matrix(knot1[2:(a1-1),]) 
  aa=rep(1,N) 
  data1=matrix(ncol=m,nrow=N) 
  data2=data[,2:M] #data x saja  
  nk1=nrow(knot1) 
  GCV=as.matrix(rep(NA,nk1),ncol=1);colnames(GCV)<-"GCV" 
  MSE=as.matrix(rep(NA,nk1),ncol=1);colnames(MSE)<-"MSE" 
  SSE=rep(NA,nk1) 
  SSR=rep(NA,nk1)  
  Rsq=as.matrix(rep(NA,nk1),ncol=1);colnames(Rsq)<-"Rsq" 
  knotke=matrix(c(1:nk1),ncol=1);colnames(knotke)<-"knot_ke" 
  for (i in 1:nk1) 
  { 
    for (j in 1:m)  
    {  
      for (k in 1:N)  
      {  
        if (data[k,(j+parameter+1)]<knot1[i,j]) data1[k,j]=0 else  
          data1[k,j]=data[k,(j+parameter+1)]-knot1[i,j] 
      } 
    } 
    mx=as.matrix(cbind(aa,data2,data1)) 
    C=pinv(t(mx)%*%mx) 
    B=C%*%(t(mx)%*%data[,1]) 
    yhat=mx%*%B 
    res=data[,1]-yhat 
    SSE[i]=sum((res)^2) 
    SSR[i]=sum((yhat-mean(data[,1]))^2) 
    MSE[i]=SSE[i]/(N) 
    Rsq[i]=(SSR[i]/(SSR[i]+SSE[i]))*100 
    A=mx%*%C%*%t(mx) 
    A1=(F-A) 
    A2=(sum(diag(A1))/N)^2 
    GCV[i]=MSE[i]/A2 
  } 
  dataAll=as.matrix(cbind(GCV,Rsq,knotke,knot1)) 
  dataG=dataAll[order(GCV),-2] 
  write.csv(dataAll, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Data Titik Knot 1.CSV")
  
  # ----  hasil GCV terkecil ----
  cat("\n[ HASIL GCV TERKECIL | SPLINE 1 KNOT ]\n\n")
  cat("  | GCV minimum  :", format(dataG[1,1], digits=8), "\n")
  cat("  | Knot ke-     :", dataG[1,2], "\n")
  for (v in 1:m) cat("  | Knot X", v, "      : ", format(dataG[1,2+v], digits=6), "\n", sep="")
  
  cat("\n[ 10 NILAI GCV TERKECIL ]\n\n")
  print(dataG[1:10,]) 
  
  mingcv=dataG[1,1] 
  knotgcv=as.matrix(knot1[dataG[1,4],]) 
  knotgcv1=matrix(knotgcv,nrow=1) 
  datagcv1=matrix(ncol=m,nrow=N)  
  for (j in 1:m)  
  {  
    for (k in 1:N)  
    {  
      if (data[k,(j+parameter+1)]<knotgcv[j,1]) datagcv1[k,j]=0 else  
        datagcv1[k,j]=data[k,(j+parameter+1)]-knotgcv[j,1]  
    }  
  } 
  mxgcv=as.matrix(cbind(aa,data2,datagcv1))  
  mxgcv=mxgcv[,c(2:6)] 
  list(knotgcv=knotgcv1,mingcv=mingcv,mxgcv=mxgcv) 
  
  # ----  estimasi parameter ----
  rownames(B) = c("b0",
                  paste0("b", 1:m, "_x", 1:m),
                  paste0("b", (m + 1):(2 * m), "_(x", 1:m, "-k", 1:m, ")+"))
  cat("\n[ ESTIMASI PARAMETER | TITIK KNOT KE-1 ]\n\n")
  print(B)
  cat("\n")
} 
GCV1(data)
## 
## [ HASIL GCV TERKECIL | SPLINE 1 KNOT ]
## 
##   | GCV minimum  : 1.5081867 
##   | Knot ke-     : 45 
##   | Knot X1      : 76.2867
##   | Knot X2      : 14.6306
##   | Knot X3      : 69.1837
##   | Knot X4      : 75.9227
## 
## [ 10 NILAI GCV TERKECIL ]
## 
##            GCV knot_ke                                     
##  [1,] 1.508187      45 76.28673 14.63061 69.183673 75.92265
##  [2,] 1.515931      44 75.92592 14.55327 67.719592 74.71082
##  [3,] 1.603414      46 76.64755 14.70796 70.647755 77.13449
##  [4,] 1.615275      43 75.56510 14.47592 66.255510 73.49898
##  [5,] 1.734461      42 75.20429 14.39857 64.791429 72.28714
##  [6,] 1.763515      47 77.00837 14.78531 72.111837 78.34633
##  [7,] 1.830095       3 61.13245 11.38204  7.692245 25.02551
##  [8,] 1.861406       4 61.49327 11.45939  9.156327 26.23735
##  [9,] 1.869770      41 74.84347 14.32122 63.327347 71.07531
## [10,] 1.912402       5 61.85408 11.53673 10.620408 27.44918
## 
## [ ESTIMASI PARAMETER | TITIK KNOT KE-1 ]
## 
##                      [,1]
## b0           1.100168e+01
## b1_x1       -2.352118e-01
## b2_x2        8.683805e-01
## b3_x3       -5.401921e-03
## b4_x4       -1.233868e-02
## b5_(x1-k1)+  5.699848e-01
## b6_(x2-k2)+ -1.336717e+02
## b7_(x3-k3)+  4.073604e-01
## b8_(x4-k4)+  6.923471e+00

#Uji Signifikansi 1 titik knot

uji=function(alpha,parameter) 
{ 
  # ----  membaca titik knot optimal (GCV terkecil) ----
  knot1=read.csv("C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Data Titik Knot 1.CSV", header=TRUE) 
  knot1=as.matrix(knot1) 
  knot1=knot1[,-1] #buang kolom index baris 
  knot1=knot1[order(knot1[,1]),] #urutkan berdasarkan GCV terkecil 
  
  data=as.matrix(data) 
  N=nrow(data) 
  M=ncol(data) 
  m=ncol(data)-parameter-1 
  dataA=data[,(parameter+2):M] 
  dataA=as.matrix(dataA) 
  knotopt=as.numeric(knot1[1,4:(3+m)]) #knot X1-X4 pada baris GCV terkecil 
  aa=rep(1,N) 
  data1=matrix(ncol=m,nrow=N) 
  data2=data[,2:M] #data x saja 
  
  for (j in 1:m)  
  {  
    for (k in 1:N)  
    {  
      if (data[k,(j+parameter+1)]<knotopt[j]) data1[k,j]=0 else  
        data1[k,j]=data[k,(j+parameter+1)]-knotopt[j] 
    } 
  } 
  mx=as.matrix(cbind(aa,data2,data1)) 
  C=pinv(t(mx)%*%mx) 
  B=C%*%(t(mx)%*%data[,1]) 
  np=nrow(B) #banyaknya parameter 
  yhat=mx%*%B 
  res=data[,1]-yhat 
  SSE=sum((res)^2) 
  SSR=sum((yhat-mean(data[,1]))^2) 
  SST=sum((data[,1]-mean(data[,1]))^2) 
  MSE=SSE/(N) 
  MSR=SSR/(np-1) 
  Rsq=(SSR/(SSR+SSE))*100 
  
  rownames(B) = c("b0",
                  paste0("b", 1:m, "_x", 1:m),
                  paste0("b", (m + 1):(2 * m), "_(x", 1:m, "-k", 1:m, ")+"))
  
  # ----  uji simultan ----
  Fhit=MSR/MSE 
  pvalue=pf(Fhit,(np-1),(N-np),lower.tail=FALSE) 
  cat("\n[ UJI SIMULTAN | SPLINE 1 KNOT ]\n\n")
  cat("  | F hitung     :", format(Fhit, digits=8), "\n")
  cat("  | p-value      :", format(pvalue, digits=8), "\n")
  if (pvalue<=alpha) 
  { 
    cat("  | Keputusan    : Tolak Ho\n")
    cat("  | Kesimpulan   : minimal terdapat 1 variabel bebas yang signifikan\n")
  } else 
  { 
    cat("  | Keputusan    : Gagal Tolak Ho\n")
    cat("  | Kesimpulan   : semua variabel bebas tidak berpengaruh signifikan\n")
  } 
  
  # ----  uji parsial ----
  thit=rep(NA,np) 
  pval=rep(NA,np) 
  SE=sqrt(diag(MSE*C)) 
  cat("\n[ UJI PARSIAL | SPLINE 1 KNOT ]\n\n")
  for (i in 1:np) 
  { 
    thit[i]=B[i,1]/SE[i] 
    pval[i]=2*(pt(abs(thit[i]),(N-np),lower.tail=FALSE)) 
    ket=if (pval[i]<=alpha) "Signifikan (Tolak Ho)" else "Tidak signifikan (Gagal Tolak Ho)"
    cat(sprintf("  > %-12s : t = %9.4f | p = %8.6f | %s\n", rownames(B)[i], thit[i], pval[i], ket))
  } 
  
  # ----  anova ----
  cat("\n[ ANALYSIS OF VARIANCE ]\n\n")
  cat(sprintf("  %-8s %4s %14s %14s %10s\n", "Sumber", "df", "SS", "MS", "Fhit"))
  cat(sprintf("  %-8s %4d %14.4f %14.4f %10.4f\n", "Regresi", np-1, SSR, MSR, Fhit))
  cat(sprintf("  %-8s %4d %14.4f %14.4f\n", "Error", N-np, SSE, MSE))
  cat(sprintf("  %-8s %4d %14.4f\n", "Total", N-1, SST))
  cat("\n  | s            :", format(sqrt(MSE), digits=6), "\n")
  cat("  | R-square     :", format(Rsq, digits=6), "%\n")
  cat("  | p-value (F)  :", format(pvalue, digits=8), "\n\n")
  
  write.csv(res, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Output Uji Residual Titik Knot 1.CSV") 
  write.csv(mx, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Output Uji MX Titik Knot 1.CSV") 
  write.csv(yhat, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Output Uji yhat Titik Knot 1.CSV") 
} 
uji(0.1, 0)
## 
## [ UJI SIMULTAN | SPLINE 1 KNOT ]
## 
##   | F hitung     : 19.730268 
##   | p-value      : 1.2390004e-12 
##   | Keputusan    : Tolak Ho
##   | Kesimpulan   : minimal terdapat 1 variabel bebas yang signifikan
## 
## [ UJI PARSIAL | SPLINE 1 KNOT ]
## 
##   > b0           : t =    2.0625 | p = 0.044713 | Signifikan (Tolak Ho)
##   > b1_x1        : t =   -5.0617 | p = 0.000007 | Signifikan (Tolak Ho)
##   > b2_x2        : t =    2.8350 | p = 0.006736 | Signifikan (Tolak Ho)
##   > b3_x3        : t =   -0.6720 | p = 0.504905 | Tidak signifikan (Gagal Tolak Ho)
##   > b4_x4        : t =   -1.7269 | p = 0.090745 | Signifikan (Tolak Ho)
##   > b5_(x1-k1)+  : t =    0.1162 | p = 0.907988 | Tidak signifikan (Gagal Tolak Ho)
##   > b6_(x2-k2)+  : t =   -5.3953 | p = 0.000002 | Signifikan (Tolak Ho)
##   > b7_(x3-k3)+  : t =    1.8516 | p = 0.070368 | Signifikan (Tolak Ho)
##   > b8_(x4-k4)+  : t =    5.8681 | p = 0.000000 | Signifikan (Tolak Ho)
## 
## [ ANALYSIS OF VARIANCE ]
## 
##   Sumber     df             SS             MS       Fhit
##   Regresi     8       167.6864        20.9608    19.7303
##   Error      47        59.4926         1.0624
##   Total      55       227.1789
## 
##   | s            : 1.03071 
##   | R-square     : 73.8125 %
##   | p-value (F)  : 1.2390004e-12

#Pemilihan 2 titik knot

GCV2=function(data) 
{ 
  parameter=0 
  data=as.matrix(data) 
  N=nrow(data) 
  M=ncol(data) 
  m=ncol(data)-parameter-1 
  dataA=data[,(parameter+2):M] 
  dataA=as.matrix(dataA) 
  F=diag(N) 
  nk=50 #nk=banyaknya alternatif titik knot yang akan dicoba  
  knot1=matrix(ncol=m,nrow=nk) 
  for (i in (1:m)) #membuat knot 
  { 
    a=seq(min(dataA[,i]),max(dataA[,i]),length.out=nk) 
    knot1[,i]=t(as.matrix(a)) 
  } 
  a1=length(knot1[,1]) 
  knot1=as.matrix(knot1[2:(a1-1),]) 
  a2=nk-2  
  z=(a2*(a2-1)/2) 
  knot2=cbind(rep(NA,(z+1))) 
  for (i in (1:m)) 
  { 
    knot=rbind(rep(NA,2)) 
    for ( j in 1:(a2-1)) 
    { 
      for (k in (j+1):a2)  
      { xx=cbind(knot1[j,i],knot1[k,i]) 
      knot=rbind(knot,xx) 
      } 
    } 
    knot2=cbind(knot2,knot)  
  } 
  knot2=knot2[2:(z+1),2:(2*m+1)] 
  a3=nrow(knot2) 
  aa=rep(1,N) 
  data1=matrix(ncol=2*m,nrow=N) 
  data2=data[,2:M] #data x saja  
  nk1=nrow(knot2) 
  GCV=as.matrix(rep(NA,nk1),ncol=1);colnames(GCV)<-"GCV" 
  MSE=as.matrix(rep(NA,nk1),ncol=1);colnames(MSE)<-"MSE" 
  SSE=rep(NA,nk1) 
  SSR=rep(NA,nk1)  
  Rsq=as.matrix(rep(NA,nk1),ncol=1);colnames(Rsq)<-"Rsq" 
  knotke=matrix(c(1:nk1),ncol=1);colnames(knotke)<-"knot_ke" 
  for (i in 1:a3) 
  { 
    for (j in 1:(2*m))  
    {  
      b=ceiling(j/2) 
      for (k in 1:N)  
      {  
        if (data[k,(b+parameter+1)]<knot2[i,j]) data1[k,j]=0 else  
          data1[k,j]=data[k,(b+parameter+1)]-knot2[i,j] 
      } 
    } 
    mx=as.matrix(cbind(aa,data2,data1)) 
    C=pinv(t(mx)%*%mx) 
    B=C%*%(t(mx)%*%data[,1]) 
    yhat=mx%*%B 
    res=data[,1]-yhat 
    SSE[i]=sum((res)^2) 
    SSR[i]=sum((yhat-mean(data[,1]))^2) 
    MSE[i]=SSE[i]/(N) 
    Rsq[i]=(SSR[i]/(SSR[i]+SSE[i]))*100 
    A=mx%*%C%*%t(mx) 
    A1=(F-A) 
    A2=(sum(diag(A1))/N)^2 
    GCV[i]=MSE[i]/A2 
  } 
  dataAll=as.matrix(cbind(GCV,Rsq,knotke,knot2)) 
  dataG=dataAll[order(GCV),-2] 
  write.csv(dataAll, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Data Titik Knot 2.CSV")
  
  # ----  hasil GCV terkecil ----
  cat("\n[ HASIL GCV TERKECIL | SPLINE 2 KNOT ]\n\n")
  cat("  | GCV minimum  :", format(dataG[1,1], digits=8), "\n")
  cat("  | Knot ke-     :", dataG[1,2], "\n")
  for (v in 1:m) cat("  | Knot X", v, "      : ", paste(format(dataG[1,(2+(v-1)*2+1):(2+v*2)], digits=6), collapse=" ; "), "\n", sep="")
  
  cat("\n[ 10 NILAI GCV TERKECIL ]\n\n")
  print(dataG[1:10,]) 
  
  # ----  hitung ulang B pada knot dengan GCV terkecil ----
  knotgcv=knot2[dataG[1,2],] 
  datagcv1=matrix(ncol=2*m,nrow=N)  
  for (j in 1:(2*m))  
  {  
    b=ceiling(j/2) 
    for (k in 1:N)  
    {  
      if (data[k,(b+parameter+1)]<knotgcv[j]) datagcv1[k,j]=0 else  
        datagcv1[k,j]=data[k,(b+parameter+1)]-knotgcv[j]  
    }  
  } 
  mxgcv=as.matrix(cbind(aa,data2,datagcv1))  
  C=pinv(t(mxgcv)%*%mxgcv) 
  B=C%*%(t(mxgcv)%*%data[,1]) 
  
  # ----  estimasi parameter ----
  rownames(B) = c("b0",
                  paste0("b", 1:m, "_x", 1:m),
                  paste0("b", (m + 1):(3 * m), "_(x", rep(1:m, each = 2), "-k", rep(1:m, each = 2), ".", rep(1:2, m), ")+"))
  cat("\n[ ESTIMASI PARAMETER | TITIK KNOT KE-2 ]\n\n")
  print(B)
  cat("\n")
} 
GCV2(data)
## 
## [ HASIL GCV TERKECIL | SPLINE 2 KNOT ]
## 
##   | GCV minimum  : 1.3160676 
##   | Knot ke-     : 135 
##   | Knot X1      : 61.1324 ; 76.2867
##   | Knot X2      : 11.3820 ; 14.6306
##   | Knot X3      :  7.69224 ; 69.18367
##   | Knot X4      : 25.0255 ; 75.9227
## 
## [ 10 NILAI GCV TERKECIL ]
## 
##            GCV knot_ke                                                       
##  [1,] 1.316068     135 61.13245 76.28673 11.38204 14.63061  7.692245 69.18367
##  [2,] 1.317894     179 61.49327 76.28673 11.45939 14.63061  9.156327 69.18367
##  [3,] 1.321114     178 61.49327 75.92592 11.45939 14.55327  9.156327 67.71959
##  [4,] 1.321402     134 61.13245 75.92592 11.38204 14.55327  7.692245 67.71959
##  [5,] 1.358738     221 61.85408 75.92592 11.53673 14.55327 10.620408 67.71959
##  [6,] 1.359630     222 61.85408 76.28673 11.53673 14.63061 10.620408 69.18367
##  [7,] 1.359989     138 61.13245 77.36918 11.38204 14.86265  7.692245 73.57592
##  [8,] 1.388799     136 61.13245 76.64755 11.38204 14.70796  7.692245 70.64776
##  [9,] 1.393180     180 61.49327 76.64755 11.45939 14.70796  9.156327 70.64776
## [10,] 1.396087     177 61.49327 75.56510 11.45939 14.47592  9.156327 66.25551
##                        
##  [1,] 25.02551 75.92265
##  [2,] 26.23735 75.92265
##  [3,] 26.23735 74.71082
##  [4,] 25.02551 74.71082
##  [5,] 27.44918 74.71082
##  [6,] 27.44918 75.92265
##  [7,] 25.02551 79.55816
##  [8,] 25.02551 77.13449
##  [9,] 26.23735 77.13449
## [10,] 26.23735 73.49898
## 
## [ ESTIMASI PARAMETER | TITIK KNOT KE-2 ]
## 
##                       [,1]
## b0              95.3587175
## b1_x1           -2.9213119
## b2_x2            6.1469387
## b3_x3            0.2059982
## b4_x4            0.7283636
## b5_(x1-k1.1)+    2.7449916
## b6_(x1-k1.2)+    0.7954129
## b7_(x2-k2.1)+   -5.3197766
## b8_(x2-k2.2)+  -18.0705567
## b9_(x3-k3.1)+   -0.2144538
## b10_(x3-k3.2)+   0.2853691
## b11_(x4-k4.1)+  -0.7619877
## b12_(x4-k4.2)+   0.9034632

#Uji Signifikansi 2 titik knot

uji=function(alpha,parameter) 
{ 
  # ----  membaca titik knot optimal (GCV terkecil) ----
  knot2=read.csv("C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Data Titik Knot 2.CSV", header=TRUE) 
  knot2=as.matrix(knot2) 
  knot2=knot2[,-1] #buang kolom index baris 
  knot2=knot2[order(knot2[,1]),] #urutkan berdasarkan GCV terkecil 
  
  data=as.matrix(data) 
  N=nrow(data) 
  M=ncol(data) 
  m=ncol(data)-parameter-1 
  dataA=data[,(parameter+2):M] 
  dataA=as.matrix(dataA) 
  knotopt=as.numeric(knot2[1,4:(3+2*m)]) #knot X1-X4 pada baris GCV terkecil (2 knot per variabel) 
  aa=rep(1,N) 
  data1=matrix(ncol=2*m,nrow=N) 
  data2=data[,2:M] #data x saja 
  
  for (j in 1:(2*m))  
  {  
    b=ceiling(j/2) 
    for (k in 1:N)  
    {  
      if (data[k,(b+parameter+1)]<knotopt[j]) data1[k,j]=0 else  
        data1[k,j]=data[k,(b+parameter+1)]-knotopt[j] 
    } 
  } 
  mx=as.matrix(cbind(aa,data2,data1)) 
  C=pinv(t(mx)%*%mx) 
  B=C%*%(t(mx)%*%data[,1]) 
  np=nrow(B) #banyaknya parameter 
  yhat=mx%*%B 
  res=data[,1]-yhat 
  SSE=sum((res)^2) 
  SSR=sum((yhat-mean(data[,1]))^2) 
  SST=sum((data[,1]-mean(data[,1]))^2) 
  MSE=SSE/(N) 
  MSR=SSR/(np-1) 
  Rsq=(SSR/(SSR+SSE))*100 
  
  rownames(B) = c("b0",
                  paste0("b", 1:m, "_x", 1:m),
                  paste0("b", (m + 1):(3 * m), "_(x", rep(1:m, each = 2), "-k", rep(1:m, each = 2), ".", rep(1:2, m), ")+"))
  
  # ----  uji simultan ----
  Fhit=MSR/MSE 
  pvalue=pf(Fhit,(np-1),(N-np),lower.tail=FALSE) 
  cat("\n[ UJI SIMULTAN | SPLINE 2 KNOT ]\n\n")
  cat("  | F hitung     :", format(Fhit, digits=8), "\n")
  cat("  | p-value      :", format(pvalue, digits=8), "\n")
  if (pvalue<=alpha) 
  { 
    cat("  | Keputusan    : Tolak Ho\n")
    cat("  | Kesimpulan   : minimal terdapat 1 variabel bebas yang signifikan\n")
  } else 
  { 
    cat("  | Keputusan    : Gagal Tolak Ho\n")
    cat("  | Kesimpulan   : semua variabel bebas tidak berpengaruh signifikan\n")
  } 
  
  # ----  uji parsial ----
  thit=rep(NA,np) 
  pval=rep(NA,np) 
  SE=sqrt(diag(MSE*C)) 
  cat("\n[ UJI PARSIAL | SPLINE 2 KNOT ]\n\n")
  for (i in 1:np) 
  { 
    thit[i]=B[i,1]/SE[i] 
    pval[i]=2*(pt(abs(thit[i]),(N-np),lower.tail=FALSE)) 
    ket=if (pval[i]<=alpha) "Signifikan (Tolak Ho)" else "Tidak signifikan (Gagal Tolak Ho)"
    cat(sprintf("  > %-14s : t = %9.4f | p = %8.6f | %s\n", rownames(B)[i], thit[i], pval[i], ket))
  } 
  
  # ----  anova ----
  cat("\n[ ANALYSIS OF VARIANCE ]\n\n")
  cat(sprintf("  %-8s %4s %14s %14s %10s\n", "Sumber", "df", "SS", "MS", "Fhit"))
  cat(sprintf("  %-8s %4d %14.4f %14.4f %10.4f\n", "Regresi", np-1, SSR, MSR, Fhit))
  cat(sprintf("  %-8s %4d %14.4f %14.4f\n", "Error", N-np, SSE, MSE))
  cat(sprintf("  %-8s %4d %14.4f\n", "Total", N-1, SST))
  cat("\n  | s            :", format(sqrt(MSE), digits=6), "\n")
  cat("  | R-square     :", format(Rsq, digits=6), "%\n")
  cat("  | p-value (F)  :", format(pvalue, digits=8), "\n\n")
  
  write.csv(res, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Output Uji Residual Titik Knot 2.CSV") 
  write.csv(mx, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Output Uji MX Titik Knot 2.CSV") 
  write.csv(yhat, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Output Uji yhat Titik Knot 2.CSV") 
} 
uji(0.1, 0)
## 
## [ UJI SIMULTAN | SPLINE 2 KNOT ]
## 
##   | F hitung     : 19.73097 
##   | p-value      : 1.0756193e-13 
##   | Keputusan    : Tolak Ho
##   | Kesimpulan   : minimal terdapat 1 variabel bebas yang signifikan
## 
## [ UJI PARSIAL | SPLINE 2 KNOT ]
## 
##   > b0             : t =    1.2829 | p = 0.206414 | Tidak signifikan (Gagal Tolak Ho)
##   > b1_x1          : t =   -3.1999 | p = 0.002583 | Signifikan (Tolak Ho)
##   > b2_x2          : t =    1.4435 | p = 0.156128 | Tidak signifikan (Gagal Tolak Ho)
##   > b3_x3          : t =    1.4449 | p = 0.155735 | Tidak signifikan (Gagal Tolak Ho)
##   > b4_x4          : t =    2.2723 | p = 0.028125 | Signifikan (Tolak Ho)
##   > b5_(x1-k1.1)+  : t =    2.9751 | p = 0.004790 | Signifikan (Tolak Ho)
##   > b6_(x1-k1.2)+  : t =    1.1858 | p = 0.242220 | Tidak signifikan (Gagal Tolak Ho)
##   > b7_(x2-k2.1)+  : t =   -1.2366 | p = 0.222963 | Tidak signifikan (Gagal Tolak Ho)
##   > b8_(x2-k2.2)+  : t =   -4.8730 | p = 0.000015 | Signifikan (Tolak Ho)
##   > b9_(x3-k3.1)+  : t =   -1.4662 | p = 0.149862 | Tidak signifikan (Gagal Tolak Ho)
##   > b10_(x3-k3.2)+ : t =    1.4127 | p = 0.164956 | Tidak signifikan (Gagal Tolak Ho)
##   > b11_(x4-k4.1)+ : t =   -2.3388 | p = 0.024060 | Signifikan (Tolak Ho)
##   > b12_(x4-k4.2)+ : t =    5.3276 | p = 0.000003 | Signifikan (Tolak Ho)
## 
## [ ANALYSIS OF VARIANCE ]
## 
##   Sumber     df             SS             MS       Fhit
##   Regresi    12       183.7252        15.3104    19.7310
##   Error      43        43.4537         0.7760
##   Total      55       227.1789
## 
##   | s            : 0.880886 
##   | R-square     : 80.8725 %
##   | p-value (F)  : 1.0756193e-13

#Pemilihan 3 titik knot

GCV3=function(data) 
{ 
  parameter=0 
  data=as.matrix(data) 
  N=nrow(data) 
  M=ncol(data) 
  m=ncol(data)-parameter-1 
  dataA=data[,(parameter+2):M] 
  dataA=as.matrix(dataA) 
  F=diag(N) 
  nk=50 #nk=banyaknya alternatif titik knot yang akan dicoba  
  knot1=matrix(ncol=m,nrow=nk) 
  for (i in (1:m)) #membuat knot 
  { 
    a=seq(min(dataA[,i]),max(dataA[,i]),length.out=nk) 
    knot1[,i]=t(as.matrix(a)) 
  } 
  a1=length(knot1[,1]) 
  knot1=as.matrix(knot1[2:(a1-1),]) 
  a2=nk-2 
  z=(a2*(a2-1)*(a2-2)/6) 
  knot2=cbind(rep(NA,(z+1))) 
  for (i in (1:m)) 
  { 
    knot=rbind(rep(NA,3)) 
    for ( j in 1:(a2-2)) 
    { 
      for (k in (j+1):(a2-1)) 
      { 
        for (g in (k+1):a2) 
        { 
          xx=cbind(knot1[j,i],knot1[k,i],knot1[g,i]) 
          knot=rbind(knot,xx) 
        } 
      } 
    } 
    knot2=cbind(knot2,knot) 
  } 
  knot2=knot2[2:(z+1),2:(3*m+1)] 
  a3=nrow(knot2) 
  aa=rep(1,N) 
  data1=matrix(ncol=3*m,nrow=N) 
  data2=data[,2:M] #data x saja  
  nk1=nrow(knot2) 
  GCV=as.matrix(rep(NA,nk1),ncol=1);colnames(GCV)<-"GCV" 
  MSE=as.matrix(rep(NA,nk1),ncol=1);colnames(MSE)<-"MSE" 
  SSE=rep(NA,nk1) 
  SSR=rep(NA,nk1)  
  Rsq=as.matrix(rep(NA,nk1),ncol=1);colnames(Rsq)<-"Rsq" 
  knotke=matrix(c(1:nk1),ncol=1);colnames(knotke)<-"knot_ke" 
  for (i in 1:a3) 
  { 
    for (j in 1:(3*m))  
    {  
      b=ceiling(j/3) 
      for (k in 1:N)  
      {  
        if (data[k,(b+parameter+1)]<knot2[i,j]) data1[k,j]=0 else  
          data1[k,j]=data[k,(b+parameter+1)]-knot2[i,j] 
      } 
    } 
    mx=as.matrix(cbind(aa,data2,data1)) 
    C=pinv(t(mx)%*%mx) 
    B=C%*%(t(mx)%*%data[,1]) 
    yhat=mx%*%B 
    res=data[,1]-yhat 
    SSE[i]=sum((res)^2) 
    SSR[i]=sum((yhat-mean(data[,1]))^2) 
    MSE[i]=SSE[i]/(N) 
    Rsq[i]=(SSR[i]/(SSR[i]+SSE[i]))*100 
    A=mx%*%C%*%t(mx) 
    A1=(F-A) 
    A2=(sum(diag(A1))/N)^2 
    GCV[i]=MSE[i]/A2 
  } 
  dataAll=as.matrix(cbind(GCV,Rsq,knotke,knot2)) 
  dataG=dataAll[order(GCV),-2] 
  write.csv(dataAll, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Data Titik Knot 3.CSV")
  
  # ----  hasil GCV terkecil ----
  cat("\n[ HASIL GCV TERKECIL | SPLINE 3 KNOT ]\n\n")
  cat("  | GCV minimum  :", format(dataG[1,1], digits=8), "\n")
  cat("  | Knot ke-     :", dataG[1,2], "\n")
  for (v in 1:m) cat("  | Knot X", v, "      : ", paste(format(dataG[1,(2+(v-1)*3+1):(2+v*3)], digits=6), collapse=" ; "), "\n", sep="")
  
  cat("\n[ 10 NILAI GCV TERKECIL ]\n\n")
  print(dataG[1:10,]) 
  
  # ----  hitung ulang B pada knot dengan GCV terkecil ----
  knotgcv=knot2[dataG[1,2],] 
  datagcv1=matrix(ncol=3*m,nrow=N)  
  for (j in 1:(3*m))  
  {  
    b=ceiling(j/3) 
    for (k in 1:N)  
    {  
      if (data[k,(b+parameter+1)]<knotgcv[j]) datagcv1[k,j]=0 else  
        datagcv1[k,j]=data[k,(b+parameter+1)]-knotgcv[j]  
    }  
  } 
  mxgcv=as.matrix(cbind(aa,data2,datagcv1))  
  C=pinv(t(mxgcv)%*%mxgcv) 
  B=C%*%(t(mxgcv)%*%data[,1]) 
  
  # ----  estimasi parameter ----
  rownames(B) = c("b0",
                  paste0("b", 1:m, "_x", 1:m),
                  paste0("b", (m + 1):(4 * m), "_(x", rep(1:m, each = 3), "-k", rep(1:m, each = 3), ".", rep(1:3, m), ")+"))
  cat("\n[ ESTIMASI PARAMETER | TITIK KNOT KE-3 ]\n\n")
  print(B)
  cat("\n")
} 
GCV3(data)
## 
## [ HASIL GCV TERKECIL | SPLINE 3 KNOT ]
## 
##   | GCV minimum  : 1.4442458 
##   | Knot ke-     : 2200 
##   | Knot X1      : 61.1324 ; 61.8541 ; 76.2867
##   | Knot X2      : 11.3820 ; 11.5367 ; 14.6306
##   | Knot X3      :  7.69224 ; 10.62041 ; 69.18367
##   | Knot X4      : 25.0255 ; 27.4492 ; 75.9227
## 
## [ 10 NILAI GCV TERKECIL ]
## 
##            GCV knot_ke                                                      
##  [1,] 1.444246    2200 61.13245 61.85408 76.28673 11.38204 11.53673 14.63061
##  [2,] 1.445793    3146 61.49327 61.85408 76.28673 11.45939 11.53673 14.63061
##  [3,] 1.447104    2157 61.13245 61.49327 76.28673 11.38204 11.45939 14.63061
##  [4,] 1.452451    3106 61.13245 77.00837 77.36918 11.38204 14.78531 14.86265
##  [5,] 1.453903    2199 61.13245 61.85408 75.92592 11.38204 11.53673 14.55327
##  [6,] 1.454858    3145 61.49327 61.85408 75.92592 11.45939 11.53673 14.55327
##  [7,] 1.458180    2156 61.13245 61.49327 75.92592 11.38204 11.45939 14.55327
##  [8,] 1.458931    2242 61.13245 62.21490 76.28673 11.38204 11.61408 14.63061
##  [9,] 1.464584    3037 61.13245 73.03939 76.28673 11.38204 13.93449 14.63061
## [10,] 1.465580    3101 61.13245 76.28673 76.64755 11.38204 14.63061 14.70796
##                                                             
##  [1,] 7.692245 10.620408 69.18367 25.02551 27.44918 75.92265
##  [2,] 9.156327 10.620408 69.18367 26.23735 27.44918 75.92265
##  [3,] 7.692245  9.156327 69.18367 25.02551 26.23735 75.92265
##  [4,] 7.692245 72.111837 73.57592 25.02551 78.34633 79.55816
##  [5,] 7.692245 10.620408 67.71959 25.02551 27.44918 74.71082
##  [6,] 9.156327 10.620408 67.71959 26.23735 27.44918 74.71082
##  [7,] 7.692245  9.156327 67.71959 25.02551 26.23735 74.71082
##  [8,] 7.692245 12.084490 69.18367 25.02551 28.66102 75.92265
##  [9,] 7.692245 56.006939 69.18367 25.02551 65.01612 75.92265
## [10,] 7.692245 69.183673 70.64776 25.02551 75.92265 77.13449
## 
## [ ESTIMASI PARAMETER | TITIK KNOT KE-3 ]
## 
##                        [,1]
## b0              -4.87954772
## b1_x1           -0.57070096
## b2_x2            1.29861827
## b3_x3            0.20162854
## b4_x4            1.23897094
## b5_(x1-k1.1)+   -2.60712939
## b6_(x1-k1.2)+    3.03208076
## b7_(x1-k1.3)+    0.76491110
## b8_(x2-k2.1)+   13.80910095
## b9_(x2-k2.2)+  -14.12188194
## b10_(x2-k2.3)+ -19.59971920
## b11_(x3-k3.1)+  -0.22960609
## b12_(x3-k3.2)+   0.02361872
## b13_(x3-k3.3)+   0.25980650
## b14_(x4-k4.1)+  -1.94377923
## b15_(x4-k4.2)+   0.67438516
## b16_(x4-k4.3)+   0.92445503

#Uji Signifikansi 3 titik knot

uji=function(alpha,parameter) 
{ 
  # ----  membaca titik knot optimal (GCV terkecil) ----
  knot2=read.csv("C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Data Titik Knot 3.CSV", header=TRUE) 
  knot2=as.matrix(knot2) 
  knot2=knot2[,-1] #buang kolom index baris 
  knot2=knot2[order(knot2[,1]),] #urutkan berdasarkan GCV terkecil 
  
  data=as.matrix(data) 
  N=nrow(data) 
  M=ncol(data) 
  m=ncol(data)-parameter-1 
  dataA=data[,(parameter+2):M] 
  dataA=as.matrix(dataA) 
  knotopt=as.numeric(knot2[1,4:(3+3*m)]) #knot X1-X4 pada baris GCV terkecil (3 knot per variabel) 
  aa=rep(1,N) 
  data1=matrix(ncol=3*m,nrow=N) 
  data2=data[,2:M] #data x saja 
  
  for (j in 1:(3*m))  
  {  
    b=ceiling(j/3) 
    for (k in 1:N)  
    {  
      if (data[k,(b+parameter+1)]<knotopt[j]) data1[k,j]=0 else  
        data1[k,j]=data[k,(b+parameter+1)]-knotopt[j] 
    } 
  } 
  mx=as.matrix(cbind(aa,data2,data1)) 
  C=pinv(t(mx)%*%mx) 
  B=C%*%(t(mx)%*%data[,1]) 
  np=nrow(B) #banyaknya parameter 
  yhat=mx%*%B 
  res=data[,1]-yhat 
  SSE=sum((res)^2) 
  SSR=sum((yhat-mean(data[,1]))^2) 
  SST=sum((data[,1]-mean(data[,1]))^2) 
  MSE=SSE/(N) 
  MSR=SSR/(np-1) 
  Rsq=(SSR/(SSR+SSE))*100 
  
  rownames(B) = c("b0",
                  paste0("b", 1:m, "_x", 1:m),
                  paste0("b", (m + 1):(4 * m), "_(x", rep(1:m, each = 3), "-k", rep(1:m, each = 3), ".", rep(1:3, m), ")+"))
  
  # ----  uji simultan ----
  Fhit=MSR/MSE 
  pvalue=pf(Fhit,(np-1),(N-np),lower.tail=FALSE) 
  cat("\n[ UJI SIMULTAN | SPLINE 3 KNOT ]\n\n")
  cat("  | F hitung     :", format(Fhit, digits=8), "\n")
  cat("  | p-value      :", format(pvalue, digits=8), "\n")
  if (pvalue<=alpha) 
  { 
    cat("  | Keputusan    : Tolak Ho\n")
    cat("  | Kesimpulan   : minimal terdapat 1 variabel bebas yang signifikan\n")
  } else 
  { 
    cat("  | Keputusan    : Gagal Tolak Ho\n")
    cat("  | Kesimpulan   : semua variabel bebas tidak berpengaruh signifikan\n")
  } 
  
  # ----  uji parsial ----
  thit=rep(NA,np) 
  pval=rep(NA,np) 
  SE=sqrt(diag(MSE*C)) 
  cat("\n[ UJI PARSIAL | SPLINE 3 KNOT ]\n\n")
  for (i in 1:np) 
  { 
    thit[i]=B[i,1]/SE[i] 
    pval[i]=2*(pt(abs(thit[i]),(N-np),lower.tail=FALSE)) 
    ket=if (pval[i]<=alpha) "Signifikan (Tolak Ho)" else "Tidak signifikan (Gagal Tolak Ho)"
    cat(sprintf("  > %-14s : t = %9.4f | p = %8.6f | %s\n", rownames(B)[i], thit[i], pval[i], ket))
  } 
  
  # ----  anova ----
  cat("\n[ ANALYSIS OF VARIANCE ]\n\n")
  cat(sprintf("  %-8s %4s %14s %14s %10s\n", "Sumber", "df", "SS", "MS", "Fhit"))
  cat(sprintf("  %-8s %4d %14.4f %14.4f %10.4f\n", "Regresi", np-1, SSR, MSR, Fhit))
  cat(sprintf("  %-8s %4d %14.4f %14.4f\n", "Error", N-np, SSE, MSE))
  cat(sprintf("  %-8s %4d %14.4f\n", "Total", N-1, SST))
  cat("\n  | s            :", format(sqrt(MSE), digits=6), "\n")
  cat("  | R-square     :", format(Rsq, digits=6), "%\n")
  cat("  | p-value (F)  :", format(pvalue, digits=8), "\n\n")
  
  write.csv(res, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Output Uji Residual Titik Knot 3.CSV") 
  write.csv(mx, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Output Uji MX Titik Knot 3.CSV") 
  write.csv(yhat, file="C:\\Users\\ACER\\Documents\\MATKUL REGNON\\Tugas Spline Dataset 1\\Output Uji yhat Titik Knot 3.CSV") 
} 
uji(0.1, 0)
## 
## [ UJI SIMULTAN | SPLINE 3 KNOT ]
## 
##   | F hitung     : 15.769172 
##   | p-value      : 2.7621416e-12 
##   | Keputusan    : Tolak Ho
##   | Kesimpulan   : minimal terdapat 1 variabel bebas yang signifikan
## 
## [ UJI PARSIAL | SPLINE 3 KNOT ]
## 
##   > b0             : t =   -0.5160 | p = 0.608760 | Tidak signifikan (Gagal Tolak Ho)
##   > b1_x1          : t =   -0.2898 | p = 0.773496 | Tidak signifikan (Gagal Tolak Ho)
##   > b2_x2          : t =    0.1294 | p = 0.897680 | Tidak signifikan (Gagal Tolak Ho)
##   > b3_x3          : t =    0.7517 | p = 0.456715 | Tidak signifikan (Gagal Tolak Ho)
##   > b4_x4          : t =    2.0245 | p = 0.049803 | Signifikan (Tolak Ho)
##   > b5_(x1-k1.1)+  : t =   -0.6448 | p = 0.522861 | Tidak signifikan (Gagal Tolak Ho)
##   > b6_(x1-k1.2)+  : t =    1.3787 | p = 0.175834 | Tidak signifikan (Gagal Tolak Ho)
##   > b7_(x1-k1.3)+  : t =    1.0472 | p = 0.301445 | Tidak signifikan (Gagal Tolak Ho)
##   > b8_(x2-k2.1)+  : t =    0.5012 | p = 0.619070 | Tidak signifikan (Gagal Tolak Ho)
##   > b9_(x2-k2.2)+  : t =   -0.7666 | p = 0.447909 | Tidak signifikan (Gagal Tolak Ho)
##   > b10_(x2-k2.3)+ : t =   -5.0586 | p = 0.000010 | Signifikan (Tolak Ho)
##   > b11_(x3-k3.1)+ : t =   -0.4422 | p = 0.660799 | Tidak signifikan (Gagal Tolak Ho)
##   > b12_(x3-k3.2)+ : t =    0.0864 | p = 0.931585 | Tidak signifikan (Gagal Tolak Ho)
##   > b13_(x3-k3.3)+ : t =    1.2935 | p = 0.203453 | Tidak signifikan (Gagal Tolak Ho)
##   > b14_(x4-k4.1)+ : t =   -1.6175 | p = 0.113823 | Tidak signifikan (Gagal Tolak Ho)
##   > b15_(x4-k4.2)+ : t =    1.0511 | p = 0.299661 | Tidak signifikan (Gagal Tolak Ho)
##   > b16_(x4-k4.3)+ : t =    5.4967 | p = 0.000003 | Signifikan (Tolak Ho)
## 
## [ ANALYSIS OF VARIANCE ]
## 
##   Sumber     df             SS             MS       Fhit
##   Regresi    16       185.9148        11.6197    15.7692
##   Error      39        41.2642         0.7369
##   Total      55       227.1789
## 
##   | s            : 0.858406 
##   | R-square     : 81.8363 %
##   | p-value (F)  : 2.7621416e-12