Revision 85d0a0463621c30063752c5577e591be0de5ae60 authored by Dominique Makowski on 26 July 2021, 08:40:08 UTC, committed by cran-robot on 26 July 2021, 08:40:08 UTC
1 parent 601edcd
bayes_factors.R
## ----setup, include=FALSE-----------------------------------------------------
library(knitr)
options(knitr.kable.NA = "", digits = 2)
knitr::opts_chunk$set(
echo = TRUE,
comment = ">",
out.width = "100%",
message = FALSE,
warning = FALSE,
dpi = 150
)
pkgs <- c(
"rstanarm", "BayesFactor", "emmeans", "logspline", "lme4", "ggplot2",
"see", "insight", "emmeans", "knitr", "effectsize", "bayestestR"
)
if (!all(sapply(pkgs, require, quietly = TRUE, character.only = TRUE))) {
knitr::opts_chunk$set(eval = FALSE)
}
set.seed(4)
if (require("ggplot2") && require("see")) {
theme_set(theme_modern())
}
## ----deathsticks_fig, echo=FALSE, fig.cap="Bayesian analysis of the Students' (1908) Sleep data set.", fig.align='center', out.width="80%"----
# knitr::include_graphics("https://github.com/easystats/easystats/raw/master/man/figures/bayestestR/deathsticks.jpg")
## ----sleep_boxplot, echo=FALSE------------------------------------------------
# library(ggplot2)
#
# ggplot(sleep, aes(x = group, y = extra, fill = group)) +
# geom_boxplot() +
# theme_classic() +
# theme(legend.position = "none")
## ----rstanarm_model, eval = FALSE---------------------------------------------
# set.seed(123)
# library(rstanarm)
#
# model <- stan_glm(
# formula = extra ~ group,
# data = sleep,
# prior = normal(0, 3, autoscale = FALSE)
# )
## ---- echo=FALSE--------------------------------------------------------------
# model <- stan_glm(
# formula = extra ~ group,
# data = sleep,
# prior = normal(0, 3, autoscale = FALSE),
# refresh = 0
# )
## ---- echo=FALSE--------------------------------------------------------------
# null <- c(-1, 1)
# xrange <- c(-10, 10)
#
# x_vals <- seq(xrange[1], xrange[2], length.out = 400)
# d_vals <- dnorm(x_vals, sd = 3)
# in_null <- null[1] < x_vals & x_vals < null[2]
# range_groups <- rep(0, length(x_vals))
# range_groups[!in_null & x_vals < 0] <- -1
# range_groups[!in_null & x_vals > 0] <- 1
#
# ggplot(mapping = aes(x_vals, d_vals, fill = in_null, group = range_groups)) +
# geom_area(color = "black", size = 1) +
# scale_fill_flat(name = "", labels = c("Alternative", "Null")) +
# labs(x = "Drug effect", y = "Density") +
# coord_cartesian(ylim = c(0, 0.45)) +
# theme_modern() +
# theme(legend.position = c(0.2, 0.8))
#
# pnull <- diff(pnorm(null, sd = 2.5))
# prior_odds <- (1 - pnull) / pnull
## ----rstanarm_fit, echo=FALSE-------------------------------------------------
# library(bayestestR)
# model_prior <- unupdate(model)
# posterior <- insight::get_parameters(model)$group2
# prior <- insight::get_parameters(model_prior)$group2
#
# f_post <- logspline::logspline(posterior)
#
# d_vals_post <- logspline::dlogspline(x_vals, f_post)
#
# ggplot(mapping = aes(x_vals, d_vals_post, fill = in_null, group = range_groups)) +
# geom_area(color = "black", size = 1) +
# scale_fill_flat(name = "", labels = c("Alternative", "Null")) +
# labs(x = "Drug effect", y = "Density") +
# coord_cartesian(ylim = c(0, 0.45)) +
# theme_modern() +
# theme(legend.position = c(0.2, 0.8))
#
# My_first_BF <- bayesfactor_parameters(model, null = c(-1, 1), prior = model_prior)
#
# BF <- My_first_BF$BF[2]
# post_odds <- prior_odds * BF
#
# med_post <- point_estimate(posterior)$Median
## ---- eval=FALSE--------------------------------------------------------------
# My_first_BF <- bayesfactor_parameters(model, null = c(-1, 1))
# My_first_BF
## ---- echo=FALSE--------------------------------------------------------------
# print(My_first_BF)
## -----------------------------------------------------------------------------
# library(see)
# plot(My_first_BF)
## -----------------------------------------------------------------------------
# effectsize::interpret_bf(exp(My_first_BF$log_BF[2]), include_value = TRUE)
## ---- eval=FALSE--------------------------------------------------------------
# My_second_BF <- bayesfactor_parameters(model, null = 0)
# My_second_BF
## ---- echo=FALSE--------------------------------------------------------------
# My_second_BF <- bayesfactor_parameters(
# data.frame(group2 = posterior),
# data.frame(group2 = prior),
# null = 0
# )
#
# print(My_second_BF)
## -----------------------------------------------------------------------------
# plot(My_second_BF)
## ----savagedickey_one_sided, eval=FALSE---------------------------------------
# test_group2_right <- bayesfactor_parameters(model, direction = ">")
# test_group2_right
## ----prior_n_post_plot_one_sided, echo=FALSE----------------------------------
# test_group2_right <- bayesfactor_parameters(
# data.frame(group2 = posterior),
# data.frame(group2 = prior),
# null = 0,
# direction = ">"
# )
#
# BF <- test_group2_right$BF
#
# print(test_group2_right)
## -----------------------------------------------------------------------------
# plot(test_group2_right)
## ----inteval_div, eval=FALSE--------------------------------------------------
# test_group2_dividing <- bayesfactor_parameters(model, null = c(-Inf, 0))
# test_group2_dividing
## ----inteval_div2, echo=FALSE-------------------------------------------------
# test_group2_dividing <- bayesfactor_parameters(
# data.frame(group2 = posterior),
# data.frame(group2 = prior),
# null = c(-Inf, 0)
# )
#
# print(test_group2_dividing)
## -----------------------------------------------------------------------------
# plot(test_group2_dividing)
## -----------------------------------------------------------------------------
# my_first_si <- si(
# posterior = data.frame(group2 = posterior),
# prior = data.frame(group2 = prior),
# BF = 1
# )
#
# print(my_first_si)
## -----------------------------------------------------------------------------
# plot(my_first_si)
## ----brms_disp, eval = FALSE--------------------------------------------------
# library(brms)
#
# # intercept only model
# m0 <- brm(Sepal.Length ~ 1, data = iris,
# save_pars = save_pars(all = TRUE), refresh = 0, backend = "rstan")
#
# # main effects models
# m1 <- brm(Sepal.Length ~ Petal.Length, data = iris,
# save_pars = save_pars(all = TRUE), refresh = 0, backend = "rstan")
#
# m2 <- brm(Sepal.Length ~ Species, data = iris,
# save_pars = save_pars(all = TRUE), refresh = 0, backend = "rstan")
#
# # additive main effects model
# m3 <- brm(Sepal.Length ~ Species + Petal.Length, data = iris,
# save_pars = save_pars(all = TRUE), refresh = 0, backend = "rstan")
#
# # full model
# m4 <- brm(Sepal.Length ~ Species * Petal.Length, data = iris,
# save_pars = save_pars(all = TRUE), refresh = 0, backend = "rstan")
## ----brms_models_disp, eval = FALSE-------------------------------------------
# library(bayestestR)
#
# comparison <- bayesfactor_models(m1, m2, m3, m4, denominator = m0)
# comparison
## ---- echo = FALSE------------------------------------------------------------
# comparison <- structure(
# list(Model = c("Petal.Length", "Species", "Species + Petal.Length", "Species * Petal.Length", "1"),
# log_BF = c(102.600193981361, 68.5488807613052, 128.665504913167, 128.919384882682, 0)),
# class = c("bayesfactor_models", "see_bayesfactor_models", "data.frame"),
# row.names = c("m1", "m2", "m3", "m4", "m0"),
# denominator = 5L,
# BF_method = "marginal likelihoods (bridgesampling)",
# unsupported_models = FALSE)
# print(comparison)
## ----update_models1-----------------------------------------------------------
# update(comparison, reference = 3)
## ----update_models2-----------------------------------------------------------
# update(comparison, reference = 2)
## -----------------------------------------------------------------------------
# as.matrix(comparison)
## ----lme4_models--------------------------------------------------------------
# library(lme4)
#
# # define models with increasing complexity
# m0 <- lmer(Sepal.Length ~ (1 | Species), data = iris)
# m1 <- lmer(Sepal.Length ~ Petal.Length + (1 | Species), data = iris)
# m2 <- lmer(Sepal.Length ~ Petal.Length + (Petal.Length | Species), data = iris)
# m3 <- lmer(Sepal.Length ~ Petal.Length + Petal.Width + (Petal.Length | Species), data = iris)
# m4 <- lmer(Sepal.Length ~ Petal.Length * Petal.Width + (Petal.Length | Species), data = iris)
#
# # model comparison
# bayesfactor_models(m1, m2, m3, m4, denominator = m0)
## -----------------------------------------------------------------------------
# iris_model <- stan_glm(Sepal.Length ~ Species + Petal.Length,
# data = iris,
# prior = normal(0, c(2, 1.2, 1.2), autoscale = FALSE),
# refresh = 0
# )
## -----------------------------------------------------------------------------
# botanist_hypotheses <- c(
# "Petal.Length > 0",
# "(Speciesversicolor > 0) & (Speciesvirginica > 0)"
# )
## -----------------------------------------------------------------------------
# model_prior <- unupdate(iris_model)
#
# botanist_BFs <- bayesfactor_restricted(
# posterior = iris_model,
# prior = model_prior,
# hypothesis = botanist_hypotheses
# )
#
# print(botanist_BFs)
## ----plot_iris, echo=FALSE----------------------------------------------------
# ggplot(iris, aes(Petal.Length, Sepal.Length, color = Species)) +
# geom_point() +
# scale_color_flat() +
# theme(legend.position = c(0.2, 0.8))
## ----inclusion_brms-----------------------------------------------------------
# bayesfactor_inclusion(comparison)
## ----inclusion_brms2----------------------------------------------------------
# bayesfactor_inclusion(comparison, match_models = TRUE)
## ----JASP_all-----------------------------------------------------------------
# library(BayesFactor)
# data(ToothGrowth)
# ToothGrowth$dose <- as.factor(ToothGrowth$dose)
#
# BF_ToothGrowth <- anovaBF(len ~ dose * supp, ToothGrowth, progress = FALSE)
#
# bayesfactor_inclusion(BF_ToothGrowth)
## ----JASP_all_fig, echo=FALSE-------------------------------------------------
# knitr::include_graphics("https://github.com/easystats/easystats/raw/master/man/figures/bayestestR/JASP1.PNG")
## ----JASP_matched-------------------------------------------------------------
# bayesfactor_inclusion(BF_ToothGrowth, match_models = TRUE)
## ----JASP_matched_fig, echo=FALSE---------------------------------------------
# knitr::include_graphics("https://github.com/easystats/easystats/raw/master/man/figures/bayestestR/JASP2.PNG")
## ----JASP_Nuisance------------------------------------------------------------
# BF_ToothGrowth_against_dose <- BF_ToothGrowth[3:4] / BF_ToothGrowth[2] # OR:
# # update(bayesfactor_models(BF_ToothGrowth),
# # subset = c(4, 5),
# # reference = 3)
# BF_ToothGrowth_against_dose
#
#
# bayesfactor_inclusion(BF_ToothGrowth_against_dose)
## ----JASP_Nuisance_fig, echo=FALSE--------------------------------------------
# knitr::include_graphics("https://github.com/easystats/easystats/raw/master/man/figures/bayestestR/JASP3.PNG")
## -----------------------------------------------------------------------------
# mod <- stan_glm(mpg ~ wt + am,
# data = mtcars,
# prior = normal(0, c(10, 10), autoscale = FALSE),
# diagnostic_file = file.path(tempdir(), "df1.csv"),
# refresh = 0
# )
#
# mod_carb <- stan_glm(mpg ~ wt + am + carb,
# data = mtcars,
# prior = normal(0, c(10, 10, 20), autoscale = FALSE),
# diagnostic_file = file.path(tempdir(), "df0.csv"),
# refresh = 0
# )
#
# BF_carb <- bayesfactor_models(mod_carb, denominator = mod, verbose = FALSE)
# BF <- BF_carb$BF[1]
# print(BF_carb)
## -----------------------------------------------------------------------------
# hdi(mod_carb, ci = .95)
## -----------------------------------------------------------------------------
# BMA_draws <- weighted_posteriors(mod, mod_carb)
#
# BMA_hdi <- hdi(BMA_draws, ci = .95)
# BMA_hdi
#
# plot(BMA_hdi)
## ---- echo=FALSE--------------------------------------------------------------
# set.seed(1)
## -----------------------------------------------------------------------------
# library(emmeans)
#
# groups <- emmeans(model, ~group)
# group_diff <- pairs(groups)
#
# (groups_all <- rbind(groups, group_diff))
#
# # pass the original model via prior
# bayesfactor_parameters(groups_all, prior = model)
## ---- echo=FALSE--------------------------------------------------------------
# set.seed(1)
## ---- eval=FALSE--------------------------------------------------------------
# library(modelbased)
#
# estimate_contrasts(model, test = "bf")
## -----------------------------------------------------------------------------
# df <- iris
# contrasts(df$Species)[, ] <- contr.sum(3)
#
# fit_sum <- stan_glm(Sepal.Length ~ Species,
# data = df,
# prior = normal(0, c(1, 1), autoscale = FALSE),
# prior_PD = TRUE, # sample priors
# family = gaussian(),
# refresh = 0
# )
#
# pairs_sum <- pairs(emmeans(fit_sum, ~Species))
#
# em_pairs_samples <- as.data.frame(as.matrix(emmeans::as.mcmc.emmGrid(pairs_sum, names = FALSE)))
#
# print(pairs_sum)
#
# ggplot(stack(em_pairs_samples), aes(x = values, fill = ind)) +
# geom_density(size = 1) +
# facet_grid(ind ~ .) +
# labs(x = "prior difference values") +
# theme(legend.position = "none")
## ---- eval=FALSE--------------------------------------------------------------
# contrasts(df$Species) <- contr.orthonorm
## ---- eval=FALSE--------------------------------------------------------------
# options(contrasts = c("contr.orthonorm", "contr.poly"))
## -----------------------------------------------------------------------------
# contrasts(df$Species)[, ] <- contr.orthonorm(3)
#
# fit_bayes <- stan_glm(Sepal.Length ~ Species,
# data = df,
# prior = normal(0, c(1, 1), autoscale = FALSE),
# prior_PD = TRUE, # sample priors
# family = gaussian(),
# refresh = 0
# )
#
# pairs_bayes <- pairs(emmeans(fit_bayes, ~Species))
#
# em_pairs_samples <- as.data.frame(as.matrix(emmeans::as.mcmc.emmGrid(pairs_bayes, names = FALSE)))
#
# print(pairs_bayes)
#
# ggplot(stack(em_pairs_samples), aes(x = values, fill = ind)) +
# geom_density(size = 1) +
# facet_grid(ind ~ .) +
# labs(x = "prior difference values") +
# theme(legend.position = "none")
## -----------------------------------------------------------------------------
# hyp <- c(
# # comparing 2 levels
# "setosa < versicolor",
# "setosa < virginica",
# "versicolor < virginica",
#
# # comparing 3 (or more) levels
# "setosa < virginica & virginica < versicolor",
# "virginica < setosa & setosa < versicolor",
# "setosa < versicolor & versicolor < virginica"
# )
## ---- eval=FALSE--------------------------------------------------------------
# contrasts(df$Species) <- contr.sum
# fit_sum <- stan_glm(Sepal.Length ~ Species,
# data = df,
# prior = normal(0, c(1, 1), autoscale = FALSE),
# family = gaussian()
# )
#
# em_sum <- emmeans(fit_sum, ~Species) # the posterior marginal means
#
# bayesfactor_restricted(em_sum, fit_sum, hypothesis = hyp)
## ---- echo=FALSE--------------------------------------------------------------
# contrasts(df$Species)[, ] <- contr.sum(3)
# fit_sum <- stan_glm(Sepal.Length ~ Species,
# data = df,
# prior = normal(0, c(1, 1), autoscale = FALSE),
# family = gaussian(),
# refresh = 0
# )
#
# em_sum <- emmeans(fit_sum, ~Species) # the posterior marginal means
#
# bayesfactor_restricted(em_sum, fit_sum, hypothesis = hyp)
## ---- eval=FALSE--------------------------------------------------------------
# contrasts(df$Species) <- contr.orthonorm
# fit_bayes <- stan_glm(Sepal.Length ~ Species,
# data = df,
# prior = normal(0, c(1, 1), autoscale = FALSE),
# family = gaussian()
# )
# em_bayes <- emmeans(fit_sum, ~Species) # the posterior marginal means
# bayesfactor_restricted(em_bayes, fit_sum, hypothesis = hyp)
## ---- echo=FALSE--------------------------------------------------------------
# contrasts(df$Species)[, ] <- contr.orthonorm(3)
# fit_bayes <- stan_glm(Sepal.Length ~ Species,
# data = df,
# prior = normal(0, c(1, 1), autoscale = FALSE),
# family = gaussian(),
# refresh = 0
# )
# em_bayes <- emmeans(fit_bayes, ~Species) # the posterior marginal means
# bayesfactor_restricted(em_bayes, fit_bayes, hypothesis = hyp)
Computing file changes ...