使用python进行贝叶斯统计分析|附代码数据

news/2025/3/13 13:16:17/文章来源:https://www.cnblogs.com/tecdat/p/18236113

原文链接:http://tecdat.cn/?p=7637

最近我们被客户要求撰写关于贝叶斯统计的研究报告,包括一些图形和统计输出。

本文讲解了使用PyMC3进行基本的贝叶斯统计分析过程.  点击文末“阅读原文”获取完整代码数据******** )。

 
 
# Imports
import pymc3 as pm # python的概率编程包
import numpy.random as npr # numpy是用来做科学计算的
import numpy as np
import matplotlib.pyplot as plt # matplotlib是用来画图的
import matplotlib as mplfrom collections import Counter # ? 
import seaborn as sns # ? 
# import missingno as msno # 用来应对缺失的数据# Set plotting style
# plt.style.use('fivethirtyeight')
sns.set_style('white')
sns.set_context('poster')%load_ext autoreload
%autoreload 2
%matplotlib inline
%config InlineBackend.figure_format = 'retina'import warnings
warnings.filterwarnings('ignore')

**

拓端

,赞37

使用python进行贝叶斯统计分析 

  图片

贝叶斯公式 

贝叶斯主义者的思维方式 

根据证据不断更新信念

pymc3 

图片

常见的统计分析问题 

  • 参数估计: "真实值是否等于X"
  • 比较两组实验数据: "实验组是否与对照组不同? "

问题1: 参数估计 

"真实值是否等于X?"

或者说

"给定数据,对于感兴趣的参数,可能值的概率分布是多少?"

例 1: 抛硬币问题 

我把我的硬币抛了 _n_次,正面是 _h_次。这枚硬币是有偏的吗?

参数估计问题parameterized problem 

先验假设 

  • 对参数预先的假设分布:  p∼Uniform(0,1)
  • likelihood function(似然函数, 翻译这词还不如英文原文呢): data∼Bernoulli(p)
 
 
# 产生所需要的数据
from random import shuffle
total = 30
n_heads = 11
n_tails = total - n_heads
tosses = [1] * n_heads + [0] * n_tails
shuffle(tosses)

数据 

 
 
fig = plot_coins()
plt.show()

图片


点击标题查阅往期内容

图片

R语言中的block Gibbs吉布斯采样贝叶斯多元线性回归

图片

左右滑动查看更多

图片

01

图片

02

图片

03

图片

04

图片

MCMC Inference Button (TM) 

 
 
100%|██████████| 2500/2500 [00:00<00:00, 3382.23it/s]

结果 

 
 
pm.traceplot(coin_trace)
plt.show()

图片

In [10]:

 
 
 plt.show()

图片

  • 95% highest posterior density (HPD, 大概类似于置信区间) 包含了 region of practical equivalence (ROPE, 实际等同区间).
  •  

例 2: 药品活性问题 

我有一个新开发的分子X; X在阻止流感病毒复制方面有多好?

实验 

  • 测试X的浓度范围, 测量流感活性
  • 计算 IC50: 能够抑制病毒复制活性50%的X浓度.

data 

 
 
 import pandas as pdchem_df = pd.DataFrame(chem_data)
chem_df.columns = ['concentration', 'activity']
chem_df['concentration_log'] = chem_df['concentration'].apply(lambda x:np.log10(x))
# df.set_index('concentration', inplace=True)

参数化问题parameterized problem 

给定数据, 求出化学物质的IC50值是多少, 并且求出置信区间( 原文中the uncertainty surrounding it, 后面看类似置信区间的含义)?

先验知识 

  • 由药学知识已知测量函数(measurement function):  m=β1+ex−IC50
  • 测量函数中的参数估计, 来自先验知识: β∼HalfNormal(1002)
  • 关于感兴趣参数的先验知识: log(IC50)∼ImproperFlat
  • likelihood function: data∼N(m,1)

数据 

In [13]:

 
 
fig = plot_chemical_data(log=True)
plt.show()

图片

MCMC Inference Button (TM) 

In [16]:

 
 
pm.traceplot(ic50_trace[2000:], varnames=['IC50_log10', 'IC50'])  # live: sample from step 2000 onwards.
plt.show()

图片

结果 

In [17]:

 
 
pm.plot_posterior(ic50_trace[4000:], varnames=['IC50'], color='#87ceeb', point_estimate='mean')
plt.show()

图片

该化学物质的 IC50 大约在[2 mM, 2.4 mM] (95% HPD). 这不是个好的药物候选者. 在这个问提上不确定性影响不大, 看看单位数量级就知道IC50在毫摩的物质没什么用...

第二类问题: 实验组之间的比较 

"实验组和对照组之间是否有差别? "

例 1: 药品对IQ的影响问题 

药品治疗是否影响(提高)IQ分数?

 
 
 def ECDF(data):x = np.sort(data)y = np.cumsum(x) / np.sum(x)return x, ydef plot_drug():fig = plt.figure()ax = fig.add_subplot(1,1,1)x_drug, y_drug = ECDF(drug)ax.plot(x_drug, y_drug, label='drug, n={0}'.format(len(drug)))x_placebo, y_placebo = ECDF(placebo)ax.plot(x_placebo, y_placebo, label='placebo, n={0}'.format(len(placebo)))ax.legend()ax.set_xlabel('IQ Score')ax.set_ylabel('Cumulative Frequency')ax.hlines(0.5, ax.get_xlim()[0], ax.get_xlim()[1], linestyle='--')return fig

In [19]:

 
 
# Eric Ma自己很好奇, 从频率主义的观点, 差别是否已经是具有"具有统计学意义"from scipy.stats import ttest_indttest_ind(drug, placebo) # (非配对) t检验. P=0.025, 已经<0.05了

Out[19]:

 
 
Ttest_indResult(statistic=2.2806701634329549, pvalue=0.025011500508647616)

实验 

  • 参与者被随机分为两组:
    • 给药组 vs. 安慰剂组
  • 测量参与者的IQ分数

先验知识 

  • 被测数据符合t分布:  data∼StudentsT(μ,σ,ν)

以下为t分布的几个参数:

  • 均值符合正态分布:  μ∼N(0,1002)
  • 自由度(degrees of freedom)符合指数分布:  ν∼Exp(30)
  • 方差是positively-distributed:  σ∼HalfCauchy(1002)
  •  

数据 

In [20]:

 
 
fig = plot_drug()
plt.show()

图片

代码 

In [21]:

 
 
y_vals = np.concatenate([drug, placebo])
labels = ['drug'] * len(drug) + ['placebo'] * len(placebo)data = pd.DataFrame([y_vals, labels]).T
data.columns = ['IQ', 'treatment']

MCMC Inference Button (TM) 

结果 

In [24]:

 
 
pm.traceplot(kruschke_trace[2000:], varnames=['mu_drug', 'mu_placebo'])
plt.show()

图片

In [25]:

 
 
pm.plot_posterior(kruschke_trace[2000:], color='#87ceeb',varnames=['mu_drug', 'mu_placebo', 'diff_means'])
plt.show()

图片

  • IQ均值的差距为: [0.5, 4.6]
  • 频率主义的 p-value: 0.02 (!!!!!!!!)

注: IQ的差异在10以上才有点意义. p-value=0.02说明组间有差异, 但没说差异有多大. 这个故事说的是虽然有差异, 但是差异太小了, 也没啥意思.

In [27]:

 
 
 ax = adjust_forestplot_for_slides(ax)
plt.show()

图片

森林图:在同一轴上的95%HPD(细线),IQR(粗线)和后验分布的中位数(点),使我们能够直接比较治疗组和对照组。

In [29]:

 
 
ax = pm.plot_posterior(kruschke_trace[2000:], varnames=['effect_size'],color='#87ceeb')
overlay_effect_size(ax)

图片

  • 效果大小(Cohen's d, 效果微小, 效果中等, 效果很大)可以从微小到很大(95%HPD [0.0,0.77])。
  •  这种药很可能是无关紧要的。
  • 没有生物学意义的证据。

例 2: 手机消毒问题  

比较两种常用的消毒方法, 和我的fancy方法, 哪种消毒方法更好

实验设计 

  • 将手机随机分到6组: 4 "fancy" 方法 + 2 "control" 方法.

  • 处理前后对手机表面进行拭子菌培养

  • count 菌落数量, 比较处理前后的菌落计数

Out[30]:

 
 
sample_id                 int32
treatment                 int32
colonies_pre              int32
colonies_post             int32
morphologies_pre          int32
morphologies_post         int32
year                    float32
month                   float32
day                     float32
perc_reduction morph    float32
site                      int32
phone ID                float32
no case                 float32
frac_change_colonies    float64
dtype: object

数据 

In [32]:

 
 
fig = plot_colonies_data()
plt.show()

图片

先验知识 

菌落计数符合泊松Poisson分布. 因此...

  • 菌落计数符合泊松分布:  dataij∼Poisson(μij),j∈[pre,post],i∈[1,2,3...]

  • 泊松分布的参数是离散均匀分布:  μij∼DiscreteUniform(0,104),j∈[pre,post],i∈[1,2,3...]

  • 灭菌效力通过百分比变化测量,定义如下:  mupre−mupostmupre

MCMC Inference Button (TM) 

In [34]:

 
 
with poisson_estimation:poisson_trace = pm.sample(200000)
 
 
Assigned Metropolis to pre_mus
Assigned Metropolis to post_mus
100%|██████████| 200500/200500 [01:15<00:00, 2671.98it/s]

In [35]:

 
 
pm.traceplot(poisson_trace[50000:], varnames=['pre_mus', 'post_mus'])
plt.show()

图片

结果 

In [39]:

 
 
pm.forestplot(poisson_trace[50000:], varnames=['perc_change'], ylabels=treatment_order) #, xrange=[0, 110])
plt.xlabel('Percentage Reduction')ax = plt.gca()
ax = adjust_forestplot_for_slides(ax)

图片


图片

点击文末 “阅读原文”

获取全文完整资料。

本文选自《使用python进行贝叶斯统计分析》。

图片

图片

点击标题查阅往期内容

数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病
R语言中的block Gibbs吉布斯采样贝叶斯多元线性回归
Python用MCMC马尔科夫链蒙特卡洛、拒绝抽样和Metropolis-Hastings采样算法
R语言贝叶斯METROPOLIS-HASTINGS GIBBS 吉布斯采样器估计变点指数分布分析泊松过程车站等待时间
R语言马尔可夫MCMC中的METROPOLIS HASTINGS,MH算法抽样(采样)法可视化实例
python贝叶斯随机过程:马尔可夫链Markov-Chain,MC和Metropolis-Hastings,MH采样算法可视化
Python贝叶斯推断Metropolis-Hastings(M-H)MCMC采样算法的实现
Metropolis Hastings采样和贝叶斯泊松回归Poisson模型
Matlab用BUGS马尔可夫区制转换Markov switching随机波动率模型、序列蒙特卡罗SMC、M H采样分析时间序列R语言RSTAN MCMC:NUTS采样算法用LASSO 构建贝叶斯线性回归模型分析职业声望数据
R语言BUGS序列蒙特卡罗SMC、马尔可夫转换随机波动率SV模型、粒子滤波、Metropolis Hasting采样时间序列分析
R语言Metropolis Hastings采样和贝叶斯泊松回归Poisson模型
R语言贝叶斯MCMC:用rstan建立线性回归模型分析汽车数据和可视化诊断
R语言贝叶斯MCMC:GLM逻辑回归、Rstan线性回归、Metropolis Hastings与Gibbs采样算法实例
R语言贝叶斯Poisson泊松-正态分布模型分析职业足球比赛进球数
R语言用Rcpp加速Metropolis-Hastings抽样估计贝叶斯逻辑回归模型的参数
R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病
R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据
R语言中的block Gibbs吉布斯采样贝叶斯多元线性回归
Python贝叶斯回归分析住房负担能力数据集
R语言实现贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析
Python用PyMC3实现贝叶斯线性回归模型
R语言用WinBUGS 软件对学术能力测验建立层次(分层)贝叶斯模型
R语言Gibbs抽样的贝叶斯简单线性回归仿真分析
R语言和STAN,JAGS:用RSTAN,RJAG建立贝叶斯多元线性回归预测选举数据
R语言基于copula的贝叶斯分层混合模型的诊断准确性研究
R语言贝叶斯线性回归和多元线性回归构建工资预测模型
R语言贝叶斯推断与MCMC:实现Metropolis-Hastings 采样算法示例
R语言stan进行基于贝叶斯推断的回归模型
R语言中RStan贝叶斯层次模型分析示例
R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化
R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型
WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较
R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样
R语言贝叶斯推断与MCMC:实现Metropolis-Hastings 采样算法示例
R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化
视频:R语言中的Stan概率编程MCMC采样的贝叶斯模型
R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721137.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析

原文链接:http://tecdat.cn/?p=7923 原文出处:拓端数据部落公众号使用R和Python进行分析的主要好处之一是,它们充满活力的开源生态系统中总是有新的和免费提供的服务。如今,越来越多的数据科学家能够同时在R,Python和其他平台上使用数据,这是因为供应商向R和Python引入了…

【专题】2024医药研发趋势年度回顾白皮书报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=36410 原文出处:拓端数据部落公众号 在开始编纂2024年的药物研发合集之前,我们先概览当前研发管线中的药物总数,以确立后续分析所依托的框架。鉴于本报告合集的核心内容围绕这些药物展开,对“研发管线”的明确定义显得尤为重要。 在此,我…

代码随想录算法训练营第二十九天 | 491.非递减子序列 46.全排列 47.全排列II

491.非递减子序列 题目链接 文章讲解 视频讲解 层间去重:回溯法相当于深搜,所以所以是一直递归到叶节点才开始回溯; 每次进入backtracking也就进入了搜索树的下一层,所以每进入一层需要用一个used_set来记录使用过的元素;class Solution { private:vector<int> sub;…

6.6--链表

链表的定义 C++的定义链表节点方式,如下所示: // 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 };不定义构造函数,C++默认生成一个构造函数,但是这个构造函…

6.5--链表

链表的定义 C++的定义链表节点方式,如下所示: // 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 };不定义构造函数,C++默认生成一个构造函数,但是这个构造函…

python多进程 AttributeError: Cant get attribute on module __main__ (built-in)

在学习python多进程的发现一个问题 代码在单独的py文件中可以正确执行,但在jupyter notebook中会报错在此记录一下 解决后处理

智能仪表通过Modbus转Profinet网关与PLC通讯方案

Modbus转Profinet网关(XD-MDPN100/300)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus转Profinet网关集成了Modbus和Profinet两种协议,支持Modbus RTU主站/从站,并可以与RS485接口的设备,它自带网口和串口,既可以实现协议的转换,也可以实现接口的转…

5分钟入门大模型,就5分钟

这个是大模型系列课程的第一节。 接下来我带着大家一起拥抱新技术,分享的进展不会很快,大概一周一次,有这个是大模型系列课程的第一节。 接下来我带着大家一起拥抱新技术,分享的进展不会很快,大概一周一次,有空可以直播讲解或实操。为了照顾那些工程出身,甚至非技术同学…

(4)跨时钟域设计(多bit+FIFO)

一、引入   以上是多bit指示信号的传输与指示信号不同,多bit数据流具有连续性,即背靠背传输,同时要求信号具有较快的传播速度目前多bit数据流传输有两种,一种是借助SRAM,另一种是借助FIFO 二、FIFO   如果FIFO内数据写满则生成满信号,反压上游结点,上游停止写入新的…