在临床科研中,由于失访、无应答或记录不清等各种原因,经常会遇到数据缺失的问题。本文将深入探讨医学科研中数据缺失的成因、分类、影响以及应对方法,结合R语言的实际应用,为医学研究人员提供全面的解决方案。
一、认识缺失数据
其实,很多医学的纵向研究因获取数据资料时间较长,受试对象疾病痊愈、居住地改变等原因,不可避免地出现缺失数据。缺失数据不仅会降低医学研究的把握度,还会给研究的结果带来偏倚。在数据收集过程中由于失访、拒访、录入错误等原因造成的不完整数据称为缺失数据(Missing data)。
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.Length
、Sepal.Width
和Petal.Length
列的特定行设置为缺失值(NA),具体位置分别是第12、22、51、92、122行的Sepal.Length
,第12、96、126行的Sepal.Width
,以及第5、15、35、45行的Petal.Length
。接着,代码计算了iris_miss
数据集中所有缺失值的总数,并将结果存储在num_na
变量中,最后通过
3、使用View()和complete.cases()函数
我们可以通过View()函数以表格形式查看数据中含有NA值的非完整数据行,并可以根据每列中数值类别和大小进行数据排序。此外,complete.cases()函数返回一个逻辑向量,表示哪些行是完整的,即没有缺失值。
View(iris_miss[!complete.cases(iris_miss),])
结果可见:
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.Width
,Species
,Sepal.Width
,Petal.Length
,Sepal.Length
)。- 数值
1
表示该变量在该行中没有缺失值,而0
表示有缺失值,一列和最后一列和最后一行除外。- 第一行第一列的 139,是说明139 行数据没有任何缺失值。
- 第一行第二行表示有 4 行数据缺失
Sepal.Length
的值(1 表示不缺失,0 表示缺失)。- 末尾的一列表示每种缺失模式的行数,最后一行表示每个变量缺失值的总数。
图示:
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")])
缺失值的直方图
上面左图是用条形图展示了每个变量缺失值的个数,其中 “Petal.Width(PWidth)”和“Species”变量没有缺失值,“Sepal.Length(SLength)”缺失最多为5个。右图展示了数据框中5个变量不同组合下缺失值的个数,右下角的139代表删除所有缺失值后还剩的完整数据的样本数为139个,具体分析可参考md.pattern()的结果分析。
缺失值的散点图
上图为函数scattmatrixMiss()生成的不同变量之间的散点图情况。如果观察其中两个变量之间的缺失值信息也可以使用函数marginplot(),例如"Sepal.Length"和"Petal.Width"的。
缺失值的综合图
VIM 包是 R 语言中专门用于可视化和处理缺失值的工具包。它具备多种实用函数,能够助力用户清晰直观地了解缺失值的分布状况,并实现有效的填补。在缺失值可视化方面,aggr()函数可以生成条形图和矩阵图,用于展示单变量以及多变量组合时缺失值的个数或者比例;scattmatrixMiss()函数能够生成涵盖缺失信息的散点图矩阵,以此呈现不同变量之间的关系;marginplot()函数则可用于对两个变量之间的缺失值信息进行观察。