You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python生成MCAR、MAR、MNAR三类缺失值?相关问题咨询

关于生成MCAR、MAR、MNAR三类缺失值的问题解答

问题1:分步生成时,最终缺失率是否为三类缺失率之和?

不是。你的分步生成逻辑是每一步仅在当前未缺失的数据集上生成对应类型的缺失值,因此最终总缺失率是概率叠加后的结果,公式为:
总缺失率 = 1 - (1-p0) * (1-p1) * (1-p2)
其中p0、p1、p2分别是MCAR、MAR、MNAR的设定缺失率。

举个例子:如果p0=0.2,p1=0.2,p2=0.2,总缺失率是1 - 0.80.80.8 = 0.488(约48.8%),远小于0.2+0.2+0.2=0.6。这是因为每一步的缺失操作都只针对前一步剩下的非缺失数据,重复标记同一位置为缺失也不会改变最终的缺失状态。

问题2:是否存在同时引入三类缺失值的合并方法?

有两种可行思路:

思路1:预生成不重叠的缺失掩码,分别应用对应缺失机制

  • MCAR掩码:随机选择占总数据量p0的位置(确保这些位置未被其他掩码选中)
  • MAR掩码:在剩余非掩码位置中,根据MAR的依赖规则(比如与其他特征的相关性)选择p1比例的位置
  • MNAR掩码:在最后剩余的非掩码位置中,根据MNAR的规则(比如自身特征值的大小)选择p2比例的位置
  • 对每个掩码对应的位置,统一设置为缺失值。

思路2:基于概率分配缺失类型并一次性生成

自定义逻辑对每个数据点随机分配状态:

  • 以1-p0-p1-p2的概率保持非缺失
  • 以p0/(p0+p1+p2)的概率分配为MCAR类型,直接设为缺失
  • 以p1/(p0+p1+p2)的概率分配为MAR类型,根据MAR规则判断是否缺失
  • 以p2/(p0+p1+p2)的概率分配为MNAR类型,根据MNAR规则判断是否缺失

如果用你当前的produce_na工具,也可以先分别生成三个带单一缺失类型的数据集,再合并缺失位置,示例代码如下:

import numpy as np
import pandas as pd
from rmisstastic import produce_na

np.random.seed(0)

# 分别生成三种缺失类型的数据集
mcar_df = produce_na(frame.copy(), p_miss=p[0], mecha="MCAR")
mar_df = produce_na(frame.copy(), p_miss=p[1], mecha="MAR")
mnar_df = produce_na(frame.copy(), p_miss=p[2], mecha="MNAR")

# 合并缺失掩码:只要任意一个数据集该位置缺失,就设为缺失
combined_mask = mcar_df.isna() | mar_df.isna() | mnar_df.isna()
incop_df = frame.mask(combined_mask)

这种方式的总缺失率和分步生成结果一致,为1 - (1-p0)*(1-p1)*(1-p2),但可以一次性得到包含三类缺失的数据集。

内容的提问来源于stack exchange,提问作者Merely Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:50:25