【统计检验】贝叶斯检验

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

统计检验进阶:贝叶斯检验|原理+公式+Python实战+对比总结

贝叶斯检验是现代统计学与机器学习中极具实用价值的推断方法,它跳出传统假设检验(p值)的框架,用概率直接描述假设可信程度,特别适合小样本、需结合先验知识、要量化不确定性的场景。


一、贝叶斯检验到底是什么?(超通俗解释)

传统检验(t检验、F检验)只回答:
能不能拒绝原假设?(p < 0.05?)

贝叶斯检验回答:
在看到数据后,这个假设成立的概率有多大?

核心逻辑:
先验信念 + 新数据 → 更新为后验信念

就像:

  • 你一开始觉得某药有效(先验)
  • 做实验拿到数据(新证据)
  • 重新判断药物有效概率(后验)

二、贝叶斯检验 vs 传统假设检验(一眼看懂区别)

对比项传统频率检验(t/F/卡方)贝叶斯检验
核心思想长期频率、是否拒绝H0用数据更新假设的概率
输出结果p值、是否显著后验概率、贝叶斯因子
是否用先验不使用使用先验知识
结果解释偏间接直接:假设成立的概率
小样本表现
不确定性只能给置信区间完整后验分布

一句话总结:
传统检验做“判断”,贝叶斯检验做“概率更新”。


三、核心原理:贝叶斯定理(必须掌握)

贝叶斯检验的根基就是贝叶斯公式

P(H∣D)=P(D∣H)⋅P(H)P(D) P(H|D) = \frac{P(D|H) \cdot P(H)}{P(D)} P(HD)=P(D)P(DH)P(H)

各项含义:

  • P(H):先验概率(没看数据前,你对假设的相信程度)
  • P(D|H):似然(假设成立时,出现当前数据的概率)
  • P(D):归一化因子(所有假设下数据的总概率)
  • P(H|D):后验概率(看完数据后,假设的真实概率)

四、贝叶斯检验完整步骤(标准流程)

  1. 设定假设

    • H0:原假设(如药物无效)
    • H1:备择假设(如药物有效)
  2. 设定先验 P(H0)、P(H1)

    • 无信息先验:直接设 P(H0)=P(H1)=0.5
    • 有信息先验:用历史/专家知识设定
  3. 计算似然 P(D|H0)、P(D|H1)
    即:在假设下,数据出现的可能性。

  4. 计算后验概率
    P(H0∣D),P(H1∣D)P(H0|D),\quad P(H1|D)P(H0∣D),P(H1∣D)

  5. 决策

    • 若 P(H1|D) > P(H0|D) → 支持H1
    • 若 P(H0|D) > P(H1|D) → 支持H0

五、关键指标:贝叶斯因子 BF

贝叶斯因子用来衡量数据对两个假设的支持强度

公式:
BF10=P(D∣H1)P(D∣H0) BF_{10} = \frac{P(D|H_1)}{P(D|H_0)} BF10=P(DH0)P(DH1)

判断标准:

  • BF > 1:数据支持 H1
  • BF < 1:数据支持 H0
  • BF > 3:中等支持
  • BF > 10:强支持
  • BF > 30:极强支持

它比p值更科学、更直观


六、Python 实战:贝叶斯检验对比两种药物效果

我们用最常用的PyMC3实现贝叶斯建模、后验采样、可视化。

1. 生成模拟数据

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import norm

np.random.seed(42)

# 两组数据:药物A vs 药物B
n = 100
mu_a, mu_b = 70, 65
s_a, s_b = 10, 12

data_a = np.random.normal(mu_a, s_a, n)
data_b = np.random.normal(mu_b, s_b, n)

df = pd.DataFrame({'DrugA': data_a, 'DrugB': data_b})
print(df.head())

2. 数据分布可视化

plt.figure(figsize=(10, 5))
sns.kdeplot(data_a, label='Drug A', fill=True, color='blue')
sns.kdeplot(data_b, label='Drug B', fill=True, color='red')
plt.title('Drug Effectiveness Distribution')
plt.xlabel('Score')
plt.ylabel('Density')
plt.legend()
plt.show()

3. 构建贝叶斯模型 + MCMC采样

import pymc3 as pm

with pm.Model() as model:
    # 先验分布
    mu_a = pm.Normal('mu_a', mu=70, sigma=10)
    sigma_a = pm.HalfNormal('sigma_a', sigma=10)
    
    mu_b = pm.Normal('mu_b', mu=65, sigma=10)
    sigma_b = pm.HalfNormal('sigma_b', sigma=12)
    
    # 观测似然
    obs_a = pm.Normal('obs_a', mu=mu_a, sigma=sigma_a, observed=data_a)
    obs_b = pm.Normal('obs_b', mu=mu_b, sigma=sigma_b, observed=data_b)
    
    # 采样
    trace = pm.sample(2000, chains=1, cores=1, return_inferencedata=False)

4. 后验分布可视化

# 查看参数后验
pm.traceplot(trace)
plt.show()

# 对比两组均值后验
plt.figure(figsize=(12, 5))
sns.histplot(trace['mu_a'], kde=True, label='Drug A mean', color='blue')
sns.histplot(trace['mu_b'], kde=True, label='Drug B mean', color='red')
plt.title('Posterior Distribution of Drug Means')
plt.xlabel('Mean')
plt.legend()
plt.show()

5. 计算贝叶斯因子

# 简单估计:A均值 > B均值的比例
bf = np.mean(trace['mu_a'] > trace['mu_b'])
print(f"贝叶斯因子 BF10 ≈ {bf:.3f}")

七、贝叶斯检验的优点(为什么现在这么火)

  1. 可直接输出假设成立的概率
  2. 小样本下表现优秀
  3. 能融合先验知识(历史数据/专家经验)
  4. 提供完整后验分布,可量化不确定性
  5. 不依赖“显著性水平0.05”这种人为阈值
  6. 适合复杂模型、层次模型、高维参数

八、贝叶斯检验的缺点(必须知道)

  1. 计算量大,需要MCMC采样
  2. 结果受先验分布影响
  3. 模型收敛需要经验
  4. 入门门槛比t检验高
  5. 大数据下速度不如传统方法

九、什么时候用贝叶斯检验?(最佳场景)

  • 样本量 很小
  • 先验知识/历史数据可用
  • 需要量化不确定性
  • 医学、药物、可靠性、金融等风险敏感领域
  • 传统p值解释不清、结论不稳定的场景

十、总结(最精简背诵版)

  • 贝叶斯检验 = 先验 + 数据 → 后验概率
  • 核心公式:贝叶斯定理
  • 核心指标:贝叶斯因子 BF
  • 优势:小样本强、可解释、可融先验
  • 劣势:计算复杂、依赖先验
  • 适合:科研、医学、金融、小数据、不确定性分析

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeepModel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值