# ============================================================
# REGRESI NONPARAMETRIK SPLINE TRUNCATED MULTIVARIABEL

# ============================================================
# LIBRARY
# ============================================================
library(Matrix)
library(pracma)
## Warning: package 'pracma' was built under R version 4.5.3
## 
## Attaching package: 'pracma'
## The following objects are masked from 'package:Matrix':
## 
##     expm, lu, tril, triu
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
# ============================================================
# SCATTERPLOT 
# ============================================================

# X1 : Tingkat Partisipasi Angkatan Kerja
plot(data$X1,data$Y,
     main="Scatterplot Tingkat Pengangguran Terbuka dan
Tingkat Partisipasi Angkatan Kerja",
     xlab="Tingkat Partisipasi Angkatan Kerja (X1)",
     ylab="Tingkat Pengangguran Terbuka (Y)",
     col="black")
abline(lm(data$Y~data$X1), col="darkred", lwd=3)

# X2 : Harapan Lama Sekolah
plot(data$X2,data$Y,
     main="Scatterplot Tingkat Pengangguran Terbuka dan
Harapan Lama Sekolah",
     xlab="Harapan Lama Sekolah (X2)",
     ylab="Tingkat Pengangguran Terbuka (Y)",
     col="black")
abline(lm(data$Y~data$X2), col="darkred", lwd=3)

# X3 : PDRB Atas Dasar Harga Berlaku
plot(data$X3,data$Y,
     main="Scatterplot Tingkat Pengangguran Terbuka dan
PDRB Atas Dasar Harga Berlaku",
     xlab="PDRB Atas Dasar Harga Berlaku (X3)",
     ylab="Tingkat Pengangguran Terbuka (Y)",
     col="black")
abline(lm(data$Y~data$X3), col="darkred", lwd=3)

# X4 : Indeks Pembangunan Manusia
plot(data$X4,data$Y,
     main="Scatterplot Tingkat Pengangguran Terbuka dan
Indeks Pembangunan Manusia",
     xlab="Indeks Pembangunan Manusia (X4)",
     ylab="Tingkat Pengangguran Terbuka (Y)",
     col="black")
abline(lm(data$Y~data$X4), col="darkred", lwd=3)

# ============================================================
# PEMILIHAN 1 TITIK KNOT
# ============================================================
GCV1=function(data)
{
 library(Matrix)
 library(pracma)
 para=0
 data=as.matrix(data)
 N=nrow(data)
 M=ncol(data)
 m=ncol(data)-para-1
 dataA=data[,(para+2):M]
 dataA=as.matrix(dataA)
 F=diag(N)
 nk=50
 knot1=matrix(ncol=m,nrow=nk)

 for (i in (1:m))
 {
  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]
 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+para+1)]<knot1[i,j])
      data1[k,j]=0
    else
      data1[k,j]=data[k,(j+para+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="DATA ALL KNOT 1.csv")

 cat("==============================================","\n")
 cat("HASIL GCV terkecil dengan 1 knot","\n")
 cat("==============================================","\n")
 print(((dataG[1,1:6])))

 cat("Nilai GCV 10 terkecil pertama","\n")
 print(dataG[1:10,])

 mingcv=dataG[1,1]

 # knot optimal = baris dengan GCV terkecil
 knotke_opt=as.integer(dataG[1,2])
 knotgcv=as.matrix(knot1[knotke_opt,])
 knotgcv1=matrix(knotgcv,nrow=1)

 # hitung kembali B tepat pada knot optimal
 datagcv1=matrix(ncol=m,nrow=N)
 for (j in 1:m)
 {
  for (k in 1:N)
  {
   if(data[k,(j+para+1)]<knotgcv[j,1])
     datagcv1[k,j]=0
   else
     datagcv1[k,j]=data[k,(j+para+1)]-knotgcv[j,1]
  }
 }

 mxgcv=as.matrix(cbind(aa,data2,datagcv1))
 mxgcv=mxgcv[,c(2:6)]

 Cgcv=pinv(t(mxgcv)%*%mxgcv)
 Bgcv=Cgcv%*%t(mxgcv)%*%data[,1]

 cat("\n")
 cat("==============================================","\n")
 cat("HASIL ESTIMASI PARAMETER TITIK KNOT KE 1","\n")
 cat("==============================================","\n")
 print(Bgcv)
 cat("\n")

 list(
  knotgcv=knotgcv1,
  mingcv=mingcv,
  mxgcv=mxgcv,
  B=Bgcv
 )
}


hasil1=GCV1(data)
## ============================================== 
## HASIL GCV terkecil dengan 1 knot 
## ============================================== 
##       GCV   knot_ke                                         
##  1.508187 45.000000 76.286735 14.630612 69.183673 75.922653 
## Nilai GCV 10 terkecil pertama 
##            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
## 
## ============================================== 
## HASIL ESTIMASI PARAMETER TITIK KNOT KE 1 
## ============================================== 
##              [,1]
## [1,] -0.160517930
## [2,]  1.319322478
## [3,] -0.006232983
## [4,] -0.008207276
## [5,] -0.066081304
# ============================================================
# UJI SIGNIFIKANSI 1 TITIK KNOT
# ============================================================
uji1=function(alpha,knot,data)
{
 alpha=0.1

 data=as.matrix(data)
 knot=as.matrix(knot)

 ybar=mean(data[,1])
 m=2
 n=nrow(data)
 q=ncol(data)

 dataA=cbind(data[,m],data[,m+1],
             data[,m+2],data[,m+3])
 dataA=as.matrix(dataA)

 satu=rep(1,n)
 n1=ncol(knot)

 data.knot=matrix(ncol=n1,nrow=n)

 for (i in 1:n1)
 {
  for (j in 1:n)
  {
   if(dataA[j,i]<knot[1,i])
     data.knot[j,i]=0
   else
     data.knot[j,i]=dataA[j,i]-knot[1,i]
  }
 }

 mx=cbind(satu,data[,2],data.knot[,1:1],
          data[,3],data.knot[,2:2],
          data[,4],data.knot[,3:3],
          data[,5],data.knot[,4:4])

 mx=as.matrix(mx)

 B=(pinv(t(mx)%*%mx))%*%t(mx)%*%data[,1]
 n1=nrow(B)

 yhat=mx%*%B
 ybar=mean(data[,1])
 res=data[,1]-yhat

 SSE=sum((data[,1]-yhat)^2)
 SSR=sum((yhat-ybar)^2)

 MSE=SSE/(n)
 MSR=SSR/(n1-1)
 SST=sum((data[,1]-ybar)^2)
 Rsq=(SSR/(SSR+SSE))*100

 #-------------------------------------------------------#
 #SINTAKS UJI SIMULTAN DENGAN TITIK KNOT
 #-------------------------------------------------------#
 Fhit=MSR/MSE
 pvalue=pf(Fhit,(n1-1),(n-n1),lower.tail=FALSE)

 if(pvalue<=alpha)
 {
  cat('---------------------------------------','\n')
  cat('Kesimpulan hasil uji simultan','\n')
  cat('---------------------------------------','\n')
  cat('Tolak Ho yakni minimal terdapat 1 variabel bebas yang signifikan','\n')
  cat('','\n')
 }
 else
 {
  cat('---------------------------------------','\n')
  cat('Kesimpulan hasil uji simultan','\n')
  cat('---------------------------------------','\n')
  cat('Gagal Tolak Ho yakni semua variabel bebas tidak berpengaruh signifikan','\n')
  cat('','\n')
 }

 #------------------------------------------------------#
 #SINTAKS UJI PARSIAL DENGAN TITIK KNOT
 #------------------------------------------------------#
 thit=rep(NA,n1)
 pval=rep(NA,n1)

 SE=sqrt(diag(MSE*(pinv(t(mx)%*%mx))))

 cat('---------------------------------------------','\n')
 cat('Kesimpulan hasil uji parsial','\n')
 cat('---------------------------------------------','\n')

 thit=rep(NA,n1)
 pval=rep(NA,n1)

 for (i in 1:n1)
 {
  thit[i]=B[i,1]/SE[i]
  pval[i]=2*(pt(abs(thit[i]),(n-n1),lower.tail=FALSE))

  if (pval[i]<=alpha)
    cat('Tolak Ho yakni variabel bebas signifikan dengan pvalue',pval[i],'\n')
  else
    cat('Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue',pval[i],'\n')
 }

 thit=as.matrix(thit)

 cat('=============================================','\n')
 cat('nilai t hitung','\n')
 cat('=============================================','\n')
 print(thit)

 cat('Analysis of Variance','\n')
 cat('=============================================','\n')
 cat('Sumber df SS MS Fhit','\n')
 cat('Regresi ',(n1-1),' ',SSR,' ',MSR,' ',Fhit,'\n')
 cat('Error ',n-n1,' ',SSE,' ',MSE,'\n')
 cat('Total ',n-1,' ',SST,'\n')
 cat('=============================================','\n')
 cat('s=',sqrt(MSE),' Rsq=',Rsq,'\n')
 cat('pvalue(F)=',pvalue,'\n')

 write.csv(res,file='OUTPUT UJI RESIDUAL KNOT 1.csv')
 write.csv(mx,file='OUTPUT UJI MX KNOT 1.csv')
 write.csv(yhat,file='UJI YHAT KNOT 1.csv')

 list(
  mx=mx,
  residual=res,
  yhat=yhat,
  B=B,
  SE=SE,
  thit=thit,
  pval=pval,
  Fhit=Fhit,
  pvalue=pvalue,
  Rsq=Rsq
 )
}

uji_hasil1=uji1(
 alpha=0.1,
 knot=hasil1$knotgcv,
 data=data
)
## --------------------------------------- 
## Kesimpulan hasil uji simultan 
## --------------------------------------- 
## Tolak Ho yakni minimal terdapat 1 variabel bebas yang signifikan 
##  
## --------------------------------------------- 
## Kesimpulan hasil uji parsial 
## --------------------------------------------- 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 0.04471309 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 6.825617e-06 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.9079879 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 0.006735878 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 2.184894e-06 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.5049048 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 0.07036832 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 0.09074499 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 4.259298e-07 
## ============================================= 
## nilai t hitung 
## ============================================= 
##             [,1]
##  [1,]  2.0624803
##  [2,] -5.0617196
##  [3,]  0.1162015
##  [4,]  2.8350060
##  [5,] -5.3953305
##  [6,] -0.6719509
##  [7,]  1.8516205
##  [8,] -1.7269469
##  [9,]  5.8681386
## Analysis of Variance 
## ============================================= 
## Sumber df SS MS Fhit 
## Regresi  8   167.6864   20.9608   19.73027 
## Error  47   59.49258   1.062368 
## Total  55   227.1789 
## ============================================= 
## s= 1.030712  Rsq= 73.81246 
## pvalue(F)= 1.239e-12
# ============================================================
# PEMILIHAN 2 TITIK KNOT
# ============================================================
GCV2=function(data)
{
 library(Matrix)
 library(pracma)

 para=0
 data=as.matrix(data)
 N=nrow(data)
 M=ncol(data)
 m=ncol(data)-para-1

 dataA=data[,(para+2):M]
 dataA=as.matrix(dataA)

 F=diag(N)
 nk=50

 knot1=matrix(ncol=m,nrow=nk)

 for (i in (1:m))
 {
  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]
 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))
  {
   if (mod(j,2)==1)
     b=floor(j/2)+1
   else
     b=j/2

   for (k in 1:N)
   {
    if (data[k,(b+para+1)]<knot2[i,j])
      data1[k,j]=0
    else
      data1[k,j]=data[k,(b+para+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="DATA ALL KNOT 2.csv")

 cat("==============================================","\n")
 cat("HASIL GCV terkecil dengan 2 knot","\n")
 cat("==============================================","\n")
 print(((dataG[1,1:10])))

 cat("Nilai GCV 10 terkecil pertama","\n")
 print(dataG[1:10,])

 mingcv=dataG[1,1]

 knotke_opt=as.integer(dataG[1,2])
 knotgcv=as.matrix(knot2[knotke_opt,])
 knotgcv1=matrix(knotgcv,nrow=2)

 datagcv1=matrix(ncol=2*m,nrow=N)

 for (j in 1:(2*m))
 {
  if (mod(j,2)==1)
    b=floor(j/2)+1
  else
    b=j/2

  for (k in 1:N)
  {
   if(data[k,(b+para+1)]<knotgcv[j,1])
     datagcv1[k,j]=0
   else
     datagcv1[k,j]=data[k,(b+para+1)]-knotgcv[j,1]
  }
 }

 mxgcv=as.matrix(cbind(aa,data2,datagcv1))
 mxgcv=mxgcv[,c(2:6)]

 Cgcv=pinv(t(mxgcv)%*%mxgcv)
 Bgcv=Cgcv%*%t(mxgcv)%*%data[,1]

 cat("\n")
 cat("==============================================","\n")
 cat("HASIL ESTIMASI PARAMETER TITIK KNOT KE 2","\n")
 cat("==============================================","\n")
 print(Bgcv)
 cat("\n")

 list(
  knotgcv=knotgcv1,
  mingcv=mingcv,
  mxgcv=mxgcv,
  B=Bgcv
 )
}

hasil2=GCV2(data)
## ============================================== 
## HASIL GCV terkecil dengan 2 knot 
## ============================================== 
##        GCV    knot_ke                                                        
##   1.316068 135.000000  61.132449  76.286735  11.382041  14.630612   7.692245 
##                                  
##  69.183673  25.025510  75.922653 
## Nilai GCV 10 terkecil pertama 
##            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
## 
## ============================================== 
## HASIL ESTIMASI PARAMETER TITIK KNOT KE 2 
## ============================================== 
##              [,1]
## [1,] -0.078732767
## [2,]  0.975097952
## [3,] -0.008054519
## [4,] -0.009098772
## [5,] -0.149594082
# ============================================================
# UJI SIGNIFIKANSI 2 TITIK KNOT
# ============================================================
uji2=function(alpha,knot,data)
{
 alpha=0.1

 data=as.matrix(data)
 knot=as.matrix(knot)

 # HASIL GCV2 disimpan sebagai matriks 2 x 4.
 # Untuk tahap uji, skripsi menggunakan knot dalam satu baris
 # (8 nilai: 2 knot x 4 variabel).
 knot=matrix(as.numeric(knot),nrow=1)

 ybar=mean(data[,1])
 m=2
 n=nrow(data)
 q=ncol(data)

 dataA=cbind(
  data[,m],data[,m],
  data[,m+1],data[,m+1],
  data[,m+2],data[,m+2],
  data[,m+3],data[,m+3]
 )
 dataA=as.matrix(dataA)

 satu=rep(1,n)
 n1=ncol(knot)
 data.knot=matrix(ncol=n1,nrow=n)

 for (i in 1:n1)
 {
  for (j in 1:n)
  {
   if(dataA[j,i]<knot[1,i])
     data.knot[j,i]=0
   else
     data.knot[j,i]=dataA[j,i]-knot[1,i]
  }
 }

 mx=cbind(
  satu,
  data[,2],data.knot[,1:2],
  data[,3],data.knot[,3:4],
  data[,4],data.knot[,5:6],
  data[,5],data.knot[,7:8]
 )
 mx=as.matrix(mx)

 B=(pinv(t(mx)%*%mx))%*%t(mx)%*%data[,1]
 n1=nrow(B)

 yhat=mx%*%B
 ybar=mean(data[,1])
 res=data[,1]-yhat

 SSE=sum((data[,1]-yhat)^2)
 SSR=sum((yhat-ybar)^2)

 MSE=SSE/(n)
 MSR=SSR/(n1-1)
 SST=sum((data[,1]-ybar)^2)
 Rsq=(SSR/(SSR+SSE))*100

 #-------------------------------------------------------#
 #SINTAKS UJI SIMULTAN DENGAN TITIK KNOT
 #-------------------------------------------------------#
 Fhit=MSR/MSE
 pvalue=pf(Fhit,(n1-1),(n-n1),lower.tail=FALSE)

 if(pvalue<=alpha)
 {
  cat('---------------------------------------','\n')
  cat('Kesimpulan hasil uji simultan','\n')
  cat('---------------------------------------','\n')
  cat('Tolak Ho yakni minimal terdapat 1 variabel bebas yang signifikan','\n')
  cat('','\n')
 }
 else
 {
  cat('---------------------------------------','\n')
  cat('Kesimpulan hasil uji simultan','\n')
  cat('---------------------------------------','\n')
  cat('Gagal Tolak Ho yakni semua variabel bebas tidak berpengaruh signifikan','\n')
  cat('','\n')
 }

 #------------------------------------------------------#
 #SINTAKS UJI PARSIAL DENGAN TITIK KNOT
 #------------------------------------------------------#
 thit=rep(NA,n1)
 pval=rep(NA,n1)

 SE=sqrt(diag(MSE*(pinv(t(mx)%*%mx))))

 cat('---------------------------------------------','\n')
 cat('Kesimpulan hasil uji parsial','\n')
 cat('---------------------------------------------','\n')

 thit=rep(NA,n1)
 pval=rep(NA,n1)

 for (i in 1:n1)
 {
  thit[i]=B[i,1]/SE[i]
  pval[i]=2*(pt(abs(thit[i]),(n-n1),lower.tail=FALSE))

  if (pval[i]<=alpha)
    cat('Tolak Ho yakni variabel bebas signifikan dengan pvalue',pval[i],'\n')
  else
    cat('Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue',pval[i],'\n')
 }

 thit=as.matrix(thit)

 cat('=============================================','\n')
 cat('nilai t hitung','\n')
 cat('=============================================','\n')
 print(thit)

 cat('Analysis of Variance','\n')
 cat('=============================================','\n')
 cat('Sumber df SS MS Fhit','\n')
 cat('Regresi ',(n1-1),' ',SSR,' ',MSR,' ',Fhit,'\n')
 cat('Error ',n-n1,' ',SSE,' ',MSE,'\n')
 cat('Total ',n-1,' ',SST,'\n')
 cat('=============================================','\n')
 cat('s=',sqrt(MSE),' Rsq=',Rsq,'\n')
 cat('pvalue(F)=',pvalue,'\n')

 write.csv(res,file='OUTPUT UJI RESIDUAL KNOT 2.csv')
 write.csv(mx,file='OUTPUT UJI MX KNOT 2.csv')
 write.csv(yhat,file='UJI YHAT KNOT 2.csv')

 list(
  mx=mx,
  residual=res,
  yhat=yhat,
  B=B,
  SE=SE,
  thit=thit,
  pval=pval,
  Fhit=Fhit,
  pvalue=pvalue,
  Rsq=Rsq
 )
}

uji_hasil2=uji2(
 alpha=0.1,
 knot=hasil2$knotgcv,
 data=data
)
## --------------------------------------- 
## Kesimpulan hasil uji simultan 
## --------------------------------------- 
## Tolak Ho yakni minimal terdapat 1 variabel bebas yang signifikan 
##  
## --------------------------------------------- 
## Kesimpulan hasil uji parsial 
## --------------------------------------------- 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.2064143 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 0.002583234 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 0.004789845 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.2422198 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.1561285 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.2229634 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 1.532736e-05 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.1557346 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.1498621 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.1649558 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 0.02812549 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 0.02406025 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 3.439945e-06 
## ============================================= 
## nilai t hitung 
## ============================================= 
##            [,1]
##  [1,]  1.282856
##  [2,] -3.199948
##  [3,]  2.975107
##  [4,]  1.185782
##  [5,]  1.443491
##  [6,] -1.236557
##  [7,] -4.872993
##  [8,]  1.444899
##  [9,] -1.466226
## [10,]  1.412651
## [11,]  2.272317
## [12,] -2.338846
## [13,]  5.327626
## Analysis of Variance 
## ============================================= 
## Sumber df SS MS Fhit 
## Regresi  12   183.7252   15.31043   19.73097 
## Error  43   43.45373   0.7759595 
## Total  55   227.1789 
## ============================================= 
## s= 0.8808856  Rsq= 80.87246 
## pvalue(F)= 1.075619e-13
# ============================================================
# PEMILIHAN 3 TITIK KNOT
# ============================================================
GCV3=function(data)
{
 library(Matrix)
 library(pracma)

 para=0
 data=as.matrix(data)
 N=nrow(data)
 M=ncol(data)
 m=ncol(data)-para-1

 dataA=data[,(para+2):M]
 dataA=as.matrix(dataA)

 F=diag(N)
 nk=50

 knot1=matrix(ncol=m,nrow=nk)

 for (i in (1:m))
 {
  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]
 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+para+1)]<knot2[i,j])
      data1[k,j]=0
    else
      data1[k,j]=data[k,(b+para+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="DATA ALL KNOT 3.csv")

 cat("==============================================","\n")
 cat("HASIL GCV terkecil dengan 3 knot","\n")
 cat("==============================================","\n")
 print(((dataG[1,1:14])))

 cat("Nilai GCV 10 terkecil pertama","\n")
 print(dataG[1:10,])

 mingcv=dataG[1,1]

 knotke_opt=as.integer(dataG[1,2])
 knotgcv=as.matrix(knot2[knotke_opt,])
 knotgcv1=matrix(knotgcv,nrow=3)

 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+para+1)]<knotgcv[j,1])
     datagcv1[k,j]=0
   else
     datagcv1[k,j]=data[k,(b+para+1)]-knotgcv[j,1]
  }
 }

 mxgcv=as.matrix(cbind(aa,data2,datagcv1))
 mxgcv=mxgcv[,c(2:6)]

 Cgcv=pinv(t(mxgcv)%*%mxgcv)
 Bgcv=Cgcv%*%t(mxgcv)%*%data[,1]

 cat("\n")
 cat("==============================================","\n")
 cat("HASIL ESTIMASI PARAMETER TITIK KNOT KE 3","\n")
 cat("==============================================","\n")
 print(Bgcv)
 cat("\n")

 list(
  knotgcv=knotgcv1,
  mingcv=mingcv,
  mxgcv=mxgcv,
  B=Bgcv
 )
}

hasil3=GCV3(data)
## ============================================== 
## HASIL GCV terkecil dengan 3 knot 
## ============================================== 
##         GCV     knot_ke                                                 
##    1.444246 2200.000000   61.132449   61.854082   76.286735   11.382041 
##                                                                         
##   11.536735   14.630612    7.692245   10.620408   69.183673   25.025510 
##                         
##   27.449184   75.922653 
## Nilai GCV 10 terkecil pertama 
##            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
## 
## ============================================== 
## HASIL ESTIMASI PARAMETER TITIK KNOT KE 3 
## ============================================== 
##              [,1]
## [1,] -0.078732767
## [2,]  0.975097952
## [3,] -0.008054519
## [4,] -0.009098772
## [5,] -0.149594082
# ============================================================
# UJI SIGNIFIKANSI 3 TITIK KNOT
# ============================================================
uji3=function(alpha,knot,data)
{
 alpha=0.1

 data=as.matrix(data)
 knot=as.matrix(knot)

 # HASIL GCV3 disimpan sebagai matriks 3 x 4.
 # Untuk tahap uji, knot diratakan menjadi 1 baris
 # (12 nilai: 3 knot x 4 variabel).
 knot=matrix(as.numeric(knot),nrow=1)

 ybar=mean(data[,1])
 m=2
 n=nrow(data)
 q=ncol(data)

 dataA=cbind(
  data[,m],data[,m],data[,m],
  data[,m+1],data[,m+1],data[,m+1],
  data[,m+2],data[,m+2],data[,m+2],
  data[,m+3],data[,m+3],data[,m+3]
 )
 dataA=as.matrix(dataA)

 satu=rep(1,n)
 n1=ncol(knot)
 data.knot=matrix(ncol=n1,nrow=n)

 for (i in 1:n1)
 {
  for (j in 1:n)
  {
   if(dataA[j,i]<knot[1,i])
     data.knot[j,i]=0
   else
     data.knot[j,i]=dataA[j,i]-knot[1,i]
  }
 }

 mx=cbind(
  satu,
  data[,2],data.knot[,1:3],
  data[,3],data.knot[,4:6],
  data[,4],data.knot[,7:9],
  data[,5],data.knot[,10:12]
 )
 mx=as.matrix(mx)

 B=(pinv(t(mx)%*%mx))%*%t(mx)%*%data[,1]
 n1=nrow(B)

 yhat=mx%*%B
 ybar=mean(data[,1])
 res=data[,1]-yhat

 SSE=sum((data[,1]-yhat)^2)
 SSR=sum((yhat-ybar)^2)

 MSE=SSE/(n)
 MSR=SSR/(n1-1)
 SST=sum((data[,1]-ybar)^2)
 Rsq=(SSR/(SSR+SSE))*100

 #-------------------------------------------------------#
 #SINTAKS UJI SIMULTAN DENGAN TITIK KNOT
 #-------------------------------------------------------#
 Fhit=MSR/MSE
 pvalue=pf(Fhit,(n1-1),(n-n1),lower.tail=FALSE)

 if(pvalue<=alpha)
 {
  cat('---------------------------------------','\n')
  cat('Kesimpulan hasil uji simultan','\n')
  cat('---------------------------------------','\n')
  cat('Tolak Ho yakni minimal terdapat 1 variabel bebas yang signifikan','\n')
  cat('','\n')
 }
 else
 {
  cat('---------------------------------------','\n')
  cat('Kesimpulan hasil uji simultan','\n')
  cat('---------------------------------------','\n')
  cat('Gagal Tolak Ho yakni semua variabel bebas tidak berpengaruh signifikan','\n')
  cat('','\n')
 }

 #------------------------------------------------------#
 #SINTAKS UJI PARSIAL DENGAN TITIK KNOT
 #------------------------------------------------------#
 thit=rep(NA,n1)
 pval=rep(NA,n1)

 SE=sqrt(diag(MSE*(pinv(t(mx)%*%mx))))

 cat('---------------------------------------------','\n')
 cat('Kesimpulan hasil uji parsial','\n')
 cat('---------------------------------------------','\n')

 thit=rep(NA,n1)
 pval=rep(NA,n1)

 for (i in 1:n1)
 {
  thit[i]=B[i,1]/SE[i]
  pval[i]=2*(pt(abs(thit[i]),(n-n1),lower.tail=FALSE))

  if (pval[i]<=alpha)
    cat('Tolak Ho yakni variabel bebas signifikan dengan pvalue',pval[i],'\n')
  else
    cat('Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue',pval[i],'\n')
 }

 thit=as.matrix(thit)

 cat('=============================================','\n')
 cat('nilai t hitung','\n')
 cat('=============================================','\n')
 print(thit)

 cat('Analysis of Variance','\n')
 cat('=============================================','\n')
 cat('Sumber df SS MS Fhit','\n')
 cat('Regresi ',(n1-1),' ',SSR,' ',MSR,' ',Fhit,'\n')
 cat('Error ',n-n1,' ',SSE,' ',MSE,'\n')
 cat('Total ',n-1,' ',SST,'\n')
 cat('=============================================','\n')
 cat('s=',sqrt(MSE),' Rsq=',Rsq,'\n')
 cat('pvalue(F)=',pvalue,'\n')

 write.csv(res,file='OUTPUT UJI RESIDUAL KNOT 3.csv')
 write.csv(mx,file='OUTPUT UJI MX KNOT 3.csv')
 write.csv(yhat,file='UJI YHAT KNOT 3.csv')

 list(
  mx=mx,
  residual=res,
  yhat=yhat,
  B=B,
  SE=SE,
  thit=thit,
  pval=pval,
  Fhit=Fhit,
  pvalue=pvalue,
  Rsq=Rsq
 )
}

uji_hasil3=uji3(
 alpha=0.1,
 knot=hasil3$knotgcv,
 data=data
)
## --------------------------------------- 
## Kesimpulan hasil uji simultan 
## --------------------------------------- 
## Tolak Ho yakni minimal terdapat 1 variabel bebas yang signifikan 
##  
## --------------------------------------------- 
## Kesimpulan hasil uji parsial 
## --------------------------------------------- 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.6087605 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.7734961 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.5228609 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.1758342 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.3014451 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.8976796 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.6190703 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.4479088 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 1.040868e-05 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.4567152 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.6607985 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.9315849 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.2034532 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 0.04980339 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.1138228 
## Gagal tolak Ho yakni variabel tidak signifikan dengan pvalue 0.2996611 
## Tolak Ho yakni variabel bebas signifikan dengan pvalue 2.587599e-06 
## ============================================= 
## nilai t hitung 
## ============================================= 
##              [,1]
##  [1,] -0.51601044
##  [2,] -0.28981099
##  [3,] -0.64475471
##  [4,]  1.37873374
##  [5,]  1.04722022
##  [6,]  0.12943381
##  [7,]  0.50116758
##  [8,] -0.76664478
##  [9,] -5.05857856
## [10,]  0.75174871
## [11,] -0.44218412
## [12,]  0.08640707
## [13,]  1.29348236
## [14,]  2.02451772
## [15,] -1.61753943
## [16,]  1.05114669
## [17,]  5.49666947
## Analysis of Variance 
## ============================================= 
## Sumber df SS MS Fhit 
## Regresi  16   185.9148   11.61967   15.76917 
## Error  39   41.26416   0.7368601 
## Total  55   227.1789 
## ============================================= 
## s= 0.8584055  Rsq= 81.83627 
## pvalue(F)= 2.762142e-12