Uno de los criterios para seleccionar el valor óptimo de $\lambda$ con una red elástica o similar penalizado de regresión es examinar una parcela de la desviación en contra de la variedad de $\lambda$ y seleccione $\lambda$ cuando la desviación se minimiza (o $\lambda$ dentro de un error estándar de la mínima).
Sin embargo, estoy teniendo dificultades para entender lo que, precisamente, glmnet
muestra con plot.cv.glmnet
, debido a que el gráfico muestra no se parece en nada a los resultados de trazado de la desviación en contra de $\lambda$.
set.seed(4567)
N <- 500
P <- 100
coefs <- NULL
for(p in 1:P){
coefs[p] <- (-1)^p*100*2^(-p)
}
inv.logit <- function(x) exp(x)/(1+exp(x))
X <- matrix(rnorm(N*P), ncol=P, nrow=N)
Y <- rbinom(N, size=1, p=inv.logit(cbind(1, X)%*%c(-4, coefs)))
plot(test <- cv.glmnet(x=X, y=Y, family="binomial", nfolds=10, alpha=0.8))
plot(log(test$lambda), deviance(test$glmnet.fit))
Parece que la segunda trama no se incorpora a la red elástica de la pena, y es también la escala incorrecta verticalmente. Me la base de la demanda sobre la base de que la forma de la curva para valores más grandes de $\lambda$ asemeja a la de la glmnet
de salida. Sin embargo, cuando he intentado calcular la multa en el mío propio, mi intento asimismo parece ser imprecisos.
penalized.dev.fn <- function(lambda, alpha=0.2, data, cv.model.obj){
dev <- deviance(cv.model.obj$glmnet.fit)[seq_along(cv.model.obj$lambda)[cv.model.obj$lambda==lambda]]
beta <- coef(cv.model.obj, s=lambda)[rownames(coef(cv.model.obj))!="(Intercept)"]
penalty <- lambda * ( (1-alpha)/2*(beta%*%beta) + alpha*sum(abs(beta)) )
penalized.dev <- penalty+dev
return(penalized.dev)
}
out <- sapply(test$lambda, alpha=0.2, cv.model.obj=test, FUN=penalized.dev.fn)
plot(log(test$lambda), out)
Mi pregunta es: ¿cómo se hace manualmente calcular las desviaciones reportadas en el valor predeterminado plot.cv.glmnet
diagrama? ¿Cuál es su fórmula, y lo que he hecho mal en mi intento de calcular?