• 构建一个快速数据分析(boruta+shap+rcs)的shiny APP


    构建一个快速数据分析(boruta+shap+rcs)的shiny APP

    之前提出了一个快速数据分析的流程,包括:

    1. 变量筛选,使用Boruta等变量筛选的方法来找出相关的变量;
    2. 发现规律,使用SHAP分析的散点图、交互作用图来探索变量与结局指标之间的关系;
    3. 描述规律,使用立方样条分析来拟合预测变量与其SHAP值之间的关系,主要是探索曲线的拐点,或者有意义的点。或者将数据进行分层分析来展示交互作用。

    以上流程可以使用python 或者R代码实现,而我们这里尝试制作一个shiny APP来包装R代码,以实现相似的功能。目前这个APP有三个页面:
    1.筛选, 使用boruta算法对变量实现快速的筛选,后续分析只针对感兴趣的变量,因而提高了分析的效率。这也是将这套流程称为“快速分析”的主要原因。操作的时候,首先上传csv或tsv文件,设定是经过接本的预处理,比如去除缺失值等等,字符串变量可以不进行处理,会自动专为factor变量进行处理;然后分别选定X变量和y变量,最后点击“运行”即可。

    在这里插入图片描述
    2.发现,使用SHAP分析对独立变量和因变量之间的关系进行定量(SHAP值),并使用其散点图观察变量之间的关系,快速发现是曲线或者直线关系。这一步背后的算法是树形算法,为了能适用更多的情况,不能固定模型的参数,而通过一个参数探索的过程,选出最佳的模型来展示SHAP分析的结果。这一步耗费的时间比较长。
    在这里插入图片描述
    3. 描述, 对上一步发现的关系进行进一步描述,因为多数情况下是曲线关系,采用的是立方样条回归,这一步的主要内容是确定曲线的模式和确定拐点或者交界点。立方样条回归(RCS)用的是独立变量及其SHAP值之间的单因素回归,但是因为SHAP值计算的时候是多因素lightgbm计算出来的,所以最终结果中含有多因素的成份,与普通的两个变量之间的直接RCS拟合不同。
    在这里插入图片描述
    通过以上三个页面,把数据分析的流程,整合到一个APP中。但是运行起来比较耗费资源,主要是第二步导致部署在网路上的APP运行时间过长,体验较差,需要寻求其它的解决办法,目前APP是二分类的版本,后续可能退出COX的版本,敬请期待。

    UI端源码公布如下,完整的源码可以通过该地址积分下载,无积分的可以联系作者。

    library(shiny)
    library(bslib)
    library(Boruta)
    library(shapviz)
    library(rms)
    library(ggrcs)
    library(recipes)
    library(tidyverse)
    library(bonsai)
    library(tidymodels)
    tidymodels_prefer()
    library(themis)
    library(shapviz)
    library(probably)
    library(discrim)
    library(shinybusy)
    # Define UI for application that draws a histogram
    ui <- page_navbar(
        title='快速数据分析',
        # underline=TRUE,
        # bg='#0062cc',
        theme = bslib::bs_theme(bootswatch = "flatly"),
        #'arg' should be one of “cerulean”, “cosmo”, “cyborg”, “darkly”, “flatly”, “journal”, “litera”, “lumen”, “lux”, “materia”, “minty”, “morph”, “pulse”, “quartz”, “sandstone”, “simplex”, “sketchy”, “slate”, “solar”, “spacelab”, “superhero”, “united”, “vapor”, “yeti”, “zephyr”
        nav_panel("筛选",
                  add_busy_spinner(spin = "double-bounce", margins = c(10, 20),color='green'),
                  
                  layout_sidebar(
                    sidebar=sidebar(
                      width=400,
                      position='left',
                      fileInput('file','上传数据文件(csv或tsv)'),
                      hr(),
                      selectInput('interest_vars','选择待分析的X变量',choices = NULL,multiple = TRUE),
                      selectInput('y_vars','选择待分析的y变量(目前仅支持二分类)',choices=NULL),
                      actionButton('boruta_run','运行'),
                      card('bug检查框',
                        verbatimTextOutput('bug_check'))
                      
                    ),
                    # layout_column_wrap(width=1/2,
                    card('Boruta筛选结果(formula_confirm)',verbatimTextOutput('formula_confirm')),
                    # card('Boruta筛选结果(formula_nonrejected)',verbatimTextOutput('formula_nonrejected'))),
                    card(full_screen = TRUE,'Boruta筛选结果(图形)',plotOutput('borutaPlot'),
                         card_footer("说明:使用boruta快捷的筛选与结局变量相关的变量,后续的分析聚焦与筛选出的变量"
                    ))
                  )),
        nav_panel("发现",
                  add_busy_spinner(spin = "double-bounce", margins = c(10, 20),color = "red",position='top-right'),
                  
                  layout_sidebar(
                    sidebar=sidebar(
                      width=400,
                      position='left',
                      selectInput('shap_var1','待观察的变量1(仅可选筛选出的变量)',choices=NULL),
                      selectInput('shap_var2','待观察的变量2(仅可选筛选出的变量)',choices=NULL),
                      actionButton('shap_run','SHAP'),
                      card('bug检查框',
                      verbatimTextOutput('bug_check2'))
                
                    ),
                    layout_column_wrap(width=1/2,
                      card(min_height = 180,full_screen = TRUE,'各个变量的贡献-bees图',plotOutput('bees_plot')),
                      card(min_height=180,full_screen = TRUE,'各个变量的贡献-柱状图',plotOutput('bar_plot')),
                      card(min_height=180,full_screen = TRUE,"选择变量的散点图",plotOutput('scatter_plot')),
                      card(min_height=180,full_screen = TRUE,"选择变量的散点图(带交互)",plotOutput('scatter_plot2')),
                      card(min_height=180,full_screen = TRUE,"选择变量的散点图",plotOutput('scatter_plot3')),
                      card(min_height=180,full_screen = TRUE,"选择变量的散点图(带交互)",plotOutput('scatter_plot4')),
                    )
                  )),
        nav_panel("描述",
                  add_busy_spinner(spin = "double-bounce", margins = c(10, 20),color = "blue",position='top-right'),
                  layout_sidebar(
                    sidebar = sidebar(
                      width=400,
                      selectInput('rcs_var1','待拟合的指标1',choices=NULL),
                      numericInput('rcs_point1','标记拐点1',value=NULL),
                      hr(),
                      selectInput('rcs_var2','待拟合的指标2',choices=NULL),
                      numericInput('rcs_point2','标记拐点2',value=NULL),
                      actionButton('rcs_run','RCS'),
                      card('bug检查框',
                      verbatimTextOutput('bug_check3'))
                      
                    ),
                    layout_column_wrap(width=1/2,
                        card('立方样条回归拟合SHAP结果1',plotOutput('rcs_plot1'),
                             card_footer('说明:背后的算法是单因素立方样条回归,但是因为SHAP值是经过多因素lightgbm计算出来的,所以反映的其实是一种多因素分析处理过的相关性')),
                        card('立方样条回归拟合SHAP结果2',plotOutput('rcs_plot2'),
                             card_footer('说明:因为使用的是线性回归,虚线代表了预测变量对结局指标影响为0的情况。逻辑回归可能有不同的情况。'))
                      
                    )
                    
                  )
                  
                  ),
        nav_menu(title='',align='right',
                 nav_item(),
                 nav_item())
        )
    
    
  • 相关阅读:
    用matlab在hfss中建模
    无需搭建环境,零门槛带你体验Open-Sora文生视频应用
    博客马拉松|和 OpenMLDB 一路向前
    git的使用(从配置到常用命令)
    ArcPy要素批量转dwg
    基于Pytorch的CNN手写数字识别
    springboot整合sentinel完成限流
    二叉树操作题
    Spring框架----AOP全集
    【python】time
  • 原文地址:https://blog.csdn.net/skyskytotop/article/details/138544063