Nothing
set.seed(2018)
test_df <- gss_calc[1:20, ]
test_df$stat <- sample(c(
-5,
-4,
-4,
-4,
-1,
-0.5,
rep(0, 6),
1,
1,
3.999,
4,
4,
4.001,
5,
5
))
test_that("direction is appropriate", {
expect_snapshot(
error = TRUE,
test_df |> get_p_value(obs_stat = 0.5, direction = "righ")
)
})
test_that("get_p_value works", {
expect_equal(
get_p_value(test_df, 4, "right")[[1]][1],
5 / 20,
tolerance = eps
)
expect_equal(
get_p_value(test_df, 4, "left")[[1]][1],
17 / 20,
tolerance = eps
)
expect_equal(
get_p_value(test_df, 4, "both")[[1]][1],
10 / 20,
tolerance = eps
)
expect_equal(
get_p_value(test_df, 0, "right")[[1]][1],
14 / 20,
tolerance = eps
)
expect_equal(
get_p_value(test_df, 0, "left")[[1]][1],
12 / 20,
tolerance = eps
)
# This is also a check for not returning value more than 1
expect_equal(get_p_value(test_df, 0, "both")[[1]][1], 1, tolerance = eps)
expect_equal(
get_p_value(test_df, -3.999, "right")[[1]][1],
16 / 20,
tolerance = eps
)
expect_equal(
get_p_value(test_df, -3.999, "left")[[1]][1],
4 / 20,
tolerance = eps
)
expect_equal(
get_p_value(test_df, -3.999, "both")[[1]][1],
8 / 20,
tolerance = eps
)
expect_equal(
get_p_value(test_df, 4, "greater"),
get_p_value(test_df, 4, "right"),
tolerance = eps
)
expect_equal(
get_p_value(test_df, 4, "less"),
get_p_value(test_df, 4, "left"),
tolerance = eps
)
expect_equal(
get_p_value(test_df, 4, "two_sided"),
get_p_value(test_df, 4, "both"),
tolerance = eps
)
expect_equal(
get_p_value(test_df, 4, "two-sided"),
get_p_value(test_df, 4, "both"),
tolerance = eps
)
expect_equal(
get_p_value(test_df, 4, "two sided"),
get_p_value(test_df, 4, "both"),
tolerance = eps
)
expect_equal(
get_p_value(test_df, 4, "two.sided"),
get_p_value(test_df, 4, "both"),
tolerance = eps
)
})
test_that("theoretical p-value not supported error", {
obs_F <- gss_tbl |>
specify(hours ~ partyid) |>
calculate(stat = "F")
expect_snapshot(
error = TRUE,
gss_tbl |>
specify(hours ~ partyid) |>
hypothesize(null = "independence") |>
calculate(stat = "F") |>
get_p_value(obs_stat = obs_F, direction = "right")
)
})
test_that("get_p_value warns in case of zero p-value", {
expect_snapshot(
res_ <- get_p_value(gss_calc, obs_stat = -10, direction = "left")
)
})
test_that("get_p_value throws error in case of `NaN` stat", {
gss_calc$stat[1] <- NaN
expect_snapshot(error = TRUE, res_ <- get_p_value(gss_calc, 0, "both"))
gss_calc$stat[2] <- NaN
expect_snapshot(error = TRUE, res_ <- get_p_value(gss_calc, 0, "both"))
# In the case that _all_ values are NaN, error should have different text
gss_calc$stat <- NaN
expect_snapshot(error = TRUE, res_ <- get_p_value(gss_calc, 0, "both"))
})
test_that("get_p_value can handle fitted objects", {
set.seed(1)
null_fits <- gss[1:50, ] |>
specify(hours ~ age + college) |>
hypothesize(null = "independence") |>
generate(reps = 10, type = "permute") |>
fit()
obs_fit <- gss[1:50, ] |>
specify(hours ~ age + college) |>
fit()
expect_equal(
get_p_value(null_fits, obs_fit, "both"),
structure(
list(
term = c("age", "collegedegree", "intercept"),
p_value = c(0.6, 0.4, 0.6)
),
row.names = c(NA, -3L),
class = c("tbl_df", "tbl", "data.frame")
),
ignore_attr = TRUE
)
# errors out when it ought to
obs_fit_2 <- gss[1:50, ] |>
specify(hours ~ age) |>
fit()
expect_snapshot(error = TRUE, get_p_value(null_fits, obs_fit_2, "both"))
obs_fit_3 <- gss[1:50, ] |>
specify(year ~ age + college) |>
fit()
expect_snapshot(error = TRUE, get_p_value(null_fits, obs_fit_3, "both"))
set.seed(1)
null_fits_4 <- gss[1:50, ] |>
specify(hours ~ age) |>
hypothesize(null = "independence") |>
generate(reps = 10, type = "permute") |>
fit()
obs_fit_4 <- gss[1:50, ] |>
specify(hours ~ age) |>
fit()
obs_fit_4
expect_equal(
get_p_value(null_fits_4, obs_fit_4, "both"),
structure(
list(
term = c("age", "intercept"),
p_value = c(0.6, 0.6)
),
row.names = c(NA, -2L),
class = c("tbl_df", "tbl", "data.frame")
),
ignore_attr = TRUE
)
expect_equal(ncol(null_fits_4), ncol(obs_fit_4) + 1)
expect_equal(nrow(null_fits_4), nrow(obs_fit_4) * 10)
expect_equal(ncol(obs_fit_4), ncol(obs_fit))
expect_equal(nrow(obs_fit_4), nrow(obs_fit) - 1)
expect_true(is_fitted(obs_fit))
expect_true(is_fitted(obs_fit_2))
expect_true(is_fitted(obs_fit_3))
expect_true(is_fitted(obs_fit_4))
expect_true(is_fitted(null_fits))
expect_true(is_fitted(null_fits_4))
})
test_that("get_p_value can handle bad args with fitted objects", {
set.seed(1)
null_fits <- gss[1:50, ] |>
specify(hours ~ age + college) |>
hypothesize(null = "independence") |>
generate(reps = 10, type = "permute") |>
fit()
obs_fit <- gss[1:50, ] |>
specify(hours ~ age + college) |>
fit()
expect_snapshot(error = TRUE, get_p_value(null_fits, "boop", "both"))
expect_snapshot(
error = TRUE,
get_p_value(null_fits, obs_fit$estimate, "both")
)
expect_snapshot(error = TRUE, get_p_value(obs_fit, null_fits, "both"))
})
test_that("get_p_value errors informatively when args are switched", {
# switch obs_stat and x
obs_stat <- gss |>
specify(response = hours) |>
calculate(stat = "mean")
set.seed(1)
null_dist <- gss |>
specify(response = hours) |>
hypothesize(null = "point", mu = 41) |>
generate(reps = 20, type = "bootstrap") |>
calculate(stat = "mean")
expect_snapshot(error = TRUE, get_p_value(obs_stat, null_dist, "both"))
expect_silent(
get_p_value(null_dist, obs_stat, "both")
)
})
test_that("get_p_value can handle theoretical distributions", {
get_p_value_ <- function(x, obs_stat, direction) {
x <- get_p_value(x, obs_stat, direction)
x$p_value
}
# f ------------------------------------------------------------
# direction = "right" is the only valid one
f_dist <-
gss |>
specify(age ~ partyid) |>
hypothesize(null = "independence") |>
assume(distribution = "F")
f_obs <-
gss |>
specify(age ~ partyid) |>
calculate(stat = "F")
expect_equal(
get_p_value_(f_dist, f_obs, direction = "right"),
0.06005251,
tolerance = 1e-3
)
old_way_f <- broom::tidy(aov(age ~ partyid, gss))
expect_equal(
get_p_value_(f_dist, f_obs, direction = "right"),
old_way_f$p.value[[1]],
tolerance = 1e-3
)
# t ------------------------------------------------------------
t_dist <-
gss |>
specify(response = hours) |>
hypothesize(null = "point", mu = 40) |>
assume("t")
t_obs <-
gss |>
specify(response = hours) |>
hypothesize(null = "point", mu = 40) |>
calculate(stat = "t")
expect_equal(
get_p_value_(t_dist, t_obs, direction = "both"),
0.03755,
tolerance = 1e-3
)
expect_equal(
get_p_value_(t_dist, t_obs, direction = "left"),
0.981,
tolerance = 1e-3
)
expect_equal(
get_p_value_(t_dist, t_obs, direction = "right"),
1 - get_p_value_(t_dist, t_obs, direction = "left"),
tolerance = 1e-3
)
expect_equal(
get_p_value_(t_dist, t_obs, direction = "both"),
(1 - get_p_value_(t_dist, t_obs, direction = "left")) * 2,
tolerance = 1e-3
)
old_way_both <- t_test(gss, hours ~ NULL, mu = 40, alternative = "two.sided")
expect_equal(
old_way_both$p_value,
get_p_value_(t_dist, t_obs, direction = "both"),
tolerance = 1e-3
)
old_way_left <- t_test(gss, hours ~ NULL, mu = 40, alternative = "less")
expect_equal(
old_way_left$p_value,
get_p_value_(t_dist, t_obs, direction = "left")
)
old_way_right <- t_test(gss, hours ~ NULL, mu = 40, alternative = "greater")
expect_equal(
old_way_right$p_value,
get_p_value_(t_dist, t_obs, direction = "right")
)
# chisq ------------------------------------------------------------
# direction = "right" is the only valid one
chisq_dist <-
gss |>
specify(college ~ finrela) |>
hypothesize(null = "independence") |>
assume(distribution = "Chisq")
chisq_obs <-
gss |>
specify(college ~ finrela) |>
calculate(stat = "Chisq")
expect_equal(
get_p_value_(chisq_dist, chisq_obs, direction = "right"),
1.082094e-05,
tolerance = 1e-3
)
expect_snapshot(
old_way <- chisq_test(gss, college ~ finrela)
)
expect_equal(
old_way$p_value,
get_p_value_(chisq_dist, chisq_obs, direction = "right"),
tolerance = 1e-3
)
# z ------------------------------------------------------------
z_dist <-
gss |>
specify(response = sex, success = "female") |>
hypothesize(null = "point", p = .5) |>
assume("z")
z_obs <-
gss |>
specify(response = sex, success = "female") |>
hypothesize(null = "point", p = .5) |>
calculate(stat = "z")
expect_equal(
get_p_value_(z_dist, z_obs, direction = "both"),
0.24492,
tolerance = 1e-3
)
expect_equal(
get_p_value_(z_dist, z_obs, direction = "left"),
0.12246,
tolerance = 1e-3
)
expect_equal(
get_p_value_(z_dist, z_obs, direction = "right"),
1 - get_p_value_(z_dist, z_obs, direction = "left"),
tolerance = 1e-3
)
expect_equal(
get_p_value_(z_dist, z_obs, direction = "both"),
(1 - get_p_value_(z_dist, z_obs, direction = "right")) * 2,
tolerance = 1e-3
)
old_way_z_both <- prop_test(
gss,
sex ~ NULL,
success = "female",
p = .5,
alternative = "two.sided",
z = TRUE
)
old_way_z_left <- prop_test(
gss,
sex ~ NULL,
success = "female",
p = .5,
alternative = "less",
z = TRUE
)
old_way_z_right <- prop_test(
gss,
sex ~ NULL,
success = "female",
p = .5,
alternative = "greater",
z = TRUE
)
expect_equal(
get_p_value_(z_dist, z_obs, direction = "both"),
old_way_z_both$p_value,
tolerance = 1e-3
)
expect_equal(
get_p_value_(z_dist, z_obs, direction = "left"),
old_way_z_left$p_value,
tolerance = 1e-3
)
expect_equal(
get_p_value_(z_dist, z_obs, direction = "right"),
old_way_z_right$p_value,
tolerance = 1e-3
)
})
test_that("get_p_value warns with bad theoretical distributions", {
t_dist_40 <-
gss |>
specify(response = hours) |>
hypothesize(null = "point", mu = 40) |>
assume("t")
t_dist_30 <-
gss |>
specify(response = hours) |>
hypothesize(null = "point", mu = 30) |>
assume("t")
t_obs <-
gss |>
specify(response = hours) |>
hypothesize(null = "point", mu = 40) |>
calculate(stat = "t")
expect_silent(
get_p_value(
t_dist_40,
t_obs,
direction = "both"
)
)
expect_snapshot(
res_ <- get_p_value(
t_dist_30,
t_obs,
direction = "both"
)
)
})
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.