Quiero entender mejor los paquetes de R Lars
y Glmnet
, que se utilizan para resolver el Lazo problema:
$$min_{(\beta_0 \beta) \in R^{p+1}} \left[\frac{1}{2N}\sum_{i=1}^{N}(y_i-\beta_0-x_i^T\beta)^2 + \lambda||\beta ||_{l_{1}} \right]$$
(para $p$ Variables e $N$ muestras, ver www.stanford.edu/~hastie/Papers/glmnet.pdf en la página 3)
Por lo tanto, he aplicado, tanto en el mismo juguete conjunto de datos. Por desgracia, los dos métodos no dan las mismas soluciones para los mismos datos de entrada. ¿Alguien tiene una idea de donde está la diferencia viene de?
He obtenido los resultados de la siguiente manera: Después de generar algunos datos (8 muestras, 12 funciones, Toeplitz diseño, todo centrado), he calculado todo Lazo ruta con Lars. Entonces, me encontré con Glmnet utilizando la secuencia de las lambdas calculada por Lars (multiplicado por 0.5) y esperaba obtener la misma solución, pero no lo hice.
[edit:por Favor, ignore el párrafo siguiente, la diffierent intercepta fueron causados por un error en el código, en el que me fijo ahora, lo siento por eso. El resto de la pregunta es pertinente, como corregir el error no se soluciona el problema de los destinatarios.]
Cuando vi el (no idénticas) salidas, me di cuenta de que glmnet calcula una intercepción para cada lambda, mientras que lars no. Así que me resta por mano de la intersección de algunas glmnet solución de y y recentered Y. Entonces me calcula el Lazo camino de nuevo el uso de Lars, y luego con glmnet el uso de las nuevas expresiones lambdas de Lars.
Uno puede ver que las soluciones son similares. Pero, ¿cómo puedo explicar las diferencias? Por favor, encontrar mi código de abajo. Hay una pregunta relacionada aquí: GLMNET o LARS para el cómputo de los LASSO de la solución? , pero no contiene la respuesta a mi pregunta.
### Load packages
library(lars)
library(glmnet)
library(MASS)
###Set parameters
nbFeatures<-12
nbSamples<-8
nbRelevantIndices<-3
snr<-1
nbLambdas<-10
nlambda<-nbLambdas
### Create data, not really important
sigma<-matrix(0,nbFeatures,nbFeatures)
for (i in (1:nbFeatures))
for (j in (1:nbFeatures))
sigma[i,j]<-0.99^(abs(i-j))
X<-mvrnorm(n = nbSamples, rep(0, nbFeatures), sigma, tol = 1e-6, empirical = FALSE)
relevantIndices <- sample(1:nbFeatures, nbRelevantIndices, replace=F)
X<-scale(X) #bug fixed, replaced 'scale(X)' by 'X<-scale(X)'
beta <- rep(0, times=nbFeatures)
beta[relevantIndices] <- runif(nbRelevantIndices,0,1)
epsilon<-matrix(rnorm(nbSamples),nbSamples,1)
simulatedSnr<-(norm(X %*% beta,type="F"))/(norm(epsilon,type="F"))
epsilon<-epsilon*(simulatedSnr/snr)
Y <- X %*% beta + epsilon;
Y<-scale(Y) #bug fixed, replaced 'scale(Y)' by 'Y<-scale(Y)'
### launch lars
la <- lars(X,Y,intercept=TRUE, max.steps=1000, use.Gram=FALSE)
coLars <- as.matrix(coef(la,,mode="lambda"))
print(round(coLars,4))
### Launch glmnet with lambda=1/2*lambda_lars
glm2 <- glmnet(X,Y,family="gaussian",lambda=0.5*la$lambda,thresh=1e-16)
coGlm2 <- as.matrix(t(coef(glm2,mode="lambda")))
print(round(coGlm2,4))
##########################
#edit: The rest of the program is not relevant any more, as the issue of the intercept was due to a bug.
##########################
### Remove intercept computed by glmnet for some lambda (adjusted by hand, depending on output)
Y<-Y--0.0863
Y<-Y/norm(Y,"F")
### Launch Lars
la <- lars(X,Y,intercept=TRUE, max.steps=1000, use.Gram=FALSE)
coLars <- as.matrix(coef(la,,mode="lambda"))
print(round(coLars,4))
### Launch Glmnet with lambda=1/2*lambda_lars
glm2 <- glmnet(X,Y,family="gaussian",lambda=0.5*la$lambda,thresh=1e-16)
coGlm2 <- as.matrix(t(coef(glm2,mode="lambda")))
print(round(coGlm2,4))