在上一节,已经更新了临床研究统计思维之临床数据的获取(2),这节主要讲数据预处理,主要从数据预处理的目的、数据预处理的核心步骤及数据预处理的注意事项这几方面进行讲解。
在临床研究中,数据预处理是连接原始数据与后续统计分析、模型构建的关键环节,其质量直接影响研究结果的可靠性和准确性。临床数据往往具有复杂性(如多源异构、缺失值多、存在异常值等),因此需要系统的预处理流程。以下从预处理的目的、核心步骤、常见问题及处理方法等方面详细讲解:
数据预处理的目的
1.提升数据质量:修正原始数据中的错误、缺失、异常等问题,确保数据准确反映研究对象的真实情况。
2.统一数据格式:将不同来源、不同格式的数据(如文本、数值、影像报告等)标准化,便于后续分析。
3.降低分析难度:通过筛选、转换等操作,减少冗余信息,突出关键特征,提高模型效率。
数据预处理的核心步骤
1. 数据清洗(Data Cleaning)
主要处理数据中的错误、缺失、异常值等问题,是预处理的基础。
(1)识别与处理缺失值
临床数据缺失极为常见(如患者未完成某项检查、记录遗漏等),需先统计缺失比例(按变量或样本),再选择处理方式:
1)删除:若缺失比例极低(如< 5%)且随机分布,可删除含缺失值的样本或变量;但需注意避免因删除导致样本量不足或偏倚(如缺失与病情相关时,删除会影响结果)。
你可以只丢弃缺失项处的值,也可以丢弃包含缺失项的整条数据记录,这得看该条数据记录上其它的数据是否有价值,尤其是在数据样本较少的情况下,需要权衡一番。比如:去除唯一属性(唯一属性通常是一些id属性)。对数据做结尾或者缩尾处理。这里的结尾处理其实就是同第二个方法,在样本量足够大的情况下删除首尾1%-5%的样本。缩尾指的是人为改变异常值大小。
2)填充:
数值型变量:常用均值、中位数(适用于近似正态分布)、众数(适用于偏态分布)填充;或用更复杂的方法,如多重插补(Multiple Imputation,适用于缺失机制为随机缺失时)、基于回归 / 机器学习模型的预测填充、使用KNN填补、。
分类变量:用众数填充,或标记为 “未知” 单独作为一类(适用于缺失有实际意义时,如 “未检测” 可能与病情相关)。
概括为剔除缺失值、用一个统计量来替代缺失值、用模型来估计缺失值。
3)注意:需在研究方法中明确缺失值处理策略,避免结果偏倚。
(2)识别与处理异常值
处理异常值是为了能够拟合一个更加真实的模型。数据分析(可借助可视化工具,如分位数图、直方图、散点图)发现脏数据
异常值可能源于记录错误(如年龄= 200 岁)或真实极端值(如罕见的实验室指标),需先区分性质:
1)检测方法:
数值型变量:绘制箱线图(超过 1.5× 四分位距的为疑似异常)、Z 分数(|Z|>3 为疑似异常)、直方图或 Q-Q 图(观察偏离正态分布的点)。
分类变量:检查是否有不合理类别(如性别出现 “3”,需核对原始记录修正)。
是描述性统计分析,看均值、标准差和最大最小值。一般情况下,若标准差远远大于均值,可粗略判定数据存在异常值。
异常值的识别,数据少的话,可以通过排序分方法来识别。对于单变量的异常值识别,最常见的一种是使用三倍标准差原则,即是如果数据服从正态分布,那么数据中在均值的三倍标准差之外的数据则可能是异常值。但是,数据呈偏态分布,则用另外一个标准,均值+1.5IQR至均值—1.5IQR这个范围外的数据为异常值,IQR值的是四分位数间距,具体为75分位数与25分位数之间的距离。对于多变量(回归)的异常值处理,可以使用cook距离来分析异常值,一般而言,cook距离大于平均值的4倍,可能归类为异常值。
2)处理方法:
识别异常值后,根据具体情况进行删除,用均值进行处理,用中位数进行处理,用众数进行处理。概括为剔除缺异常值、用一个统计量来替代异常值、用模型来估计异常值。
需要注意的是,如果异常值的比例较高,那么需要考虑的是这并不是异常值了,更有可能是数据本身就来自两个分布,这时就需要对数据进行划分,将数据划分为两个数据集,而不是将异常值当做一个需要解决的问题。
若为记录错误:联系原始记录者修正,或直接删除(需记录修正过程)。
若为真实极端值:
保留:若样本量小或极端值有临床意义(如重症患者的指标),可保留但在分析中注明。
截断(Winsorization):将极端值替换为合理范围的临界值(如将 > 99% 分位数的值替换为 99% 分位数,避免极端值对模型的过度影响)。
2. 数据标准化与转换(Data Standardization & Transformation)
使不同尺度、分布的数据具有可比性,或满足后续分析(如回归、机器学习模型)的假设。
(1)标准化(适用于数值型变量)
消除量纲影响,将数据转换为同一尺度:
Z-score 标准化:
,转换后均值为0,标准差为 1(适用于近似正态分布的变量)。
Min-Max 标准化:
,转换后数据范围为[0,1](适用于有明确上下限的变量,如百分比)。
(2)数据转换(适用于非正态分布变量)
数据变换包含的方法众多,作用也不尽相同。常见的数据变换过程包含以下方法:离散化、区间化、二元化、规范化(有的地方也成称为标准化)、特征转换与创建、函数变换。最基本的转换就是数据的标准化,其目的之一是消除数据之间量纲的影响。
1)离散化:
当我们不太关心值的小范围变化,或者想要将连续属性当成离散属性处理时,可以使用离散化方法,这可以简化计算,提高模型准确率。
针对第一个问题,可以采用非监督和监督的离散化方法来确定离散区间的个数,一旦离散集合划分完毕,那么对于第二个问题,直接将数据映射到其分类值上即可。监督和非监督的区别在于区间划分过程是否利用样本类别信息,一般来说利用类别信息能达到更好的区间划分结果,但计算量也会大一些。
非监督的离散方法主要包括等宽离散化、等频率离散化、聚类离散化等,离散过程不利用样本的分类信息。
监督的离散化方法主要包括,基于熵(或信息增益)的区间离散化、卡方分裂算法离散化等。这里只介绍基于一种简单的基于熵的离散过程。
2)二元化
有一些算法中要求属性为二元属性(例如关联模式算法),即属性的取值只能为0或1(当然其它二元取值形式都可以,如Yes和No,只是都可以转化为0和1表示),此时就要用到属性二元化的过程。
二元化的过程是用多个二元属性来表示一个多元属性。假设属性取值有个,则将整数区间中的每个值唯一的赋予该属性的每个取值,如果该属性的取值是有序的,则赋值的过程也必须按顺序赋值,然后将这个值用二进制表示,共需要(结果向上取整)个二进制位。例如一个具有5个取值的属性{awful,poor,ok,good,great}可以用3个二元属性表示
当一个属性取值数量较多时,这种做法会引入过多的属性值,此时可以在二元化之前先进行离散化,减少属性取值。
数据分箱是对连续数据进行的转化,即将连续数据划分为不同的间隔,从而将连续数据转变为分类数据。这样做的好处是可以减小数据中的噪声,从而让数据的分布趋势更加明显。在信用评分卡建模中,数据分箱是连续变量必须要做的数据转换。常用的数据分箱方法很多,如等比分箱、等距分箱。dlookr包中的bimming()函数提供了很多方法对数据进行分箱,包括以下几种:
● quantile:使用分位数进行分箱。
● equal:等距分箱。
● pretty:等比分箱。
● kmeans:使用K均值进行分箱。
● bclust:使用层次聚类进行分箱。
3)规范化
数据规范化是调整属性取值的一些特征,比如取值范围、均值或方差统计量等,这在一些算法中很重要。常见的规范化方位有:最小-最大规范化、z-score规范化、小数定标规范化。
min-max标准化(归一化):对于每个属性,设minA和maxA分别为属性A的最小值和最大值,将A的一个原始值x通过min-max标准化映射成在区间[0,1]中的值x',其公式为:新数据=(原数据 - 最小值)/(最大值 - 最小值)
z-score标准化(规范化):基于原始数据的均值(mean)和标准差(standarddeviation)进行数据的标准化。将A的原始值x使用z-score标准化到x'。z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。新数据=(原数据- 均值)/ 标准差
正则化:数据正则化是将样本的某个范数(如L1范数)缩放到到位1,正则化的过程是针对单个样本的,对于每个样本将样本缩放到单位范数。
小数定标规范化:该方法通过移动小数点的位置,将数值映射到[-1,1]上。其中表示小数点移动的位数,它取决于属性取值绝对值中的最大值。如属性取值的最大、最小值分别为-987、678,则应该为3。
4)特征转换与创建
对有一些时间序列,可以通过傅里叶变换、小波变换、EMD分解等方法得到数据的频域或其它类型特征,这能帮助我们从另一个角度分析问题,例如EMD分解在经济学上就有较多的应用。采用这一类方法时,一个比较重要的问题是如何解释在频域或时域上得到的新特征。
5)函数变换
函数变换是一个比较宽泛的说法,上面的规范化过程也是一种函数变换过程。我们可以依据需求,选择函数来处理数据,例如当属性取值比较大时,可以用log函数来处理数据。
许多临床指标(如病毒载量、炎症因子)呈偏态分布,需转换为近似正态分布以满足参数检验(如t 检验、线性回归)的假设:
对数转换(log transformation):适用于右偏分布(如值均为正数且差异较大)。
平方根转换:适用于轻度偏态分布。
Box-Cox 转换:通过参数 λ 调整转换方式,自动寻找最优转换形式(需变量值为正)。Zscore:zscore转换,其转换公式为(x-mu)/sigma。
minmax:标准化转换,其转换公式为(x-min)/(max-min)。
log:log转换。log+1:log转换。
sqrt:平方根转换。
1/x:倒数转换。
x^2:平方转换。
x^3:立方转换。
数据转换过程中经常遇到的一个问题是数据是有偏的。要进行数据转换,首先需要识别出数据是否存在有偏现象,然后需要对有偏的数据进行处理。dlookr中的find_skewness()可以计算出变量的偏态值。需要注意的是,想要计算变量的偏态情况,这里需要先对数据的缺失值情况进行处理,否则计算出的偏态值为NA。
3. 数据整合与格式化(Data Integration & Formatting)
临床数据常来自多源(如电子病历、实验室系统、影像报告),需整合为统一格式:
(1)数据类型转换
将文本型数值(如 “血糖:5.6mmol/L”)提取为纯数值型。
将分类变量编码:二分类变量用 0/1(如性别:男 = 0,女 = 1);多分类变量用哑变量(如血型:A 型 = 1,0,0;B 型 = 0,1,0 等),避免模型误判为有序关系。
(2)时间变量处理
临床研究中常涉及时间(如发病时间、随访时间),需统一格式(如 “YYYY-MM-DD”),并计算衍生变量(如年龄 = 当前时间 - 出生日期,随访时长 = 终点事件时间 - 入组时间)。
(3)多表整合
若数据分散在多个表格(如患者基本信息表、实验室检查表),需通过唯一标识(如患者 ID)关联,形成 “一行代表一个样本,一列代表一个变量” 的结构化数据集。
4. 数据筛选(Data Filtering)
去除冗余或无意义的变量,减少分析负担:
(1)删除无效变量:如所有样本取值相同的变量(如“是否为人类” 均为 “是”)、缺失比例极高的变量(如 > 50%,填充后可靠性低)。
(2)初步特征筛选:结合临床意义,剔除与研究问题无关的变量(如研究糖尿病时,“眼睛颜色” 通常无意义)。
数据预处理的注意事项
1.全程记录日志:详细记录每一步操作(如缺失值填充方法、异常值处理原因),确保可重复性,这是临床研究规范性的基本要求。
2.结合临床背景:预处理需基于专业知识,避免机械套用统计方法。例如,对于“未检测” 的肿瘤标志物,若其缺失与患者放弃治疗相关,不应简单填充为均值,而需保留其临床意义。
3.避免数据泄露(Data Leakage):预处理需在训练集和验证集上分别进行(如用训练集的均值填充验证集,而非整体数据的均值),否则会导致模型评价偏乐观。
4.工具选择:常用工具包括Excel(简单处理)、R(tidyr dplyr包)、Python(pandas库)等,其中 R 和 Python 更适合批量处理和复杂操作(如多重插补、自动化清洗)。
总结
数据预处理是临床研究中“磨刀不误砍柴工” 的关键环节,其核心是通过清洗、转换、整合等操作,将原始数据转化为高质量、可分析的格式。过程中需兼顾统计合理性与临床意义,同时严格记录操作流程,为后续的特征筛选、模型构建奠定可靠基础。