在 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/ 中找到更多详细信息。
我正在尝试在 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/ 中找到更多详细信息。