是否可基于变量现有取值占比填充缺失值?如何实现?是否合理?
实现方法
以下提供两种常用分析工具的实现代码:
Python(Pandas 环境)
import pandas as pd import numpy as np # 假设存储数据的DataFrame名为df,二分类变量列名为`side` # 计算现有观测的取值占比 value_ratio = df['side'].value_counts(normalize=True) # 定位缺失值位置 missing_pos = df['side'].isna() # 按占比随机填充缺失值 df.loc[missing_pos, 'side'] = np.random.choice( value_ratio.index, size=missing_pos.sum(), p=value_ratio.values )
如果需要严格控制填充的Left/Right数量,避免随机抽样的微小波动,可以手动计算填充量:
left_cnt = round(500 * (973/(973+897))) right_cnt = 500 - left_cnt fill_values = ['Left']*left_cnt + ['Right']*right_cnt # 打乱顺序后填充 np.random.shuffle(fill_values) df.loc[missing_pos, 'side'] = fill_values
R 语言
library(dplyr) # 假设存储数据的data.frame名为df,二分类变量列名为`side` # 计算现有观测占比 value_ratio <- prop.table(table(df$side)) missing_num <- sum(is.na(df$side)) # 填充缺失值 df <- df %>% mutate(side = ifelse( is.na(side), sample(names(value_ratio), n(), replace = T, prob = value_ratio), side ))
方案合理性评估
这种按现有观测比例随机填充的方式属于单变量随机比例插补,合理性完全取决于数据的缺失机制和后续的分析目的:
属于合理方案的场景
- 数据满足完全随机缺失(MCAR):即取值缺失的概率和
side本身的取值、数据集中其他变量都没有关联,仅属于采集过程中的随机漏记 - 后续分析仅需要该变量的整体分布统计、或做简单的描述性分析,不需要探索该变量和其他变量的关联关系
- 本次缺失占比约为21%(500/2370),属于较低缺失占比区间,插补误差可控
属于不合理方案的场景
- 数据不是完全随机缺失:比如
Left取值的记录更容易漏记、或者某类特征的样本更容易出现缺失,这种情况下按现有比例填充会直接扭曲变量的真实分布 - 后续需要做回归分析、因果推断、相关性检验等关联类分析:单变量插补没有考虑该变量和其他协变量的关联,会低估变量方差,大概率导致分析结果出现偏差
- 如果缺失占比超过30%,该插补方式的误差会被放大,输出结论的可靠性极低
优化建议
如果有其他可利用的协变量,更推荐使用多重插补(MICE)方法,会同时考虑变量间的关联生成多组插补结果,最终合并估计量降低偏差;如果缺失机制不明确,建议额外做缺失敏感性分析,对比保留缺失值、插补后的结果差异,验证结论的稳定性。
内容的提问来源于stack exchange,提问作者user15300490
相关产品推荐
相关产品推荐

