如何使用来自R的BSTS包在一个图中绘制先验,对数似然和后验

时间:2017-10-28 15:17:16

标签: r plot bayesian

我还在了解更多关于bsts Package的信息,所以我正在使用R AirPassengers数据集并学习如何在预测中创建BSTS模型,

###library(lubridate)

###library(bsts)

###library(dplyr)

###library(ggplot2)

###Load the data

data("AirPassengers")

Y <- window(AirPassengers, start=c(1949, 1), end=c(1959,12))

ss <- AddLocalLinearTrend(list(), Y)

ss <- AddSeasonal(ss, Y, nseasons = 12)

bsts.model <- bsts(Y, state.specification = ss, niter = 500, ping=0, seed=2016)

burn <- SuggestBurn(0.1, bsts.model)

p <- predict.bsts(bsts.model, horizon = 12, burn = burn, quantiles = c(.025, .975))

我发现当我进一步查看bsts.model时,bsts.model $ previous返回给我这样的东西

Prior returning only 1 value

然后bsts.model$log.likelihood

BSTS Model Log.Likelihood with 500 MCMC draws

我认为后验分布的最后一个p $分布就是这个

Posterior distribution with 473 MCMC after burn each for month

以及我想知道的事情:

为什么先前只给出这一个值而不是分布?是否可以将这些绘制成一张图片/情节?

我使用EasyFit软件检查了AirPassengers数据集,然后使用这些参数ibb.co/dxwrvm将结果安装到Beta Distribution,但我想知道更多是否可以使用R来实现这些...

提前谢谢你

[编辑 - 2017年11月18日] ------------------------------------ --------------------

在下面我只能在可能性和后验之间进行绘图,因为我仍然无法得到先验来自何处的想法:

积(密度(ρ$分布))

行(密度(AirPassengers),类型=“l”)

Result Plotting

如果我定义自己的先验,我将使用随机t分布与rt(1000,12,650) 它生成1000次迭代,df = 12,中心线= 650,它将匹配整个绘图图像:

drawt = rt(1000,12,650)

线(密度(drawt))

with own prior definition

所以它清楚地看到这个先前(右侧)x似然(左侧)创造了这些后验分布,但是bsts包可以生成后面而我没有定义任何先验..有人可以帮我解释一下吗?

(我已经搜索了史蒂夫提到的州规范,但它只是给我一些趋势和季节性的先前信息列表,我仍然很难理解先前的分布在哪里,如果有的话,请在代码中给我更多真实的例子)

2 个答案:

答案 0 :(得分:0)

先验是观察方差的先验。它是一个反伽马分布,其中prior.guess作为标准偏差的猜测,而prior.df作为先前的样本大小。请参阅SdPrior的帮助页面。

我不确定你的意思是&#34; beta发布&#34;。 β分布是[0,1]上的分布(即它的支持)。你可能意味着&#34;分发在β&#34;&#34;&#34; (即回归系数),但在这个例子中没有意义,因为你所适合的模型没有回归系数。

另请注意,状态模型的参数有(独立的)先验分布。由于您使用的两种状态模型都是随机游走的组合,因此这些模型的唯一参数是随机游走中相应误差项的方差,因此这些也将是伽玛分布。您可以通过检查bsts.model $ state.specification找到这些先前的发行版。它是您在bsts调用中传递的state.specification参数的副本。在您的情况下,它是一个包含两个元素的列表,每个元素对应一个状态(趋势和季节性)。

答案 1 :(得分:0)

所以我最近做了很多研究,包括试验,错误和谷歌搜索, 我发现这项研究使用贝叶斯比我见过的其他人更有用

http://sisifospage.tech/2017-10-30-forecasting-bsts.html

并且我自己得出结论,将这些(先前,数据可能性,后验)预测到这样的一个图中:

情节(密度(bsts.model $ one.step.prediction.error),xlim = c(-100,1000),ylim = c(0,0.035)) //这些表示先前我假设

行(密度(p $ distribution)) //这些表示后验分布

行(密度(AirPassengers)) //这些表示数据可能性

结果我得到这样的结果:

Results

仍然 [纠正我,如果我错了]

我在R中读到关于Prior的帮助,我发现这些语句[如果模型不包含回归量,那么这只是残差标准差的先验,表示为由SdPrior创建的对象。]但是SdPrior只是数字对象,

和sisifospage.tech确实给出了如何使用SdPrior制作趋势组件的详细解释,然后我知道这些SdPrior及其兄弟是为了创建趋势组件的先前参数,并且最终结果包含在将one.step.prediction.error中的模型作为分析残差。