我试图在R中拟合一个brms模型,现在它不能很好地收敛,但是它在JAGS中运行得很好。惟一的区别是初始值,我想在brm()函数中指定自己的初始值。
我的模特:
### Priors
prior_brms <- c(brms::prior(normal(0, 1), class = "Intercept"),
brms::prior(normal(0, 1), class = "b"),
brms::prior(inv_gamma(10^-3, 10^-3), class = "sd"))
### Fit
brms_mod <- brms::brm(formula = Y ~ species + X1 * species + (1|tree),
data = Data_stan,
prior= prior_brms,
iter = 10000 , warmup = 5000, thin = 5,
chains = 2, cores=2)我阅读了brm()函数doc,它告诉我要查看rstan的doc,我真的不知道如何指定初始值。它说,它应该是使用与Stan相同的参数名称的列表。
有人知道怎么做吗?
提前谢谢!
编辑:原来收敛问题与初始值无关,而是因为我的数据被模型很好地解释了(没有前向,数据是模拟的;)以至于几乎没有残差,斯坦似乎不喜欢这样做(previous post about this problem)。
发布于 2021-12-14 13:17:12
为brms包指定初始值非常简单。您必须为模型中的每个参数声明一个值,但是对于每个Monte方法马尔可夫链(MCMC)数,您必须这样做。
在您的示例中,您有与协变量对应的参数"Intercept“、对应于协变量的"b”,以及brm函数默认声明的响应分布的"sd“(标准差)参数(在您的示例中是高斯)。
你可以试试这样的东西。试着从你的数据中调整起始点。
rm(list = ls())
set.seed(943)
Data_stan <- data.frame( Y =rnorm(20,0,1),
X1 = rnorm(20,0,1)*5,
species= factor(rep(LETTERS[1:4],each=5)),
tree= factor(rep(c("I","II"),time=10)))
# Initial kicks
init_func <- function(chain_id=1) {
list ( Intercept = 0.5 ,
beta = 0.3 ,
sigma = 0.8)
}
# See an example output
init_func(chain_id = 1)
# In your case just two chains is needed.
init_list <- list(
init_func(chain_id = 1),
init_func(chain_id = 2)
)
# NUTS configuration
control <- list(
adapt_engaged = TRUE,
adapt_delta = 0.95, #increased from default of 0.8
stepsize = 0.05, # 0.05 default
max_treedepth = 15
)
### Priors
prior_brms <- c(brms::prior(normal(0, 1), class = "Intercept"),
brms::prior(normal(0, 1), class = "b"),
brms::prior(inv_gamma(10^-1, 10^-1), class = "sigma"))
### Fit
brms_mod <- brms::brm(formula = Y ~ species + X1 * species + (1|tree),
data = Data_stan,
prior= prior_brms,
iter = 4000 , warmup = 2000, thin = 2,
chains = 2, cores=6,
inits = init_list, control = control
)
summary(brms_mod)我不想混淆,但建议从每个马尔可夫链的不同踢开始。从伪随机数产生的猜测中,这是可能的。或者从等于零的初始值开始(将参数放在brm()函数中的"0“中)。
不要被斯坦通过brm函数的警告返回延迟(放下)。正是这些警告使斯坦相对于其他贝叶斯建模软件脱颖而出。正是汉密尔顿蒙特卡罗方法(MCMC)和螺母算法使得对链收敛进行更详细的诊断成为可能,而吉布斯或大都会等其他抽样方法则不允许这样做。这是我们应该关注的重要资产。毕竟,我们的链的收敛性保证了我们的模型后验是可靠的,因为我们使用数值积分方法来找到它们。
最后,收敛问题与初始踢有关。特别是如果模型是一个非线性模型,你要对数据进行拟合。它不仅与最初的开球有关,而且还与被宣布的前科的质量有关。我不想在这里详细讨论,因为它回避了最初的问题,但是,在本文中可以找到更多的细节,推荐阅读https://solomonkurz.netlify.app/post/2021-06-05-don-t-forget-your-inits/。
https://stackoverflow.com/questions/66050575
复制相似问题