VIM 包,集成多种算法的数据缺失值处理工具!

news2024/11/25 0:25:18

生信碱移

VIM 缺失值处理

在组学分析中,尤其是在公开数据库的挖掘中,数据缺失是一个常见问题,这可能是由于样本处理、测量误差或技术限制等多种原因引起。例如,在转录组学研究中,某些基因的表达数据可能因实验失败而缺失;在使用TCGA数据库的样本进行临床关联分析时,某些样本的部分临床数据存在缺失。

常规情况下,面对数据缺失最常用的解决方法包括

  1. 删除法(直接删除包含缺失值的样本或变量,这种是最常见的)

  2. 朴素的方法:比如均值填补(用该变量的均值填补缺失值)

  3. 更复杂的插补方法(如回归填补、k-最近邻填补和迭代模型填补),原理其实就是根据数据的相似性进行聚类或者建模,来获得缺失的信息。

虽然已经存在多种算法来填充缺失数据,但是由于方法的实现缺乏便捷的工具,使得多数研究者还是倾向于删除存在缺失数据的样本。小编最近冲浪的时候看到了一个R包 VIM,早在 2016 年便发表在 Journal of Statistical Software [IF: 5.4]杂志,目前已经有了600+被引。

图片

▲ DOI: 10.18637/jss.v074.i07

VIM 包旨在通过可视化方法探究和分析数据中缺失值的结构,利用内置的填充方法对这些缺失值进行填补,并通过可视化工具验证填充过程。目前,VIM 实现了四种缺失数据的填充方法:hotdeck 填充、k 最近邻填充、回归填充和迭代鲁棒模型填充。简单介绍一下它们的原理以及在 VIM 相应的函数名

  1. hotdeck(): hotdeck 填充,选择数据集中最相似的记录,并用它们的值来替换缺失值。

  2. kNN(): 通过 KNN 算法找到数据集中最接近的几个样本,然后用这些邻居样本的平均值来填补缺失值。

  3. regressionImp(): 用回归模型预测缺失值,用该样本其他已知变量预测缺失变量的值。

  4. matchImpute(): 通过匹配算法填补缺失值

  5. irmi(): 迭代的填充方法,逐步使用数据中的所有信息来填补缺失值,每一步中,将一个变量作为目标变量进行填充,同时使用其它变量的信息来预测这个目标变量的缺失值。

本文主要介绍一下该包的使用示例,感兴趣的铁子可以自行在下面网站了解更多内容:

  • https://github.com/statistikat/VIM/

1 R包的安装与引用

该 R 包支持从 CRAN/GitHub 来源进行安装:

## Install release version from CRAN
install.packages("VIM")

## Install development version from GitHub
remotes::install_github("statistikat/VIM")

library(VIM)

2 示例数据介绍

使用内置数据集sleep,为了方便各位理解就把行名改成了 GEO 数据库的样本格式,列名则是一些相应的样本临床性状,比如睡眠、体重什么的:

data(sleep)
rownames(sleep) <- paste0("GSM222013", 1:nrow(sleep))
sleep[1:5, 1:5]
#            BodyWgt BrainWgt NonD Dream Sleep
#GSM2220131 6654.000   5712.0   NA    NA   3.3
#GSM2220132    1.000      6.6  6.3   2.0   8.3
#GSM2220133    3.385     44.5   NA    NA  12.5
#GSM2220134    0.920      5.7   NA    NA  16.5
#GSM2220135 2547.000   4603.0  2.1   1.8   3.9

注意到,前五列中的DreamSleep是有缺失值的。对于这两对存在缺失的数据变量,可以使用VIM提供的可视化方法进行指定展示:

x <- sleep[, c("Dream", "Sleep")]
marginplot(x)

图片

▲ 两对变量的缺失值展示:横纵坐标分别表示样本的两种变量Sleep与Dream;图中每一个点代表一个样本;点的颜色代表这个样本的数据缺失情况(蓝色点样本的Sleep与Dream皆不存在缺失值,红色点样本的Sleep或Dream存在一个缺失值,棕色点样本的Sleep与Dream都缺失了);数字代表相应颜色样本的数量(在上图中,棕色的数字2代表共有两个样本的Sleep与Dream皆缺失,红色的12代表共有12个样本的Sleep或Dream存在一个缺失值);箱式图代表存在缺失的样本与未缺失样本的指定变量差异,比如对于靠Sleep轴的那对箱式图,红色的箱子代表只存在Dream缺失的样本(由虚线隔开,在棕色点上面的那些红点),即此时具有Sleep数值(具有y轴)但由于Dream缺失所以在x轴上无法显示,此时箱式图比较的则是这些样本与未发生缺失的蓝色样本的Sleep数值差异(另一对同理)。

当然,也可以看看整个数据表的缺失情况

a <- aggr(sleep, plot = FALSE)
plot(a, numbers = TRUE, prop = FALSE)

图片

▲ 数据缺失情况的整体概括:左图代表各种变量的缺失情况,可以看到NonD的缺失值是最多的,在14个样本中存在缺失;右图展示的是样本的缺失情况,从下往上看,可以看到42个样本不存在任何缺失,9个样本存在NonD与Dream的缺失。

3 KNN算法填充缺失

① 使用 KNN 算法填补整个sleep的缺失值

sleep_imputed <- kNN(sleep)
rownames(sleep_imputed) <- rownames(sleep)
sleep_imputed[1:5, 1:5]
#            BodyWgt BrainWgt NonD Dream Sleep
#GSM2220131 6654.000   5712.0  3.2   0.8   3.3
#GSM2220132    1.000      6.6  6.3   2.0   8.3
#GSM2220133    3.385     44.5 12.8   2.4  12.5
#GSM2220134    0.920      5.7 10.4   2.4  16.5
#GSM2220135 2547.000   4603.0  2.1   1.8   3.9

kNN函数返回的表其实和原先的表没有什么区别,只是使用算法将NA的数据进行了填充。这里只演示了kNN的结果,老铁们也可以试试前面说到的其他函数算法。

② 简单自定义一个函数提取数据,可视化一下DreamSleep列缺失值的填充情况:

# 自定义函数提取数据用于可视化
index_finder <- function(x, x_imputed){
  index <- c()
  for (i in x) {
    index_i <- grep(i, colnames(x_imputed))
    index <- c(index, index_i[1])
  }
  for (i in x) {
    index_i <- grep(i, colnames(x_imputed))
    index <- c(index, index_i[2])
  }
  return(index)
}
# 可视化一下指定列插补的结果
select <- c("Dream", "Sleep")
x_imputed <- sleep_imputed[, index_finder(select, sleep_imputed)]
marginplot(x_imputed, delimiter = "_imp")

图片

▲ 展示指定两对变量的数据填充情况:看图的方法还是一致的,只是颜色的注释变了,棕色和黄色分别是不同变量经过算法填充的数据(即原本是缺失值,通过算法进行了填充),所以这个时候在所有的蓝色样本中会出现这些填充完数据的样本。

简单易用

还有可视化的功能

对于一些难免存在缺失的数据

还是有一定应用价值的

至于有没有必要查漏补缺

还是看结果吧

算法只是理由,更多情况还是结果导向

欢迎点击关注

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

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

相关文章

我主编的电子技术实验手册(15)——测量正弦信号

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

Qt (5)【Qt 的 qrc 机制高效管理项目静态资源】

阅读导航 引言一、qrc机制简介二、创建qrc机制并使用1. 创建⼀个qrc文件2. 添加已有资源3. 使用已加载资源 三、qrc机制的优缺点 引言 在上一篇文章中&#xff0c;我们深入探讨了QWidget作为Qt GUI框架中核心基类的重要性&#xff0c;以及它如何承载了构建丰富用户界面所需的各…

“传统”父母用手机 VS “时髦”父母玩手机

“传统”父母日常用智能手机&#xff0c;经常有些“拦路虎”&#xff0c;让他们在接触新事物的时候&#xff0c;如果搞不定就干脆不用了。现在也涌现出来很多“时髦”父母&#xff0c;能游刃有余的使用智能手机&#xff0c;如何让长辈在使用手机时更有松弛感&#xff0c;今天带…

Mapreduce_partition分区入门

分区 将输入的csv按照员工号拆分成每个员工&#xff0c;每个员工存储为员工对象&#xff0c;之后按每个员工的不同部门存储 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:x…

力扣热题100_回溯_17_电话号码的字母组合

文章目录 题目链接解题思路解题代码 题目链接 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示…

力扣面试经典算法150题:删除有序数组中的重复项 II

删除有序数组中的重复项 II 今天的题目是力扣面试经典150题中的数组的中等难度题: 删除有序数组中的重复项 II 题目链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 …

Linux中yum、vim、gcc/g++的使用

目录 一、Linux 软件包管理器 yum 什么是软件包 关于 rzsz 查看软件包★ 如何安装软件★ 如何卸载软件★ Linux 开发工具 二、Linux编译器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 vim末行模式命令集 vim操作总结 如果在vim界面不小心按了Ctrl …

【Redis集群】集群原理最全解析

主从集群 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 数据同步概念 Replication Id和offset 在从节点发起数据同步的请求中&#xff0c;有两个重要的属性&#xff1a; Replication…

灵办AI探索之旅:颠覆传统的代码开发工具

前言 灵办AI是一个先进的人工智能工具&#xff0c;专注于提高软件开发和项目管理的效率。其核心功能包括代码生成、优化、评估和自动化修复&#xff0c;旨在帮助开发者和团队提升开发速度和代码质量。 体验地址&#xff1a;https://ilingban.com/browser_extension/?fromjj …

管道的学习

信号量&#xff1a;线程间有顺序的协调工作&#xff1b;&#xff08;用来描述可使用的资源个数&#xff09;&#xff1b; 信号量的个数反应的是资源的数量&#xff1b; 写线程 ---写资源 可以写数据的条件 1.开始时 &#xff0c;buf空的 2.读线程 读完了 读线程 buf充当读资源…

Particle Swarm Optimization粒子群算法

目录 1.粒子群算法入门 1.1 简单的优化问题 1.1.1 盲目搜索 1.1.2 粒子群算法流程图 1.1.3 粒子群算法的核心公式 1.1.4 预设参数 1.1.5 初始化粒子的位置和速度 1.1.6 计算适应度 1.1.7 循环体&#xff1a;更新粒子速度和位置 1.1.8 模型改进 2.深入研究粒子群算法 …

开办无人机培训机构,前期需要投入多少?

开办无人机培训机构的前期投入因多种因素而异&#xff0c;主要包括场地租赁、设备购置、师资薪酬、教学材料与课程开发、宣传推广、行政和运营费用&#xff0c;以及资质认证和审批费用等。以下是对这些费用的大致估算&#xff1a; 1. 场地租赁 费用范围&#xff1a;根据所在地…

“论NoSQL数据库技术及其应用”写作框架,软考高级,系统架构设计师

论文真题 随着互联网web2.0网站的兴起&#xff0c;传统关系数据库在应对web2.0 网站&#xff0c;特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心&#xff0c;暴露了很多难以克服的问题&#xff0c;而非关系型的数据库则由于其本身的特点得到了非常迅速的发展…

CentOS系统下安装NVIDIA显卡驱动

一、安装显卡驱动 1.安装依赖项 yum -y install gcc pciutils yum -y install gcc yum -y install gcc-c yum -y install make2.查看内核版本 uname -a3.查看显卡版本 lspci | grep -i nvidia4.屏蔽系统自带的nouveau (1)查看nouveau lsmod | grep nouveau (2)打开blackl…

Java的反射原理

反射允许程序在运行时检查或修改其类、接口、字段和方法的行为。反射主要通过java.lang.reflect包中的类和接口实现&#xff0c;它主要用于以下目的&#xff1a; 在运行时分析类的能力&#xff1a;通过反射&#xff0c;可以在运行时检查类的结构&#xff0c;比如它的方法、构造…

MySQL(二)——CRUD

文章目录 CRUD新增全列插入指定列插入 查询全列查询指定列查询查询字段为表达式表达式不包含字段表达式包含一个字段表达式包含多个字段 补充&#xff1a;别名去重查询排序条件查询 补充&#xff1a;运算符区间查询模糊查询NULL的查询 分页查询 修改删除 CRUD CRUD是指创建&am…

【自动驾驶】ROS中的TF坐标变换(一):静态坐标变换

目录 引子ros中的右手坐标系补充&#xff1a;欧拉角及四元数理解旋转平移操作复合操作 运行坐标变换的例子坐标转换 静态坐标变换-发布坐标系信息创建功能包 静态坐标变换-订阅坐标系信息添加cpp订阅者主文件修改cmakelist文件编译报错的解决方案运行程序进行测试 引子 机器人…

设计模式---构建者模式(Builder Pattern)

构建者模式&#xff08;Builder Pattern&#xff09; 是一种创建型设计模式&#xff0c;旨在将复杂对象的构建过程与其表示分离。它允许使用相同的构建过程创建不同的表示。该模式通常用于构建复杂对象&#xff0c;这些对象由多个部分组成或具有多个可选属性。 构建者模式的核…

Labelme的安装与使用教程

文章目录 一、Labelme是什么&#xff1f;二、安装步骤1.新建虚拟环境2.安装Labelme3.Labelme的使用 三、json2yolo 一、Labelme是什么&#xff1f; Labelme是一个用于图像标注的开源工具&#xff0c;可以实现图像标注、语义分割、实例分割等。 本文记录一下labelme的安装与使…

【系统架构设计】系统性能评价(一)

【系统架构设计】系统性能评价&#xff08;一&#xff09; 性能指标对计算机对网络对操作系统对数据库管理系统对Web服务器 性能计算MIPS(百万条指令/秒)计算方法峰值计算等效指令速度 性能设计性能评估 性能指标 对计算机 时钟频率&#xff08;主频&#xff09; 指计算机处…