匹配AGE与WEIGHT后两类样本BPM的统计显著性检验问题咨询
匹配后组间BPM差异检验操作流程
1. 依赖安装
需要用到的第三方库提前安装:
pip install pandas numpy scipy psmpy
2. 数据预处理
首先剔除核心变量的缺失值,避免影响匹配和检验结果:
import pandas as pd import numpy as np from scipy.stats import ttest_ind from psmpy import PsmPy from psmpy.functions import cohenD from psmpy.plotting import * # 你的示例数据 d = {'x': [1,1,0,1,0,0,1],'BPM':[70,55,45,np.nan,35,25,np.nan],'AGE': [50, 47,21, 50,24,47,16], 'WEIGHT': [50,100,50,np.nan,np.nan,100,27]} df = pd.DataFrame(data=d) # 剔除缺失值:匹配变量(AGE/WEIGHT)、分组变量(x)、结局变量(BPM)都不能有缺失 df_clean = df.dropna(subset=['x', 'AGE', 'WEIGHT', 'BPM']).reset_index(drop=True)
3. 执行倾向得分匹配(PSM)
通过PSM匹配AGE和WEIGHT两个协变量,平衡两组样本分布,解决样本不均衡问题:
# 初始化PSM对象,指定分组列为x,处理组取值为1,自变量为匹配用的AGE和WEIGHT psm = PsmPy(df_clean, treatment='x', indx=df_clean.index, exclude=['BPM']) # 计算倾向得分 psm.logistic_ps(balance=True) # 1:1匹配,也可以根据样本量调整为1:n匹配 psm.knn_matched(matcher='propensity_score', replacement=False, caliper=None) # 提取匹配后的数据 matched_df = psm.matched_df
4. 匹配平衡性校验
必须确认匹配后两个协变量在两组无显著差异,匹配结果才有效:
# 计算协变量的标准化均值差,小于0.1说明平衡效果达标 for col in ['AGE', 'WEIGHT']: smd = cohenD(matched_df[matched_df['x']==1][col], matched_df[matched_df['x']==0][col]) print(f"{col} 标准化均值差:{smd:.3f}")
如果两个变量的标准化均值差都<0.1,说明两组的AGE、WEIGHT分布已经基本一致,可以继续做差异检验。
5. 独立样本t检验
对匹配后两组的BPM做t检验,判断是否存在显著差异:
group1_bpm = matched_df[matched_df['x']==1]['BPM'] group0_bpm = matched_df[matched_df['x']==0]['BPM'] # 方差不齐的场景下用Welch t检验,equal_var设为False即可 t_stat, p_value = ttest_ind(group1_bpm, group0_bpm, equal_var=False) print(f"t统计量:{t_stat:.3f}, p值:{p_value:.3f}")
结果解读:
- 若p值 < 0.05,说明类别1和类别0的BPM存在统计学显著差异
- 若p值 ≥ 0.05,说明两组BPM无显著统计学差异
注:你提供的示例数据样本量太小,仅作代码流程演示,你的2万行真实样本量足够得到稳定的匹配和检验结果。
内容的提问来源于stack exchange,提问作者Zillur Rahman
相关产品推荐
相关产品推荐

