I haven’t read the paper in detail, but you may try the following model. I built it rather ad-hoc so not sure if that’s the best solution we have in brms. Please also note that the priors are just to get the model running with this non-sensible simulated data.
library(brms)
bform <- bf(
y ~ b0 + b1 * (age - omega) * step(omega - age) +
b2 * (age - omega) * step(age - omega),
b0 + b1 + b2 + alpha ~ 1 + (1|person),
# to keep omega within the age range of 0 to 10
nlf(omega ~ inv_logit(alpha) * 10),
nl = TRUE
)
df <- data.frame(
y = rnorm(330),
age = rep(0:10, 30),
person = rep(1:30, each = 11)
)
bprior <- prior(normal(0, 3), nlpar = "b0") +
prior(normal(0, 3), nlpar = "b1") +
prior(normal(0, 3), nlpar = "b2") +
prior(normal(0, 3), nlpar = "alpha")
make_stancode(bform, data = df, prior = bprior)
fit <- brm(bform, data = df, prior = bprior, chains = 1)
summary(fit)
# you need the github version of brms for this to run
marginal_effects(fit)