使用PyMC进行时间序列分层建模

在统计建模领域,理解总体趋势的同时解释群体差异的一个强大方法是分层(或多层)建模。这种方法允许参数随组而变化,并捕获组内和组间的变化。在时间序列数据中,这些特定于组的参数可以表示不同组随时间的不同模式。

今天,我们将深入探讨如何使用PyMC(用于概率编程的Python库)构建分层时间序列模型。

让我们从为多个组生成一些人工时间序列数据开始,每个组都有自己的截距和斜率。

 import numpy as npimport matplotlib.pyplot as pltimport pymc as pm# Simulating some datanp.random.seed(0)n_groups = 3  # number of groupsn_data_points = 100  # number of data points per groupx = np.tile(np.linspace(0, 10, n_data_points), n_groups)group_indicator = np.repeat(np.arange(n_groups), n_data_points)slope_true = np.random.normal(0, 1, size=n_groups)intercept_true = np.random.normal(2, 1, size=n_groups)y = slope_true[group_indicator]*x + intercept_true[group_indicator] + np.random.normal(0, 1, size=n_groups*n_data_points)

我们生成了三个不同组的时间序列数据。每组都有自己的时间趋势,由唯一的截距和斜率定义。

 colors = ['b', 'g', 'r']  # Define different colors for each groupplt.figure(figsize=(10, 5))# Plot raw data for each groupfor i in range(n_groups):plt.plot(x[group_indicator == i], y[group_indicator == i], 'o', color=colors[i], label=f'Group {i+1}')plt.title('Raw Data with Groups')plt.xlabel('Time')plt.ylabel('Value')plt.legend()plt.show()

下一步是构建层次模型。我们的模型将具有组特定的截距(alpha)和斜率(beta)。截距和斜率是从具有超参数mu_alpha、sigma_alpha、mu_beta和sigma_beta的正态分布中绘制的。这些超参数分别表示截距和斜率的组水平均值和标准差。

 with pm.Model() as hierarchical_model:# Hyperpriorsmu_alpha = pm.Normal('mu_alpha', mu=0, sigma=10)sigma_alpha = pm.HalfNormal('sigma_alpha', sigma=10)mu_beta = pm.Normal('mu_beta', mu=0, sigma=10)sigma_beta = pm.HalfNormal('sigma_beta', sigma=10)# Priorsalpha = pm.Normal('alpha', mu=mu_alpha, sigma=sigma_alpha, shape=n_groups)  # group-specific interceptsbeta = pm.Normal('beta', mu=mu_beta, sigma=sigma_beta, shape=n_groups)  # group-specific slopessigma = pm.HalfNormal('sigma', sigma=1)# Expected valuemu = alpha[group_indicator] + beta[group_indicator] * x# Likelihoody_obs = pm.Normal('y_obs', mu=mu, sigma=sigma, observed=y)# Samplingtrace = pm.sample(2000, tune=1000)

现在我们已经定义了模型并对其进行了采样。让我们检查不同参数的模型估计:

 # Checking the tracepm.plot_trace(trace,var_names=['alpha','beta'])plt.show()

最后一步是将原始数据和模型预测可视化:

 # Posterior samplesalpha_samples = trace.posterior['alpha'].valuesbeta_samples = trace.posterior['beta'].values# New x values for predictionsx_new = np.linspace(0, 10, 200)plt.figure(figsize=(10, 5))# Plot raw data and predictions for each groupfor i in range(n_groups):# Plot raw dataplt.plot(x[group_indicator == i], y[group_indicator == i], 'o', color=colors[i], label=f'Group {i+1} observed')x_new = x[group_indicator == i]# Generate and plot predictionsalpha = trace.posterior.sel(alpha_dim_0=i,beta_dim_0=i)['alpha'].valuesbeta = trace.posterior.sel(alpha_dim_0=i,beta_dim_0=i)['beta'].valuesy_hat = alpha[..., None] + beta[..., None] * x_new[None,:]y_hat_mean = y_hat.mean(axis=(0, 1))y_hat_std = y_hat.std(axis=(0, 1))plt.plot(x_new, y_hat_mean, color=colors[i], label=f'Group {i+1} predicted')plt.fill_between(x_new, y_hat_mean - 2*y_hat_std, y_hat_mean + 2*y_hat_std, color=colors[i], alpha=0.3)plt.title('Raw Data with Posterior Predictions by Group')plt.xlabel('Time')plt.ylabel('Value')plt.legend()plt.show()

从图中可以看出,分层时间序列模型很好地捕获了每组中的单个趋势,而阴影区域给出了预测的不确定性。

层次模型为捕获时间序列数据中的组级变化提供了一个强大的框架。它们允许我们在组之间共享统计数据,提供部分信息池和对数据结构的细微理解。使用像PyMC这样的库,实现这些模型变得相当简单,为健壮且可解释的时间序列分析铺平了道路。

https://avoid.overfit.cn/post/56ad545325504850ab2b7b7b9a264a61

作者:Charles Copley

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

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

相关文章

驱动开发 作业2

使用 ioctl 替换 write/read 控制 LED、蜂鸣器、马达、风扇,并使用 udev 来自动创建设备文件 完整代码目录,请看这个仓库依然使用之前 ARM 课程中的 common 中的结构体代码都差不多,就贴个 led.c ,用户空间测试代码 test.c 和头文…

剑指 Offer 57 - II: 和为s的连续正数序列

这里从0开始先然是不对的!滑动窗口思想很好用,相等了必定移动左边!让他变小!这都想不到! 首先看到返回值和题给条件明确这是一个滑动窗口任务/可变数组 ,所以要使用List,然后其中元素又是数组&a…

QSlider样式表

QSlider 的样式设置_qslider样式_robertkun的博客-CSDN博客 Qslider样式_qslider的多种样式_DayDay_Upppp的博客-CSDN博客 【Qt】QSlider----qss(round handle) 圆形滑块_qslider 圆形滑块_Qyee16的博客-CSDN博客 QT QSlider控件 样式表 渐变色的特殊格式_qslid…

SpringBoot 基于Redis的消息队列(基于发布订阅模型)

SpringBoot下Redis消息队列(基于发布订阅模型) 1. 什么是生产者/消费者模式? 消息队列一般是有两种场景 1、种是发布者订阅者模式 2、种是生产者消费者模式 生产者消费者模式 :生产者生产消息放到队列里,多个消费者同时监听队列&#xff0…

分布式——监控平台zabbix的认识与搭建

作为一个运维,需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等,利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件,我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●…

二叉树 — 折纸问题

题目: 一道Google真实出现过的面试题 将一段纸条放在桌上,然后从纸条下边向上方对折1次,压出折痕后展开,此时折痕是凹下去的(称为凹折痕),即折痕凸起的方向指向纸条的背面。如果从纸条的下边向上…

我的创作纪念日兼GPT模型简单介绍

目录 一、引言 二、收获与开端 2.1 问题:在创作的过程中都有哪些收获? 2.2 模型开端 三、日常与深入 3.1 问题:当前创作和你的学习是什么样的关系? 3.2 模型深入介绍 3.2.1 无监督预训练 3.2.2 有监督下游任务精调 四、…

云原生——什么是云原生数据库?

❄️作者介绍:奇妙的大歪❄️ 🎀个人名言:但行前路,不负韶华!🎀 🐽个人简介:云计算网络运维专业人员🐽 前言 突然间,云原生数据库就火了。根据IDC《2021年下半…

Spring 是什么?IoC 和 DI的区别

1. Spring 是什么?2. IoC是什么? 2.DI概念说明 1. Spring 是什么? 我们通常讲的Spring指的是Spring Framework(Spring框架),它是一个开源的框架,有着活跃而庞大的社区,这也是它之所谓经久不衰的原因。官方的解读是:Spring官网 翻译过来就是:Spring使Java编程对每…

React03-props 和 state 详解

一、props 组件传参 1. props 基本使用 我们在使用组件时可以向组件传递数据&#xff0c;在组件内可以使用 props 对象来调用传入的数据。 function Person(props) {return <div><h3>姓名&#xff1a;{props.name}</h3><h3>年龄&#xff1a;{props.…

接口测试-postman,JMeter与LoadRunner比较

目录 JMeter与LoadRunner比较 JMeter缺点 一.创建测试用例集、子集 二.创建测试用例 三.设置变量 四.添加响应处理 五.批量执行测试用例 总结&#xff1a; postman是一个谷歌出的轻量级的专门测试接口的小工具~&#xff08;PS&#xff1a;postman包括两种&#xff1a;C…

【项目部署】NGINX原生部署前端

如有拼错的单词感谢提醒~ 一.准备工作 为了方便文件的管理&#xff0c;我们先在服务器上创建一个专门存放项目的目录。 # 1.查看当前所在目录 pwd # 1.1 可以切换到根目录管理 cd /root # 2.创建一个专门存放项目的文件夹 mkdir services # 3.可以查看我们创建的文件夹 ls # …