采用logistic或非参数算法生成MAR缺失数据的方法咨询
R环境下无OLS依赖的MAR缺失数据生成方案
1. 原生logit机制实现(零依赖,灵活度最高)
MAR的核心要求是变量的缺失概率仅与已观测到的其他变量有关,与变量自身的未观测取值无关,完全不需要依赖线性回归做底层,自己写逻辑10行代码就能实现logit形式的MAR生成:
- 先选定需要添加缺失的目标变量,再指定会影响缺失概率的已观测变量,给每个变量设置权重控制影响方向和强度
- 用logit连接函数把观测变量的加权组合映射到0-1的缺失概率区间,再做伯努利抽样生成缺失掩码
- 示例代码:
set.seed(123) # df为待处理的模拟数据集,目标是给y列添加MAR缺失,缺失概率和已观测的x1、x2相关 intercept <- -1.2 # 调整截距控制整体缺失率,这里大概对应20%左右的整体缺失 w1 <- 0.9 # x1取值越大,y的缺失概率越高 w2 <- -0.6 # x2取值越大,y的缺失概率越低 # 计算每个样本的缺失概率,全程无OLS拟合 miss_prob <- plogis(intercept + w1*df$x1 + w2*df$x2) # 按概率抽样生成缺失标记 miss_flag <- rbinom(nrow(df), size = 1, prob = miss_prob) # 赋值NA df$y[miss_flag == 1] <- NA
你可以自由在加权项里加非线性变换、交互项、分类变量虚拟变量,不受任何线性假设限制。
2. 非参数MAR生成思路
如果不想用任何参数化的概率模型,可以直接用这两种完全无模型假设的方法:
- 分位数分层法:把影响缺失的观测变量按分位数切成若干区间,给每个区间预设不同的缺失率,在区间内随机抽取对应比例的样本设为NA。比如把x1按四分位数分成4组,x1最高的组设40%缺失率,次高组20%,次低组10%,最低组5%,全程不需要拟合任何模型,完全满足MAR要求。
- 秩次排序法:把观测变量按取值从大到小排序,按秩次设置递增/递减的缺失概率,比如秩次越高缺失概率越高,只用到变量的排序信息,不需要对变量和缺失概率的关系做参数假设。
3. 现成可调用的函数
missMethods包的MAR生成系列函数:delete_MAR_logistic()直接实现logit机制的MAR生成,delete_MAR_rank()是基于秩次的非参数MAR实现,底层都不依赖OLS线性回归,直接传入数据集、缺失列、相关观测列和缺失率参数就能用。simFrame包的naGenerate()函数:支持自定义广义线性模型形式的缺失机制,可以直接指定logit连接函数生成MAR缺失,适合批量模拟场景。- 最新版
mice包的ampute()已经支持method = "logit"参数,会替换默认的线性概率模型,用logit变换计算缺失概率,如果习惯mice的工作流可以直接用这个参数,不需要换工具。
校验提示:生成缺失后建议做简单验证:按已观测变量分组看缺失率是否符合你预设的趋势,同时确认目标变量的缺失和自身取值没有显著相关性,避免误生成MNAR数据。
内容的提问来源于stack exchange,提问作者Damon C. Roberts
相关产品推荐
相关产品推荐

