[英]MCMC Changepoint model in R
我想运行 MCMC 线性高斯多重变化点 model 来检测连续值的时间序列向量的变化点。
在这样做时,我正在考虑使用 MCMCregressChange function,但我在这里有几个问题:
(1) 如何获得这些模型的对数边际似然?
(2) MCMCregressChange function 和 MCMCresidualBreakAnalysis function 有什么区别?
R 脚本如下所示。 如果您能帮我解决这个问题,我将非常高兴。
library(MCMCpack)
set.seed(1234)
n <- 100
x1 <- runif(n, min = 0, max = 1)
x2 <- runif(n, min = 1, max = 2)
X <- c(x1,x2)
B0 <- 0.1
sigma.mu=sd(X)
sigma.var=var(X)
model0 <- MCMCregressChange(X ~ 1, m=0, b0=mean(X), mcmc=100, burnin=100, verbose = 1000,
sigma.mu=sigma.mu, sigma.var=sigma.var, marginal.likelihood="Chib95")
model1 <- MCMCregressChange(X ~ 1, m=1, b0=mean(X), mcmc=100, burnin=100, verbose = 1000,
sigma.mu=sigma.mu, sigma.var=sigma.var, marginal.likelihood="Chib95")
model2 <- MCMCregressChange(X ~ 1, m=2, b0=mean(X), mcmc=100, burnin=100, verbose = 1000,
sigma.mu=sigma.mu, sigma.var=sigma.var, marginal.likelihood="Chib95")
print(BayesFactor(model0, model1, model2))
plotState(model0)
plotChangepoint(model0)
plotState(model1)
plotChangepoint(model1)
plotState(model2)
plotChangepoint(model2)
文档的“值”小节描述了MCMCregressChange
返回的内容,指出 model 的对数边际可能性存储在属性logmarglike
中。 因此,它可以像访问
attr(model1, "logmarglike")
在代码中运行该行时也会报告这些属性值:
print(BayesFactor(model0, model1, model2))
至于模型的差异, MCMCresidualBreakAnalysis
是MCMCregressChange
的一个特例,即当X
是单变量时。 事实上, MCMCregressChange
的代码检查X
中的列数是否为 1,如果是,则将输入 arguments 重新格式化为对MCMCresidualBreakAnalysis
的调用。 由于后者也没有特定的附加参数,因此了解MCMCregressChange
更为通用,并且都需要使用。
加强这一点的是MCMCresidualBreakAnalysis
描述中的注释:
“代码主要是为
testpanelSubjectBreak
的内部使用而编写的。 ”
也就是说,虽然它是一个导出的 function,但它主要是由特定用例产生的方便 function。
除了 MCMCpack,我认为一些专门为变化点检测设计的贝叶斯模型可能会有用。 在 R 中,三个可能的包是bcp
、 mcp
和Rbeast
。 bcp
和mcp
在 model 拟合和数据类型处理方面更加通用。 Rbeast
是一种专门用于同时贝叶斯时间序列分解(类似于stl
)和变化点检测(类似于changepoint
)的方法; Rbeast
还报告了后验对数边际似然性,可用于比较变化点上的替代假设(更准确地说,对于变化点数的替代先验)。
以下是使用bcp
和Rbeast
的示例数据的一些快速结果。
set.seed(1234)
n = 100
x1 = runif(n, min = 0, max = 1)
x2 = runif(n, min = 1, max = 2)
X = c(x1,x2)
library(bcp)
fit=bcp(X)
plot(X)
平均而言,
bcp
查明大约 2 个变化点; 最佳位置由概率曲线中的峰值指示。 它也可以从sum(fit$posterior.prob,na.rm = TRUE)
获得。 我相信这里的bcp
适合分段常数模型; 上面绘制的平均曲线是许多 MCMC 采样分段常数模型的平均值,它给出了检测到的变化点周围的不规则性。
作为时间序列分解model, Rbeast
以“Y=季节性/周期性(如果存在)+趋势+误差”的形式拟合一个时间序列。 季节性和趋势分量分别建模为分段谐波曲线和分段线性(多项式)曲线。 鉴于样本数据中没有周期性分量,因此在以下代码中使用season='none'
来拟合仅趋势 model。 此外,作为变更点 model, Rbeast
允许用户指定变更点的可能数量范围; 如果允许的最小和最大变更点数相同,并且Rbeast
会将变更点数固定为常数; 例如, tcp.minmax=c(0,0)
指定趋势没有变化点。 对于每个分段趋势/分段,多项式阶数可以设置为允许的最小和最大阶数范围。 下面,我们将最小和最大阶数固定为零,以便将每个段拟合为一条恒定线(即,torder.minmax=c(0,0))。
library(Rbeast)
model0 = beast(X, season='none', tcp.minmax = c(0,0), torder.minmax = c(0,0) ) # no changepoint
model1 = beast(X, season='none', tcp.minmax = c(1,1), torder.minmax = c(0,0) ) # 1 changepoint
model2 = beast(X, season='none', tcp.minmax = c(2,2), torder.minmax = c(0,0) ) # 2 changepoints
plot(model0)
plot(model1)
plot(model2)
# These are the posterior log marginal likelihoods; the numbers will vary slightly
# across runs due to the MCMC nature.
model0$marg_lik # -460.6778
model1$marg_lik # -313.9160 (the most likely)
model2$marg_lik) # -315.8801
下面是 model1 的model1
,仅指定了 1 个更改点。 请注意,在前面,我们只是将变更点的数量指定为 1 Rbeast
仍然会找出最可能的位置; 它估计它随时间的发生概率(即绿色 Pr(tcp) 曲线),并确定最可能的位置(即垂直虚线)。 order_t 曲线描绘了充分拟合趋势所需的多项式曲线的平均阶数; 这里它是一条零线,因为我们将它固定为零(即,torder.minmax=c(0,0))。
下面是模型 2 的model2
,假设有 2 个变化点。 估计的变化点概率与bcp
结果大致相同。 在实践中,运行Rbeast
最合理的方法不是通过将变化点的数量固定为已知常数来指定强先验,而是指定一个宽范围并让 model 找出数字和位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.