Определить оптимальную лямбду в сплайнах в R, используя `spline.des`

Я перехожу к слайду с лекцией, где мы говорим о сплайнах. Мой профессор дал нам R-код для расчета оптимальной лямбды, однако есть некоторые части кода, которые я не могу составить.

Следующий код выполняется на сплайнах с 5 узлами.

Код:

#determine perfect lambda 
  #for 5 knots 
    nrknots <- 3
    minx <- min(Temp)-0.001
    maxx <- max(Temp)+0.001
    step <- (maxx-minx)/(nrknots-1)
    inner.knots <- seq(minx,maxx,length=nrknots)
    knots <- seq(minx-3*step,maxx+3*step,by=step)

D2 <- matrix(0,nrknots,nrknots+2)
for(i in 1:nrknots)
{
  D2[i,i] <- 1
  D2[i,i+1] <- -2
  D2[i,i+2] <- 1
}
K2 <- t(D2)%*%D2

B <- spline.des(knots=knots,Temp,ord=4)$design

lambda <- seq(0.0005,0.05,length=250)
gcv <- rep(0,length(lambda))
aic <- rep(0,length(lambda))
bic <- rep(0,length(lambda))

n <- nrow(Air_reduced)

require(psych)
S <- B%*%solve(t(B)%*%B)%*%t(B)
fit <- as.vector(S%*%Ozone)
sigma2 <- sum((Ozone-fit)^2)/(n-tr(S))

for(i in 1:length(lambda))
{
  S <- B%*%solve(t(B)%*%B + lambda[i]*K2)%*%t(B)
  diags <- diag(S)
  trs <- mean(diags)
  df <- sum(diags)
  fit <- as.vector(S%*%Ozone)
  gcv[i] <- mean(((Ozone-fit)/(1-trs))^2)
  #  aic[i] <- n*log(sigma2) + sum((data$z-fit)^2)/sigma2 + 2*df
  #  bic[i] <- n*log(sigma2) + sum((data$z-fit)^2)/sigma2 + log(n)*df
  sigma2 <- sum((Ozone-fit)^2)/n
  aic[i] <- n*log(sigma2) + 2*(df+1)
  bic[i] <- n*log(sigma2) + log(n)*(df+1)
}

par(mfrow=c(1,2))


plot(lambda,gcv,type="l",lwd=2,
     xlab="lambda",ylab="GCV",main="5 knots",
     cex.lab=1.5,cex.axis=1.3,col="red",cex=1.3)
plot(lambda,aic,type="l",lwd=2,main="5 knots",
     xlab="lambda",ylab="AIC",
     cex.lab=1.5,cex.axis=1.3,col="red",cex=1.3)
# plot(lambda,bic,type="l",type="l",lwd=2,
#      xlab="lambda",ylab=" ",
#      cex.lab=1.5,cex.axis=1.3,col="red",cex=1.3)

lambdamingcv <- lambda[which(gcv==min(gcv))]
lambdaminaic <- lambda[which(aic==min(aic))]
lambdaminbic <- lambda[which(bic==min(bic))]

lambdamingcv;lambdaminaic;lambdaminbic

Мои вопросы:

  1. Какова цель inner nodes?
  2. Я видел knots использовать 2 вместо 3 иногда. Связано ли это с порядком / степенью сплайнов?
  3. Какова цель S матрица? Как только я увеличу nrknots до 20 я получаю ошибку system is exactly singular: U[1,1] = 0
  4. Я играл с количеством узлов, и для всех настроек я получаю одинаковое значение для оптимальной лямбды. Я делаю что-то неправильно?

0 ответов

Другие вопросы по тегам