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

匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:09:04