计算Cumulative Deficit Index:自定义失调规则的代码实现需求
累积缺陷指数(Cumulative Deficit Index)计算实现方案
核心逻辑
- 预先定义每个分析物z-score的失调判断规则(基于全局分位数)
- 逐行判断每个有效分析物是否失调(NA值直接跳过)
- 用「失调分析物数量」除以「有效分析物总数」得到个体的
dysreg_index
Python 实现代码(基于 Pandas)
1. 准备测试数据(模拟真实场景)
先生成带NA值的1500行数据集,和目标数据结构对齐:
import pandas as pd import numpy as np # 固定随机种子保证结果可复现 np.random.seed(42) # 生成4种分析物的z-score数据 data = pd.DataFrame({ 'alb_zscore': np.random.normal(0, 1, 1500), 'alp_zscore': np.random.normal(0, 1, 1500), 'pot_zscore': np.random.normal(0, 1, 1500), 'glu_zscore': np.random.normal(0, 1, 1500) }) # 随机插入10%的NA值模拟真实数据缺失 data = data.mask(np.random.random(data.shape) < 0.1)
2. 定义自定义失调规则
用字典存储每个分析物的判断逻辑,键是z-score列名,值是基于全局分位数的判断函数:
# 先计算所有z-score列的关键分位数(按需调整分位值) quantile_vals = data.quantile([0.125, 0.25, 0.75, 0.875]) # 自定义规则字典,直接加/删键值对即可扩展规则 dysreg_rules = { 'alb_zscore': lambda x: x < quantile_vals.loc[0.25, 'alb_zscore'], # 低于25%分位算失调 'alp_zscore': lambda x: x > quantile_vals.loc[0.75, 'alp_zscore'], # 高于75%分位算失调 'pot_zscore': lambda x: x < quantile_vals.loc[0.125, 'pot_zscore'] or x > quantile_vals.loc[0.875, 'pot_zscore'], # 超出12.5%-87.5%区间算失调 'glu_zscore': lambda x: x < quantile_vals.loc[0.25, 'glu_zscore'] or x > quantile_vals.loc[0.75, 'glu_zscore'] # 示例:超出四分位距算失调 }
3. 计算累积缺陷指数
# 生成每行的失调标记矩阵(1=失调,0=正常,NA保持) dysreg_markers = pd.DataFrame() for col, rule in dysreg_rules.items(): dysreg_markers[col] = data[col].apply(rule).astype(float) # 计算每行的失调分析物数量(自动忽略NA) dysreg_count = dysreg_markers.sum(axis=1, skipna=True) # 计算每行的有效分析物数量(非NA的列数) valid_test_count = data[list(dysreg_rules.keys())].count(axis=1) # 计算最终的累积缺陷指数 data['dysreg_index'] = dysreg_count / valid_test_count
关键细节说明
- 规则扩展性:新增分析物时,只需在
dysreg_rules里添加对应的列名和判断逻辑,核心计算代码无需修改 - NA值处理:
apply会保留原始NA,sum(skipna=True)和count()自动跳过NA,完全符合需求 - 分位数一致性:基于整个数据集计算分位数,确保所有个体使用统一的判断阈值
验证结果
查看前5行的计算结果:
print(data[['alb_zscore', 'alp_zscore', 'pot_zscore', 'glu_zscore', 'dysreg_index']].head())
内容的提问来源于stack exchange,提问作者burphound
相关产品推荐
相关产品推荐

