Tengo un problema extraño cuando especifico lambda en la función glmnet
que no aparece si dejo que la función pase por todas las lambdas.
Cuando uso la secuencia lambda por defecto funciona muy bien:
glmnet.out = glmnet(y=yy[train_id], x=xx[train_id,], family="binomial", alpha=1)
Warning message:
from glmnet Fortran code (error code -82); Convergence for 82th lambda
value not reached after maxit=100000 iterations; solutions for larger
lambdas returned
glmnet.out$lambda
[1] 2.126060e-02 1.937187e-02 1.765092e-02 1.608287e-02 1.465411e-02
1.335228e-02 1.216610e-02 1.108530e-02 1.010051e-02 9.203207e-03
[11] 8.385619e-03 7.640664e-03 6.961888e-03 6.343413e-03 5.779882e-03
5.266413e-03 4.798560e-03 4.372269e-03 3.983849e-03 3.629934e-03
y más filas, hasta el valor 82. La advertencia está bien, ya que no uso lambdas tan pequeñas. El cv.glmnet
da un lambda de alrededor de 0,001.
Mientras que cuando especifico un único valor de lambda :
glmnet.out = glmnet(y=yy[train_id], x=xx[train_id,], family="binomial",
alpha=1, lambda=3.629934e-03)
entonces recibo el siguiente mensaje de advertencia:
Warning messages:
1: from glmnet Fortran code (error code -1); Convergence for 1th lambda
value not reached after maxit=100000 iterations; solutions for larger
lambdas returned
2: In getcoef(fit, nvars, nx, vnames) :an empty model has been returned;
probably a convergence issue
Tenga en cuenta que el primer valor de lambda es infinito, por lo que no se devuelve nada.
¿Cómo es posible? Puedo evitar el problema no especificando lambda, y luego elegir manualmente las estimaciones para la predicción con el conjunto de datos de validación cruzada así:
coefficients = as.matrix(coef(glmnet.out)[,selected_lamdda])
xBeta = cbind(rep(1,length(cv_id)),xx[cv_id,])%*%as.matrix(coefficients)
prediction = 1/(1+exp(-xBeta))
pero es bastante ineficiente, ya que el glmnet
hace un montón de cálculos innecesarios.