微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

请求帮助理解 tidybayes::add_predicted_draws 和 brms::posterior_predict 之间的明显差异

如何解决请求帮助理解 tidybayes::add_predicted_draws 和 brms::posterior_predict 之间的明显差异

我正在使用 rethinking 包中的 Howell1 数据集。

require(cmdstanr)
require(brms)
require(tidybayes)

data("Howell1")
d <- Howell1
d2 <- d[d$age > 18,]

d2$hs <- (d2$height - mean(d2$height))/ sd(d2$height)
d2$ws <- (d2$weight - mean(d2$weight))/ sd(d2$weight)

使用一个数字和一个分类预测器构建一个简单的 brms 模型

priors <- c(prior(normal(0,2),class = "Intercept"),prior(normal(0,class = 'b'),prior(cauchy(0,class = "sigma"))

m4.4 <- brm(formula = hs ~ 1 + ws + male,data = d2,family = gaussian,backend = "cmdstanr",prior = priors
          iter = 2000,warmup = 1000,chains = 4,cores = 4)

我想了解 add_fitted_draws 和 add_predicted_draws 的工作原理。

考虑 add_fitted_draws:

i <- 4 # looking at the results for a particular row of the input dataset
y <- posterior_epred(m4.4)
x <- d2 %>% add_fitted_draws(model = m4.4,value = "epred")
x %>% as_tibble() %>% filter(.row ==i) %>% dplyr::select(epred) %>% cbind(fitdr = y[,i]) %>% mutate(diff = fitdr - epred)

根据文档,add_fitted_draw 在内部使用了后验_epred 或其在 brms 中的等效项,并且结果完全匹配。

add_fitted_draaws

现在,当我继续在 add_predicted_draws 和后验_预测之间做完全相同的事情时,结果不匹配

yp <- posterior_predict(m4.4)
xp <- d2 %>% add_predicted_draws(model = m4.4,prediction = "pred")
xp %>% as_tibble() %>% filter(.row ==i) %>% dplyr::select(pred) %>% cbind(preddr = yp[,i]) %>% mutate(diff = preddr - pred)

add_predicted_draws

我很确定我的理解有差距,请指教。

会话信息如下:

R version 4.0.3 (2020-10-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.1 LTS

Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0

other attached packages:
[1] stringr_1.4.0 readr_1.4.0 tibble_3.0.4 tidyverse_1.3.0 MASS_7.3-53 bayesplot_1.8.0 cmdstanr_0.1.3 rethinking_2.13
[9] loo_2.4.1 gganimate_1.0.7 RColorBrewer_1.1-2 ggrepel_0.9.0 brms_2.14.4 Rcpp_1.0.5 rstan_2.21.2 StanHeaders_2.21.0-7
[17] cowplot_1.1.1 ggplot2_3.3.3 tidybayes_2.3.1 ggdist_2.4.0 modelr_0.1.8 tidyr_1.1.2 forcats_0.5.0 purrr_0.3.4
[25] dplyr_1.0.2 magrittr_2.0.1

PS:我也在 stan discourse 上发布了这个问题,但还没有收到回复。另外请让我知道这是否更好地发布在 stats.stackexchange 中。由于这更像是一个基于工具的问题,而不是一个概念性的问题,因此我将其发布在这里

解决方法

事实证明,这种差异是由于 brms::posterior_predict 不遵守种子设置而引起的

enter image description here

在与github中brms包的开发者讨论后,他root导致问题如下:

如果你设置了选项(mc.cores = ),后验预测 默认情况下将并行评估,除非您更改核心 争论。在 Windows 上,并行执行是通过 parallel::parLapply,我不知道该函数如何尊重种子, 如果有的话。串行执行代码(使用 1 个内核)时,结果 是可重现的。

一旦我将 mc.cores 设置为 1,我就不再看到后验预测和 add_predicted_draws 之间的差异。

因此我将问题标记为已解决。

相关的github链接是:

  1. https://github.com/mjskay/tidybayes/issues/280
  2. https://github.com/paul-buerkner/brms/issues/1073

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。