【时间序列分解方法】BEAST(贝叶斯突变、季节性和趋势估计器)模型

1 BEAST模型概述

BEAST(Bayesian Estimator of Abrupt Change, Seasonality, and Trend)是一种基于贝叶斯推断的时间序列分解方法,用于检测时间序列中的趋势变化、突变点(断点)、季节性变化以及噪声成分。该方法特别适用于分析环境、气候、经济和遥感数据,能够自动识别多个趋势变化点,并提供不确定性估计。
在这里插入图片描述

主要特点

  • 趋势检测:能够识别时间序列中的长期趋势及其变化点(如增长或下降的变化)。
  • 突变点检测:能够检测时间序列表现出结构性变化的时间点,如政策变化、自然灾害影响等。
  • 季节性检测:能够识别时间序列中的周期性模式(如年周期、月周期等)。
  • 贝叶斯框架:采用贝叶斯方法进行概率推断,能够提供趋势、季节性和变化点的不确定性估计。
  • 全自动化:不需要用户指定变化点的数量或位置,模型能够自动确定最优的分解方式。

优缺点

1、优势

  • 自动化:无需用户指定趋势或季节性变化点的数量,模型会自动检测。
  • 贝叶斯不确定性估计:提供变化点的置信区间,能够量化分析不确定性。
  • 适用于非平稳时间序列:能够处理趋势、季节性和突变点共存的情况。

2、局限性

  • 计算复杂度较高:由于采用 MCMC 采样,计算较为耗时,特别是对于长时间序列。
  • 对参数较为敏感:不同的先验假设可能会影响结果,需要一定的调参经验。
  • 对强噪声不够稳健:当数据中噪声较大时,可能出现误检变化点的情况。

2 数学原理

BEAST 的核心思想是将时间序列 Y(t) 分解为以下三个主要部分:Y(t)=T(t)+S(t)+R(t)

其中:

  • T(t):趋势(Trend),表示时间序列的长期变化趋势。
  • S(t):季节性(Seasonality),表示周期性变化模式。
  • R(t):残差(Residuals),表示噪声或其它未建模的变化。

为了估计 T(t) 和 S(t),BEAST 采用了一种 分段回归(piecewise regression) 方法,在不同的时间段上使用不同的回归模型。模型通过贝叶斯推断计算每个时间点是否存在趋势或季节性的变化,并估计它们的概率分布。

2.1 贝叶斯推断

BEAST 采用 可逆跳跃马尔可夫链蒙特卡洛(RJ-MCMC) 采样方法来估计趋势和季节性的变化。

  • RJ-MCMC(Reversible Jump MCMC) 允许模型在不同的复杂度之间跳跃,使得 BEAST 可以自动决定需要多少个变化点,而无需用户手动指定。
  • 通过后验概率计算,BEAST 为每个时间点提供可能的趋势变化或季节性变化的概率估计。

2.2 先验假设

BEAST 采用 稀疏先验(sparse priors) 来鼓励模型选择较少的突变点,从而避免过拟合:

  • 趋势变化点的数量服从泊松分布。
  • 季节性变化点的数量服从泊松分布。
  • 变化点的间距服从均匀分布。

2.3 变化点检测

在贝叶斯框架下,BEAST 计算每个时间点是否存在趋势或季节性的 变化概率,并使用 **贝叶斯因子(Bayes Factor)**来判断突变点的可信度。最终,BEAST 输出:

  • 变化点位置(突变发生的时间点)。
  • 趋势分解(不同时间段的趋势)。
  • 季节性模式(如果有周期性变化)。
  • 不确定性估计(变化点的置信区间)。

3 BEAST 的实现

BEAST 主要有以下几种实现方式:

  • R 语言实现 (Rbeast):提供了 R 语言的 BEAST 分析工具,适用于数据科学家和统计学家。
  • Python 版本 (pybeast):适用于 Python 用户,方便在机器学习和数据分析任务中使用。
  • MATLAB 版本:适用于工程与科学计算环境。

MATLAB提供工具箱-
Bayesian Changepoint Detection & Time Series Decomposition

在这里插入图片描述

3.1 R 语言示例

如果想在 R 语言中使用 BEAST,可以安装 Rbeast 包:

install.packages("Rbeast")
library(Rbeast)

# 生成示例时间序列数据
set.seed(123)
t <- 1:100
y <- sin(2 * pi * t / 12) + rnorm(100, 0, 0.5)

# 应用 BEAST 进行时间序列分解
result <- beast(y)

# 绘制结果
plot(result)

3.2 Python 语言示例

安装Rbeast工具箱:

pip install Rbeast

Python 可以使用 pybeast 进行分析:

import numpy as np
import pybeast

# 生成示例时间序列数据
np.random.seed(123)
t = np.arange(1, 101)
y = np.sin(2 * np.pi * t / 12) + np.random.normal(0, 0.5, size=100)

# 应用 BEAST 进行分析
result = pybeast.beast(y)

# 可视化结果
pybeast.plot(result)

3.3 MATLAB 语言示例

MATLAB 提供了 BEAST 的实现,可用于检测时间序列中的趋势(Trend)、突变点(Breakpoints) 和 季节性变化(Seasonality)。

BEAST工具箱安装

beastPath = 'C:\MATLAB\toolbox\rbeast'                   
eval( webread('http://b.link/rbeast') )  

%%%%%%%%%%%%%%%%%%%%%%%%%%% Note on Automatic Installtion %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% 1. Write permission needed for your chosen path; the variable name must be 'beastPath'.   %
% 2. If webread has a certificate error, run the following line instead:                    %
    eval(  webread( 'http://b.link/rbeast', weboptions('cert','') )  )                       %
% 3. If the automatic installation fails, please manually download all the files (see blow) %       
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

安装界面如下:
在这里插入图片描述

BEAST 应用示例:尼罗河流量数据(Nile.mat)

尼罗河流量数据案例来自 MATLAB 官网,使用 BEAST(Bayesian Estimator of Abrupt Change, Seasonality, and Trend)对 尼罗河流量数据(Nile.mat) 进行时间序列分析。数据记录了 1871 年至 1970 年尼罗河的年平均流量。

在 MATLAB 中,使用以下代码运行 BEAST:

load('Nile.mat')   % 载入尼罗河年流量数据
out = beast(Nile, 'season', 'none', 'start', 1871);  % 进行 BEAST 分解(无季节性)
plotbeast(out);   % 绘制结果

该分析仅关注 趋势变化,不考虑季节性成分(因为年流量数据通常不具有显著的周期性)。

在这里插入图片描述
BEAST 结果图分为多个子图,每个部分代表不同的时间序列特征。下面依次解析各个子图的含义。

(1) 第一行:趋势检测(Trend)
黑色圆点:原始数据点(1871-1970 年的年流量)。
绿色曲线:BEAST 估计的趋势成分。
绿色阴影区域:趋势的不确定性范围(置信区间)。
观察结果:在 1898-1900 年左右,趋势发生了显著下降,表明尼罗河流量在该时期经历了突变。

(2) 第二行:变化点概率(Changepoint Probability)
该子图显示了每个时间点的变化点(突变点)概率。
绿色峰值:表示该时间点可能是趋势变化点。
观察结果:在 1898-1900 年 期间,变化点概率剧增,说明 BEAST 认为该时间段内趋势发生了显著的结构性变化。

(3) 第三行:趋势阶数(Trend Order)
该子图显示了 BEAST 估计的趋势项阶数(趋势的复杂度)。
绿色曲线:趋势阶数的变化。
观察结果:趋势阶数在 1898-1900 年之前保持相对稳定,随后发生显著变化,表明趋势结构发生了突变。

(4) 第四行:趋势方向与强度(Slope Significance)
绿色区域:表示趋势上升。
红色区域:表示趋势下降。
蓝色区域:显著的突变点。
观察结果:
1898-1900 年之前,尼罗河的流量相对稳定(绿色区域)。
1898-1900 年后,流量下降(红色区域)。
该变化点附近有一个 蓝色高峰,表示突变的显著性较高。

(5) 第五行:残差(Residuals)
该子图显示了原始数据与 BEAST 估计趋势之间的残差。
观察结果:
绝大部分残差较小,表明 BEAST 对趋势的拟合较好。
1898-1900 年突变点附近的残差较大,说明模型在该点附近捕捉到了显著的变化。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WW、forever

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

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

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

打赏作者

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

抵扣说明:

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

余额充值