含缺失值的净资产计算:结果差异与维度均值匹配问题咨询
带缺失值的财富维度均值匹配整体净资产均值问题解决
问题背景
数据集包含住房(housing)、商业资产(business)、金融资产(financial)、贷款(loan)、非住房贷款(loan_non_housing)变量,存在不同程度随机缺失值。净资产计算逻辑为:
- 资产项:若housing、business、financial全为NA则返回NA,否则忽略NA求和
- 负债项:若loan、loan_non_housing全为NA则返回NA,否则忽略NA求和
- 净资产:资产和负债均为NA则返回NA;仅资产为NA则取负负债;仅负债为NA则取资产;否则资产减负债
按年龄组和社会阶层分组计算时,mean(net_assets, na.rm = TRUE)的结果,与各维度常规均值(mean(housing, na.rm=TRUE)等)求和的结果差异显著,需要在保留原净资产缺失值处理逻辑的前提下,让维度均值的求和结果与整体净资产均值一致。
核心原因
常规维度均值是基于该维度自身非NA的所有样本计算,而整体净资产均值是基于排除了“资产全NA且负债全NA”的样本计算,两者的样本池不一致,导致求和结果不匹配。
解决方案:基于有效净资产样本计算维度均值
仅使用净资产非NA的样本(即原计算mean(net_assets, na.rm=TRUE)的样本)来计算各维度的均值,确保样本池完全一致,这样维度均值的求和结果会和整体净资产均值完全匹配。
代码实现
# 基于有效净资产样本的分组汇总 fig_net_assets_adjusted <- df %>% filter(!is.na(net_assets)) %>% # 过滤掉净资产为NA的无效样本 group_by(age_groups, social_class) %>% summarise( mean_net_assets = mean(net_assets), # 无需na.rm,已过滤NA # 基于有效样本计算各维度均值 mean_housing = mean(housing, na.rm = TRUE), mean_business = mean(business, na.rm = TRUE), mean_financial = mean(financial, na.rm = TRUE), mean_loan = mean(loan, na.rm = TRUE), mean_loan_non_housing = mean(loan_non_housing, na.rm = TRUE), # 验证维度均值求和是否匹配整体净资产均值 summed_mean = mean_housing + mean_business + mean_financial - mean_loan - mean_loan_non_housing )
验证逻辑
- 所有参与计算的样本都是净资产有效的样本,和计算
mean(net_assets, na.rm=TRUE)的样本完全一致 - 对每个有效样本来说,净资产等于「该样本中存在的资产值之和」减去「该样本中存在的负债值之和」
- 均值的和等于和的均值,因此基于有效样本计算的各维度均值之和,必然等于净资产的均值
对比常规均值的扩展代码
如果需要同时查看常规维度均值和调整后的维度均值,可以用以下代码:
fig_net_assets_combined <- df %>% group_by(age_groups, social_class) %>% summarise( mean_net_assets = mean(net_assets, na.rm = TRUE), # 常规维度均值(基于该维度自身非NA的所有样本) mean_housing_full = mean(housing, na.rm = TRUE), mean_business_full = mean(business, na.rm = TRUE), mean_financial_full = mean(financial, na.rm = TRUE), mean_loan_full = mean(loan, na.rm = TRUE), mean_loan_non_housing_full = mean(loan_non_housing, na.rm = TRUE), # 基于有效净资产样本的维度均值 mean_housing_valid = mean(housing[!is.na(net_assets)], na.rm = TRUE), mean_business_valid = mean(business[!is.na(net_assets)], na.rm = TRUE), mean_financial_valid = mean(financial[!is.na(net_assets)], na.rm = TRUE), mean_loan_valid = mean(loan[!is.na(net_assets)], na.rm = TRUE), mean_loan_non_housing_valid = mean(loan_non_housing[!is.na(net_assets)], na.rm = TRUE), # 验证匹配结果 summed_valid_mean = mean_housing_valid + mean_business_valid + mean_financial_valid - mean_loan_valid - mean_loan_non_housing_valid )
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

