首页 > 其他分享 >R语言动态广义相加模型GAM张量积交互项、傅立叶项、谐波回归分析季节性时间序列航空乘客数据

R语言动态广义相加模型GAM张量积交互项、傅立叶项、谐波回归分析季节性时间序列航空乘客数据

时间:2024-06-17 16:54:41浏览次数:31  
标签:张量积 季节性 绘制 模型 GAM 时间 时变 傅立叶 傅里叶

全文链接:https://tecdat.cn/?p=36497

原文出处:拓端数据部落公众号

季节性在真实的时间序列中是非常常见的。许多系列以周期性、规律性的方式变化。例如,冰淇淋销售在温暖的假期月份往往更高,而候鸟数量围绕年度迁徙周期强烈波动。由于季节性非常普遍,已经开发了许多时间序列和预测方法专门用于处理这个特征。

本文的目的是强调一种策略,用于在动态广义相加模型中捕捉季节性和时变季节性模式。

绘制季节性时间序列

我们将使用AirPassengers数据集,这是一个从1949年到1960年每月国际航空乘客的时间序列(以千为单位)。

5014d6aaae174a1da52d279f9b486da6~tplv-k3u1fbpfcp-jj-mark_0_0_0_0_q75.jpg

从这张图中可以清晰地看出,乘客数量存在强烈的季节性波动,但这种模式也似乎在随时间变化。一种常见的检查可能季节性模式的方法是计算和绘制STL分解(使用Loess的季节性和趋势分解),该方法利用Loess平滑来迭代地平滑和移除数据的某些成分(即可能是非线性的长期趋势和可能随时间变化的季节性)。

   

	  autoplot()

可以通过修改t.windows.window参数来调整趋势和季节性成分被平滑的周期,但这些对于本文来说并不是很重要。关键信息是,似乎存在一个长期的非线性趋势和一个随时间变化的循环季节性模式,这种变化不仅体现在幅度上,可能还在形状上略有不同。接下来,我们将介绍一些模型。首先,我们将时间序列转换为适合使用{mgcv}和{mvgam}包进行建模的data.frame()对象。这个函数还会自动将数据拆分为训练集和测试集,以便轻松评估不同模型的预测能力。

image.png 在将数据转换为正确的“长”格式之后,我们可以轻松地使用{mvgam}包的S3函数绘制时间序列的一些特征。

   
r复制代码
	plot_mvgam_s

自相关函数(ACF)图清晰地显示了强烈的自相关性和季节性证据,这正是我们希望在我们的模型中捕捉到的。

使用张量积交互项拟合mvgam模型

现在我们可以拟合一个模型来尝试捕捉这两个组成部分,即趋势和季节性模式。

   
mod1 <- mvgam(y ~ 
                te(season, time,
                   
                 

为了更深入地了解模型中的时间与时节交互平滑函数,我们可以方便地使用gratia::draw()函数从模型底层的gam对象(存储在返回模型对象的mgcv_model槽位中)进行查看。

9e3bc247e62f4f1683c2e86d900ab86c~tplv-k3u1fbpfcp-jj-mark_0_0_0_0_q75.jpg

1f4978fea85d4b39bb64dba506bf37f4~tplv-k3u1fbpfcp-jj-mark_0_0_0_0_q75.jpg

尽管此模型的样本外预测表现尚可,但不确定性区间可能稍显宽泛。如果你花些时间理解样条如何超出训练数据进行外推,这并不令人意外。在实际应用中,可能需要进一步调整模型或考虑其他方法来缩小预测的不确定性区间。

image.png

Forecasts from a Dynamic Generalized Additive Model with time-varying seasonality using a tensor product, fitted in mvgam

该模型表现尚可,但出于以下几个原因可能不是最优选择:

  1. 我们使用样条函数来捕捉时间维度,但众所周知,样条函数在外推时通常表现不佳
  2. 该模型假设季节性模式随时间样条函数的变化而变化的速率相同,而这可能并非总是最合适的模型。

使用傅里叶项来捕捉时变季节性

另一种捕捉时变季节性的方法是使用傅里叶变换。傅里叶级数通过不同频率的正弦和余弦项集合,通过加权来近似各种周期性函数。首先,我们使用forecast::fourier()函数来计算正弦和余弦函数,该函数会自动识别AirPassengers数据的月周期性,以计算正确频率的傅里叶项。在这里,我们将阶数K设置为4,这给我们提供了总共8个正弦和余弦预测器,这些预测器可以作为我们动态模型中的回归变量。这种模型通常被称为谐波回归,因为连续的傅里叶项可以被认为是前一个傅里叶项的谐波。

   

dplyr::glimpse(fou_terms)

image.png

观察这些傅里叶项(针对前24个时间点)有助于我们理解它们如何被视为一种特定的基函数扩展。

接下来,我们可以将这些新的预测变量添加到训练和测试数据集中。重要的是,我们也需要为样本外测试集添加这些项,因为这将用于帮助我们从模型中计算预测值。

然后,我们可以拟合一个mvgam()模型,该模型包括平滑的非线性时间趋势和时变季节性,但使用傅里叶项代替上面使用的循环样条。这首先通过使用时间的单调样条来实现,确保时间趋势永远不会下降,这在当前情况下似乎是合适的。时变季节性通过允许傅里叶项的系数随时间变化来实现,这通过使用s()包装器中的'by'参数并利用单独的样条来实现。这实际上设置了时间的独立样条,然后与傅里叶项进行交互,为每个傅里叶项制定了一个时变系数模型。

   
mod2 <- mvgam(y ~) 
                # 时间单调平滑,以确保趋势
                # 要么增加要么变平,但不会 
                # 下降
                s(time, bs = 'moi', k = 10) +
                
                # 时变傅立叶系数,以捕捉
                # 可能变化的季节性
                s(time, by = s1_12, k = 5) + # 时间变化的傅立叶系数,以捕捉 # 可能变化的季节性。

当然,该模型仍然使用时间样条来模拟趋势,但单调性限制确保了预测结果至少在一定程度上是可控的。基于样本内拟合的效果,我们更倾向于选择第二个模型,并可以通过近似留一交叉验证(Approximate Leave-One-Out Cross-Validation)轻松地比较两个模型的性能。在这里,我们更倾向于具有更高期望对数预测密度(ELPD)的模型。

image.png

但预测结果如何呢?这里我们绘制了两个模型的样本外预测结果,结果再次表明第二个模型略胜一筹

image.png

image.png

QQ截图20240613152131.png

查看平滑局部效应图,了解某些傅立叶系数的估计值随时间的变化情况

Time-varying Fourier coefficients from a Dynamic Harmonic Regression, fitted in mvgam

绘制谐波回归的趋势和季节成分

绘制该模型的图需要更多的工作,因为我们需要使用该模型的目标预测来直观地显示两个主要效应(即非线性趋势和随时间变化的季节性)。

首先是趋势图,在这个模型中使用参数可以很容易地计算出模型的期望值(即结果标度上的预测值,但忽略了负二项采样分布的超分散参数)。

现在是时变季节模式,需要从总预测值中减去条件趋势预测值

   

season_preds <- with_season - agg_r_season

现在,我们将这些效果绘制在一起

绘制用 mvgam 拟合的谐波回归动态广义加法模型的非线性趋势和时变季节性

这幅图清楚地显示了模型是如何估算出这两个组成部分的,以及季节模式在形状和幅度上随时间的变化情况

时变周期性

上例说明了如何利用傅立叶项来捕捉时变季节性。但如果周期性本身随时间变化呢?换句话说,如果一个序列开始时每 8 周出现一次有规律的周期性变化,但随后周期性窗口不断缩小或扩大,我们该如何建立模型呢?下面是一个非常简单的示例,说明我们如何扩展傅立叶策略,以对这种情况进行建模

首先,我定义了构建单调递增或递减系数的函数。这将有助于模拟时变周期性

   
  x <- sort(as.vector(scale(times)))
  exp(k * x) / (1 + exp(k * x))

现在进行模拟,包括构建两个不同周期的傅里叶级数(本例中为 "k = 12 "和 "k = 6"),每个周期有三个傅里叶项。然后,我模拟这些项的时变系数,迫使周期为 12 的项随时间下降为零,而周期为 6 的项随时间上升。这些系数加上模拟的傅立叶项本身,就可以模拟出一个周期性随时间从 ~12 缩小到 ~6 的时间序列。

绘制随时间变化的傅立叶系数图

Time-varying periodicity simulated in R

现在计算线性预测因子并绘制曲线

Time-varying periodicity simulated in R

最后,添加一些高斯随机漫步噪声,绘制模拟时间序列图

Time-varying periodicity simulated in R

现在我们可以构建用于建模的数据;这需要我们仔细考虑问题,并将两个周期性的傅立叶级数作为预测因子纳入其中

现在我们可以拟合动态 GAM,它使用状态空间表示法来捕捉随时间变化的季节性、周期性和随机漫步自相关过程

和之前一样,绘制时变傅立叶系数图

   
draw(trend_mgcv_model)

Time-varying Fourier coefficients to model time-varying periodicity in mvgam

和以前一样,我们的模型成功地捕捉到了这些项的时变系数。请注意,许多 12 期项(即 s1_12 和 c3_12)估计会随时间推移而下降,而许多 6 期项(即 s2_6 和 c3_6)估计会随时间推移而上升。令人鼓舞的是,该模型在处理随机漫步自相关过程和两个方差项(过程误差和观测误差)的同时,还能发现这些问题。

我们还可以使用后验期望绘制季节性时变图,就像上面第一个例子那样。但要注意的是,该图的预测不包括随机漫步部分。

现在,我们可以提取估算出的 RW 趋势,并减去季节性预测,这样就可以看到模型估算出的潜在非线性趋势了

   
treneds <- hinst(mod3, type = 'expected')$hiasts[[1]] - 
  sepreds

将二者绘制在一起。

使用 mvgam 捕捉谐波回归模型中的时变周期性

参考文献

以下论文和资源提供了有关动态谐波回归和使用 GAM 进行时间序列建模/预测的有用资料

Autin, M. A., & Edwards, D. 河口水质数据的非参数谐波回归 Environmetrics 21.6 (2010): 588-605.

Karunarathna, K. A. N. K., Wells, K., & Clark, N. J. (2024). 用分层动态广义加法模型模拟沙漠啮齿动物物种对环境变化的非线性响应Ecological Modelling, 490, 110648.

Young, P. C., Pedregal, D. J., & Tych, W. (1999). Dynamic harmonic regressionJournal of Forecasting, 18, 369-394.

标签:张量积,季节性,绘制,模型,GAM,时间,时变,傅立叶,傅里叶
From: https://www.cnblogs.com/tecdat/p/18252734

相关文章

  • 【工具推荐】基于Win10系统自带软件Xbox Game Bar录屏后下载安装ffmpeg然后使用ffmpeg
    本文详细介绍了如何基于Win10系统自带软件XboxGameBar录屏,以及如何下载安装ffmpeg,然后如何使用ffmpeg将录屏得到的mp4视频转换为可用于博客中做功能演示用的gif动态图片,同时还提供了一个一键转换脚本,减少繁琐的操作步骤。......
  • 有针对Pygame封装好各种模块的第三方库吗???
    #创意设计        最近刚学完Python,想做一个自己的GUI程序,具体要做什么没想好,但方法让我有点犯难。问题如下:    1.做GUI程序,以我的水平Python下能用的只有Tkinter、Pygame和easygui了。    2.Tkinter之前用过,用途简单一点的话没什么问题,程序需求复......
  • 贪吃蛇小游戏Python Pygame实现
    运行结果 游戏规则1.↑↓←→来控制蛇的移动方向2.蛇吃到自己身体的任意一部分游戏结束,自动退出窗口3. 蛇的速度会随游戏时间增长越来越快,与吃食物的多少(分数)无关4.蛇可以穿过边界到达另一边5.场上食物同时只会存在一个,颜色随机,但每个颜色的所得分......
  • C#实验 综合实例:生命游戏 game of life
    C#实验综合实例:生命游戏gameoflife《面向对象实验》嗨,我是射手座的程序媛,期待与大家更多的学习与交流,欢迎添加3512724768一、实验目的1.熟练掌握C#开发,编写WinForm应用程序。2.全面加深面向对象编程的概念,如类、对象、实例化等。3.学会使用C#图形图像编程。二、......
  • 【RabbitMQ】SpringAMQP--消息转换器
    在SpringAMQP的发送方法中,接收消息的类型是 Object,也就是说我们可以发送任意对象类型的消息,SpringAMQP会帮我们序列化为字节后发送。测试发送Object类型消息1.声明队列@ConfigurationpublicclassFanoutConfig{@BeanpublicQueueobjectQueue(){return......
  • P2734 [USACO3.3] 游戏 A Game
    原题链接题解首先,玩家一先选,那么玩家一该选最左边还是最右边呢?我们假设玩家一有穿越时空的能力,知晓了选择左边后的最大得分和选了右边后的最大得分,那么玩家一便能确定选哪个设\(dp[l][r]\)为当区间为\(l,r\)时先手最大分数选左边的最大得分:\(sumr-dp[2][r]+a[1]\)选右......
  • SpringAMQP使用管理RabbitMQ的五种消息模型
    使用SpringAMQ实现五种消息队列模型1.普通队列2.工作队列(WorkQueue)发布订阅=>根据交换机的不同分为三种3.订阅模型之Fanout(广播)4.订阅模型之Direct(路由)5.订阅模型之Topic(话题)使用前导:1.在生产者和消费者项目上分别导入RabbitMQ依赖<!--AMQP依赖,包含RabbitMQ-->......
  • [Tkey] CodeForces 1267G Game Relics
    太神了这题,膜拜出题人orz。思考一首先是大家都提到的一点,先抽卡再买。这里来做个数学分析。假设我们还剩\(k\)种没有买,其实我们是有式子来算出它的花费期望的。WIKI上提到,假设一个事件的概率为\(p\),则遇到它的期望为\(\frac{1}{p}\),因此,对于这个题,抽到一个新物品的概率显......
  • CF1913C Game with Multiset
    题目Inthisproblem,youareinitiallygivenanemptymultiset.Youhavetoprocesstwotypesofqueries:ADD\(x\)—addanelementequalto\(2^{x}\)tothemultiset;GET\(w\)—saywhetheritispossibletotakethesumofsomesubsetofthecur......
  • 【读脑仪game】
    读脑仪(Brain-ComputerInterface,BCI)游戏是一种利用脑电信号来控制游戏的新型交互方式。这类游戏通常需要专业的硬件设备来读取用户的脑电信号,并将这些信号转化为游戏中的控制信号。编写这样的游戏代码涉及到多个方面,包括硬件接口的通信、信号处理、游戏逻辑编程等。由于这......