Nothing
# Tests for compare_levels
#
# Author: mjskay
###############################################################################
library(dplyr)
library(tidyr)
ff_labels = c("a", "b", "c")
get_draws = function() {
#observations of tau grouped by the factor ff (with levels ff_labels)
data(RankCorr, package = "ggdist")
rank_corr = RankCorr[[1]]
bind_rows(lapply(1:3, function(i) {
data.frame(
.chain = as.integer(1),
.iteration = seq_len(nrow(rank_corr)),
.draw = seq_len(nrow(rank_corr)),
ff = ff_labels[i],
tau = as.vector(rank_corr[, paste0("tau[", i, "]")])
)
}))
}
test_that("pairwise level comparison works", {
draws = get_draws()
draws_wide = spread(draws, ff, tau)
ref = bind_rows(lapply(combn(levels(factor(draws$ff)), 2, simplify = FALSE), function(levels.) {
draws_wide$ff = paste(levels.[[2]], "-", levels.[[1]])
draws_wide$tau = draws_wide[[levels.[[2]]]] - draws_wide[[levels.[[1]]]]
draws_wide
})) %>%
select(-one_of(ff_labels)) %>%
group_by(ff)
expect_equal(compare_levels(draws, tau, by = ff, comparison = pairwise), ref)
expect_equal(group_vars(compare_levels(draws, tau, by = ff, comparison = pairwise)), "ff")
expect_equal(compare_levels(draws, tau, by = ff, comparison = "pairwise"), ref)
expect_equal(compare_levels(group_by(mutate(draws, .row = 1), ff, .row), tau, by = ff, comparison = pairwise), ref)
})
test_that("ordered level comparison works", {
draws = get_draws()
draws_wide = spread(draws, ff, tau)
ref = bind_rows(lapply(lapply(2:3, function(i) c(ff_labels[[i]], ff_labels[[i - 1]])), function(levels.) {
draws_wide$ff = paste(levels.[[1]], "-", levels.[[2]])
draws_wide$tau = draws_wide[[levels.[[1]]]] - draws_wide[[levels.[[2]]]]
draws_wide
})) %>%
select(-one_of(ff_labels)) %>%
group_by(ff)
expect_equal(compare_levels(draws, tau, by = ff, comparison = ordered), ref)
expect_equal(compare_levels(draws, tau, by = ff, comparison = "ordered"), ref)
})
test_that("control level comparison works", {
draws = get_draws()
draws_wide = spread(draws, ff, tau)
ref = bind_rows(lapply(lapply(2:3, function(i) c(ff_labels[[i]], ff_labels[[1]])), function(levels.) {
draws_wide$ff = paste(levels.[[1]], "-", levels.[[2]])
draws_wide$tau = draws_wide[[levels.[[1]]]] - draws_wide[[levels.[[2]]]]
draws_wide
})) %>%
select(-one_of(ff_labels)) %>%
group_by(ff)
expect_equal(compare_levels(draws, tau, by = ff, comparison = control), ref)
})
test_that("default level comparison selects the correct comparison depending on if `by` is ordered", {
draws = get_draws()
expect_equal(compare_levels(draws, tau, by = ff, comparison = default),
compare_levels(draws, tau, by = ff, comparison = pairwise))
draws$ff = ordered(draws$ff)
expect_equal(compare_levels(draws, tau, by = ff, comparison = default),
compare_levels(draws, tau, by = ff, comparison = ordered))
})
test_that("named functions are supported and named with their own name", {
draws = get_draws()
draws_wide = spread(draws, ff, tau)
ref = bind_rows(lapply(lapply(2:3, function(i) c(ff_labels[[i]], ff_labels[[1]])), function(levels.) {
draws_wide$ff = paste(levels.[[1]], "+", levels.[[2]])
draws_wide$tau = draws_wide[[levels.[[1]]]] + draws_wide[[levels.[[2]]]]
draws_wide
})) %>%
select(-one_of(ff_labels)) %>%
group_by(ff)
expect_equal(compare_levels(draws, tau, by = ff, fun = `+`, comparison = control), ref)
})
test_that("anonymous functions are supported and named with `:`", {
draws = get_draws()
draws_wide = spread(draws, ff, tau)
ref = bind_rows(lapply(lapply(2:3, function(i) c(ff_labels[[i]], ff_labels[[1]])), function(levels.) {
draws_wide$ff = paste(levels.[[1]], ":", levels.[[2]])
draws_wide$tau = draws_wide[[levels.[[1]]]] + draws_wide[[levels.[[2]]]]
draws_wide
})) %>%
select(-one_of(ff_labels)) %>%
group_by(ff)
expect_equal(compare_levels(draws, tau, by = ff, fun = function(x, y) x + y, comparison = control), ref)
})
test_that("custom comparisons of lists of character vectors are supported", {
draws = get_draws()
draws_wide = spread(draws, ff, tau)
ref = bind_rows(lapply(list(c("a", "b"), c("a", "c")), function(levels.) {
draws_wide$ff = paste(levels.[[1]], "-", levels.[[2]])
draws_wide$tau = draws_wide[[levels.[[1]]]] - draws_wide[[levels.[[2]]]]
draws_wide
})) %>%
select(-one_of(ff_labels)) %>%
group_by(ff)
expect_equal(compare_levels(draws, tau, by = ff, comparison = list(c("a", "b"), c("a", "c"))), ref)
})
test_that("custom comparisons of lists of unevaluated expressions are supported", {
draws = get_draws()
draws_wide = spread(draws, ff, tau)
ref = bind_rows(lapply(list(quote(a + b), quote(exp(c - a))), function(levels.) {
draws_wide$ff = deparse0(levels.)
draws_wide$tau = eval(levels., draws_wide)
draws_wide
})) %>%
select(-one_of(ff_labels)) %>%
group_by(ff)
expect_equal(compare_levels(draws, tau, by = ff, comparison = list(quote(a + b), quote(exp(c - a)))), ref)
expect_equal(compare_levels(draws, tau, by = ff, comparison = rlang::exprs(a + b, exp(c - a))), ref)
# test named comparisons
ref[ref$ff == "a + b",]$ff = "comp1"
ref[ref$ff == "exp(c - a)",]$ff = "comp2"
expect_equal(compare_levels(draws, tau, by = ff, comparison = rlang::exprs(comp1 = a + b, comp2 = exp(c - a))), ref)
})
test_that("comparisons of subsets of levels of factors are supported", {
draws = get_draws() %>%
filter(ff %in% c("a", "c"))
draws_wide = spread(draws, ff, tau)
ref = bind_rows(lapply(combn(levels(factor(draws$ff)), 2, simplify = FALSE), function(levels.) {
draws_wide$ff = paste(levels.[[2]], "-", levels.[[1]])
draws_wide$tau = draws_wide[[levels.[[2]]]] - draws_wide[[levels.[[1]]]]
draws_wide
})) %>%
select(-one_of(c("a", "c"))) %>%
group_by(ff)
expect_equal(compare_levels(draws, tau, by = ff, comparison = pairwise), ref)
})
test_that("extraneous columns are dropped before comparison", {
draws = get_draws()
draws_extra = draws %>%
mutate(sd = 1 / sqrt(tau)) #use something that won't act as a clean index
expect_equal(
compare_levels(draws, tau, by = ff, comparison = pairwise),
compare_levels(draws_extra, tau, by = ff, comparison = pairwise)
)
})
test_that("compare_levels respects groups of input data frame", {
draws = RankCorr %>%
spread_draws(b[i,j]) %>%
filter(i %in% 1:3, j %in% 1:3) %>%
group_by(i, j)
ref = bind_rows(lapply(split(draws, draws[["i"]]), function (d) {
draws_wide = spread(d, j, b)
bind_rows(lapply(combn(levels(factor(d$j)), 2, simplify = FALSE), function(levels.) {
draws_wide$j = paste(levels.[[2]], "-", levels.[[1]])
draws_wide$b = draws_wide[[levels.[[2]]]] - draws_wide[[levels.[[1]]]]
draws_wide
}))
})) %>%
select(-one_of(c("1", "2", "3"))) %>%
group_by(i, j)
result = compare_levels(draws, b, by = j)
expect_equal(result, ref)
expect_equal(group_vars(result), group_vars(ref))
})
# compare_levels on rvars -------------------------------------------------
test_that("pairwise level comparison works on rvars", {
rvar_df = tibble(
ff = c("a","b","c"),
tau = as_draws_rvars(RankCorr)$tau
)
ref = tibble(
ff = c("b - a", "c - a", "c - b"),
tau = with(rvar_df, c(tau[2] - tau[1], tau[3] - tau[1], tau[3] - tau[2]))
) %>%
group_by(ff)
expect_equal(compare_levels(rvar_df, tau, by = ff, comparison = pairwise), ref)
})
test_that("ordered level comparison works on rvars", {
rvar_df = tibble(
ff = c("a","b","c"),
tau = as_draws_rvars(RankCorr)$tau
)
ref = tibble(
ff = c("b - a", "c - b"),
tau = with(rvar_df, c(tau[2] - tau[1], tau[3] - tau[2]))
) %>%
group_by(ff)
expect_equal(compare_levels(rvar_df, tau, by = ff, comparison = ordered), ref)
})
test_that("named functions are supported on rvars", {
rvar_df = tibble(
ff = c("a","b","c"),
tau = as_draws_rvars(RankCorr)$tau
)
ref = tibble(
ff = c("b + a", "c + a"),
tau = with(rvar_df, c(tau[2] + tau[1], tau[3] + tau[1]))
) %>%
group_by(ff)
expect_equal(compare_levels(rvar_df, tau, by = ff, fun = `+`, comparison = control), ref)
})
test_that("custom comparisons of lists of unevaluated expressions are supported on rvars", {
rvar_df = tibble(
ff = c("a","b","c"),
tau = as_draws_rvars(RankCorr)$tau
)
ref = tibble(
ff = c("a + b", "exp(c - a)"),
tau = with(rvar_df, c(tau[1] + tau[2], exp(tau[3] - tau[1])))
) %>%
group_by(ff)
expect_equal(compare_levels(rvar_df, tau, by = ff, comparison = list(quote(a + b), quote(exp(c - a)))), ref)
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.