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

news2024/12/25 10:19:25

构建一个快速数据分析(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())
    )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1666925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务思想以及实现

文章目录 前言一、什么时候需要拆分微服务1. 创业型项目2. 大型项目 二、怎么拆1. 拆分目标2. 拆分方式 三、微服务之间远程调用1. 实现方式2. 手动发送Http请求&#xff08;RestTemplate&#xff09;3. 服务注册中心3.1 原理3.2 Nacos注册中心3.3 服务注册3.4 服务发现(Discov…

牛客网Java实战项目--仿牛客网社区的学习笔记

仿牛客网社区的学习笔记 1. 项目环境搭建1.1 开发社区首页 2.开发社区登录模块2.1 发送邮件2.2 开发注册功能2.3 会话管理2.4 生成验证码2.5 开发登录、退出功能2.6 显示登录信息 4 Redis实现点赞关注4.1 Spring整合Redis访问Redis的方法&#xff1a; 4.2 Redis实现点赞4.2.1 点…

【图解计算机网络】http1.1,http2.0,http3.0

http1.1&#xff0c;http2.0&#xff0c;http3.0 http1.1长连接管道传输缺点 http2.0头部压缩二进制格式并发传输服务端推送缺点 http3.0无队头阻塞快速建立连接连接迁移 http1.1 长连接 在http1.0的时候&#xff0c;一次http请求就要建立一次TCP连接&#xff0c;这一次的htt…

【计算机网络篇】数据链路层(10)在物理层扩展以太网

文章目录 &#x1f354;扩展站点与集线器之间的距离&#x1f6f8;扩展共享式以太网的覆盖范围和站点数量 &#x1f354;扩展站点与集线器之间的距离 &#x1f6f8;扩展共享式以太网的覆盖范围和站点数量 以太网集线器一般具有8~32个接口&#xff0c;如果要连接的站点数量超过了…

【busybox记录】【shell指令】ls

目录 内容来源&#xff1a; 【GUN】【ls】指令介绍 【busybox】【ls】指令介绍 【linux】【ls】指令介绍 使用示例-默认输出&#xff1a; 列出目录内容 - 默认输出 列出目录内容 - 不忽略以.开头的文件 列出目录内容 - 不忽略以.开头的文件&#xff0c;只忽略.和..文件…

使用Maven对Java独立应用程序进行编译打包

一、 安装Maven 1.解压&#xff0c;移动安装包 sudo tar -zxf ~/apache-maven-3.9.6-bin.tar.gz -C /usr/local/ cd /usr/local/ sudo mv apache-maven-3.9.6/ ./maven-3.9.6 sudo chown -R qiangzi ./maven-3.9.6 二、Java应用程序代码 1.版本信息&#xff1a; Spark-2.1…

picoCTF-Web Exploitation-More SQLi

Description Can you find the flag on this website. Additional details will be available after launching your challenge instance. Hints SQLiLite 先随便输入个账号密码登录一下&#xff0c;得到查询SQL&#xff0c;接下来应该对SQL进行某些攻击来绕过密码登录成功 -- …

如何自定义Linux命令

说明&#xff1a;本文介绍如何将自己常用的命令设置为自定义的命令&#xff0c;以下操作在阿里云服务器CentOS上进行。 修改配置文件 修改配置文件前&#xff0c;先敲下面的命令查看当前系统配置的shell版本 echo $SHELL或者 echo $0区别在于&#xff0c;$SHELL查看的是系统…

【Shell】shell编程之循环语句

目录 1.for循环 例题 2.while循环 例题 3.until循环 1.for循环 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量 in 取值列表 do 命令序列 done [rootlocalhost ~]# for i in 1 2 3 > do > echo "第 $i 次跳舞" > done 第 1 次跳舞 第 …

java基础之面向对象的思想

一、面向对象和面向过程的编程思想对比 面向过程&#xff1a;是一种以过程为中心的编程思想&#xff0c;实现功能的每一步&#xff0c;都是自己实现的&#xff08;自己干活&#xff09;。 面向对象&#xff1a;是一种以对象为中心的编程思想&#xff0c;通过指挥对象实现具体的…

5. 简单说一说uniapp中的语法吧

前言 如果你 知道Vue3并且对Vue3的语法有一定了解&#xff0c;请跳过这一章&#xff0c;由于后续项目主要是基于Vue3TypeScript&#xff0c;因此提前简单概述一些Vue3的基础语法~ 本文的目的是 期望通过对本文的阅读后能对Vue3的每个语法有一个简单的印象&#xff0c;至少要知…

【Linux】动态库与静态库的底层比较

送给大家一句话&#xff1a; 人生最遗憾的&#xff0c;莫过于&#xff0c;轻易地放弃了不该放弃的&#xff0c;固执地坚持了不该坚持的。 – 柏拉图 (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) 底层比较 1 前言2 编译使用比较2 如何加载Than…

连升三级!openGauss单机版从2.1.0经停3.0.0升级至5.0.0

前言 如前文所述&#xff0c;我们的小demo项目起初安装了openGauss的2.1.0版本&#xff0c;由于2.1.0不是长期维护&#xff08;LTS&#xff09;版本&#xff0c;所以要升级到5.0.0LTS。考虑到虽然是DEMO项目&#xff0c;但也有些体验用户&#xff0c;所以为了保障业务连续性&a…

网络基础-Telnet协议

Telnet&#xff08;Telecommunication Network&#xff09;是一种基于文本的远程终端协议&#xff0c;允许用户通过网络连接到远程计算机&#xff0c;并在远程计算机上执行命令&#xff1b;它使用TCP作为传输层协议&#xff0c;并依赖于网络连接在客户端和服务器之间进行通信&a…

商务分析方法与工具(九):Python的趣味快捷-Pandas处理公司财务数据集思路

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

Linux部署

先把需要的东西准备好&#xff1a; 第一步解压tomcat&#xff1a; tar -zxvf apache-tomcat-8.5.20.tar.gz 第二步解压jdk: tar -zxvf jdk-8u151-linux-x64.tar.gz 第三步配置Java环境变量&#xff1a; vim /etc/profile 把下面代码放进去&#xff1a; export JAVA_HOME/root…

定时任务的几种实现方式

定时任务实现的几种方式&#xff1a; 1、JDK自带 &#xff08;1&#xff09;Timer&#xff1a;这是java自带的java.util.Timer类&#xff0c;这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行&#xff0c;但不能在指定时间运行。…

基于SpringBoot+Vue社区老人健康信息管理系统

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统社区老人健康信息管理系统信息管理难度大&#xff0c;容错…

网络爬虫概述与原理

网络爬虫概述与原理 网络爬虫简介狭义上理解功能上理解常见用途总结 网络爬虫分类通用网络爬虫聚焦网络爬虫增量网络爬虫深度网络爬虫 网络爬虫流程网络爬虫采集策略深度有限搜索策略广度优先搜索策略 网络爬虫简介 通过有效地获取网络资源的方式&#xff0c;便是网络爬虫。网…

【SpringBoot】解锁后端测试新境界:学习Mockito与MockMvc的单元测试魔法

文章目录 前言&#xff1a;Java常见的单元测试框架一.Junit5基础二.SpringBoot项目单元测试1.添加依赖2.SpringBoot单元测试标准结构3.SpringBoot单元测试常用注解 三.单元测试中如何注入依赖对象1.真实注入&#xff08;AutoWired、 Resource&#xff09;2.Mock注入2.1.前言2.2…