临床数据科学中如何用R来进行缺失值的处理(上)

在临床科研中,由于失访、无应答或记录不清等各种原因,经常会遇到数据缺失的问题。本文将深入探讨医学科研中数据缺失的成因、分类、影响以及应对方法,结合R语言的实际应用,为医学研究人员提供全面的解决方案。

一、认识缺失数据

其实,很多医学的纵向研究因获取数据资料时间较长,受试对象疾病痊愈、居住地改变等原因,不可避免地出现缺失数据。缺失数据不仅会降低医学研究的把握度,还会给研究的结果带来偏倚。在数据收集过程中由于失访、拒访、录入错误等原因造成的不完整数据称为缺失数据(Missing data)。

2083ab56173e4664b84a8a36db4edc83.png

1、数据缺失的操作成因

在医学研究中,数据缺失的原因多种多样,可以归纳为以下几类:

受试者原因

失访:在纵向研究中,受试者可能由于搬迁、无法联系、去世等原因导致后续数据无法获取。失访在长期随访研究中特别常见,尤其是在研究对象涉及广泛地理区域或高风险人群时。受试者失访会导致随访数据的缺失,从而影响研究结果的有效性和可靠性。

拒访:受试者拒绝继续参与研究,拒绝提供进一步的数据。这可能是因为研究的侵入性、不适感、时间成本或对研究过程的抵触情绪。受试者的拒访率高可能反映研究设计上的问题,或者是受试者招募和管理过程中存在的缺陷。

疾病痊愈:部分受试者在疾病痊愈后,认为不再需要参与研究,从而导致数据缺失。虽然这对于受试者个人是积极的,但对于研究来说,这种数据缺失可能会影响对长期效果的评价。

研究者原因

数据录入错误:由于工作人员的疏忽或不熟练,导致数据录入时出现错误。这类错误包括数据的遗漏、误录和重复录入等。数据录入错误不仅会直接导致数据缺失,还可能导致数据的质量和可靠性问题。

记录不清:数据记录过程中不够详细或规范,导致后期数据处理困难。这可能是由于研究者未能严格遵循数据记录的标准操作程序,或者在数据记录过程中未能及时、准确地记录相关信息。

设备故障:数据采集设备出现故障,无法完整获取数据。设备故障可能是由于硬件问题、软件错误或操作不当引起的。在高度依赖仪器设备进行数据采集的研究中,设备故障造成的数据缺失可能尤为严重。

其他原因

样本丢失:生物样本在运输或存储过程中丢失或损坏。生物样本的丢失或损坏不仅会导致数据缺失,还会增加研究的成本和时间。样本丢失的原因可能包括标签错误、存储条件不当、运输过程中的意外等。

技术原因:某些数据由于技术限制无法获取或测量。技术原因导致的数据缺失可能包括检测限的限制、数据采集方法的不完善、数据处理技术的局限性等。在某些情况下,技术原因可能导致特定变量的数据无法获得,从而影响研究结果的全面性和准确性。

2、数据缺失的三种分类

完全随机缺失(MCAR, Missing Completely at Random)

数据缺失是完全随机的,与任何观测值或未观测值无关。例如,某些问卷中的问题因打印错误而未显示,导致所有受访者均未回答该问题。在这种情况下,缺失的数据与其他变量无关,因此不会引入偏倚。但完全随机缺失在实际研究中较为少见。

随机缺失(MAR, Missing at Random)

数据缺失与已观测的变量有关,但与未观测的变量无关。例如,年龄较大的受试者更有可能失访,但在同一年龄组内,失访是随机的。这种情况下,尽管数据缺失不是完全随机的,但如果对已观测变量进行适当的调整,可以得到无偏估计。

非随机缺失(MNAR, Missing Not at Random)

数据缺失与未观测的变量有关。例如,重病患者由于身体不适,更有可能拒绝接受某些检查,导致数据缺失。在这种情况下,缺失的数据与未观测的值相关,通常难以处理,因为缺失机制本身与数据有关,可能会引入偏倚。

3、数据缺失的影响

减少统计效能

统计效能是指研究检测到实际存在效应的能力。在临床试验中,每个参与者的数据都至关重要。当部分数据缺失时,等同于减少了样本量。假设我们在一项试验中原计划招募100名参与者,但由于各种原因,最终只有80名参与者提供了完整的数据。那么,我们实际用于分析的数据点只有80个,而不是最初设计的100个。

统计功效的降低:样本量减少直接影响统计功效。统计功效(Statistical Power)是指试验正确拒绝零假设的概率。当样本量不足时,即使有实际效应存在,我们也可能因为数据不足而无法检测到这种效应。统计功效降低意味着试验得出的结论可靠性下降,可能会出现更多的假阴性结果,即实际存在的效应未被检测到。

效应大小的估计偏差:数据缺失不仅影响统计功效,还会对效应大小的估计产生偏差。较小的样本量使得效应大小的估计变得不准确,可能会夸大或低估实际效应。例如,在药物试验中,如果一些患者因为副作用退出试验,这些患者的数据缺失会导致对药物副作用严重性的低估。

引入偏倚

数据缺失不仅仅是一个统计学问题,它还会引入系统性偏倚,导致研究结果偏离真实情况。

非随机缺失:如果数据缺失不是随机发生的,而是与某些特定因素相关,则会引入偏倚。例如,在一项关于重病患者的研究中,重病患者往往更有可能因病情严重而无法完成整个试验,这就导致了非随机缺失。如果我们不考虑这些缺失数据,可能会低估疾病的严重性,甚至对某些治疗的有效性产生错误的结论。

偏倚的表现:这种偏倚可以表现为结果的系统性误差。例如,在一项新药试验中,如果药物副作用严重的患者由于无法耐受而退出试验,那么剩下的数据可能会显示出药物的副作用较轻。实际上,这是因为最严重的副作用患者的数据被忽略了,导致了对药物安全性的不准确评估。

4、复杂数据分析

处理数据缺失必然会增加了数据分析的复杂性。所以,处理缺失数据需要采用特殊的方法,否则可能会得出错误的结论。

传统的数据分析方法,如完全案例分析(Complete Case Analysis)和均值插补(Mean Imputation),在处理数据缺失时有其局限性。完全案例分析只使用没有缺失值的案例进行分析,这会导致样本量的大幅减少。而均值插补则简单地用变量的平均值代替缺失值,这会低估变量的变异性,从而影响结果的准确性。

现代统计学方法提供了更有效的处理数据缺失的方法。例如,多重插补法(Multiple Imputation)是一种广泛使用的方法,它通过创建多个插补数据集,并结合这些数据集的分析结果,来处理缺失数据。此外,还有全信息最大似然法(Full Information Maximum Likelihood, FIML),它通过使用所有可用数据来估计模型参数,从而减少缺失数据的影响。

二、用R来检验缺失数据

R语言中将缺失值表示为NA(Not Available)。接着,我们将深入探讨如何在R中检测缺失值。

1、缺失值的检测

在R中,可以使用is.na()函数来检测缺失值。该函数返回一个与输入对象大小相同的逻辑向量,其中缺失值的位置为TRUE,非缺失值的位置为FALSE。让我们通过一个简单的示例来理解这一点。

data_miss <- c(1, 2, 3, NA, 33, NA, NA, 23)
is_na_result <- is.na(data_miss)
print(is_na_result)

结果可见:

[1] FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE

通过上述代码,我们可以清楚地看到哪些位置存在缺失值。

2、缺失值观察

在实际数据分析中,我们常常需要查看缺失值的具体分布情况。由于R的内置数据集iris没有缺失值,我们可以人为地生成一个含有缺失值的iris_miss数据集,并通过不同的方法来观察缺失值的情况。

示例:生成含缺失值的数据集

iris_miss <- iris
iris_miss$Sepal.Length[c(12, 22, 51, 92, 122)] <- NA
iris_miss$Sepal.Width[c(12, 96, 126)] <- NA
iris_miss$Petal.Length[c(5, 15, 35, 45)] <- NA
num_na <- length(which(is.na(iris_miss)))
print(num_na)

结果可见:

[1] 12

上面代码首先创建了一个名为iris_miss的数据框,它是iris数据集的副本。然后,该代码将iris_miss数据集中Sepal.LengthSepal.WidthPetal.Length列的特定行设置为缺失值(NA),具体位置分别是第12、22、51、92、122行的Sepal.Length,第12、96、126行的Sepal.Width,以及第5、15、35、45行的Petal.Length。接着,代码计算了iris_miss数据集中所有缺失值的总数,并将结果存储在num_na变量中,最后通过print函数打印出缺失值的总数,结果显示为12。

3、使用View()和complete.cases()函数

我们可以通过View()函数以表格形式查看数据中含有NA值的非完整数据行,并可以根据每列中数值类别和大小进行数据排序。此外,complete.cases()函数返回一个逻辑向量,表示哪些行是完整的,即没有缺失值。

View(iris_miss[!complete.cases(iris_miss),])

结果可见:

9d6489dbde294b969fa7d66f17d44c03.png

4、使用mice包观察缺失值模式

mice包提供了丰富的缺失值处理功能。通过md.pattern()函数,可以生成一个以矩阵或数据框形式展示缺失值模式的表格,并生成关于缺失值的图表。

library(mice)
md_pattern_result <- md.pattern(iris_miss)
print(md_pattern_result)

 结果可见:

    Petal.Width Species Sepal.Width Petal.Length Sepal.Length   
139           1       1           1            1            1  0
4             1       1           1            1            0  1
4             1       1           1            0            1  1
2             1       1           0            1            1  1
1             1       1           0            1            0  20       0           3            4            5 12
  • 从第二列开始,每一列表示数据集中的一个变量(Petal.WidthSpeciesSepal.WidthPetal.LengthSepal.Length)。
  • 数值 1 表示该变量在该行中没有缺失值,而 0 表示有缺失值,一列和最后一列和最后一行除外。
  • 第一行第一列的 139,是说明139 行数据没有任何缺失值。
  • 第一行第二行表示有 4 行数据缺失 Sepal.Length 的值(1 表示不缺失,0 表示缺失)。
  • 末尾的一列表示每种缺失模式的行数,最后一行表示每个变量缺失值的总数。

图示:

6b7cf8f0954e4ec0a122a2b1fe6a6a69.png

MICE(Multivariate Imputation by Chained Equations)包更多是R语言中用于多重插补缺失值的强大工具包。它基于链式方程的思想,提供了一种系统化的方法来处理数据集中的缺失值。通过多重插补,可以生成多个填补缺失值后的数据集,并对这些数据集进行综合分析,以提高估计的准确性和可靠性。上面只是用到MICE的可视化功能。

5、使用VIM包进行缺失值可视化

通过图形化的方式观察缺失值,可以更直观地理解数据的缺失模式。VIM包提供了多种可视化工具,如aggr()函数和scattmatrixMiss()函数等等。

library(VIM)
names(iris_miss) <- c("SLength", "SWidth", "PLength", "PWidth", "Species")
aggr_plot <- aggr(iris_miss, prop = FALSE, numbers = TRUE)
scattmatrixMiss_plot <- scattmatrixMiss(iris_miss)
marginplot(iris_miss[c("SLength", "SWidth")])

缺失值的直方图

67dca4ea59154c94b328a732c240b9ad.png

上面左图是用条形图展示了每个变量缺失值的个数,其中 “Petal.Width(PWidth)”和“Species”变量没有缺失值,“Sepal.Length(SLength)”缺失最多为5个。右图展示了数据框中5个变量不同组合下缺失值的个数,右下角的139代表删除所有缺失值后还剩的完整数据的样本数为139个,具体分析可参考md.pattern()的结果分析。

缺失值的散点图

dc062501490d45fe8720317b7659cad9.png

上图为函数scattmatrixMiss()生成的不同变量之间的散点图情况。如果观察其中两个变量之间的缺失值信息也可以使用函数marginplot(),例如"Sepal.Length"和"Petal.Width"的。

缺失值的综合图

5ae46d8f96354c49bfed40f20c8a192c.png

VIM 包是 R 语言中专门用于可视化和处理缺失值的工具包。它具备多种实用函数,能够助力用户清晰直观地了解缺失值的分布状况,并实现有效的填补。在缺失值可视化方面,aggr()函数可以生成条形图和矩阵图,用于展示单变量以及多变量组合时缺失值的个数或者比例;scattmatrixMiss()函数能够生成涵盖缺失信息的散点图矩阵,以此呈现不同变量之间的关系;marginplot()函数则可用于对两个变量之间的缺失值信息进行观察。

53f1738b73904a138297fbc34d7cfe4f.png

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【生成式人工智能-四-chatgpt的训练过程-pretrain预训练自督导式学习督导式学习】

大模型是怎么被训练出来的具有人类智慧的 阶段一训练-自我学习-具备知识训练资料self-supervised learning&#xff08;自督导式学习&#xff09; 阶段二-怎么让模型具备人的智慧supervised learning 督导式学习预训练pretrain为什么要用预训练的模型&#xff1f;Adapter逆向工…

红外遥控风扇——arduino

红外遥控风扇——arduino 本节课任务红外遥控红外遥控通信过程红外遥控套件红外遥控接线实现风扇的多种换挡方式用本节课所学的红外遥控&#xff0c;控制RGB彩灯变换颜色&#xff0c;至少配置4种 本节课任务 1、了解红外遥控技术在生活中的运用。 2、学会编程测试红外遥控器的…

WPF-实现多语言的静态(需重启)与动态切换(不用重启)

一、多语言切换&#xff08;需重启&#xff09; 1、配置文件添加Key <appSettings><add key"language" value"zh-CN"/></appSettings> 2、新增附加属性当前选择语言 public CultureInfo SelectLanguage{get > (CultureInfo)GetValu…

C#初级——List 容器

容器 在C#中&#xff0c;容器通常指的是用于存储和组织数据的集合类。 本文介绍的容器是动态数组&#xff1a;List<T> 内部使用数组来存储元素&#xff0c;当添加元素超出当前数组容量时&#xff0c;会自动调整大小&#xff08;扩容&#xff09;。 list容器 List<&g…

用数组表达双链表

大体思想跟单链表相同&#xff0c;只不过双链表每个节点有两个指向&#xff1a; 单链表只能指向一个节点(下一个节点) 而双链表可以指向两个节点(上下两个节点) 代码分析 1、定义 在这里没有定义head&#xff0c;直接让0号点是head&#xff0c;下标为1的点是最右边的 //e[i…

Spring Boot 中使用 JSON Schema 来校验复杂JSON数据

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 在应用程序接口&#xff08;API&#xff09;的开发中&#xff0c;JSON作为一种数据交换格式被广泛利用。然而&#xff0c;对数据的结构和规则进行标准化是至关重要的&#xff0c;这正是JSON Schema发挥…

模拟一次XFS故障,分析原因并进行修复

模拟一次XFS故障 在平常处理问题时经常会遇到文件系统损坏的问题&#xff0c;有时候是日志里面出现了报错但文件系统还是可以读写&#xff0c;有时候是文件系统已经无法读写了 分析下不同现象的原因和一些可能出现的情况。 通过直接修改块存储损坏文件系统 1、制作一个xfs文…

Android图像显示SurfaceFlinger总结

1 介绍 1.1 框架中位置 ​​ 上图为Android的图形显示系统框架图。 首先上层应用通过ViewRoot的scheduleTraversals函数发起绘制任务&#xff0c;并通过HWUI调用OpenGL接口将绘制数据传递给GPU处理&#xff1b;SF会接收所有应用更新的绘制数据&#xff0c;并根据Z-Order、透明…

计算机网络(网络层)

网络层概述 网络层是干什么的&#xff1f; 网络层的主要任务是实现不同异构网络互连&#xff0c;进而实现数据包在各网络之间的传输相比于数据链路层的以太网通信&#xff0c;网络层则是将一个个数据链路层连接的以太网通过路由器连接起来。从而实现不同数据链路层的互联。 这…

​【香菇带你学Mysql】Mysql超长执行sql定位和优化【建议收藏】

本文为MySQL数据库管理员和开发人员提供了一套全面的超时SQL定位和优化解决方案。通过合理运用这些方法和技巧&#xff0c;可以显著提升MySQL数据库的性能和稳定性&#xff0c;减少超时SQL语句的发生&#xff0c;确保数据库的高效运行。 0. 引言 最近某个Mysql数据库频繁告警…

登录页滑块验证图

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> <b…

【Kubernetes】k8s集群中pod的容器资源限制和三种探针

目录 一.关于pod容器的资源限制 1.资源限制的单位 1.1.CPU 资源单位 1.2.内存 资源单位 二.关于QOS服务质量&#xff08;pod的调度和驱逐有限制&#xff09; 1.QoS服务质量分类 2.驱逐顺序 三.关于pod容器的三种探针 1.探针的三种规则 2.Probe支持三种检查方法 3.探…

docker安装及使用

一、docker优点及作用 优点&#xff1a; 基础镜像MB级别创建简单隔离性强启动速度秒级移植与分享放便 作用&#xff1a;资源隔离 cpu、memory资源隔离与限制访问设备隔离与限制网络隔离与限制用户、用户组隔离限制 二、docker安装 2.1.配置yum源 yum install -y yum-uti…

Mysql开启SSL

等二测出未开启SSL,如下 have_openssl、have_ssl都是DISABLED也不知道当时为啥没开&#xff0c;看最近的都是开启的,整改必去得开了&#xff0c;开启步骤 1.生成秘钥 进入mysql的bin目录下&#xff0c;运行 ./mysql_ssl_rsa_setup运行后会生成证书 默认证书会在mysql的data…

主从备份(复制)

一、备份的三种类型 备份的三种主要类型包括热备份、逻辑备份和物理备份&#xff0c;每种备份类型都有其特定的应用场景和优缺点。 1. 热备份 定义&#xff1a; 热备份是在数据库或系统处于正常运行状态下进行的备份。这种备份方式允许在不停机的情况下对数据库或系统数据进…

【Python】Django Web 框架

一、常用的Web开发框架 1.Django Django是一个由Python写成的开放源代码的Web应用框架。这套框架的主要目标是使开发复杂、数据库驱动的网站变得简单。Django注重组件的重用性和“可拔插性”、敏捷开发和DRY(Dont Repeat Yourself)法则 2.Flask Flask是一个微型的Python开发…

反序列化靶机实战serial(保姆级教程)

一.信息收集 靶机地址下载&#xff1a;https://download.vulnhub.com/serial/serial.zip 打开靶机&#xff0c;在kali虚拟机中进行主机存活探测 可以知道靶机ip地址为192.168.133.171 然后扫描端口 可以发现有一个22端口跟80端口 然后接下来用kali扫描它的目录 可以发现有一…

Django-Oscar开发独立站/外贸商城教程与问题记录

​特别说明&#xff1a; 本博客为个人开发Django-Oscar时的经验总结&#xff0c;方便后期维护&#xff01;&#xff08;第一次这么认真的记录这种大型项目&#xff0c;打个广告吧&#xff1a;本人可接单算法程序开发&#xff0c;包含深度学习和图像相关……等相关&#xff09;…

Unity补完计划 之 音效

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 首先&#xff0c;音频这块组件较少&#xff0c;但是内容很重要&#xff0c;因为对于任何一款非特殊面向人群的游戏来说&a…

STM32入门三(开漏输出点亮外接的LED)

前面2章用的是推免输出&#xff0c; 推免输出: 输出端由两个晶体管构成&#xff1a;一个N沟道晶体管和一个P沟道晶体管。这两个晶体管一般不会同时导通&#xff0c;避免短路; 白话&#xff0c;就是输入高还是低&#xff0c;由你的GPIO 控制&#xff08;GPIO 输出高就高&#xf…