如何从 R 中的 glmnet 模型列表中获取不同的 ggplot2 图?

问题描述 投票:0回答:1

我正在尝试从模型对象列表中绘制 R 中的 glmnet (

lasso
) 模型图。

我的数据看起来像(原始数据很大)

head(SLE28sy_w20_dat3)
# A tibble: 6 × 31
  EE86222ln1 EE86223ln1 EE86224ln1 EE86225ln1 blood_vessel_w20 adrenal_gland_w20 bone_element_w20 brain_w20
       <dbl>      <dbl>      <dbl>      <dbl>            <dbl>             <dbl>            <dbl>     <dbl>
1    0.00809    0.00357    0.00146    0.00228                0                 1                0         1
2    0.00437    0.00212    0.00156    0.00197                0                 1                0         1
3    0.00437    0.00303    0.00172    0.00237                1                 0                0         1
4    0.00833    0.00303    0.00126    0.00217                0                 1                0         1
5    0.00833    0.00316    0.00165    0.00217                1                 1                0         1
6    0.00833    0.00236    0.00134    0.00189                1                 0                0         1

我通过下面的代码创建了

lasso
模型列表,

  j <- SLE28sy_w20_dat3[, c(1:4)]
  l <- data.matrix(SLE28sy_w20_dat3[, -c(1:4)])
  
  for (i in 1:ncol(j)) {
    las_glmnet <- glmnet(l, data.matrix(j[, i]))
    assign(paste0("glmnet_lasso_", names(j)[i]), las_glmnet, envir = .GlobalEnv)
  }

现在,我正在尝试从每个样本中绘制模型图,我该怎么做......

到目前为止我做了什么,

  las_sam<-list(glmnet_lasso_EE86222ln1, glmnet_lasso_EE86223ln1,
       glmnet_lasso_EE86224ln1, glmnet_lasso_EE86225ln1)
  
  for (i in seq_along(las_sam)){
    
    betas = as.matrix(las_sam[[i]]$beta)
    lambdas = las_sam[[i]]$lambda
    names(lambdas) = colnames(betas)

 plot_las<- as.data.frame(betas) %>% 
      tibble::rownames_to_column("variable") %>% 
      pivot_longer(-variable) %>% 
      mutate(lambda=lambdas[name]) %>% 
      ggplot(aes(x=lambda,y=value,col=variable)) + 
      geom_line() + 
      geom_label_repel(data=~subset(.x,lambda==min(lambda)), size = 2.5,
                       aes(label=variable),nudge_x=-0.8) +
      theme(legend.position="none")   +
      scale_x_log10()
 assign(paste0("Plot_lasso_", names(las_sam)[i]), plot_las, envir = .GlobalEnv)
    
  }  

这样我只能得到最后一个样本模型的图,即

glmnet_lasso_EE86225ln1
。也就是说,循环是有效的,但它无法存储具有不同名称的图像对象。也许代码的最后一行是我出错的地方。

r for-loop ggplot2 glmnet
1个回答
0
投票

这个“整洁式”解决方案怎么样?

  • 它重塑了您的初始数据框,以便您可以按 EE 变体进行分组
  • 然后嵌套数据,每个 EE 变体一个子集
  • 它运行每个嵌套/组的模型并存储每行的结果
  • 最后,它使用基本绘图函数和多图布局绘制数据(使用 {ggplot} 或 {lattice},按组
    facet
    可以更好地简化流程

  • 您的示例数据:
SLE28sy_w20_dat3 <- 
structure(list(EE86222ln1 = c(0.00809, 0.00437, 0.00437, 0.00833, 
0.00833, 0.00833), EE86223ln1 = c(0.00357, 0.00212, 0.00303, 
0.00303, 0.00316, 0.00236), EE86224ln1 = c(0.00146, 0.00156, 
0.00172, 0.00126, 0.00165, 0.00134), EE86225ln1 = c(0.00228, 
0.00197, 0.00237, 0.00217, 0.00217, 0.00189), blood_vessel_w20 = c(0L, 
0L, 1L, 0L, 1L, 1L), adrenal_gland_w20 = c(1L, 1L, 0L, 1L, 1L, 
0L), bone_element_w20 = c(0L, 0L, 0L, 0L, 0L, 0L), brain_w20 = c(1L, 
1L, 1L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA, 
6L))
  • 重塑数据
    library(glmnet)
    library(tidyr)
    library(dplyr)

    data_long <- 
      SLE28sy_w20_dat3 |>
      pivot_longer(cols = contains('EE'), 
                   names_to = 'EE_variant',
                   values_to = 'Y',
                   )
    
    ## > data_long
    ## # A tibble: 24 x 6
    ##    blood_vessel_w20 adrenal_gland_w20 bone_element_w20 brain_w20 EE_variant
    ##               <int>             <int>            <int>     <int> <chr>     
    ##  1                0                 1                0         1 EE86222ln1
    ##  2                0                 1                0         1 EE86223ln1
    ##  3                0                 1                0         1 EE86224ln1
    ## ...
  • 每个 EE 变体的嵌套数据:
    data_nested <- 
      data_long |>
      group_by(EE_variant) |>
      nest(data = -EE_variant)
    
    + # A tibble: 4 x 2
    # Groups:   EE_variant [4]
      EE_variant data            
      <chr>      <list>          
    1 EE86222ln1 <tibble [6 x 5]>
    2 EE86223ln1 <tibble [6 x 5]>
    3 EE86224ln1 <tibble [6 x 5]>
    4 EE86225ln1 <tibble [6 x 5]>
  • 计算每个巢的模型:
    the_models <- 
      data_nested |>
      rowwise() |>
      ## save the model in list-column
      summarise(the_model = list(glmnet(x = data |> select(-Y) |> data.matrix(),
                                        y = data |> select(Y) |> data.matrix()
                                        )
                                 )
                )
    ## > the_models
    ## # A tibble: 4 x 2
    ## # Groups:   EE_variant [4]
    ##   EE_variant the_model
    ##   <chr>      <list>   
    ## 1 EE86222ln1 <elnet>  
    ## 2 EE86223ln1 <elnet>  
    ## 3 EE86224ln1 <elnet>  
    ## 4 EE86225ln1 <elnet> 
  • 将图形参数设置为 2x2 布局和绘图:
par(mfrow = c(2, 2))

the_models |> mutate(plot(the_model[[1]], sub = EE_variant))

© www.soinside.com 2019 - 2024. All rights reserved.