在 brms 中指定初始值

Specify initial values in brms

我正在尝试在 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()函数的文档,里面说要看rstan的文档,实在不明白怎么指定初始值。它说它应该是使用与 Stan 相同的参数名称的列表列表。

有人知道怎么做吗?

提前致谢!

编辑:事实证明收敛问题与初始值无关,但事实是我的数据被模型很好地解释了(没有假装,数据是模拟的;))几乎没有残差,stan 似乎不喜欢它 (previous post about this problem).

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

在你的情况下,你有参数“截距”,对应于协变量的“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() 函数中放置参数 inits = "0")。

不要被斯坦通过 brm 函数发出的警告 returns 推迟(放下)。正是这些警告使 Stan 与其他贝叶斯建模软件相比脱颖而出。正是汉密尔顿 Monte Carlo 方法 (MCMC) 和 NUTS 算法使得对链收敛性进行更详细的诊断成为可能,而其他采样方法(如 Gibbs 或 Metropolis)则不允许这样做。这是我们应该关注的重要资产。毕竟,正是我们链的收敛质量保证了我们的模型后验是可靠的,因为我们使用数值积分方法来找到它们。

最后,收敛问题与初始踢球有关。特别是如果模型是您要拟合数据的非线性模型。它不仅与最初的踢球有关,还与被宣布的先验者的素质有关。我不想在这里详细介绍,因为它逃避了最初的问题,但是,可以在这篇建议阅读的文章 https://solomonkurz.netlify.app/post/2021-06-05-don-t-forget-your-inits/ 中找到更多详细信息。