I am confused how to calculate r-squared for the glmnet fits (LASSO, elastic-net etc). One of the ways I have seen is through the cvm corresponding to one of lambdas:

cvfit2 <- glmnet::cv.glmnet(datam, fundm,alpha=1,nfolds=10)
cf<-coef(cvfit2, s = "lambda.1se")
i<-which(cvfit2$lambda == cvfit2$lambda.1se)
#[1]  0.4571688

The classic way via calculating the variance of the residuals:

cc2<-as.matrix(cf[-1,]) #removing the intercept row
predict<-datam2 %*% cc2
err<-predict - fundm
#[1] 0.6100457

Quite a huge difference and I am not sure if the 1st way of calculating $R^2$ is correct.

My questions

  1. What is the correct way of calculating r-squared?

  2. A glmnet object has components dev.ratio and nulldev. From the glmnet docs:

    "The fraction of (null) deviance explained (for "elnet", this is the R-square)."

Should we rather use dev.ratio for the purpose of $R^2$ calculations? If yes, how to extract it for the given lambda index? The dev.ratio array has 100 values, but the cvfit2$lambda has only 88 values.

I am really confused and would appreciate your feedback.


I'm using

r2 <- fit$glmnet.fit$dev.ratio[which(fitnet$glmnet.fit$lambda == fitnet$lambda.min)]

or if you have chosen the lambda.1se

r2 <- fit$glmnet.fit$dev.ratio[which(fitnet$glmnet.fit$lambda == fitnet$lambda.1se)] 

If you do a cross check with the traditional regression lm() and summary()$r.squared it will match the results if weights are close to the elastic net.


I think I know why the two calculations produce different answers. The cvm variable from the cvm.glmnet object is a cross-validated error. It's calculated from the residuals in the validation folds. The predict() function on the other hand, is not cross-validated. It's calculated from the residuals of predictions on the whole data set.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.