#MEMANGGIL LIBRARY YANG DIGUNAKAN#

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#

Catatan: pada data, kolom Y berada di kolom terakhir (X1 … X6, Y). Fungsi GCV dan uji pada sintaks ini mengambil kolom pertama (data[,1]) sebagai respon, sehingga kolom data disusun ulang agar Y berada di kolom pertama. Jika tidak disusun ulang, X1 akan ikut berperan sebagai respon.

folder="C:\\File Lama\\BACKUP\\Kodingan dan segalanya\\HTML R\\TUGAS 6"   #folder untuk menyimpan/membaca file csv hasil

data=read.table(file.choose(),header=TRUE)
data=data[,c("Y","X1","X2","X3","X4","X5","X6")]   #Y dijadikan kolom pertama
data
nrow(data)
## [1] 514

#ANALISIS STATISTIKA DESKRIPTIF & DETEKSI MULTIKOLINIERITAS#

stat.desc(data)

#DETEKSI PENCILAN (ATURAN IQR)#

hitung_pencilan=function(v)
{
  q=quantile(v,c(.25,.75))
  iqr=diff(q)
  sum(v<q[1]-1.5*iqr | v>q[2]+1.5*iqr)
}
pencilan=data.frame(Variabel=names(data),
                    Banyak_pencilan=sapply(data,hitung_pencilan),
                    Persen=round(100*sapply(data,hitung_pencilan)/nrow(data),2),
                    row.names=NULL)
pencilan

#KORELASI ANTAR VARIABEL#

kor=cor(data)
round(kor,3)
##         Y     X1     X2     X3     X4     X5     X6
## Y   1.000 -0.681 -0.667  0.457 -0.592  0.629 -0.112
## X1 -0.681  1.000  0.534 -0.518  0.437 -0.563  0.191
## X2 -0.667  0.534  1.000 -0.541  0.425 -0.523  0.118
## X3  0.457 -0.518 -0.541  1.000 -0.335  0.354 -0.019
## X4 -0.592  0.437  0.425 -0.335  1.000 -0.389 -0.080
## X5  0.629 -0.563 -0.523  0.354 -0.389  1.000 -0.273
## X6 -0.112  0.191  0.118 -0.019 -0.080 -0.273  1.000
image(1:ncol(kor),1:ncol(kor),t(kor[ncol(kor):1,]),
      col=colorRampPalette(c("#b2182b","white","#2166ac"))(50),
      zlim=c(-1,1),axes=FALSE,xlab="",ylab="",main="Matriks Korelasi Pearson")
axis(1,at=1:ncol(kor),labels=colnames(kor))
axis(2,at=1:ncol(kor),labels=rev(colnames(kor)),las=1)
for (i in 1:ncol(kor))
{
  for (j in 1:ncol(kor))
  {
    text(j,ncol(kor)-i+1,sprintf("%.2f",kor[i,j]),cex=0.8)
  }
}

#SCATTERPLOT#

Garis merah = garis linear, garis biru putus-putus = kurva lowess. Jika kurva lowess menyimpang dari garis linear (melengkung atau patah), hal itu mendukung penggunaan regresi nonparametrik spline.

plot(data$X1,data$Y,main="Scatterplot Y dan X1"
     , xlab="X1"
     , ylab="Y"
     ,col="black")
abline(lm(data$Y~data$X1), col="darkred", lwd=3)
lines(lowess(data$X1,data$Y), col="steelblue", lwd=3, lty=2)

plot(data$X2,data$Y,main="Scatterplot Y dan X2"
     , xlab="X2"
     , ylab="Y"
     ,col="black")
abline(lm(data$Y~data$X2), col="darkred", lwd=3)
lines(lowess(data$X2,data$Y), col="steelblue", lwd=3, lty=2)

plot(data$X3,data$Y,main="Scatterplot Y dan X3"
     , xlab="X3"
     , ylab="Y"
     ,col="black")
abline(lm(data$Y~data$X3), col="darkred", lwd=3)
lines(lowess(data$X3,data$Y), col="steelblue", lwd=3, lty=2)

plot(data$X4,data$Y,main="Scatterplot Y dan X4"
     , xlab="X4"
     , ylab="Y"
     ,col="black")
abline(lm(data$Y~data$X4), col="darkred", lwd=3)
lines(lowess(data$X4,data$Y), col="steelblue", lwd=3, lty=2)

plot(data$X5,data$Y,main="Scatterplot Y dan X5"
     , xlab="X5"
     , ylab="Y"
     ,col="black")
abline(lm(data$Y~data$X5), col="darkred", lwd=3)
lines(lowess(data$X5,data$Y), col="steelblue", lwd=3, lty=2)

plot(data$X6,data$Y,main="Scatterplot Y dan X6"
     , xlab="X6"
     , ylab="Y"
     ,col="black")
abline(lm(data$Y~data$X6), col="darkred", lwd=3)
lines(lowess(data$X6,data$Y), col="steelblue", lwd=3, lty=2)

#HISTOGRAM DAN BOXPLOT TIAP PREDIKTOR#

for (j in 2:7)
{
  par(mfrow=c(1,2))
  hist(data[,j],breaks=30,col="steelblue",border="white",
       main=paste("Histogram",names(data)[j]),xlab=names(data)[j],ylab="Frekuensi")
  boxplot(data[,j],horizontal=TRUE,col="#fdae61",outcol="red",
          main=paste("Boxplot",names(data)[j]),xlab=names(data)[j])
}

par(mfrow=c(1,1))

#RINGKASAN SEMUA SCATTERPLOT DALAM SATU GAMBAR#

par(mfrow=c(2,3))
for (j in 2:7)
{
  plot(data[,j],data$Y,main=paste("Y dan",names(data)[j]),
       xlab=names(data)[j],ylab="Y",col="grey30",pch=16,cex=0.6)
  abline(lm(data$Y~data[,j]), col="darkred", lwd=2)
  lines(lowess(data[,j],data$Y), col="steelblue", lwd=2, lty=2)
}

par(mfrow=c(1,1))

#MODEL REGRESI LINEAR BERGANDA (PEMBANDING)#

model=(lm(formula=Y~X1+X2+X3+X4+X5+X6,data=data))
model
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + X4 + X5 + X6, data = data)
## 
## Coefficients:
## (Intercept)           X1           X2           X3           X4           X5  
##    26.47106     -0.61512     -0.21398     -0.21664     -0.42017      0.92267  
##          X6  
##     0.03101
summary(model)
## 
## 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)
##       X1       X2       X3       X4       X5       X6 
## 1.930060 1.842417 1.599757 1.415399 1.754443 1.155668
par(mfrow=c(2,2))
plot(model)

par(mfrow=c(1,1))
shapiro.test(residuals(model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model)
## W = 0.91328, p-value < 2.2e-16
bptest(model)
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 47.042, df = 6, p-value = 1.835e-08
dwtest(model)
## 
##  Durbin-Watson test
## 
## data:  model
## DW = 1.4363, p-value = 3.087e-11
## alternative hypothesis: true autocorrelation is greater than 0

#PEMILIHAN 1 TITIK KNOT#

GCV1=function(data)
{
  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 #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),])
  colnames(knot1)=paste0("X",1:m)
  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+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=paste0(folder,"DATA ALL knot 1.csv"))
  cat("==============================================","\n")
  cat("HASIL GCV terkecil dengan 1 knot","\n")
  cat("==============================================","\n")
  print(((dataG[1,1:ncol(dataG)])))
  cat("Nilai GCV 10 terkecil pertama","\n")
  print(dataG[1:10,])

  # --- hitung ulang B dari titik knot dengan GCV TERKECIL ---
  baris_terbaik = dataG[1, "knot_ke"]
  knotgcv = knot1[baris_terbaik, ]
  datagcv1=matrix(ncol=m,nrow=N)
  for (j in 1:m)
  {
    for (k in 1:N)
    {
      if (data[k,(j+para+1)]<knotgcv[j]) datagcv1[k,j]=0 else
        datagcv1[k,j]=data[k,(j+para+1)]-knotgcv[j]
    }
  }
  mxgcv=as.matrix(cbind(aa,data2,datagcv1))
  Cgcv=pinv(t(mxgcv)%*%mxgcv)
  B=Cgcv%*%(t(mxgcv)%*%data[,1])

  cat("\n")
  cat("==============================================","\n")
  cat("HASIL ESTIMASI PARAMETER TITIK KNOT KE 1","\n")
  cat("==============================================","\n")
  print(B)
  cat("\n")
}
GCV1(data)
## ============================================== 
## HASIL GCV terkecil dengan 1 knot 
## ============================================== 
##       GCV   knot_ke        X1        X2        X3        X4        X5        X6 
## 60.891404 15.000000 13.823061 30.495918  4.788163 26.577551 62.518980 15.367347 
## Nilai GCV 10 terkecil pertama 
##            GCV knot_ke       X1       X2       X3       X4       X5       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
## 
## ============================================== 
## HASIL ESTIMASI PARAMETER TITIK KNOT KE 1 
## ============================================== 
##               [,1]
##  [1,] 55.235597472
##  [2,] -0.060206537
##  [3,] -0.139780329
##  [4,]  4.602967604
##  [5,] -0.613837239
##  [6,]  0.008921616
##  [7,]  0.059789517
##  [8,] -0.866308131
##  [9,] -0.081699055
## [10,] -5.057603077
## [11,]  0.720183134
## [12,]  1.020919183
## [13,] -0.129832245

#UJI SIGNIFIKANSI SATU TITIK KNOT#

Fungsi uji di bawah dipakai untuk 1, 2, dan 3 titik knot (argumen K = banyak titik knot). Derajat bebas galat yang dipakai adalah standar (MSE = SSE/(n-p)), sehingga konsisten dengan summary(lm).

uji=function(alpha,para,K)
{
  # --- baca & siapkan titik knot terbaik (GCV terkecil) ---
  knot = read.csv(paste0(folder,"DATA ALL knot ",K,".csv"), header=TRUE)
  knot = as.matrix(knot)
  knot = knot[,-1]                 # buang kolom index baris
  knot = knot[order(knot[,1]), ]   # urutkan berdasarkan GCV (kolom 1) terkecil
  baris_knot = as.numeric(knot[1, 4:ncol(knot)])   # knot terbaik X1-X6

  data=as.matrix(data)
  ybar=mean(data[,1])
  m=para+2
  n=nrow(data)
  q=ncol(data)
  p=q-para-1                        # jumlah variabel X (X1-X6)
  dataA=as.matrix(data[,rep(m:(m+p-1),each=K)])   # tiap variabel X diulang sebanyak K knot
  satu=rep(1,n)
  n1=length(baris_knot)             # jumlah kolom knot = p*K
  data.knot=matrix(ncol=n1,nrow=n)

  # --- hitung fungsi basis knot (loop i untuk knot, j untuk observasi) ---
  for (i in 1:n1)
  {
    for (j in 1:n)
    {
      if(dataA[j,i] < baris_knot[i]) data.knot[j,i]=0
      else data.knot[j,i] = dataA[j,i] - baris_knot[i]
    }
  }

  mx=satu
  nama="(Intercept)"
  for (j in 1:p)
  {
    mx=cbind(mx,data[,j+1],data.knot[,((j-1)*K+1):(j*K)])
    nama=c(nama,paste0("X",j),paste0("X",j,"_k",1:K))
  }
  mx=as.matrix(mx)
  B=(pinv(t(mx)%*%mx))%*%t(mx)%*%data[,1]
  rownames(B)=nama
  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-n1)
  MSR=SSR/(n1-1)
  SST=sum((data[,1]-ybar)^2)
  Rsq=(SSR/(SSR+SSE))*100
  Rsqadj=(1-(SSE/(n-n1))/(SST/(n-1)))*100

  #-------------------------------------------------------#
  # UJI SIMULTAN
  #-------------------------------------------------------#
  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')
  }

  #------------------------------------------------------#
  # UJI PARSIAL
  #------------------------------------------------------#
  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')
  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 parameter',nama[i],'signifikan dengan pvalue',pval[i],'\n')
    else cat('Gagal tolak Ho yakni parameter',nama[i],'tidak signifikan dengan pvalue',pval[i],'\n')
  }
  thit=as.matrix(thit)
  cat('=============================================','\n')
  cat('nilai t hitung','\n')
  cat('=============================================','\n')
  rownames(thit)=nama
  print(thit)
  cat('=============================================','\n')
  cat('Tabel uji parsial','\n')
  cat('=============================================','\n')
  tabel=data.frame(Estimasi=B[,1],Galat_baku=SE,t_hitung=thit[,1],p_value=pval,
                   Keputusan=ifelse(pval<=alpha,"Signifikan","Tidak signifikan"))
  print(tabel,digits=4)
  cat('Parameter signifikan:',sum(pval<=alpha),'dari',n1,'\n')
  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,' Rsq adj=',Rsqadj,'\n')
  cat('pvalue(F)=',pvalue,'\n')

  write.csv(res, file=paste0(folder,'OUTPUT UJI RESIDUAL knot',K,'.csv'))
  write.csv(mx, file=paste0(folder,'OUTPUT UJI MX knot',K,'.csv'))
  write.csv(yhat, file=paste0(folder,'OUTPUT UJI yhat knot',K,'.csv'))
}

uji(0.05, 0, 1)
## --------------------------------------- 
## Kesimpulan hasil uji simultan 
## --------------------------------------- 
## Tolak Ho yakni minimal terdapat 1 variabel bebas yang signifikan 
##  
## --------------------------------------------- 
## Kesimpulan hasil uji parsial 
## --------------------------------------------- 
## Gagal tolak Ho yakni parameter (Intercept) tidak signifikan dengan pvalue 0.3883954 
## Gagal tolak Ho yakni parameter X1 tidak signifikan dengan pvalue 0.6170333 
## Tolak Ho yakni parameter X1_k1 signifikan dengan pvalue 6.567427e-06 
## Tolak Ho yakni parameter X2 signifikan dengan pvalue 0.003580801 
## Gagal tolak Ho yakni parameter X2_k1 tidak signifikan dengan pvalue 0.223957 
## Tolak Ho yakni parameter X3 signifikan dengan pvalue 0.005646631 
## Tolak Ho yakni parameter X3_k1 signifikan dengan pvalue 0.003879527 
## Tolak Ho yakni parameter X4 signifikan dengan pvalue 5.156252e-13 
## Tolak Ho yakni parameter X4_k1 signifikan dengan pvalue 1.687891e-05 
## Gagal tolak Ho yakni parameter X5 tidak signifikan dengan pvalue 0.9927584 
## Gagal tolak Ho yakni parameter X5_k1 tidak signifikan dengan pvalue 0.3135006 
## Gagal tolak Ho yakni parameter X6 tidak signifikan dengan pvalue 0.6565236 
## Gagal tolak Ho yakni parameter X6_k1 tidak signifikan dengan pvalue 0.4467439 
## ============================================= 
## nilai t hitung 
## ============================================= 
##                     [,1]
## (Intercept)  0.863282194
## X1          -0.500371464
## X1_k1       -4.555637852
## X2          -2.926755428
## X2_k1       -1.217579486
## X3           2.779633244
## X3_k1       -2.901311348
## X4          -7.417012199
## X4_k1        4.344876881
## X5           0.009080621
## X5_k1        1.008918804
## X6           0.444983846
## X6_k1       -0.761454471
## ============================================= 
## Tabel uji parsial 
## ============================================= 
##              Estimasi Galat_baku  t_hitung   p_value        Keputusan
## (Intercept) 55.235598   63.98325  0.863282 3.884e-01 Tidak signifikan
## X1          -0.060207    0.12032 -0.500371 6.170e-01 Tidak signifikan
## X1_k1       -0.866308    0.19016 -4.555638 6.567e-06       Signifikan
## X2          -0.139780    0.04776 -2.926755 3.581e-03       Signifikan
## X2_k1       -0.081699    0.06710 -1.217579 2.240e-01 Tidak signifikan
## X3           4.602968    1.65596  2.779633 5.647e-03       Signifikan
## X3_k1       -5.057603    1.74321 -2.901311 3.880e-03       Signifikan
## X4          -0.613837    0.08276 -7.417012 5.156e-13       Signifikan
## X4_k1        0.720183    0.16575  4.344877 1.688e-05       Signifikan
## X5           0.008922    0.98249  0.009081 9.928e-01 Tidak signifikan
## X5_k1        1.020919    1.01189  1.008919 3.135e-01 Tidak signifikan
## X6           0.059790    0.13436  0.444984 6.565e-01 Tidak signifikan
## X6_k1       -0.129832    0.17051 -0.761454 4.467e-01 Tidak signifikan
## Parameter signifikan: 6 dari 13 
## Analysis of Variance 
## ============================================= 
## Sumber df SS MS Fhit 
## Regresi  12   77085.11   6423.759   108.2327 
## Error  501   29735.03   59.35135 
## Total  513   106820.1 
## ============================================= 
## s= 7.703983  Rsq= 72.16346  Rsq adj= 71.49672 
## pvalue(F)= 1.293317e-130

#PEMILIHAN DUA TITIK KNOT#

GCV2=function(data)
{
  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)]
  colnames(knot2)=paste0(rep(paste0("X",1:m),each=2),"_k",rep(1:2,m))
  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=paste0(folder,"DATA ALL knot 2.csv"))
  cat("==============================================","\n")
  cat("HASIL GCV terkecil dengan 2 knot","\n")
  cat("==============================================","\n")
  print(((dataG[1,1:ncol(dataG)])))
  cat("Nilai GCV 10 terkecil pertama","\n")
  print(dataG[1:10,])

  # --- hitung ulang B dari titik knot dengan GCV TERKECIL ---
  baris_terbaik = dataG[1, "knot_ke"]
  knotgcv = knot2[baris_terbaik, ]
  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]) datagcv1[k,j]=0 else
        datagcv1[k,j]=data[k,(b+para+1)]-knotgcv[j]
    }
  }
  mxgcv=as.matrix(cbind(aa,data2,datagcv1))
  Cgcv=pinv(t(mxgcv)%*%mxgcv)
  B=Cgcv%*%(t(mxgcv)%*%data[,1])

  cat("\n")
  cat("==============================================","\n")
  cat("HASIL ESTIMASI PARAMETER TITIK KNOT KE 2","\n")
  cat("==============================================","\n")
  print(B)
  cat("\n")
}
GCV2(data)
## ============================================== 
## HASIL GCV terkecil dengan 2 knot 
## ============================================== 
##        GCV    knot_ke      X1_k1      X1_k2      X2_k1      X2_k2      X3_k1 
##  59.653741 245.000000   6.891224  22.295306  12.198367  52.859592   2.683265 
##      X3_k2      X4_k1      X4_k2      X5_k1      X5_k2      X6_k1      X6_k2 
##   7.360816  10.631020  46.067755  58.439592  67.504898   6.146939  26.636735 
## Nilai GCV 10 terkecil pertama 
##            GCV knot_ke     X1_k1    X1_k2    X2_k1    X2_k2    X3_k1    X3_k2
##  [1,] 59.65374     245  6.891224 22.29531 12.19837 52.85959 2.683265 7.360816
##  [2,] 59.71889     239  6.891224 17.67408 12.19837 40.66122 2.683265 5.957551
##  [3,] 59.71968     246  6.891224 23.06551 12.19837 54.89265 2.683265 7.594694
##  [4,] 59.72621     244  6.891224 21.52510 12.19837 50.82653 2.683265 7.126939
##  [5,] 59.72924     238  6.891224 16.90388 12.19837 38.62816 2.683265 5.723673
##  [6,] 59.73756     905 23.065510 29.22714 54.89265 71.15714 7.594694 9.465714
##  [7,] 59.76477     237  6.891224 16.13367 12.19837 36.59510 2.683265 5.489796
##  [8,] 59.76563     241  6.891224 19.21449 12.19837 44.72735 2.683265 6.425306
##  [9,] 59.76975     240  6.891224 18.44429 12.19837 42.69429 2.683265 6.191429
## [10,] 59.77079     242  6.891224 19.98469 12.19837 46.76041 2.683265 6.659184
##          X4_k1    X4_k2    X5_k1    X5_k2     X6_k1    X6_k2
##  [1,] 10.63102 46.06776 58.43959 67.50490  6.146939 26.63673
##  [2,] 10.63102 35.43673 58.43959 64.78531  6.146939 20.48980
##  [3,] 10.63102 47.83959 58.43959 67.95816  6.146939 27.66122
##  [4,] 10.63102 44.29592 58.43959 67.05163  6.146939 25.61224
##  [5,] 10.63102 33.66490 58.43959 64.33204  6.146939 19.46531
##  [6,] 47.83959 62.01429 67.95816 71.58429 27.661224 35.85714
##  [7,] 10.63102 31.89306 58.43959 63.87878  6.146939 18.44082
##  [8,] 10.63102 38.98041 58.43959 65.69184  6.146939 22.53878
##  [9,] 10.63102 37.20857 58.43959 65.23857  6.146939 21.51429
## [10,] 10.63102 40.75224 58.43959 66.14510  6.146939 23.56327
## 
## ============================================== 
## HASIL ESTIMASI PARAMETER TITIK KNOT KE 2 
## ============================================== 
##               [,1]
##  [1,] 232.61514814
##  [2,]  -0.21284620
##  [3,]  -0.47339109
##  [4,]  -3.37097474
##  [5,]  -0.93861870
##  [6,]  -2.77940373
##  [7,]   0.78647431
##  [8,]  -0.04625130
##  [9,]  -1.12800600
## [10,]   0.33226449
## [11,]  -0.04946566
## [12,]   6.15885749
## [13,]  -4.00900376
## [14,]   0.87768543
## [15,]   0.02702941
## [16,]   4.11508131
## [17,]  -0.43791153
## [18,]  -0.91535404
## [19,]   0.05822887

#UJI SIGNIFIKANSI DUA TITIK KNOT#

uji(0.05, 0, 2)
## --------------------------------------- 
## Kesimpulan hasil uji simultan 
## --------------------------------------- 
## Tolak Ho yakni minimal terdapat 1 variabel bebas yang signifikan 
##  
## --------------------------------------------- 
## Kesimpulan hasil uji parsial 
## --------------------------------------------- 
## Gagal tolak Ho yakni parameter (Intercept) tidak signifikan dengan pvalue 0.2033832 
## Gagal tolak Ho yakni parameter X1 tidak signifikan dengan pvalue 0.5802154 
## Gagal tolak Ho yakni parameter X1_k1 tidak signifikan dengan pvalue 0.9150597 
## Tolak Ho yakni parameter X1_k2 signifikan dengan pvalue 0.0002143497 
## Tolak Ho yakni parameter X2 signifikan dengan pvalue 0.001689131 
## Tolak Ho yakni parameter X2_k1 signifikan dengan pvalue 0.04228767 
## Gagal tolak Ho yakni parameter X2_k2 tidak signifikan dengan pvalue 0.580082 
## Gagal tolak Ho yakni parameter X3 tidak signifikan dengan pvalue 0.53971 
## Gagal tolak Ho yakni parameter X3_k1 tidak signifikan dengan pvalue 0.3171688 
## Tolak Ho yakni parameter X3_k2 signifikan dengan pvalue 0.002221382 
## Tolak Ho yakni parameter X4 signifikan dengan pvalue 4.68481e-11 
## Tolak Ho yakni parameter X4_k1 signifikan dengan pvalue 7.791085e-06 
## Gagal tolak Ho yakni parameter X4_k2 tidak signifikan dengan pvalue 0.9171649 
## Gagal tolak Ho yakni parameter X5 tidak signifikan dengan pvalue 0.3726539 
## Gagal tolak Ho yakni parameter X5_k1 tidak signifikan dengan pvalue 0.2028383 
## Gagal tolak Ho yakni parameter X5_k2 tidak signifikan dengan pvalue 0.304175 
## Gagal tolak Ho yakni parameter X6 tidak signifikan dengan pvalue 0.1014708 
## Gagal tolak Ho yakni parameter X6_k1 tidak signifikan dengan pvalue 0.0736619 
## Gagal tolak Ho yakni parameter X6_k2 tidak signifikan dengan pvalue 0.7026649 
## ============================================= 
## nilai t hitung 
## ============================================= 
##                   [,1]
## (Intercept)  1.2736558
## X1          -0.5534350
## X1_k1       -0.1067132
## X1_k2       -3.7291410
## X2          -3.1573696
## X2_k1        2.0359461
## X2_k2       -0.5536301
## X3          -0.6136780
## X3_k1        1.0013046
## X3_k2       -3.0749953
## X4          -6.7307292
## X4_k1        4.5186820
## X4_k2        0.1040587
## X5          -0.8923222
## X5_k1        1.2751953
## X5_k2       -1.0285894
## X6           1.6408161
## X6_k1       -1.7925095
## X6_k2        0.3819466
## ============================================= 
## Tabel uji parsial 
## ============================================= 
##              Estimasi Galat_baku t_hitung   p_value        Keputusan
## (Intercept) 232.61515  182.63580   1.2737 2.034e-01 Tidak signifikan
## X1           -0.21285    0.38459  -0.5534 5.802e-01 Tidak signifikan
## X1_k1        -0.04625    0.43342  -0.1067 9.151e-01 Tidak signifikan
## X1_k2        -1.12801    0.30248  -3.7291 2.143e-04       Signifikan
## X2           -0.47339    0.14993  -3.1574 1.689e-03       Signifikan
## X2_k1         0.33226    0.16320   2.0359 4.229e-02       Signifikan
## X2_k2        -0.04947    0.08935  -0.5536 5.801e-01 Tidak signifikan
## X3           -3.37097    5.49307  -0.6137 5.397e-01 Tidak signifikan
## X3_k1         6.15886    6.15083   1.0013 3.172e-01 Tidak signifikan
## X3_k2        -4.00900    1.30374  -3.0750 2.221e-03       Signifikan
## X4           -0.93862    0.13945  -6.7307 4.685e-11       Signifikan
## X4_k1         0.87769    0.19423   4.5187 7.791e-06       Signifikan
## X4_k2         0.02703    0.25975   0.1041 9.172e-01 Tidak signifikan
## X5           -2.77940    3.11480  -0.8923 3.727e-01 Tidak signifikan
## X5_k1         4.11508    3.22702   1.2752 2.028e-01 Tidak signifikan
## X5_k2        -0.43791    0.42574  -1.0286 3.042e-01 Tidak signifikan
## X6            0.78647    0.47932   1.6408 1.015e-01 Tidak signifikan
## X6_k1        -0.91535    0.51066  -1.7925 7.366e-02 Tidak signifikan
## X6_k2         0.05823    0.15245   0.3819 7.027e-01 Tidak signifikan
## Parameter signifikan: 6 dari 19 
## Analysis of Variance 
## ============================================= 
## Sumber df SS MS Fhit 
## Regresi  18   78383.06   4354.614   75.80013 
## Error  495   28437.08   57.44864 
## Total  513   106820.1 
## ============================================= 
## s= 7.579488  Rsq= 73.37854  Rsq adj= 72.41049 
## pvalue(F)= 1.905753e-129

#PEMILIHAN TIGA TITIK KNOT#

Pencarian 3 knot memeriksa 17.296 kombinasi (48 pilih 3), sehingga chunk ini memerlukan waktu beberapa menit.

GCV3=function(data)
{
  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)]
  colnames(knot2)=paste0(rep(paste0("X",1:m),each=3),"_k",rep(1:3,m))
  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=paste0(folder,"DATA ALL knot 3.csv"))
  cat("==============================================","\n")
  cat("HASIL GCV terkecil dengan 3 knot","\n")
  cat("==============================================","\n")
  print(((dataG[1,1:ncol(dataG)])))
  cat("Nilai GCV 10 terkecil pertama","\n")
  print(dataG[1:10,])

  # --- hitung ulang B dari titik knot dengan GCV TERKECIL ---
  baris_terbaik = dataG[1, "knot_ke"]
  knotgcv = knot2[baris_terbaik, ]
  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]) datagcv1[k,j]=0 else
        datagcv1[k,j]=data[k,(b+para+1)]-knotgcv[j]
    }
  }
  mxgcv=as.matrix(cbind(aa,data2,datagcv1))
  Cgcv=pinv(t(mxgcv)%*%mxgcv)
  B=Cgcv%*%(t(mxgcv)%*%data[,1])

  cat("\n")
  cat("==============================================","\n")
  cat("HASIL ESTIMASI PARAMETER TITIK KNOT KE 3","\n")
  cat("==============================================","\n")
  print(B)
  cat("\n")
}
GCV3(data)
## ============================================== 
## HASIL GCV terkecil dengan 3 knot 
## ============================================== 
##          GCV      knot_ke        X1_k1        X1_k2        X1_k3        X2_k1 
##    57.871554 11127.000000    13.052857    24.605918    28.456939    28.462857 
##        X2_k2        X2_k3        X3_k1        X3_k2        X3_k3        X4_k1 
##    58.958776    69.124082     4.554286     8.062449     9.231837    24.805714 
##        X4_k2        X4_k3        X5_k1        X5_k2        X5_k3        X6_k1 
##    51.383265    60.242449    62.065714    68.864694    71.131020    14.342857 
##        X6_k2        X6_k3 
##    29.710204    34.832653 
## Nilai GCV 10 terkecil pertama 
##            GCV knot_ke    X1_k1    X1_k2    X1_k3    X2_k1    X2_k2    X2_k3
##  [1,] 57.87155   11127 13.05286 24.60592 28.45694 28.46286 58.95878 69.12408
##  [2,] 57.90291   11144 13.05286 25.37612 27.68673 28.46286 60.99184 67.09102
##  [3,] 57.91615   11126 13.05286 24.60592 27.68673 28.46286 58.95878 67.09102
##  [4,] 57.97474   11655 13.82306 24.60592 28.45694 30.49592 58.95878 69.12408
##  [5,] 58.00390   11672 13.82306 25.37612 27.68673 30.49592 60.99184 67.09102
##  [6,] 58.01200   11654 13.82306 24.60592 27.68673 30.49592 58.95878 67.09102
##  [7,] 58.01834   10566 12.28265 24.60592 28.45694 26.42980 58.95878 69.12408
##  [8,] 58.05155   11145 13.05286 25.37612 28.45694 28.46286 60.99184 69.12408
##  [9,] 58.07181   10583 12.28265 25.37612 27.68673 26.42980 60.99184 67.09102
## [10,] 58.08304   10565 12.28265 24.60592 27.68673 26.42980 58.95878 67.09102
##          X3_k1    X3_k2    X3_k3    X4_k1    X4_k2    X4_k3    X5_k1    X5_k2
##  [1,] 4.554286 8.062449 9.231837 24.80571 51.38327 60.24245 62.06571 68.86469
##  [2,] 4.554286 8.296327 8.997959 24.80571 53.15510 58.47061 62.06571 69.31796
##  [3,] 4.554286 8.062449 8.997959 24.80571 51.38327 58.47061 62.06571 68.86469
##  [4,] 4.788163 8.062449 9.231837 26.57755 51.38327 60.24245 62.51898 68.86469
##  [5,] 4.788163 8.296327 8.997959 26.57755 53.15510 58.47061 62.51898 69.31796
##  [6,] 4.788163 8.062449 8.997959 26.57755 51.38327 58.47061 62.51898 68.86469
##  [7,] 4.320408 8.062449 9.231837 23.03388 51.38327 60.24245 61.61245 68.86469
##  [8,] 4.554286 8.296327 9.231837 24.80571 53.15510 60.24245 62.06571 69.31796
##  [9,] 4.320408 8.296327 8.997959 23.03388 53.15510 58.47061 61.61245 69.31796
## [10,] 4.320408 8.062449 8.997959 23.03388 51.38327 58.47061 61.61245 68.86469
##          X5_k3    X6_k1    X6_k2    X6_k3
##  [1,] 71.13102 14.34286 29.71020 34.83265
##  [2,] 70.67776 14.34286 30.73469 33.80816
##  [3,] 70.67776 14.34286 29.71020 33.80816
##  [4,] 71.13102 15.36735 29.71020 34.83265
##  [5,] 70.67776 15.36735 30.73469 33.80816
##  [6,] 70.67776 15.36735 29.71020 33.80816
##  [7,] 71.13102 13.31837 29.71020 34.83265
##  [8,] 71.13102 14.34286 30.73469 34.83265
##  [9,] 70.67776 13.31837 30.73469 33.80816
## [10,] 70.67776 13.31837 29.71020 33.80816
## 
## ============================================== 
## HASIL ESTIMASI PARAMETER TITIK KNOT KE 3 
## ============================================== 
##                [,1]
##  [1,] 167.379165062
##  [2,]   0.006721307
##  [3,]  -0.162048384
##  [4,]   3.088515432
##  [5,]  -0.572073896
##  [6,]  -1.828642793
##  [7,]   0.121548312
##  [8,]  -0.884363855
##  [9,]   0.860349570
## [10,]  -2.205508264
## [11,]  -0.027020113
## [12,]  -0.313063519
## [13,]   0.513304370
## [14,]  -1.193279342
## [15,]  -6.518365931
## [16,]   6.397219439
## [17,]   0.756445243
## [18,]   0.935416563
## [19,]  -2.197128367
## [20,]   3.616134316
## [21,]  -2.564442076
## [22,]   2.261039366
## [23,]  -0.235273051
## [24,]  -0.185090874
## [25,]   0.665478503

#UJI SIGNIFIKANSI TIGA TITIK KNOT#

uji(0.05, 0, 3)
## --------------------------------------- 
## Kesimpulan hasil uji simultan 
## --------------------------------------- 
## Tolak Ho yakni minimal terdapat 1 variabel bebas yang signifikan 
##  
## --------------------------------------------- 
## Kesimpulan hasil uji parsial 
## --------------------------------------------- 
## Tolak Ho yakni parameter (Intercept) signifikan dengan pvalue 0.030933 
## Gagal tolak Ho yakni parameter X1 tidak signifikan dengan pvalue 0.9589731 
## Tolak Ho yakni parameter X1_k1 signifikan dengan pvalue 0.0008273402 
## Gagal tolak Ho yakni parameter X1_k2 tidak signifikan dengan pvalue 0.3383506 
## Gagal tolak Ho yakni parameter X1_k3 tidak signifikan dengan pvalue 0.05676414 
## Tolak Ho yakni parameter X2 signifikan dengan pvalue 0.002971664 
## Gagal tolak Ho yakni parameter X2_k1 tidak signifikan dengan pvalue 0.7632598 
## Gagal tolak Ho yakni parameter X2_k2 tidak signifikan dengan pvalue 0.3196921 
## Gagal tolak Ho yakni parameter X2_k3 tidak signifikan dengan pvalue 0.2179738 
## Gagal tolak Ho yakni parameter X3 tidak signifikan dengan pvalue 0.1575939 
## Gagal tolak Ho yakni parameter X3_k1 tidak signifikan dengan pvalue 0.6503021 
## Tolak Ho yakni parameter X3_k2 signifikan dengan pvalue 0.0001412823 
## Tolak Ho yakni parameter X3_k3 signifikan dengan pvalue 9.938082e-06 
## Tolak Ho yakni parameter X4 signifikan dengan pvalue 1.323051e-09 
## Tolak Ho yakni parameter X4_k1 signifikan dengan pvalue 0.002019186 
## Gagal tolak Ho yakni parameter X4_k2 tidak signifikan dengan pvalue 0.4230511 
## Gagal tolak Ho yakni parameter X4_k3 tidak signifikan dengan pvalue 0.1188693 
## Gagal tolak Ho yakni parameter X5 tidak signifikan dengan pvalue 0.129938 
## Tolak Ho yakni parameter X5_k1 signifikan dengan pvalue 0.00774821 
## Tolak Ho yakni parameter X5_k2 signifikan dengan pvalue 0.0005331614 
## Tolak Ho yakni parameter X5_k3 signifikan dengan pvalue 0.001533134 
## Gagal tolak Ho yakni parameter X6 tidak signifikan dengan pvalue 0.4278882 
## Gagal tolak Ho yakni parameter X6_k1 tidak signifikan dengan pvalue 0.2545297 
## Gagal tolak Ho yakni parameter X6_k2 tidak signifikan dengan pvalue 0.6005636 
## Gagal tolak Ho yakni parameter X6_k3 tidak signifikan dengan pvalue 0.1704717 
## ============================================= 
## nilai t hitung 
## ============================================= 
##                    [,1]
## (Intercept)  2.16419172
## X1           0.05146859
## X1_k1       -3.36441804
## X1_k2        0.95836847
## X1_k3       -1.90964221
## X2          -2.98564456
## X2_k1       -0.30137092
## X2_k2       -0.99610423
## X2_k3        1.23352155
## X3           1.41537923
## X3_k1       -0.45362202
## X3_k2       -3.83625662
## X3_k3        4.46530789
## X4          -6.18367326
## X4_k1        3.10410199
## X4_k2        0.80181212
## X4_k3       -1.56227849
## X5          -1.51690035
## X5_k1        2.67390671
## X5_k2       -3.48666848
## X5_k3        3.18631001
## X6           0.79347125
## X6_k1       -1.14075640
## X6_k2       -0.52393144
## X6_k3        1.37271011
## ============================================= 
## Tabel uji parsial 
## ============================================= 
##               Estimasi Galat_baku t_hitung   p_value        Keputusan
## (Intercept) 167.379165   77.34027  2.16419 3.093e-02       Signifikan
## X1            0.006721    0.13059  0.05147 9.590e-01 Tidak signifikan
## X1_k1        -0.884364    0.26286 -3.36442 8.273e-04       Signifikan
## X1_k2         0.860350    0.89772  0.95837 3.384e-01 Tidak signifikan
## X1_k3        -2.205508    1.15493 -1.90964 5.676e-02 Tidak signifikan
## X2           -0.162048    0.05428 -2.98564 2.972e-03       Signifikan
## X2_k1        -0.027020    0.08966 -0.30137 7.633e-01 Tidak signifikan
## X2_k2        -0.313064    0.31429 -0.99610 3.197e-01 Tidak signifikan
## X2_k3         0.513304    0.41613  1.23352 2.180e-01 Tidak signifikan
## X3            3.088515    2.18211  1.41538 1.576e-01 Tidak signifikan
## X3_k1        -1.193279    2.63056 -0.45362 6.503e-01 Tidak signifikan
## X3_k2        -6.518366    1.69915 -3.83626 1.413e-04       Signifikan
## X3_k3         6.397219    1.43265  4.46531 9.938e-06       Signifikan
## X4           -0.572074    0.09251 -6.18367 1.323e-09       Signifikan
## X4_k1         0.756445    0.24369  3.10410 2.019e-03       Signifikan
## X4_k2         0.935417    1.16663  0.80181 4.231e-01 Tidak signifikan
## X4_k3        -2.197128    1.40636 -1.56228 1.189e-01 Tidak signifikan
## X5           -1.828643    1.20551 -1.51690 1.299e-01 Tidak signifikan
## X5_k1         3.616134    1.35238  2.67391 7.748e-03       Signifikan
## X5_k2        -2.564442    0.73550 -3.48667 5.332e-04       Signifikan
## X5_k3         2.261039    0.70961  3.18631 1.533e-03       Signifikan
## X6            0.121548    0.15319  0.79347 4.279e-01 Tidak signifikan
## X6_k1        -0.235273    0.20624 -1.14076 2.545e-01 Tidak signifikan
## X6_k2        -0.185091    0.35327 -0.52393 6.006e-01 Tidak signifikan
## X6_k3         0.665479    0.48479  1.37271 1.705e-01 Tidak signifikan
## Parameter signifikan: 10 dari 25 
## Analysis of Variance 
## ============================================= 
## Sumber df SS MS Fhit 
## Regresi  24   79897.37   3329.057   60.46587 
## Error  489   26922.77   55.05679 
## Total  513   106820.1 
## ============================================= 
## s= 7.420026  Rsq= 74.79617  Rsq adj= 73.55917 
## pvalue(F)= 1.15666e-129

#PERBANDINGAN GCV MINIMUM 1, 2, DAN 3 KNOT#

gcv_min=rep(NA,3)
r2_min=rep(NA,3)
for (K in 1:3)
{
  d=read.csv(paste0(folder,"DATA ALL knot ",K,".csv"),header=TRUE)
  d=d[order(d$GCV),]
  gcv_min[K]=d$GCV[1]
  r2_min[K]=d$Rsq[1]
}
tab_gcv=data.frame(Jumlah_knot=1:3,GCV_minimum=gcv_min,R2_persen=r2_min)
tab_gcv
K_terbaik=tab_gcv$Jumlah_knot[which.min(tab_gcv$GCV_minimum)]
cat("Jumlah knot optimal (GCV terkecil):",K_terbaik,"\n")
## Jumlah knot optimal (GCV terkecil): 3
plot(tab_gcv$Jumlah_knot,tab_gcv$GCV_minimum,type="b",pch=16,col="steelblue",lwd=2,
     xaxt="n",main="GCV minimum per jumlah knot",xlab="Jumlah knot",ylab="GCV")
axis(1,at=1:3)
points(K_terbaik,tab_gcv$GCV_minimum[K_terbaik],col="red",cex=2.5,lwd=2)

#MODEL SPLINE TERBAIK#

#fungsi untuk membentuk matriks basis spline truncated (intersep, lalu per variabel: Xj dan (Xj-knot)+)
buat_mx=function(Xm,knot)
{
  Xm=as.matrix(Xm)
  p=ncol(Xm)
  K=nrow(knot)
  mx=matrix(1,nrow=nrow(Xm),ncol=1)
  nama="(Intercept)"
  for (j in 1:p)
  {
    mx=cbind(mx,Xm[,j])
    nama=c(nama,paste0("X",j))
    for (h in 1:K)
    {
      mx=cbind(mx,pmax(Xm[,j]-knot[h,j],0))
      nama=c(nama,paste0("X",j,"_k",h))
    }
  }
  colnames(mx)=nama
  mx
}

#fungsi untuk mengambil titik knot dengan GCV terkecil dari file csv (baris = urutan knot, kolom = variabel)
ambil_knot=function(K)
{
  d=read.csv(paste0(folder,"DATA ALL knot ",K,".csv"),header=TRUE)
  d=d[order(d$GCV),]
  knot=matrix(as.numeric(d[1,5:ncol(d)]),nrow=K)
  colnames(knot)=paste0("X",1:ncol(knot))
  rownames(knot)=paste0("knot_",1:K)
  knot
}

y=data[,1]
X=as.matrix(data[,2:7])
n=nrow(data)

knot_opt=ambil_knot(K_terbaik)
knot_opt
##              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
mx_opt=buat_mx(X,knot_opt)
df_sp=as.data.frame(mx_opt[,-1])
df_sp$Y=y
model_sp=lm(Y~.,data=df_sp)
sm=summary(model_sp)
sm
## 
## Call:
## lm(formula = Y ~ ., data = df_sp)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -24.742  -3.129   1.549   4.796  20.263 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 167.379165  77.340267   2.164 0.030933 *  
## X1            0.006721   0.130590   0.051 0.958973    
## X1_k1        -0.884364   0.262858  -3.364 0.000827 ***
## X1_k2         0.860350   0.897723   0.958 0.338351    
## X1_k3        -2.205508   1.154933  -1.910 0.056764 .  
## X2           -0.162048   0.054276  -2.986 0.002972 ** 
## X2_k1        -0.027020   0.089657  -0.301 0.763260    
## X2_k2        -0.313064   0.314288  -0.996 0.319692    
## X2_k3         0.513304   0.416129   1.234 0.217974    
## X3            3.088515   2.182112   1.415 0.157594    
## X3_k1        -1.193279   2.630559  -0.454 0.650302    
## X3_k2        -6.518366   1.699148  -3.836 0.000141 ***
## X3_k3         6.397219   1.432649   4.465 9.94e-06 ***
## X4           -0.572074   0.092514  -6.184 1.32e-09 ***
## X4_k1         0.756445   0.243692   3.104 0.002019 ** 
## X4_k2         0.935417   1.166628   0.802 0.423051    
## X4_k3        -2.197128   1.406362  -1.562 0.118869    
## X5           -1.828643   1.205513  -1.517 0.129938    
## X5_k1         3.616134   1.352379   2.674 0.007748 ** 
## X5_k2        -2.564442   0.735499  -3.487 0.000533 ***
## X5_k3         2.261039   0.709611   3.186 0.001533 ** 
## X6            0.121548   0.153186   0.793 0.427888    
## X6_k1        -0.235273   0.206243  -1.141 0.254530    
## X6_k2        -0.185091   0.353273  -0.524 0.600564    
## X6_k3         0.665479   0.484792   1.373 0.170472    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.42 on 489 degrees of freedom
## Multiple R-squared:  0.748,  Adjusted R-squared:  0.7356 
## F-statistic: 60.47 on 24 and 489 DF,  p-value: < 2.2e-16
#tabel ANOVA
fs=sm$fstatistic
p_f=pf(fs[1],fs[2],fs[3],lower.tail=FALSE)
anova_tab=data.frame(Sumber=c("Regresi","Galat","Total"),
                     db=c(fs[2],fs[3],n-1),
                     JK=c(sum((fitted(model_sp)-mean(y))^2),sum(residuals(model_sp)^2),sum((y-mean(y))^2)))
anova_tab$KT=c(anova_tab$JK[1]/anova_tab$db[1],anova_tab$JK[2]/anova_tab$db[2],NA)
anova_tab$F_hitung=c(unname(fs[1]),NA,NA)
anova_tab$p_value=c(unname(p_f),NA,NA)
anova_tab
cat(sprintf("R2 = %.2f%% | R2 adj = %.2f%% | s = %.4f\n",100*sm$r.squared,100*sm$adj.r.squared,sm$sigma))
## R2 = 74.80% | R2 adj = 73.56% | s = 7.4200
if (p_f<0.05) cat("Keputusan: tolak H0, minimal satu parameter signifikan.\n") else cat("Keputusan: gagal tolak H0.\n")
## Keputusan: tolak H0, minimal satu parameter signifikan.
#uji signifikansi parsial
koef=as.data.frame(sm$coefficients)
names(koef)=c("Estimasi","Galat_baku","t_hitung","p_value")
koef$Keputusan=ifelse(koef$p_value<0.05,"Signifikan","Tidak signifikan")
koef
sig=koef[koef$p_value<0.05,]
cat("Parameter signifikan:",nrow(sig),"dari",nrow(koef),"\n")
## Parameter signifikan: 10 dari 25
#variabel dianggap berpengaruh jika minimal satu parameternya signifikan
nama_x=paste0("X",1:6)
var_pengaruh=nama_x[sapply(nama_x,function(v) any(grepl(paste0("^",v,"($|_k)"),rownames(sig))))]
cat("Variabel berpengaruh:",paste(var_pengaruh,collapse=", "),"\n")
## Variabel berpengaruh: X1, X2, X3, X4, X5
#estimasi parameter dengan selang kepercayaan 95%
kf=koef[rownames(koef)!="(Intercept)",]
kf$bawah=kf$Estimasi-1.96*kf$Galat_baku
kf$atas=kf$Estimasi+1.96*kf$Galat_baku
ypos=nrow(kf):1
warna=ifelse(kf$Keputusan=="Signifikan","#d73027","grey55")
plot(kf$Estimasi,ypos,xlim=range(c(kf$bawah,kf$atas)),pch=16,col=warna,yaxt="n",
     xlab="Estimasi",ylab="",main="Estimasi parameter spline dengan selang kepercayaan 95%")
segments(kf$bawah,ypos,kf$atas,ypos,col=warna)
axis(2,at=ypos,labels=rownames(kf),las=1,cex.axis=0.7)
abline(v=0,lty=2)
legend("bottomright",legend=c("Signifikan","Tidak signifikan"),col=c("#d73027","grey55"),pch=16,bty="n")

#DIAGNOSTIK MODEL SPLINE#

res=residuals(model_sp)
hat=fitted(model_sp)

par(mfrow=c(2,2))
plot(y,hat,pch=16,col="grey30",main="Aktual vs prediksi",xlab="Y aktual",ylab="Y prediksi")
abline(0,1,col="red",lwd=2)
plot(hat,res,pch=16,col="grey30",main="Residual vs prediksi",xlab="Prediksi",ylab="Residual")
abline(h=0,col="red",lwd=2)
lines(lowess(hat,res),col="steelblue",lwd=2)
qqnorm(rstandard(model_sp),pch=16,col="grey30",main="Q-Q plot residual baku")
qqline(rstandard(model_sp),col="red",lwd=2)
hist(res,breaks=30,freq=FALSE,col="steelblue",border="white",main="Histogram residual",xlab="Residual")
curve(dnorm(x,mean=0,sd=sd(res)),add=TRUE,col="red",lwd=2)

par(mfrow=c(1,1))
#uji asumsi residual model spline
shapiro.test(res)
## 
##  Shapiro-Wilk normality test
## 
## data:  res
## W = 0.93503, p-value = 3.613e-14
bptest(model_sp)
## 
##  studentized Breusch-Pagan test
## 
## data:  model_sp
## BP = 87.693, df = 24, p-value = 3.461e-09
dwtest(model_sp)
## 
##  Durbin-Watson test
## 
## data:  model_sp
## DW = 1.5473, p-value = 3.331e-08
## alternative hypothesis: true autocorrelation is greater than 0

#PENGAMATAN BERPENGARUH (COOK’S DISTANCE)#

cd=cooks.distance(model_sp)
batas=4/n
plot(cd,type="h",col="grey50",main="Cook's distance (garis merah = 4/n)",xlab="Observasi",ylab="Cook's D")
abline(h=batas,col="red",lty=2)
besar=which(cd>4*batas)
if (length(besar)>0) text(besar,cd[besar],labels=besar,pos=3,cex=0.7)

d_cd=data.frame(obs=1:n,cd=cd)
head(d_cd[order(-d_cd$cd),],8)

#VISUALISASI KURVA SPLINE PER VARIABEL#

Untuk tiap variabel, kurva menunjukkan efek parsial (variabel lain ditetapkan pada median). Titik adalah partial residual (residual + efek parsial variabel tersebut), garis putus-putus vertikal adalah letak knot.

med=apply(X,2,median)
b_sp=coef(model_sp)
b_sp[is.na(b_sp)]=0

efek_parsial=function(xj_nilai,j)
{
  Xb=matrix(rep(med,each=length(xj_nilai)),ncol=ncol(X))
  Xb[,j]=xj_nilai
  drop(buat_mx(Xb,knot_opt)%*%b_sp)
}

par(mfrow=c(3,2))
for (j in 1:6)
{
  g=seq(min(X[,j]),max(X[,j]),length.out=300)
  pr=res+efek_parsial(X[,j],j)
  plot(X[,j],pr,pch=16,col=rgb(0,0,0,0.3),cex=0.6,
       main=paste("Efek parsial spline truncated",nama_x[j],"(",K_terbaik,"knot )"),
       xlab=nama_x[j],ylab="Efek parsial pada Y")
  lines(g,efek_parsial(g,j),col="darkred",lwd=3)
  abline(v=knot_opt[,j],lty=2,col="steelblue")
}

par(mfrow=c(1,1))

#PERSAMAAN PIECEWISE DAN PENGELOMPOKAN OBSERVASI#

for (j in 1:6)
{
  nm=nama_x[j]
  kj=knot_opt[,j]
  b_lin=b_sp[nm]
  b_h=b_sp[paste0(nm,"_k",1:K_terbaik)]
  bawah=c(-Inf,kj)
  atas=c(kj,Inf)

  tab=data.frame(Segmen=1:(K_terbaik+1),
                 Batas_bawah=bawah,
                 Batas_atas=atas,
                 Kemiringan=unname(b_lin+c(0,cumsum(b_h))),
                 Konstanta=unname(b_sp["(Intercept)"]+c(0,-cumsum(b_h*kj))),
                 N_obs=sapply(1:(K_terbaik+1),function(r) sum(X[,j]>=bawah[r] & X[,j]<atas[r])))

  cat("\n==============================================\n")
  cat("Model per segmen untuk",nm,"(variabel lain dianggap konstan)\n")
  cat("==============================================\n")
  print(tab,digits=4,row.names=FALSE)
  for (r in 1:nrow(tab))
  {
    arah=ifelse(tab$Kemiringan[r]>=0,"meningkatkan","menurunkan")
    cat("- Pada segmen ",r," (",sprintf("%.3f",tab$Batas_bawah[r])," <= ",nm," < ",sprintf("%.3f",tab$Batas_atas[r]),
        "), setiap kenaikan 1 satuan ",nm," ",arah," Y sebesar ",sprintf("%.3f",abs(tab$Kemiringan[r])),
        " (",tab$N_obs[r]," observasi).\n",sep="")
  }
}
## 
## ==============================================
## Model per segmen untuk X1 (variabel lain dianggap konstan)
## ==============================================
##  Segmen Batas_bawah Batas_atas Kemiringan Konstanta N_obs
##       1        -Inf      13.05   0.006721     167.4   360
##       2       13.05      24.61  -0.877643     178.9   117
##       3       24.61      28.46  -0.017293     157.8    14
##       4       28.46        Inf  -2.222801     220.5    23
## - Pada segmen 1 (-Inf <= X1 < 13.053), setiap kenaikan 1 satuan X1 meningkatkan Y sebesar 0.007 (360 observasi).
## - Pada segmen 2 (13.053 <= X1 < 24.606), setiap kenaikan 1 satuan X1 menurunkan Y sebesar 0.878 (117 observasi).
## - Pada segmen 3 (24.606 <= X1 < 28.457), setiap kenaikan 1 satuan X1 menurunkan Y sebesar 0.017 (14 observasi).
## - Pada segmen 4 (28.457 <= X1 < Inf), setiap kenaikan 1 satuan X1 menurunkan Y sebesar 2.223 (23 observasi).
## 
## ==============================================
## Model per segmen untuk X2 (variabel lain dianggap konstan)
## ==============================================
##  Segmen Batas_bawah Batas_atas Kemiringan Konstanta N_obs
##       1        -Inf      28.46   -0.16205     167.4   300
##       2       28.46      58.96   -0.18907     168.1   174
##       3       58.96      69.12   -0.50213     186.6    15
##       4       69.12        Inf    0.01117     151.1    25
## - Pada segmen 1 (-Inf <= X2 < 28.463), setiap kenaikan 1 satuan X2 menurunkan Y sebesar 0.162 (300 observasi).
## - Pada segmen 2 (28.463 <= X2 < 58.959), setiap kenaikan 1 satuan X2 menurunkan Y sebesar 0.189 (174 observasi).
## - Pada segmen 3 (58.959 <= X2 < 69.124), setiap kenaikan 1 satuan X2 menurunkan Y sebesar 0.502 (15 observasi).
## - Pada segmen 4 (69.124 <= X2 < Inf), setiap kenaikan 1 satuan X2 meningkatkan Y sebesar 0.011 (25 observasi).
## 
## ==============================================
## Model per segmen untuk X3 (variabel lain dianggap konstan)
## ==============================================
##  Segmen Batas_bawah Batas_atas Kemiringan Konstanta N_obs
##       1        -Inf      4.554      3.089     167.4    10
##       2       4.554      8.062      1.895     172.8   129
##       3       8.062      9.232     -4.623     225.4   192
##       4       9.232        Inf      1.774     166.3   183
## - Pada segmen 1 (-Inf <= X3 < 4.554), setiap kenaikan 1 satuan X3 meningkatkan Y sebesar 3.089 (10 observasi).
## - Pada segmen 2 (4.554 <= X3 < 8.062), setiap kenaikan 1 satuan X3 meningkatkan Y sebesar 1.895 (129 observasi).
## - Pada segmen 3 (8.062 <= X3 < 9.232), setiap kenaikan 1 satuan X3 menurunkan Y sebesar 4.623 (192 observasi).
## - Pada segmen 4 (9.232 <= X3 < Inf), setiap kenaikan 1 satuan X3 meningkatkan Y sebesar 1.774 (183 observasi).
## 
## ==============================================
## Model per segmen untuk X4 (variabel lain dianggap konstan)
## ==============================================
##  Segmen Batas_bawah Batas_atas Kemiringan Konstanta N_obs
##       1        -Inf      24.81    -0.5721     167.4   497
##       2       24.81      51.38     0.1844     148.6    13
##       3       51.38      60.24     1.1198     100.6     2
##       4       60.24        Inf    -1.0773     232.9     2
## - Pada segmen 1 (-Inf <= X4 < 24.806), setiap kenaikan 1 satuan X4 menurunkan Y sebesar 0.572 (497 observasi).
## - Pada segmen 2 (24.806 <= X4 < 51.383), setiap kenaikan 1 satuan X4 meningkatkan Y sebesar 0.184 (13 observasi).
## - Pada segmen 3 (51.383 <= X4 < 60.242), setiap kenaikan 1 satuan X4 meningkatkan Y sebesar 1.120 (2 observasi).
## - Pada segmen 4 (60.242 <= X4 < Inf), setiap kenaikan 1 satuan X4 menurunkan Y sebesar 1.077 (2 observasi).
## 
## ==============================================
## Model per segmen untuk X5 (variabel lain dianggap konstan)
## ==============================================
##  Segmen Batas_bawah Batas_atas Kemiringan Konstanta N_obs
##       1        -Inf      62.07     -1.829    167.38    10
##       2       62.07      68.86      1.787    -57.06   161
##       3       68.86      71.13     -0.777    119.54   128
##       4       71.13        Inf      1.484    -41.29   215
## - Pada segmen 1 (-Inf <= X5 < 62.066), setiap kenaikan 1 satuan X5 menurunkan Y sebesar 1.829 (10 observasi).
## - Pada segmen 2 (62.066 <= X5 < 68.865), setiap kenaikan 1 satuan X5 meningkatkan Y sebesar 1.787 (161 observasi).
## - Pada segmen 3 (68.865 <= X5 < 71.131), setiap kenaikan 1 satuan X5 menurunkan Y sebesar 0.777 (128 observasi).
## - Pada segmen 4 (71.131 <= X5 < Inf), setiap kenaikan 1 satuan X5 meningkatkan Y sebesar 1.484 (215 observasi).
## 
## ==============================================
## Model per segmen untuk X6 (variabel lain dianggap konstan)
## ==============================================
##  Segmen Batas_bawah Batas_atas Kemiringan Konstanta N_obs
##       1        -Inf      14.34     0.1215     167.4    83
##       2       14.34      29.71    -0.1137     170.8   326
##       3       29.71      34.83    -0.2988     176.3    65
##       4       34.83        Inf     0.3667     153.1    40
## - Pada segmen 1 (-Inf <= X6 < 14.343), setiap kenaikan 1 satuan X6 meningkatkan Y sebesar 0.122 (83 observasi).
## - Pada segmen 2 (14.343 <= X6 < 29.710), setiap kenaikan 1 satuan X6 menurunkan Y sebesar 0.114 (326 observasi).
## - Pada segmen 3 (29.710 <= X6 < 34.833), setiap kenaikan 1 satuan X6 menurunkan Y sebesar 0.299 (65 observasi).
## - Pada segmen 4 (34.833 <= X6 < Inf), setiap kenaikan 1 satuan X6 meningkatkan Y sebesar 0.367 (40 observasi).
#daftar nomor observasi per segmen disimpan ke CSV (agar laporan tidak penuh angka)
id_segmen=do.call(rbind,lapply(1:6,function(j)
{
  seg=findInterval(X[,j],knot_opt[,j])+1
  data.frame(Variabel=nama_x[j],Segmen=seg,Observasi=1:n)
}))
write.csv(id_segmen,paste0(folder,"pengelompokan_observasi_per_segmen.csv"),row.names=FALSE)

#banyak observasi per segmen (baris = variabel, kolom = nomor segmen)
table(id_segmen$Variabel,id_segmen$Segmen)
##     
##        1   2   3   4
##   X1 360 117  14  23
##   X2 300 174  15  25
##   X3  10 129 192 183
##   X4 497  13   2   2
##   X5  10 161 128 215
##   X6  83 326  65  40

#PERBANDINGAN MODEL#

hitung_gcv=function(model)
{
  sse=sum(residuals(model)^2)
  p=sum(!is.na(coef(model)))
  (sse/n)/((n-p)/n)^2
}

fit_spline=function(K)
{
  mxK=buat_mx(X,ambil_knot(K))
  dfK=as.data.frame(mxK[,-1])
  dfK$Y=y
  lm(Y~.,data=dfK)
}

semua_model=list(model,fit_spline(1),fit_spline(2),fit_spline(3))
bandingkan=data.frame(Model=c("Regresi linear",paste0("Spline ",1:3," knot")),
                      Parameter=sapply(semua_model,function(m) length(coef(m))),
                      R2=NA,RMSE=NA,GCV=NA)
for (i in 1:4)
{
  m=semua_model[[i]]
  bandingkan$R2[i]=100*summary(m)$r.squared
  bandingkan$RMSE[i]=sqrt(mean(residuals(m)^2))
  bandingkan$GCV[i]=hitung_gcv(m)
}
bandingkan
par(mfrow=c(1,2))
barplot(bandingkan$R2,names.arg=bandingkan$Model,col="steelblue",main="R2 (%)",las=2,cex.names=0.7)
barplot(bandingkan$RMSE,names.arg=bandingkan$Model,col="steelblue",main="RMSE",las=2,cex.names=0.7)

par(mfrow=c(1,1))

#KESIMPULAN#

Isi bagian ini setelah file di-knit. Poin yang bisa diisi:

#INFORMASI SESI#

sessionInfo()
## R version 4.6.1 (2026-06-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=English_United States.utf8 
## [2] LC_CTYPE=English_United States.utf8   
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.utf8    
## 
## time zone: Asia/Singapore
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] Matrix_1.7-6  pracma_2.4.6  pastecs_1.4.2 car_3.1-5     carData_3.0-6
## [6] MASS_7.3-66   lmtest_0.9-40 zoo_1.9-0    
## 
## loaded via a namespace (and not attached):
##  [1] vctrs_0.7.3       cli_3.6.6         knitr_1.52        rlang_1.3.0      
##  [5] xfun_0.60         Formula_1.2-6     jsonlite_2.0.0    htmltools_0.5.9  
##  [9] sass_0.4.10       rmarkdown_2.32    grid_4.6.1        evaluate_1.0.5   
## [13] jquerylib_0.1.4   abind_1.4-8       fastmap_1.2.0     yaml_2.3.12      
## [17] lifecycle_1.0.5   compiler_4.6.1    rstudioapi_0.19.0 lattice_0.22-9   
## [21] digest_0.6.39     R6_2.6.1          bslib_0.12.0      tools_4.6.1      
## [25] boot_1.3-32       cachem_1.1.0