缺失数据4 | 缺失数据填补R包实战

编者

在我们的临床研究中,很难得到高质量的数据。

以医院数据为例,普遍存在两个问题:第一,各科室的数据五花八门,难以统一;第二,收集的数据不够完整,存在缺失,这些缺失数据如同鸡肋,食之无味,弃之可惜。

总的来说,一是杂,二是缺。存在缺失是正常的现象,即使顶刊也不能做到完美试验,正是因为缺失的存在,才更显得试验可靠。

数据缺失并不可怕,重要的是如何处理。本文将从缺失数据的类型开始将其,由浅到深,注重实战,感兴趣的读者可以跟着一起实践一下。

复现文章介绍

这两篇顶刊都有关于缺失数据的报道,文章的具体内容这里不再赘述,重要的是如何去处理缺失的数据。这两篇文章采用的都是多重插补法,也是我们本次学习的重点。

|--------------------------------------------------|
| 本公众号回复 "立春" 即可获得"立春"临床统计学沙龙PPT,数据等资料 |

数据缺失类型

数据缺失大致分为三种类型:完全随机缺失(MCAR)、随机缺失(MAR)和非随机缺失(MNAR)。

一、完全随机缺失

数据的缺失是随机的,数据的缺失不依赖于任何变量。如设备损坏,无法进行测试;或者样本损坏,无法进行记录,所以没有数据,形成缺失。

二、随机缺失

数据的缺失只依赖于我们观测到的 不完全变量或完全变量,通俗来说,就是我们本次研究中数据框里面有的数据。如血压值未测量,高血压患病情况就为缺失。

这里我们举一个例子,BMI存在缺失,表中我们可以看到BMI在吸烟以及术前操作的不同组别之间分布不均,所以我们认为BMI与观测到的变量有关,是随机缺失。

三、非随机缺失

数据的缺失依赖于我们未观测到的不完全变量或完全变量,通俗来说,就是我们本次研究中数据框里面没有的数据。缺失的原因可以是缺失值本身。如由于收入过高或过低,拒绝回答收入情况,收入情况就为缺失。

数据缺失处理方法

面对缺失数据,我们的处理方法通常为五种:完整案例分析,缺失指标法,单变量填补缺失,优/劣填补以及多重插补。

一、完整案例分析

完整案例分析假定缺失为完全随机变量。

有什么分析什么:如果缺失的量不大 ,如个案缺失5%以内,那可以忽略缺失,仅分析数据集中所有变量完整信息的个体,不等于删除数据。

删除列:如果有一列变量大量缺失 ,比如昂贵的医学检查结果。一百个样本里有八十个缺失,可以考虑釜底抽薪,直接删除列,即删除该变量,不纳入本次的研究。

二、缺失指标法

缺失指标法不估算缺失值

分类变量:对于不完整的分类变量 ,缺失的数据将被分组到附加的"缺失"类别 中。连续变量:对于不完整的连续变量 ,缺失值被设置为固定值 (通常为零,NHANES中为类似77,99),并向主分析模型添加额外的指示符或哑变量以指示该变量的值是否缺失。

三、单变量填补缺失

单变量填补缺失估计均值时假定缺失为完全随机变量

横断面数据,根据数据类型可以使用均数(正态),中位数(偏态),众数(分类) 进行填补。如果数据是纵向测量的,则在以上填补方法之外,还可以使用最近观察值 (往期测量值)的平均分进行填补。

四、优/劣填补

优/劣填补假定缺失为完全随机变量。

我个人认为,优/劣填补本质上也是一种单变量填补缺失的方法,但是有其独特的优势。通过给缺失值填补观察到的最好/最坏结果,都进行分析,可以得到研究结果最好/最坏情况的区间,是一种敏感性分析。

五、多重插补

多重插补假定缺失为随机变量 。但也能处理完全随机变量与非随机变量

多重插补根据数据集中其他变量的分布估算缺失数据值,是如今写文热门的方法。本期学习的重点就是多重插补的学习以及R语言的实现。

需要注意的是,如果单列缺失值比例高达20% ,就认为多重插补的结果不可靠 ,在实际的研究中,超过15% 就需要谨慎使用。

六、缺失数据处理方法对比

七、多重插补介绍

多重插补: 是一种处理缺失数据的方法,它可以利用整个数据集 的信息来生成一组完整的数据集 。原理:基于观测数据的分布来估计缺失数据的多个可能值 ,然后通过模型估计和重复模拟来填补缺失值。思想:认为缺失数据不是确定的值,而是随机变量,因此需要考虑缺失值引起的不确定性。

八、多重插补基本流程

多重插补的基本流程分为三步,以mice包为例子。先用mice函数对数据进行插补 ,通常形成3-5个数据集。再使用with函数对所有数据集进行分析 。最后使用pool函数对结果进行汇总输出。也可以输出指定数据集,后续单独进行分析。

R语言实战

打开Rstudio,我们首先要将该安装的包安装并运行,此处代码可以自动识别是否安装包,安装过了就运行,没安装就安装了再运行,较为智能。本次学习需要用到的数据为datana,我们将其导入。

首先,我们拿到一个数据,要对其有一个总体的把握。要填补缺失,就要知道有多少缺失。以下是我们查看缺失情况的代码,有数据形式,也有可视化形式。

随后对数据中的分类变量进行因子化

我们要介绍的第一个包是mice包,mice包是一个功能非常强大的包,非常灵活。第一,可以选择数据框的部分进行插补,第二,可以根据不同变量类型选择不同的插补方法。我们可以使用$method来查看插补方法。

此处为mice包的一些基础参数

MICE包插补方式对应表,根据不同的变量类型选取不同的插补函数。

mice包结果解析

MICE包单独导出数据并检验是否缺失

第二个包Amelia ,适合用于符合多元正态分布 的数据。如果数据不符合条件,可能需要事先将数据转换为近似正态分布。和mice包不太一样的是,Amelia包在函数内可以对变量进行分类,不进行分类的变量默认为数值型变量,名义变量放在noms = c()中即可,可以实现分类变量的插补。数值变量会得到小数,本例中age变量如果我们不希望保留小数,可以使用round(data1$age)函数对插补完成的数据data1中的age进行取整。

第三个包missForest随机森林 的方法进行多重插补,这个包有一个优点,可以使用完整数据集衡量插补的表现。有些小伙伴想知道如何把数据写到本地,此处也一并给出代码。第四以及第五个包分别为Hmisc/mi,使用pmm的方法进行多重插补,此处不做展示。

数据缺失处理R包对比

将缺失数据与三种不同R包插补后的数据进行分析,可以发现结果略有差异,总体上来说性别从不显著变为显著,身体活动显著性明显增强,Amelia包插补后教育程度也从不显著变为显著。

后记

对于观察性研究,数据处理可以说是整个试验中最关键的一环,数据处理得当,整个试验进程就能推进70%。

有人会问,数据缺失难道不能删掉吗?只要我的样本量够大,缺失一两个不要紧吧?

其实不然,如果没有缺失值,临床试验就会失去真实性,读者也会对文章结果的稳定性产生质疑。因此,在临床试验中,对缺失值进行适当的处理是非常重要且必要的!

本文着重介绍了三种常用的R语言进行缺失值插补的方法及其适用条件,将优缺点一一列举,在实际应用中,可以根据具体要求,大家可以对照要求选择最合适的方法。

|--------------------------------------------------|
| 本公众号回复 "立春" 即可获得"立春"临床统计学沙龙PPT,数据等资料 |

本公众提供各种科研服务了!

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 一、课程培训 2022年以来,我们召集了一批富有经验的高校专业队伍,着手举行短期统计课程培训班,包括R语言**、meta分析、临床预测模型、真实世界临床研究、问卷与量表分析、医学统计与SPSS、临床试验数据分析、重复测量资料分析、nhanes、孟德尔随机化等10余门课**。如果您有需求,不妨点击查看: 发文后退款:2024-2025年科研统计课程介绍 二、数据分析服务 浙江中医药大学郑老师团队接单各项医学研究数据分析的服务,提供高质量统计分析报告。有兴趣了解一下详情: 课题、论文、毕业数据分析 临床试验设计与分析公共数据库挖掘与统计 |

相关推荐
AI原吾1 小时前
掌握Python-uinput:打造你的输入设备控制大师
开发语言·python·apython-uinput
机器视觉知识推荐、就业指导1 小时前
Qt/C++事件过滤器与控件响应重写的使用、场景的不同
开发语言·数据库·c++·qt
毕设木哥1 小时前
25届计算机专业毕设选题推荐-基于python的二手电子设备交易平台【源码+文档+讲解】
开发语言·python·计算机·django·毕业设计·课程设计·毕设
珞瑜·1 小时前
Matlab R2024B软件安装教程
开发语言·matlab
weixin_455446171 小时前
Python学习的主要知识框架
开发语言·python·学习
孤寂大仙v1 小时前
【C++】STL----list常见用法
开发语言·c++·list
她似晚风般温柔7892 小时前
Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
开发语言·javascript·uni-app
咩咩大主教2 小时前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
FuLLovers2 小时前
2024-09-13 冯诺依曼体系结构 OS管理 进程
linux·开发语言
everyStudy3 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript