在R中如何按假设分布对右删失缺失数据进行插补?
右删失对数正态数据的随机插补实现
我们已经知道可以用censlm包轻松处理左删失(低于LLOQ)数据的对数正态分布随机插补,对于右删失(高于ULOQ)的数据,完全不用走“翻转数据”的弯路,直接用censlm的原生参数就能优雅解决。
快速回顾左删失处理流程
library(ggplot2) library(dplyr) library(censlm) set.seed(123) # 模拟对数正态分布生物标志物数据 original_data <- rlnorm(10000, 2.3, 0.4) # 定义定量下限(LLOQ) lloq <- 8 # 标记左删失观测:将LLOQ以下的值替换为LLOQ obs_left <- replace(original_data, original_data < lloq, lloq) # 拟合左删失模型并生成插补值 fit_left <- clm(log(obs_left) ~ 1, left = log(lloq)) imputed_left <- exp(imputed(fit_left))
左删失数据分布:
原始与插补数据密度对比:
右删失数据的优雅插补步骤
1. 预处理右删失数据
# 定义定量上限(ULOQ) uloq <- 15 # 标记右删失观测:将ULOQ以上的值替换为ULOQ obs_right <- replace(original_data, original_data > uloq, uloq)
2. 拟合右删失模型并生成插补值
clm函数支持通过right参数指定右侧截尾阈值,对数正态分布下我们只需对观测值取对数后建模:
# 拟合右删失对数正态模型 fit_right <- clm(log(obs_right) ~ 1, right = log(uloq)) # 生成插补值并转换回原尺度 imputed_right <- exp(imputed(fit_right))
3. 验证插补效果
把原始数据和插补后数据合并,绘制密度图对比:
# 转换为长格式用于绘图 overlayed <- data.frame(original = original_data, imputed = imputed_right) %>% tidyr::pivot_longer(everything(), names_to = "data_type", values_to = "value") # 绘制密度对比图 ggplot(overlayed) + geom_density(aes(x = value, linetype = data_type, color = data_type), alpha = 0.5, bw = 1.0) + geom_vline(xintercept = uloq, linetype = "dotted", color = "red") + labs(x = "生物标志物值", y = "密度", title = "原始数据与右删失插补数据对比") + theme_minimal()
右删失原始数据分布:
核心逻辑说明
对数正态分布取对数后服从正态分布,右删失对应正态分布的右侧截尾。censlm::clm原生支持右侧截尾建模,直接基于截尾正态分布生成符合假设的随机插补值,不需要对数据做翻转等额外变换,逻辑直观且代码简洁。
内容的提问来源于stack exchange,提问作者vlangen
相关产品推荐
相关产品推荐

