dxy logo
首页丁香园病例库学术专区全部版块
搜索
登录

数据清洗实操:R+SPSS 处理糖尿病患者缺失值与异常值(附代码 / 步骤)

用户头像
注销用户 · 发布于 2025-12-10 · IP 天津天津
1042 浏览

做临床统计时,很多医生朋友会陷入这样的困境:“收集了 200 例 2 型糖尿病患者的血糖、血脂数据,满心欢喜准备做分析,却发现数据里全是‘坑’——12 个空腹血糖值是空的,还有 8 个 BMI 低到 2.1 kg/m²,直接用这些数据做统计,结果肯定不可靠,更别说发 SCI 了。” 其实,数据清洗是医学统计的 “关键预处理环节”,就像做菜前要 “挑菜、洗菜”,只有把缺失值、异常值处理好,后续的 t 检验、回归分析才能得出可信结论。今天就以 200 例 2 型糖尿病患者的真实数据为例,手把手教大家用 R 和 SPSS 处理数据问题,每步都附具体代码和操作截图,看完就能上手。​

先明确一个核心认知:临床数据 “不完美是常态”。200 例糖尿病患者数据中,我们关注 3 个关键指标:空腹血糖(FBG,单位 mmol/L)、糖化血红蛋白(HbA1c,单位 %)、体重指数(BMI,单位 kg/m²)。初步检查发现:12 例患者的 HbA1c 数据缺失(未检测),8 例患者的 BMI 数据异常(其中 2 例为 2.1、3.5 kg/m²,明显低于正常下限 18.5;6 例为 45.2、51.8 kg/m²,高于临床常见范围)。这些问题若不处理,会直接导致统计样本量减少、结果偏差,甚至被 SCI 审稿人以 “数据质量差” 拒稿。​

一、缺失值处理:3 种方法 + R/SPSS 实操(以 HbA1c 缺失为例)​

缺失值是临床数据中最常见的问题,处理核心原则是 “不随意删除,优先合理填充”。针对 200 例糖尿病患者中 12 例 HbA1c 缺失,我们分 3 种场景选择处理方法:​

1. 场景 1:缺失率低(<5%)且数据随机缺失 —— 均值 / 中位数填充​

若 12 例 HbA1c 缺失仅占总样本的 6%(接近 5%),且缺失原因是 “随机漏测”(与患者病情无关),可采用 “均值填充”(适用于正态分布数据)或 “中位数填充”(适用于非正态分布数据)。​

  • 第一步:先做正态性检验​

先判断剩余 188 例患者的 HbA1c 是否符合正态分布:​

  • R 实操:用shapiro.test()函数,代码如下:


# 加载数据(假设数据框名为diabetes)

diabetes .csv("糖尿病患者数据.csv")

# 提取非缺失的HbA1c数据

hba1c_complete $HbA1c[!is.na(diabetes$HbA1c)]

# 正态性检验

shapiro.test(hba1c_complete)

# 结果解读:若P>0.05(如P=0.12),说明符合正态分布

  • SPSS 实操:分析→描述统计→探索→将 HbA1c 选入 “因变量列表”→勾选 “正态性检验”→结果若 “夏皮罗 - 威尔克检验 P=0.12”,则符合正态分布。​
  • 第二步:填充缺失值​
  • R 实操:计算均值并填充,代码如下:

# 计算非缺失HbA1c的均值

hba1c_mean (hba1c_complete)

# 用均值填充缺失值

diabetes$HbA1c[is.na(diabetes$HbA1c)]

# 填充后验证:缺失值数量应为0

sum(is.na(diabetes$HbA1c))

  • SPSS 实操:分析→缺失值分析→替换缺失值→将 HbA1c 选入 “定量变量”→方法选 “均值”→点击 “确定”→生成新变量(如 HbA1c_imputed)。​

2. 场景 2:缺失率中等(5%-20%)且有相关变量 —— 多重插补法​

若 HbA1c 缺失率为 10%,且发现 “HbA1c 与空腹血糖(FBG)高度相关”(r=0.78,P1),可采用 “多重插补法”(基于相关变量预测缺失值,更精准)。​

  • R 实操:用mice包,代码如下:

# 安装并加载mice包

install.packages("mice")

library(mice)

# 基于FBG、年龄、性别等变量插补HbA1c(假设这些变量无缺失)

imp abetes, m=5, method="pmm", seed=123)

# m=5:生成5个插补数据集;method="pmm":适用于定量变量

# 提取插补后的完整数据集(取第1个,也可合并5个结果)

diabetes_imputed (imp, 1)

# 验证:缺失值已填充

sum(is.na(diabetes_imputed$HbA1c))

  • SPSS 实操:分析→缺失值分析→多重插补→将 HbA1c 设为 “目标变量”,FBG、年龄、性别设为 “预测变量”→设置 “插补次数 = 5”→运行后生成插补数据集。​

3. 场景 3:缺失率高(>20%)或非随机缺失 —— 删除样本​

若 HbA1c 缺失率达 30%,或缺失原因是 “重症患者无法检测”(与病情相关,非随机缺失),填充会导致结果偏差,此时应 “删除缺失样本”(仅删除该变量缺失的样本,而非整个病例)。​

  • R 实操:用na.omit()函数,代码如下:

# 仅删除HbA1c缺失的样本,保留其他变量完整的病例

diabetes_clean (diabetes[, c("FBG", "HbA1c", "BMI")])

# 验证:样本量从200变为188

nrow(diabetes_clean)

  • SPSS 实操:数据→选择个案→如果条件满足→HbA1c≠系统缺失→点击 “确定”→仅保留 HbA1c 完整的样本。​

缺失值处理避坑点:绝对不要用 “0” 填充缺失值(如将缺失的 HbA1c 填为 0,会导致均值被严重拉低);也不要直接删除所有有缺失的样本(会大幅减少样本量,降低检验效能)。​

二、异常值处理:3 步识别 + 2 种解决方案(以 BMI 异常为例)​

异常值通常是 “录入错误” 或 “极端病例”,处理核心是 “先核实,后决策”。针对 200 例糖尿病患者中 8 例 BMI 异常,我们按 “识别→核实→处理”3 步操作:​

1. 第一步:可视化识别异常值 —— 箱线图法(最直观)​

  • R 实操:用ggplot2包画箱线图,代码如下:

install.packages("ggplot2")

library(ggplot2)

# 画BMI箱线图,标出异常值

ggplot(diabetes, aes(y=BMI)) +

geom_boxplot(fill="lightblue", outlier.colour="red", outlier.size=3) +

labs(title="糖尿病患者BMI箱线图", y="BMI (kg/m²)") +

theme_bw()

# 结果解读:红色点为异常值,可看到2.1、3.5、45.2等明显偏离箱体的点

  • SPSS 实操:分析→描述统计→探索→将 BMI 选入 “因变量列表”→勾选 “箱图”→结果中箱线图的 “圆点” 即为异常值,同时输出 “极端值列表”(标注异常值对应的患者 ID)。​

2. 第二步:数值识别异常值 ——Z 分数法(量化判断)​

箱线图偏主观,可结合 Z 分数(Z=(数值 - 均值)/ 标准差)判断:通常 | Z|>3 的数值为 “极端异常值”,|Z|>2 为 “潜在异常值”。​

  • R 实操:计算 BMI 的 Z 分数,代码如下:

# 计算BMI的均值和标准差

bmi_mean BMI, na.rm=TRUE)

bmi_sd abetes$BMI, na.rm=TRUE)

# 计算每个患者的BMI Z分数

diabetes$BMI_Z abetes$BMI - bmi_mean) / bmi_sd

# 筛选出|Z|>2的异常值

abnormal_bmi (diabetes$BMI_Z) > 2, c("患者ID", "BMI", "BMI_Z")]

print(abnormal_bmi)

# 结果:8例患者的Z分数均>2(如2.1 kg/m²的Z=-5.8,45.2 kg/m²的Z=3.2)

  • SPSS 实操:转换→计算变量→输入公式 “(BMI - MEAN (BMI))/SD (BMI)”→生成 Z 分数变量(如 BMI_Z)→数据→排序个案→按 BMI_Z 降序→筛选出 | Z|>2 的病例。​

3. 第三步:处理异常值 ——2 种方案(先核实后选择)​

识别出异常值后,首要步骤是回查原始记录(病历、检测报告),判断异常原因:​

  • 方案 1:录入错误(最常见)—— 修正为正确值​

若回查发现:2 例 BMI=2.1、3.5 kg/m² 是 “录入时少写了 1”(实际为 12.1、13.5 kg/m²,虽仍偏低,但符合 “消瘦患者” 临床情况);6 例 BMI=45.2、51.8 kg/m² 是 “录入时多写了小数点”(实际为 25.2、21.8 kg/m²,属于正常范围)。​

  • R 实操:直接修正数据,代码如下:

# 修正患者ID为101的BMI(从2.1改为12.1)

diabetes$BMI[diabetes$患者ID == 101] 2.1

# 修正患者ID为105的BMI(从45.2改为25.2)

diabetes$BMI[diabetes$患者ID == 105] 5.2

  • SPSS 实操:找到异常值对应的行(通过患者 ID),直接在数据视图修改数值。​
  • 方案 2:真实极端值(少见)—— 缩尾处理 / 保留​

若回查确认:某患者 BMI=12.1 kg/m² 是 “真实的严重消瘦”(因糖尿病合并营养不良),且该患者其他数据完整,此时不建议删除(会丢失重要临床信息),可采用 “缩尾处理”(将极端值替换为 “95% 分位数” 或 “3 倍标准差界限值”)。​

  • R 实操:缩尾处理,代码如下:

# 计算BMI的95%分位数上限和5%分位数下限

bmi_95 abetes$BMI, 0.95, na.rm=TRUE) # 如29.8

bmi_05 $BMI, 0.05, na.rm=TRUE) # 如17.2

# 将超过95%分位数的BMI替换为29.8,低于5%分位数的替换为17.2

diabetes$BMI[diabetes$BMI > bmi_95] mi_95

diabetes$BMI[diabetes$BMI 05] _05

  • SPSS 实操:转换→可视离散化→将 BMI 选入 “变量”→设置 “分位数” 为 5% 和 95%→将超出范围的数值替换为界限值。​

异常值处理避坑点:不要直接删除所有异常值!很多时候,极端 BMI 可能对应 “特殊病例”(如糖尿病合并肥胖症、营养不良),这些病例反而有重要临床意义,盲目删除会导致 “选择性偏倚”,被 SCI 审稿人质疑。​

三、数据格式标准化:2 个关键步骤(避免软件识别错误)​

除了缺失值和异常值,“数据格式错误” 也会导致统计软件无法识别,比如:​

  • 空腹血糖(FBG)录入为 “7.8mmol/L”(带单位),软件会识别为 “文本” 而非 “数值”;​
  • 性别录入为 “男 / 女”(中文文字),后续回归分析需转换为 “1/0” 编码。​

针对这些问题,我们做 2 步标准化:​

1. 去除数值变量的单位,保留纯数字​

  • R 实操:用gsub()函数删除单位,代码如下:

# 假设FBG变量为文本格式(如"7.8mmol/L"),提取数字

diabetes$FBG gsub("[^0-9.]", "", diabetes$FBG))

# 结果:"7.8mmol/L"变为7.8

  • SPSS 实操:转换→替换字符串→将 “mmol/L” 替换为空→再将 FBG 变量类型改为 “数值”。​

2. 文本变量转换为数值编码(如性别)​

  • R 实操:用ifelse()函数编码,代码如下:

# 将性别"男"编码为1,"女"编码为0

diabetes$性别 else(diabetes$性别 == "男", 1, 0)

  • SPSS 实操:转换→重新编码为相同变量→将 “男” 赋值为 1,“女” 赋值为 0→确定。​

四、清洗后验证:3 个检查点(确保数据可用)​

处理完缺失值、异常值和格式问题后,必须做 3 步验证,确保数据可用于后续统计:​

  1. 缺失值检查:R 用sum(is.na(diabetes)),SPSS 用 “分析→描述统计→频率”,确认无缺失值;​
  2. 异常值复查:重新画箱线图、计算 Z 分数,确认异常值已修正或合理处理;​
  3. 变量类型确认:R 用str(diabetes),SPSS 查看 “变量视图”,确认 FBG、BMI 为 “数值型”,性别为 “数值型(编码)”。​

数据清洗看似繁琐,但却是医学统计的 “基石”——200 例糖尿病患者数据经过清洗后,样本量稳定、数据可靠,后续做 “不同治疗组血糖对比”“BMI 与并发症的相关性分析” 时,结果才能被 SCI 期刊认可。​

接下来的系列文章中,我会以冠心病患者数据为例,讲解 “统计描述的正确方法”(比如均数 ± 标准差和中位数 + 四分位数的选择),同样附 R 和 SPSS 的完整操作。如果你的研究中遇到过 “数据清洗后仍报错”“不知道如何判断缺失值原因” 等问题,欢迎在评论区留言;想系统学习医学统计 + SCI 实操的朋友,记得关注我,后续内容会持续帮你避开统计陷阱,让研究更顺利!

2 5 10

全部讨论(0)

默认最新
avatar
2
分享帖子
share-weibo分享到微博
share-weibo分享到微信
返回顶部