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

如何用Python实现R同款Bland-Altman统计指标计算

Python实现与R输出一致的Bland-Altman统计指标

核心需求:已可生成Bland-Altman图,需计算偏倚(Bias)、一致性限(Limits of Agreement, LOA)及对应标准误、95%置信区间,和R的输出结果完全匹配。

R语言参考输出结果:

Standard deviation of bias:  6.52818 

Standard error of bias:  0.06593449 
Standard error for limits of agreement:  0.1126868 

Bias:  -5.855469e-13 
Bias- upper 95% CI:  0.1292452 
Bias- lower 95% CI:  -0.1292452 

Upper limit of agreement:  12.79523 
Upper LOA- upper 95% CI:  13.01612 
Upper LOA- lower 95% CI:  12.57434

计算逻辑

所有指标基于两种测量方法的差值序列计算,公式与R常用Bland-Altman分析包默认逻辑完全对齐:

  • 差值 d = 方法A测量值 - 方法B测量值,样本量为n
  • 偏倚(Bias):d的均值
  • 偏倚的标准差:d的样本标准差(自由度为n-1)
  • 偏倚的标准误:偏倚标准差 / sqrt(n)
  • 一致性限(LOA):Bias ± 1.96 * 偏倚标准差
  • LOA的标准误:偏倚标准差 * sqrt(3/n)
  • 95%置信区间:估计值 ± t分布临界值(自由度n-1,95%置信度) * 对应标准误,大样本下临界值近似为1.96

Python实现代码

import numpy as np
from scipy.stats import t

def bland_altman_stats(method1, method2, ci=0.95):
    # 计算两组测量的差值
    d = method1 - method2
    n = len(d)
    # 核心基础指标计算
    bias = np.mean(d)
    sd_d = np.std(d, ddof=1) # 采用样本标准差(自由度n-1)和R默认计算逻辑一致
    se_bias = sd_d / np.sqrt(n)
    loa_upper = bias + 1.96 * sd_d
    loa_lower = bias - 1.96 * sd_d
    se_loa = sd_d * np.sqrt(3/n)
    # 计算t分布临界值
    alpha = 1 - ci
    t_crit = t.ppf(1 - alpha/2, df=n-1)
    # 偏倚的95%置信区间
    bias_ci_upper = bias + t_crit * se_bias
    bias_ci_lower = bias - t_crit * se_bias
    # 上一致性限的95%置信区间
    loa_upper_ci_upper = loa_upper + t_crit * se_loa
    loa_upper_ci_lower = loa_upper - t_crit * se_loa
    # 下一致性限的95%置信区间,如需输出可自行补充打印
    loa_lower_ci_upper = loa_lower + t_crit * se_loa
    loa_lower_ci_lower = loa_lower - t_crit * se_loa

    # 打印与R输出格式完全一致的结果
    print(f"Standard deviation of bias:  {sd_d:.5f}\n")
    print(f"Standard error of bias:  {se_bias:.8f}")
    print(f"Standard error for limits of agreement:  {se_loa:.8f}\n")
    print(f"Bias:  {bias:.7e}")
    print(f"Bias- upper 95% CI:  {bias_ci_upper:.7f}")
    print(f"Bias- lower 95% CI:  {bias_ci_lower:.7f}\n")
    print(f"Upper limit of agreement:  {loa_upper:.5f}")
    print(f"Upper LOA- upper 95% CI:  {loa_upper_ci_upper:.5f}")
    print(f"Upper LOA- lower 95% CI:  {loa_upper_ci_lower:.5f}")

    # 返回字典格式结果方便后续调用
    return {
        "bias": bias,
        "sd_bias": sd_d,
        "se_bias": se_bias,
        "bias_95ci": (bias_ci_lower, bias_ci_upper),
        "loa_upper": loa_upper,
        "loa_lower": loa_lower,
        "se_loa": se_loa,
        "loa_upper_95ci": (loa_upper_ci_lower, loa_upper_ci_upper),
        "loa_lower_95ci": (loa_lower_ci_lower, loa_lower_ci_upper)
    }

调用示例

# 替换为实际的两组测量数据序列
method1 = np.array([1.2, 3.5, 5.1, ...])
method2 = np.array([1.3, 3.4, 5.0, ...])
stats_result = bland_altman_stats(method1, method2)

内容的提问来源于stack exchange,提问作者Carla Martins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:45:04