【问题标题】:Loop - LASSO Coefficient extraction from simulation data循环 - 从模拟数据中提取 LASSO 系数
【发布时间】:2020-02-12 00:15:47
【问题描述】:

我正在尝试从对模拟数据的 LASSO 实验中找出哪些系数被正确且不正确地缩小为 0。我可以让它在一次迭代中工作,但我不知道如何正确循环它,以便我可以提取 100 次迭代的相关信息。 这是我当前的代码

library(MASS)
library(glmnet)
N=100
n=200
p=200


set.seed(123)
f.non<-data.frame(NULL)
f.disc<-data.frame(NULL)

  X= mvrnorm(200, rep(0,p), diag(1,p,p))
  Y=rowSums(X[,1:10])+3.5*rnorm(n)
  lasso.model<-cv.glmnet(X,Y,alpha=1,intercept=FALSE)
  lasso.coef<-coef(lasso.model,s=lasso.model$lambda.1se)
  f.non<- sum(lasso.coef[2:11,] == 0)
  f.disc <- sum(lasso.coef[12:201,] != 0)

} 

上面的部分是我尝试通过设置一个空数据框进行循环,然后在循环中捕获结果,但我无法让循​​环工作

【问题讨论】:

    标签: r dataframe for-loop coefficients lasso-regression


    【解决方案1】:

    因此,如果我理解正确(我不确定我是否理解),您将尝试提取 lasso.coef 对象的值(和名称?),具体取决于它们是否等于零.

    您可以像这样在for 循环中执行 100 次(如果您想收集变量的名称):

    f.non <- c(NULL)
    f.disc <- c(NULL)
    N=100
    for (i in 1:N) {
      n=200
      p=200
      X = mvrnorm(200, rep(0, p), diag(1, p, p))
      Y = rowSums(X[, 1:10]) + 3.5 * rnorm(n)
      lasso.model <- cv.glmnet(X, Y, alpha = 1, intercept = FALSE)
      lasso.coef <- coef(lasso.model, s = lasso.model$lambda.1se)
      # lasso_coefs <- lasso.coef[2:201]
      # setNames(lasso_coefs, paste("V", as.character(seq(2, 201, 1)), sep = ""))
      lasso_coefs_df <- data.frame(coef = lasso.coef[2:201], name = paste("V", as.character(seq(2,201,1)), sep = ""))
    
      # f.non[[i]] <- as.list(lasso_coefs[lasso_coefs == 0])
      # f.disc[[i]] <- as.list(lasso_coefs[lasso_coefs != 0])
      f.non[[i]] <- lasso_coefs_df[lasso_coefs_df$coef == 0, ]
      f.disc[[i]] <- lasso_coefs_df[lasso_coefs_df$coef != 0, ]
    }
    

    否则,如果您只想要每个变量范围的总和(2-11、12-201),则与您的尝试更相似:

    f.non <- c(NULL)
    f.disc <- c(NULL)
    N=100
    for (i in 1:N) {
      n=200
      p=200
      X = mvrnorm(200, rep(0, p), diag(1, p, p))
      Y = rowSums(X[, 1:10]) + 3.5 * rnorm(n)
      lasso.model <- cv.glmnet(X, Y, alpha = 1, intercept = FALSE)
      lasso.coef <- coef(lasso.model, s = lasso.model$lambda.1se)
      f.non[[i]] <- sum(lasso.coef[2:11,] == 0)
      f.disc[[i]] <- sum(lasso.coef[12:201,] != 0)
    }
    

    【讨论】:

    • 我需要循环这个过程 100 次。我可以为 1 个数据集做这件事,但我必须根据这个想法创建 100 个数据集,并且每次都做同样的事情。困扰我的部分是为新数据集的每次迭代提取这些信息。前 10 个 X 值不应缩小为 0,因为它们形成 Y 值 + 3.5*rnorm,下一组 [12;201] 在理论上与 Y 预测没有任何关系,但是 Lasso 不会总是缩小每一列到 0,这是我试图在这个过程的 r100 次迭代中提取的信息来检查
    • 好的,感谢您的澄清。另一个问题 - 哪个部分运行了 100 次 - cv.glmnet 调用?
    • 我应该创建 100 个数据集,即 100 组 200x200 的 X 矩阵和 100 组 200x1 Y 矩阵
    • @j4k 我已经修改了答案以循环 100 次迭代并提取等于和不等于 0 的变量。这就是你要找的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多