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