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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Python下载哔哩哔哩(Bilibili)视频字幕

在本文中&#xff0c;我将向大家展示如何使用Python下载哔哩哔哩&#xff08;Bilibili&#xff09;视频的字幕。通过这个方法&#xff0c;你可以轻松地获取你喜欢的视频的字幕文件&#xff0c;方便学习和交流。 准备工作 在开始之前&#xff0c;我们需要安装一些必要的库&…

第一个C++项目

文章目录 一、新建项目1.打开软件&#xff0c;选择“创建新项目”2.新建项目栏中&#xff0c;按自己的需求来设置项目模板&#xff0c;项目名称和文件存放位置&#xff0c;设置好后点击“确认”3. 点击“Next”4. 按照自己需求设置&#xff0c;设置完后&#xff0c;点击“Next”…

【Linux 性能详解】CPU性能篇

目录 平均负载&#xff08;Load Average&#xff09; CPU上下文切换 进程上下文切换 线程上下文切换 中断上下文切换 中断 硬中断 软中断 CPU使用率 性能分析工具 平均负载&#xff08;Load Average&#xff09; 平均负载&#xff1f;这个词对很多人来说&#xff0c…

【新三个数排序的自创算法,这是我厉年来很满意的一次排序算法设计,最好小于O(N)最坏O((NN/3)/2)。】2024-5-7

缘由如何用C&#xff0b;&#xff0b;解决一下问题_编程语言-CSDN问答 int a[]{1, 4, 7, 8, 5, 2, 3, 6, 9, 7}, n 10, x n, jh 0, j 0;px:if (j < n) {//缘由https://ask.csdn.net/questions/8099444if (--x < 2 j)x n - 1, j 3;if (x < n - 1 && a[x…

【强训笔记】day14

NO.1 思路&#xff1a;用一个哈希表&#xff0c;先遍历s1&#xff0c;统计哈希表内的字符个数&#xff0c;在遍历s2&#xff0c;s2中的字符在哈希表中减去&#xff0c;如果哈希表中的字符个数小于0那么就输出No。 代码实现&#xff1a; #include <iostream> #include&…

湘潭大学数据库作业题完整答案

作业一&#xff1a; 考虑如下所示的关系数据库。这些关系上适当的主码是什么&#xff1f; 职工&#xff08;姓名&#xff0c;街道&#xff0c;城市&#xff09; 工作&#xff08;姓名&#xff0c;公司名&#xff0c;工资&#xff09; 公司&#xff08;公司名&#xff0c;城市&a…

UVa1376/LA3661 Animal Run

UVa1376/LA3661 Animal Run 题目链接题意输入格式输出格式 分析AC 代码 题目链接 UVA - 1376 Animal Run 题意 由于控制程序出了 bug&#xff0c;动物园的笼子无缘无故被打开&#xff0c;所有动物展开了一次大逃亡。整个城市是一个网格&#xff0c;另外每个单位方格都有一条从…

win平台c语言引入开源库的问题与解决,以引入cJSON库为例

目录 遇到的问题 开源依赖库引入的问题 问题的解决 生成dll文件 方式一 方式二 在VsCode中如何使用开源库 文件放置位置 配置文件进行配置 引入头文件 结束 许久不写博客&#xff0c;五一还在加班&#xff0c;就浅浅写一篇吧。 最近除了做物联网平台,还对网关二次开…

如何恢复手机视频?手机视频恢复软件有哪些?

随着手机使用的普及&#xff0c;我们的日常生活、工作甚至娱乐都与它息息相关。而在其中&#xff0c;我们宝贵的视频文件则是记录下我们生活、工作和重要时刻的重要载体。然而&#xff0c;当这些视频文件不幸丢失或被误删&#xff0c;我们的内心往往会感到一阵恐慌。这时候&…

团队执行力差,多半都是管理的问题

在日常管理中&#xff0c;我们习惯用“执行力好不好”来评价一个团队的表现&#xff0c;但实际上&#xff0c;执行力更应该是一个管理者需要思考和解决的问题&#xff0c;而非单纯归咎于团队。 我们需要明确一点&#xff1a;执行力不是团队的问题&#xff0c;而是管理者的问题…

nestjs版若依全栈管理后台完全开源!

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;今天继续和大家分享一下我们小伙伴开源的基于 nestjs 的若依全栈管理系统。 相信前端小伙伴对若依管理系统并不陌生&#xff0c;它的后端采用…

浙大最新开源:MGMap-掩码引导学习的在线矢量化高精地图构建方法

论文标题&#xff1a; MGMap: Mask-Guided Learning for Online Vectorized HD Map Construction 论文作者&#xff1a; Xiaolu Liu, Song Wang, Wentong Li, Ruizi Yang, Junbo Chen, Jianke Zhu 作者单位&#xff1a;浙江大学&#xff0c;有鹿科技 开源地址&#xff1a;…

Android 网络请求 实现

Android 网络请求 实现 一、背景 在Android开发中,网络请求是一个非常常见的需求。应用程序可能需要与远程服务器通信来获取数据、上传文件、验证用户身份等等。背景下,Android应用通常会面临以下几个主要情况和挑战: ①数据交互: 许多应用程序需要从服务器获取数据,例…

taos数据库服务器安装

涛思数据库服务器安装分为两种情况 一。新服务器直接安装&#xff08;非常好&#xff09; 二。旧服务器删除后删除干净再安装&#xff08;麻烦得很&#xff09; 先来讲解一下情况一&#xff1a; 找需要的taos安装版本链接&#xff1a;https://docs.taosdata.com/releases/tde…

基于springboot实现体育馆管理系统项目【项目源码+论文说明】

基于springboot实现体育馆管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理…

如何阅读:一个已被证实的低投入高回报的学习方法的笔记

系列文章目录 如何有效阅读一本书笔记 如何阅读&#xff1a;一个已被证实的低投入高回报的学习方法 麦肯锡精英高效阅读法笔记 读懂一本书笔记 文章目录 系列文章目录第一章 扫清阅读障碍破解读不快、读不进去的谜题一切为了阅读小学教师让你做&#xff0c;但中学老师阻止你做的…

Python - Excel拆分详解(按工作表、行、列、内容拆分)

目录 引言 安装Python Excel库 Python按工作表拆分Excel Python按行拆分Excel Python按列拆分Excel Python按内容拆分Excel 引言 拆分Excel文件是一种将大型工作簿分割为更小、更易管理的部分的有效方法。当面对包含大量数据或复杂信息的工作簿时&#xff0c;拆分文件可…

【Linux】25. 网络基础(一)

网络基础(一) 计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 其实本质上一台计算机内部也是一个小型网络结构(如果我们将计算机内部某个硬件不存放在电脑中&#xff0c;而是拉根长长的线进行连接。这其实也就是网…

存储大作战:探索Local Storage与Session Storage的奥秘

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 存储大作战&#xff1a;探索Local Storage与Session Storage的奥秘 前言Local Storage与Session Storage简介数据存储生命周期容量限制安全性 前言 在Web的世界里&#xff0c;数据就像是一群流浪者&a…

C++ 递归函数

一 递归函数 递归函数(Recursive Function&#xff09;即自调用函数&#xff0c;即在函数体内有直接或间接地自己调用自己的语句。 大多数递归函数都能够用非递归函数代替。 例如&#xff1a;求两个整数a,b的最大公约数。 算法描述&#xff1a; 大多数递归函数都能用非递归…