原文链接:http://tecdat.cn/?p=6962
假设 有时间序列数据,如下所示。经验表明,目标变量y似乎与解释变量x有关。然而,乍一看,y的水平在中间移动,所以它似乎并不总是有固定的关系(背后有多个状态)(点击文末“阅读原文”获取完整代码数据)。
上面的样本数据创建如下。数据根据时间改变x和y之间的关系。
x <- rpois(500, lambda = 10)
y1 <- x * 4 + 20
y2 <- x * 2 + 60
noise <- rnorm(1:500, mean = 10, sd = 5)
y1 <- y1 + noise
y2 <- y2 + noise
y <- c(y1[1:200], y2[201:400], y1[401:500])
observed <- data.frame(x = x, y = y)
x和y1,y2之间的关系如下图所示。如果您知道x和y有两种状态,则x和y看起来像这样。
数据
在马尔可夫转换模型中,观察数据被认为是从几个状态生成的,并且如上所示很好地分离。
观察到的数据
创建马尔可夫转换模型
模型公式
参数的含义是
k
:马尔可夫转换模型的状态数。在这里,它被指定为后面有两个状态。sw
:使用逻辑指定每个参数在状态更改时是否更改p
:AR模型系数family
:(在GLM的情况下)概率分布族
输出中的制度1和制度2表示后面的两个状态 。
y1 <- x * 4 + 20
可以看到Regime 2 与之兼容。
可以说从调整后的R平方值整体上有所改善。
# Regime 2
# ---------
# Estimate Std. Error t value Pr(>|t|)
# (Intercept)(S) 30.2820 1.7687 17.1210 <2e-16 ***
# x(S) 3.9964 0.0913 43.7722 <2e-16 ***
# y_1(S) -0.0045 0.0203 -0.2217 0.8245
模型
对于每个regime,目标变量+指定的解释变量和处于该状态的概率以阴影绘制
每个时间点的概率
每次获取状态和更改点
如果你想知道你在某个特定时间点所在的regime,那么就选择那个时刻概率最高的 。
> probable
[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ]
[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ]
...
异常值/变化点是Regime更改的时间
c(FALSE, diff(probable) != 0)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[11] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
...
[181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[191] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[201] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
...
[381] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[391] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[401] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
...
[491] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
因此,我们可以看到检测到在第一次数据创建时指定的变化点(201,401th)附近的点。
本文中分析的数据、代码分享到会员群,扫描下面二维码即可加群!
资料获取
在公众号后台回复“领资料”,可免费获取数据分析、机器学习、深度学习等学习资料。
点击文末“阅读原文”
获取全文完整代码数据资料。
本文选自《R语言如何做马尔科夫转换模型markov switching model》。
点击标题查阅往期内容