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

摘要

状态空间建模是一种高效、灵便的办法,用于对大量的工夫序列和其余数据进行统计推断。本文介绍了状态空间建模,其观测值来自指数族,即高斯、泊松、二项、负二项和伽马散布。在介绍了高斯和非高斯状态空间模型的根本实践后,提供了一个泊松工夫序列预测的说明性例子。最初,介绍了与拟合非高斯工夫序列建模的其余办法的比拟。

绪论

状态空间模型为几种类型的工夫序列和其余数据的建模提供了一个对立的框架。结构性工夫序列、自回归综合挪动均匀模型(ARIMA)、简略回归、狭义线性混合模型和三次样条平滑模型只是一些能够示意为状态空间模型的统计模型的例子。最简略的一类状态空间模型是线性高斯状态空间模型(也被称为动静线性模型),常常被用于许多迷信畛域。

高斯状态空间模型

本节将介绍无关高斯状态空间模型实践的要害概念。因为卡尔曼滤波(Kalman filtering)背地的算法次要是基于Durbin和Koopman(2012)以及同一作者的相干文章。对于具备间断状态和离散工夫距离的线性高斯状态空间模型t=1, . . . ,n,咱们有

其中t∼N(0,Ht),t∼N(0,Qt)和1∼N(a1,P1)互相独立。咱们假如yt是一个p×1,t+1是一个m×1,t是一个k×1的向量。 = ( > 1 , . . . , > n ) >,同样y = (y > 1 , . . , y> n ) >。

状态空间建模的次要指标是在给定观测值y的状况下取得潜状态的常识。这能够通过两个递归算法实现,即卡尔曼滤波和平滑算法。从卡尔曼滤波算法中,咱们能够失去先行一步的预测后果和预测误差

和相干的协方差矩阵

利用卡尔曼滤波的后果,咱们建设了状态平滑方程,在工夫上向后运行,产生了

对于烦扰项t和t,对于信号t = Ztt,也能够计算相似的平滑预计。

高斯状态空间模型的例子

当初通过例子来阐明。咱们的工夫序列包含1969-2007年40-49岁年龄组每年每10万人中酒精相干的死亡人数(图1)。数据取自统计局。对于观测值 y1, ... . , yn,咱们假如在所有t = 1, . . . , n,其中t是一个随机游走的漂移过程

t∼N(0, 2 )。假如咱们没有对于初始状态1或斜率的先验信息。这个模型能够用状态空间的模式来写,定义为

在KFAS中,这个模型能够用以下代码来写。为了阐明问题,咱们手动定义所有的零碎矩阵,而不采纳默认值。

R> Zt <- matrix(c(1, 0), 1, 2)R> model_gaussian <-Model(deaths / population ~ -1 +custom(Z = Zt)

第一个参数是定义观测值的公式(左侧~)和状态方程的构造(右侧)。这里死亡人数/人口是一个单变量工夫序列,状态方程是用矩阵来定义的,为了放弃模型的可识别性,截距项用-1省略。观测程度方差通过参数H定义,NA值代表未知方差参数 2和 2 。预计之后,进行过滤和平滑递归。

KF(fit_gaussian)

在这种状况下,最大似然估计值对于 2是9.5,对于 2 是4.3。从卡尔曼滤波算法中,咱们失去了对状态的一步超前预测,at = (µt , t) 。请留神,即便斜率项在咱们的模型中被定义为工夫不变量(t = ),它也是由卡尔曼滤波算法递归预计的。因而,在每个工夫点t,当新的观测值yt可用时,的估计值被更新,以思考到yt所提供的新信息。在卡尔曼滤波完结时,an+1给出了咱们对所有数据下恒定斜率项的最终预计。这里斜率项被预计为0.84,标准误差为0.34。对于µt,卡尔曼滤波给出了一步的预测,然而因为状态是时变的,如果咱们对t=1, ..., n的µt估计值感兴趣,咱们还须要运行平滑算法。n的估计值。

图1显示了带有一步预测(红色)和平滑化(蓝色)的随机行走过程µt的估计值的察看后果。请留神典型的模型;在工夫t,卡尔曼滤波器计算一步向前预测误差vt = yt - µt,并应用它和先前的预测来修改下一个工夫点的预测。在这里,这在系列的开始阶段最容易看到,咱们的预测仿佛落后于观测值一个工夫步长。另一方面,平滑算法同时思考了每个工夫点的过来和将来的数值,从而产生了更平滑的潜过程的预计。

非高斯状态空间模型的例子

与酒精无关的死亡也能够天然地被建模为泊松过程。当初咱们的观测值yt是第t年与酒精无关的死亡的理论计数,而变动的人口规模则由裸露项ut来思考。状态方程放弃不变,但察看方程当初的模式是p(yt |µt) = Poisson(ute µt)。

R> Model(deaths ~ -1 ++ distribution = "poisson")

与之前的高斯模型相比,咱们当初须要用参数distribution(默认为 "高斯")来定义观测数据的散布。咱们还通过参数u来定义裸露项,并应用a1和P1的默认值。在这个模型中,只有一个未知参数,即 2 。这个参数被预计为0.0053,然而高斯模型和泊松模型之间 2 的理论值不能间接比拟,因为不同模型对µt的解释不同。泊松模型的斜率项预计为0.022,标准误差为1.4×10-4,对应于死亡人数每年减少2.3%。

图2显示了以高斯过程(蓝色)和泊松过程(红色)为模型(每10万人的死亡人数)的平滑预计。

任意的状态空间模型

通过联合后面的办法,能够绝对容易地构建大量的模型。对于这样做还不够的状况,能够通过间接定义零碎矩阵来构建任意状态空间模型。作为一个例子,咱们批改了之前的泊松模型,减少了一个额定的白噪声项,试图捕获数据的可能的适度离散。当初咱们的泊松强度模型是ut exp(µt + t),即

其中t∼N(0, 2 )如前,t∼N(0, 2)。这个模型能够用状态空间的模式来写,定义为

 Model(deaths ~ trend(2, Q = list(NA, 0)) +distribution = "poisson")

因为模型蕴含P1中的未知参数,咱们须要提供一个特定的模型更新函数。

R> update <- function(pars, model) {+ model\[ "custom"\] <- exp(pars)+ }
 fit(model_poisson,method = "BFGS")

从图3中咱们看到,高斯构造工夫序列模型和带有额定白噪声的泊松构造工夫序列模型对平滑趋势µt的预计简直没有区别。这是因为泊松过程的强度绝对较高。

例子

我当初用一个比后面的例子更残缺的例子来阐明KFAS的应用。数据还是由酒精无关的死亡组成,但当初有四个年龄组,即30-39岁、40-49岁、50-59岁和60-69岁,被一起作为一个多变量泊松模型来建模。

1969-2012年的死亡人数和相应年龄组的年人口规模都有,但作为阐明,咱们只应用2007年之前的数据,并对2008-2013年进行预测。图4显示了所有年龄组的每10万人的死亡人数。

ts.plot(window(data\[, 1:4\] / data\[, 5:8\], end = 2007)

这里我抉择了之前应用的泊松模型的一个多变量扩大。

这里t是带有漂移成分的随机游走,t是一个恒定的斜率,t是一个额定的白噪声成分,用于捕获序列的额定变动。我对程度和噪声成分的协方差构造不做限度。模型(4)能够用KFAS构建如下。

R> Model(Pred\[, 1:4\] ~+ trend(2, Q = list(matrix(NA, 4, 4)) distribution = "poisson"

更新函数为

R> updatefn <- function(pars, model, ...){+ model\[ etas \] <- crossprod(Q)+ crossprod(Q)+ model+ }

咱们能够先不通过模仿来预计模型参数,而后用这些估计值作为初始值再次运行重要性抽样的预计程序。在这种状况下,从重要性抽样步骤失去的后果实际上与从初始步骤失去的后果雷同。

fit(model, update,+ method = "BFGS")R> fit <- fit(model, updatefn = updatefn, inits =optimpar)

应用拟合模型的提取办法,咱们能够查看预计的协方差和相关矩阵。

R> varcordel\["Q",   "level"\]R> varcordel\["Q",  "custom"\]

状态空间模型的参数估计通常工作量很大,因为似然面蕴含多个最大值,从而使优化问题高度依赖于初始值。通常状况下,未知参数与未察看到的潜在状态无关,如本例中的协方差矩阵,简直没有先验常识。

因而,要猜出好的初始值是很有挑战性的,特地是在更简单的环境中。因而,在能够正当地确定找到适当的最优值之前,倡议应用多种初始值配置,可能有几种不同类型的优化办法。这里咱们应用察看到的系列的协方差矩阵作为协方差构造的初始值。在非高斯模型的状况下,另一个问题是,似然计算是基于迭代程序的,该程序应用一些终止条件(如对数似然的绝对变动)进行,因而对数似然函数实际上蕴含一些噪声。这反过来又会影响BFGS等办法的梯度计算,在实践上能够失去不牢靠的后果。因而,有时倡议应用无导数的办法,如Nelder-Mead。另一方面,BFGS通常比Nelder-Mead快得多,因而我更违心先尝试BFGS,至多在初步剖析中。咱们能够计算出状态的平滑预计。

R> out <- KF(model,)

咱们看到残差之间偶然有滞后的穿插相干,但总体上咱们能够对咱们的模型绝对称心。当初咱们能够用咱们预计的模型预测2008-2013年每个年龄组与酒精无关的死亡强度e t。因为咱们的模型是工夫变动的(u变动),咱们须要通过newdata参数为将来的察看样本提供模型。

predict(model,+ newdata ++ interval = "confidence",)

for (i in 1:4) ts.plot(data\[, i\]/data\[, 4 + i\], trend\[, i\], pred\[\[i\]\]

图7显示了察看到的死亡人数,1969-2007年的平滑趋势,以及2008-2013年的预测,还有95%的预测区间。当咱们将咱们的预测与实在的察看后果进行比拟时,咱们看到在事实中,最年长的年龄组(60-69岁)的死亡人数略有减少,而在预测期间,另一个年龄组的死亡人数大幅降落。局部起因是在此期间酒精生产总量简直枯燥降落,而这又可能是因为2008年、2009年和2012年酒精税的减少造成的。

探讨

状态空间模型提供了解决一大类统计问题的工具。在这里,我介绍了一个用于线性状态空间建模的办法。


最受欢迎的见解

1.在python中应用lstm和pytorch进行工夫序列预测

2.python中利用长短期记忆模型lstm进行工夫序列预测剖析

3.应用r语言进行工夫序列(arima,指数平滑)剖析

4.r语言多元copula-garch-模型工夫序列预测

5.r语言copulas和金融工夫序列案例

6.应用r语言随机稳定模型sv解决工夫序列中的随机稳定

7.r语言工夫序列tar阈值自回归模型

8.r语言k-shape工夫序列聚类办法对股票价格工夫序列聚类

9.python3用arima模型进行工夫序列预测