2

How can one specify link functions in glmnet for lasso / ridge / elastic net regression?
I have found the following post but not sure this helps me when I need to specify a cloglog link. How to specify log link in glmnet?

I have a survey data set with binary response 0/1 (disease no/yes) and several predictor variables, which are mostly binary categorical (yes/no, male/female), some are counts (herd size), and a few are categorical with several levels.

I previously ran a generalized linear mixed model using glmer() function with binomial family and link = cloglog as doing so created the exact interpretation of the resulting intercept that I wanted (in disease study the intercept from this setup is equivalent to the mean value 'force of infection' - the rate at which susceptibles become infected - among the variation specified in the random effect (in my case the geographic unit (village or subvillage or household).

As there are several survey variables now available to me, I wanted to try a lasso and a ridge regression using glmnet. It is my understanding that I should best do this by putting in the glmm formula into the glmnet. However, I cannot find any documentation about how to add a link. I did so, in the syntax I thought would work, and it did run. But it also ran with nonsense entered in the link function.

Here is a reproducible example:

library(msm)

library(glmnet)

set.seed(1) 

N = 1000

X = cbind( rbinom(n=N,size=1,prob=0.5), rnorm(n=N) ) 

beta = c(-0.1,0.1)
phi.true = exp( X%*%beta ) 

p = 1 - exp(-phi.true)

y = rbinom(n=N,size=1,prob = p)

dat <- data.frame(x=X,y=y)

x <- model.matrix(y~., dat)

glmnet(x, y, family="binomial", link="logit", alpha = 1, lambda = 2)

I get the same output whether I put in 'logit', 'cloglog' or even a name 'adam'. And cannot use same syntax as GLMM as in glmnet must be a character vector.

OUTPUT:

> glmnet(x, y, family="binomial"(link="logit"), alpha = 1, lambda = 2)

Error in match.arg(family) : 'arg' must be NULL or a character vector

> glmnet(x, y, family="binomial", link="logit", alpha = 1, lambda = 2)

Call:  glmnet(x = x, y = y, family = "binomial", alpha = 1, lambda = 2,      link = "logit") 

  Df      %Dev Lambda
1  0 -7.12e-15      2

> glmnet(x, y, family="binomial", link="cloglog", alpha = 1, lambda = 2)

Call:  glmnet(x = x, y = y, family = "binomial", alpha = 1, lambda = 2,      link = "cloglog") 

  Df      %Dev Lambda
1  0 -7.12e-15      2

> glmnet(x, y, family="binomial", link="adam", alpha = 1, lambda = 2)

Call:  glmnet(x = x, y = y, family = "binomial", alpha = 1, lambda = 2,      link = "adam") 

  Df      %Dev Lambda
1  0 -7.12e-15      2

Is it not possible to change the default link function for binomial family in glmnet?

herz
  • 21
  • 1

1 Answers1

2

I think you want to use family = binomial(link = "cloglog")

See the new glmnet vignette: https://cran.r-project.org/web/packages/glmnet/vignettes/glmnetFamily.pdf

rose89
  • 31
  • 4
  • I think the OP might not be on R 4.0. Makes sense if you show how it works in R 4.0 with a reproducible example – StupidWolf Aug 07 '20 at 20:29
  • Thank you! This is helpful! I also was hoping to add random effects but this seems to be a thing that is not available in the package. You are correct, at time of posting I was on a version of R prior to 4.0 – herz Aug 11 '20 at 14:18