venpopov / bmm

An R package for easy and flexible Bayesian Measurement Modeling
https://venpopov.github.io/bmm/
GNU General Public License v2.0
12 stars 3 forks source link

[bug] `default_prior` does not work with grouped random effects #201

Closed GidonFrischkorn closed 6 months ago

GidonFrischkorn commented 6 months ago

Describe the bug When using a bmmformula that includes grouped random effects, such as the formula we use in the second example of our Tutorial manuscript:

LS_formula <- bmf(
  kappa ~ 0 + ageGroup:RI:cueCond + (0 + RI:cueCond || gr(id, by = ageGroup)), 
  thetat ~ 0 + ageGroup:RI:cueCond + (0 + RI:cueCond || gr(id, by = ageGroup))
)

then the default_prior function does not parse these effects correctly. As a result it only sets priors on the whole formula, as it does not recognize the gr() commond around the grouping variable ID.

To Reproduce Using the wmData of the second example, you can reproduce the error specifying the following bmmodel and bmf:

LS_model <- mixture2p(resp_error = "dev_rad")
LS_formula <- bmf(
  kappa ~ 0 + ageGroup:RI:cueCond + (0 + RI:cueCond || gr(id, by = ageGroup)), 
  thetat ~ 0 + ageGroup:RI:cueCond + (0 + RI:cueCond || gr(id, by = ageGroup))
)
default_priors(LS_formula, data = wmData, model = LS_model)

Here is a screenshot from the output: image

Expected behavior If implemented correctly, the bmm default priors specified in the bmmodel should be applied to the flat priors listed in the output.

venpopov commented 6 months ago

Strange. I can look into it

venpopov commented 6 months ago

Ok, this is not a problem with the grouped random effects, but a problem when there are random effects and an interaction only fixed effects:

data <- oberauer_lin_2017
model <- mixture2p('dev_rad')

# this is fine
formula <- bmf(
  kappa ~ 0 + set_size*session + (1|ID),
  thetat ~ 0 + set_size*session + (1|ID)
)

default_prior(formula, data, model)
#>                 prior     class               coef group resp   dpar  nlpar   lb   ub       source     link
#>        logistic(0, 1)    theta2                                             -Inf  Inf      default identity
#>          normal(0, 1)         b           session2                    kappa <NA> <NA> (vectorized) identity
#>          normal(0, 1)         b set_size2:session2                    kappa <NA> <NA> (vectorized) identity
#>          normal(0, 1)         b set_size3:session2                    kappa <NA> <NA> (vectorized) identity
#>          normal(0, 1)         b set_size4:session2                    kappa <NA> <NA> (vectorized) identity
#>          normal(0, 1)         b set_size5:session2                    kappa <NA> <NA> (vectorized) identity
#>          normal(0, 1)         b set_size6:session2                    kappa <NA> <NA> (vectorized) identity
#>          normal(0, 1)         b set_size7:session2                    kappa <NA> <NA> (vectorized) identity
#>          normal(0, 1)         b set_size8:session2                    kappa <NA> <NA> (vectorized) identity
#>  student_t(3, 0, 2.5)        sd                                       kappa    0           default identity
#>  student_t(3, 0, 2.5)        sd                       ID              kappa    0      (vectorized) identity
#>  student_t(3, 0, 2.5)        sd          Intercept    ID              kappa    0      (vectorized) identity
#>                (flat)         b                                      thetat                default identity
#>                (flat)         b           session2                   thetat           (vectorized) identity
#>                (flat)         b set_size2:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size3:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size4:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size5:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size6:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size7:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size8:session2                   thetat           (vectorized) identity
#>  student_t(3, 0, 2.5)        sd                                      thetat    0           default identity
#>  student_t(3, 0, 2.5)        sd                       ID             thetat    0      (vectorized) identity
#>  student_t(3, 0, 2.5)        sd          Intercept    ID             thetat    0      (vectorized) identity
#>          normal(0, 1)         b                                       kappa <NA> <NA>         user identity
#>          normal(2, 1)         b          set_size1                    kappa <NA> <NA>         user identity
#>          normal(2, 1)         b          set_size2                    kappa <NA> <NA>         user identity
#>          normal(2, 1)         b          set_size3                    kappa <NA> <NA>         user identity
#>          normal(2, 1)         b          set_size4                    kappa <NA> <NA>         user identity
#>          normal(2, 1)         b          set_size5                    kappa <NA> <NA>         user identity
#>          normal(2, 1)         b          set_size6                    kappa <NA> <NA>         user identity
#>          normal(2, 1)         b          set_size7                    kappa <NA> <NA>         user identity
#>          normal(2, 1)         b          set_size8                    kappa <NA> <NA>         user identity
#>        logistic(0, 1)         b          set_size1                   thetat <NA> <NA>         user identity
#>        logistic(0, 1)         b          set_size2                   thetat <NA> <NA>         user identity
#>        logistic(0, 1)         b          set_size3                   thetat <NA> <NA>         user identity
#>        logistic(0, 1)         b          set_size4                   thetat <NA> <NA>         user identity
#>        logistic(0, 1)         b          set_size5                   thetat <NA> <NA>         user identity
#>        logistic(0, 1)         b          set_size6                   thetat <NA> <NA>         user identity
#>        logistic(0, 1)         b          set_size7                   thetat <NA> <NA>         user identity
#>        logistic(0, 1)         b          set_size8                   thetat <NA> <NA>         user identity
#>           constant(0) Intercept                                  mu1        <NA> <NA>         user tan_half
#>           constant(0) Intercept                                  mu2        <NA> <NA>         user identity
#>        constant(-100) Intercept                               kappa2        <NA> <NA>         user identity

# this is not fine
formula <- bmf(
  kappa ~ 0 + set_size:session + (1|ID),
  thetat ~ 0 + set_size:session + (1|ID)
)

default_prior(formula, data, model)
#>                 prior     class               coef group resp   dpar  nlpar   lb   ub       source     link
#>        logistic(0, 1)    theta2                                             -Inf  Inf      default identity
#>                (flat)         b                                       kappa                default identity
#>                (flat)         b set_size1:session1                    kappa           (vectorized) identity
#>                (flat)         b set_size1:session2                    kappa           (vectorized) identity
#>                (flat)         b set_size2:session1                    kappa           (vectorized) identity
#>                (flat)         b set_size2:session2                    kappa           (vectorized) identity
#>                (flat)         b set_size3:session1                    kappa           (vectorized) identity
#>                (flat)         b set_size3:session2                    kappa           (vectorized) identity
#>                (flat)         b set_size4:session1                    kappa           (vectorized) identity
#>                (flat)         b set_size4:session2                    kappa           (vectorized) identity
#>                (flat)         b set_size5:session1                    kappa           (vectorized) identity
#>                (flat)         b set_size5:session2                    kappa           (vectorized) identity
#>                (flat)         b set_size6:session1                    kappa           (vectorized) identity
#>                (flat)         b set_size6:session2                    kappa           (vectorized) identity
#>                (flat)         b set_size7:session1                    kappa           (vectorized) identity
#>                (flat)         b set_size7:session2                    kappa           (vectorized) identity
#>                (flat)         b set_size8:session1                    kappa           (vectorized) identity
#>                (flat)         b set_size8:session2                    kappa           (vectorized) identity
#>  student_t(3, 0, 2.5)        sd                                       kappa    0           default identity
#>  student_t(3, 0, 2.5)        sd                       ID              kappa    0      (vectorized) identity
#>  student_t(3, 0, 2.5)        sd          Intercept    ID              kappa    0      (vectorized) identity
#>                (flat)         b                                      thetat                default identity
#>                (flat)         b set_size1:session1                   thetat           (vectorized) identity
#>                (flat)         b set_size1:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size2:session1                   thetat           (vectorized) identity
#>                (flat)         b set_size2:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size3:session1                   thetat           (vectorized) identity
#>                (flat)         b set_size3:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size4:session1                   thetat           (vectorized) identity
#>                (flat)         b set_size4:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size5:session1                   thetat           (vectorized) identity
#>                (flat)         b set_size5:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size6:session1                   thetat           (vectorized) identity
#>                (flat)         b set_size6:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size7:session1                   thetat           (vectorized) identity
#>                (flat)         b set_size7:session2                   thetat           (vectorized) identity
#>                (flat)         b set_size8:session1                   thetat           (vectorized) identity
#>                (flat)         b set_size8:session2                   thetat           (vectorized) identity
#>  student_t(3, 0, 2.5)        sd                                      thetat    0           default identity
#>  student_t(3, 0, 2.5)        sd                       ID             thetat    0      (vectorized) identity
#>  student_t(3, 0, 2.5)        sd          Intercept    ID             thetat    0      (vectorized) identity
#>          normal(2, 1)         b             1 | ID                    kappa <NA> <NA>         user identity
#>        logistic(0, 1)         b             1 | ID                   thetat <NA> <NA>         user identity
#>           constant(0) Intercept                                  mu1        <NA> <NA>         user tan_half
#>           constant(0) Intercept                                  mu2        <NA> <NA>         user identity
#>        constant(-100) Intercept                               kappa2        <NA> <NA>         user identity

Created on 2024-04-07 with reprex v2.1.0