统计检验进阶:贝叶斯检验|原理+公式+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(H∣D)=P(D)P(D∣H)⋅P(H)
各项含义:
- P(H):先验概率(没看数据前,你对假设的相信程度)
- P(D|H):似然(假设成立时,出现当前数据的概率)
- P(D):归一化因子(所有假设下数据的总概率)
- P(H|D):后验概率(看完数据后,假设的真实概率)
四、贝叶斯检验完整步骤(标准流程)
-
设定假设
- H0:原假设(如药物无效)
- H1:备择假设(如药物有效)
-
设定先验 P(H0)、P(H1)
- 无信息先验:直接设 P(H0)=P(H1)=0.5
- 有信息先验:用历史/专家知识设定
-
计算似然 P(D|H0)、P(D|H1)
即:在假设下,数据出现的可能性。 -
计算后验概率
P(H0∣D),P(H1∣D)P(H0|D),\quad P(H1|D)P(H0∣D),P(H1∣D) -
决策
- 若 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(D∣H0)P(D∣H1)
判断标准:
- 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}")
七、贝叶斯检验的优点(为什么现在这么火)
- 可直接输出假设成立的概率
- 小样本下表现优秀
- 能融合先验知识(历史数据/专家经验)
- 提供完整后验分布,可量化不确定性
- 不依赖“显著性水平0.05”这种人为阈值
- 适合复杂模型、层次模型、高维参数
八、贝叶斯检验的缺点(必须知道)
- 计算量大,需要MCMC采样
- 结果受先验分布影响
- 模型收敛需要经验
- 入门门槛比t检验高
- 大数据下速度不如传统方法
九、什么时候用贝叶斯检验?(最佳场景)
- 样本量 很小
- 有先验知识/历史数据可用
- 需要量化不确定性
- 医学、药物、可靠性、金融等风险敏感领域
- 传统p值解释不清、结论不稳定的场景
十、总结(最精简背诵版)
- 贝叶斯检验 = 先验 + 数据 → 后验概率
- 核心公式:贝叶斯定理
- 核心指标:贝叶斯因子 BF
- 优势:小样本强、可解释、可融先验
- 劣势:计算复杂、依赖先验
- 适合:科研、医学、金融、小数据、不确定性分析
2851

被折叠的 条评论
为什么被折叠?



