首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在brms中指定初始值

在brms中指定初始值
EN

Stack Overflow用户
提问于 2021-02-04 17:16:25
回答 1查看 576关注 0票数 1

我试图在R中拟合一个brms模型,现在它不能很好地收敛,但是它在JAGS中运行得很好。惟一的区别是初始值,我想在brm()函数中指定自己的初始值。

我的模特:

代码语言:javascript
复制
    ### 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)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-14 13:17:12

为brms包指定初始值非常简单。您必须为模型中的每个参数声明一个值,但是对于每个Monte方法马尔可夫链(MCMC)数,您必须这样做。

在您的示例中,您有与协变量对应的参数"Intercept“、对应于协变量的"b”,以及brm函数默认声明的响应分布的"sd“(标准差)参数(在您的示例中是高斯)。

你可以试试这样的东西。试着从你的数据中调整起始点。

代码语言:javascript
复制
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/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66050575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档