如何创建一个 for 循环来调整 glmm 弹性网的 lambda 和 alpha?

How to create a for loop to tune lambda and alpha for glmm elastic net?

我正在使用 R 中的 MMS 包对 GLMM 进行弹性净回归。我想要做的是调整 lambda(或包中所谓的 mu)和 alpha 值。我想要 select alpha 和 lambda 的最佳组合。

目前我已经创建了一个 for 循环,循环遍历从 0.1 到 0.9 的 alpha 值,我正在尝试对 alpha 做同样的事情,但它不起作用。我想要的是对于每个 alpha(比如 0.1),使用序列中的每个 lambda 值。例如,对于 alpha = 0.1 我想尝试 lambda = seq(10, by= -1) ,并且我希望每个 alpha 值都这样。

mu <- seq(10, by = -1)

for (i in 1:9) {
  for (j in mu) {
    fit.name <- paste0("alpha ", i/10)
    list.of.fits[[fit.name]] <- lassop(X, Y, Z, grp = g, alpha = i/10, mu = j)
  }
}

list.of.fits 的此输出是使用不同 alpha 值的拟合列表,但当我希望它为每个 alpha 值迭代 1 到 10 时,mu (lambda) 为 1。

X = matrix of fixed effects, first column is intercept of 1
Y = vector of response variable
Z = 1 random effect
grp = group variable

这成功了!

list.of.fits <- list()


for (i in 1:9) {
  for (j in 1:10) {
    alpha.name <- paste0("alpha ", i/10)
    mu.name <- paste0("mu ", j)
    list.of.fits[[alpha.name]][[mu.name]] <- lassop(X, Y, Z, grp = g, alpha = i/10, mu = j)
  }
}
list.of.fits

这是另一个可能更快的解决方案。

mu <- seq(10)
alpha <- 1:9/10
df.of.params <- data.frame(expand.grid(mu, alpha))
names(df.of.params) <- c('mu', 'alpha')
list.of.params <- split(df.of.params, seq(nrow(df.of.params)))

list.of.fits <- mclapply(list.of.params, function(params) {
    lassop(X, Y, Z, grp = g, alpha = params$alpha, mu = params$mu)
})

如果您想并行化,只需将 mclapply 更改为常规 lapply