Skip to content

Instantly share code, notes, and snippets.

@plogacev
Created December 13, 2018 09:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save plogacev/da8e1ebd46ea74c311d2c0972ba730b8 to your computer and use it in GitHub Desktop.
Save plogacev/da8e1ebd46ea74c311d2c0972ba730b8 to your computer and use it in GitHub Desktop.
# based on the great vignette on specifying custom response distributions in brms:
# https://cran.r-project.org/web/packages/brms/vignettes/brms_customfamilies.html
library(languageR)
library(brms)
danish$RT <- exp(danish$LogRT)
danish$cSex <- ifelse(danish$Sex == "M", -1, 1) * 0.5
danish$cPrevError <- ifelse(danish$PrevError == "CORRECT", -0.5, 0.5)
lognormalParamMeanSigma <- custom_family(
"lognormalParamMeanSigma", dpars = c("mu", "sigma"),
links = c("identity", "log"), lb = c(0, 0),
type = "real"
)
stan_funs_lognormalParamMeanSigma <- "
real lognormalmean2mu(real mean, real sigma) {
real mu;
if (mean < 25) {
mu = log( mean + (exp(mean)-mean)/(exp(2*mean) + 1) ) - sigma^2/2;
} else {
mu = log( mean ) - sigma^2/2;
}
return mu;
}
real lognormalParamMeanSigma_lpdf(real y, real mean, real sigma) {
return lognormal_lpdf(y | lognormalmean2mu(mean, sigma), sigma);
}
real lognormalParamMeanSigma_rng(real mean, real sigma) {
return lognormal_rng(lognormalmean2mu(mean, sigma), sigma);
}
"
stanvars_lognormalParamMeanSigma <- stanvar(scode = stan_funs_lognormalParamMeanSigma, block = "functions")
m <- brm(RT ~ cSex + cPrevError + (cPrevError + 1|Subject), data = danish, family = lognormalParamMeanSigma,
stanvars = stanvars_lognormalParamMeanSigma, chains = 1)
summary(m)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment