diff --git a/DESCRIPTION b/DESCRIPTION index 31a6de3..6c60f4a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: trps Type: Package -Title: Bayesian Trophic Position Models using 'stan' -Version: 0.1.0 +Title: Bayesian Trophic Position Models using 'Stan' +Version: 0.1.1 Authors@R: c( person( "Benjamin L.", "Hlina", @@ -23,7 +23,8 @@ Imports: brms, cli, dplyr, - lifecycle + lifecycle, + rlang Suggests: bayesplot, ggdist, @@ -37,7 +38,7 @@ Suggests: tidyr, viridis Config/testthat/edition: 3 -RoxygenNote: 7.3.2 +RoxygenNote: 7.3.3 Roxygen: list(markdown = TRUE) Depends: R (>= 4.1.0) diff --git a/R/add_alpha.R b/R/add_alpha.R index 37a0da0..60ebf00 100644 --- a/R/add_alpha.R +++ b/R/add_alpha.R @@ -32,36 +32,12 @@ add_alpha <- function( data, - abs = FALSE) { - if (!(inherits(data, c( - "data.frame", "tibble", - "data.table" - )))) { - cli::cli_abort(c( - "`data` must be a data.frame, tibble, or data.table", - "i" = "Please provide data.frame" - )) - } - - rv <- c("d13c", "c1", "c2") - - if (!all(rv %in% names(data))) { - mv <- setdiff(rv, names(data)) - - cli::cli_abort(c( - "The data.frame is missing: {mv}", - "i" = "Please provide {mv}" - )) - } - + abs = FALSE +) { - - if (!(is.logical(abs))) { - cli::cli_abort(c( - "`abs` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } + check_data_frame(data) + check_column_names(data) + check_logical(abs) if (isFALSE(abs)) { dat <- data |> diff --git a/R/one_source_model.R b/R/one_source_model.R index 2db6e50..f40490d 100644 --- a/R/one_source_model.R +++ b/R/one_source_model.R @@ -34,12 +34,7 @@ #' @export one_source_model <- function(bp = FALSE) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } + check_logical(bp) if (isFALSE(bp)) { model <- brms::bf( diff --git a/R/one_source_priors.R b/R/one_source_priors.R index 41f38aa..268e3e4 100644 --- a/R/one_source_priors.R +++ b/R/one_source_priors.R @@ -18,13 +18,7 @@ #' @export one_source_priors <- function(bp = FALSE) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } - + check_logical(bp) if (isFALSE(bp)) { # set priors @@ -71,7 +65,5 @@ one_source_priors <- function(bp = FALSE) { ) } - - return(priors) } diff --git a/R/one_source_priors_params.R b/R/one_source_priors_params.R index 531dbe2..247df01 100644 --- a/R/one_source_priors_params.R +++ b/R/one_source_priors_params.R @@ -55,145 +55,61 @@ one_source_priors_params <- function( sigma_lb = NULL, sigma_ub = NULL, bp = FALSE) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } - - # ----- n1 ----- - - # set n1 to 9 - if (is.null(n1)) { - n1 <- 9 - } - - # create error message for n1 priros - if (!is.numeric(n1)) { - cli::cli_abort(c( - "`n1` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set n1_sigma to 1 - if (is.null(n1_sigma)) { - n1_sigma <- 1 - } - # create error message for n1 priors - if (!is.numeric(n1_sigma)) { - cli::cli_abort(c( - "`n1_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # create error message for dn priros - - - if (is.null(dn)) { - dn <- 3.4 - } - - if (!is.numeric(dn)) { - cli::cli_abort(c( - "`dn` argument must be a numerical value", - "i" = "Please provide a numerical value as a pirorr" - )) - } - - # create error message for dn priors - if (is.null(dn_sigma)) { - dn_sigma <- 0.25 - } - if (!is.numeric(dn_sigma)) { - cli::cli_abort(c( - "`dn_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - # ----- tp ----- - - # set piror for tp - if (is.null(tp_lb)) { - tp_lb <- 2 - } + check_logical(bp) - # create error message for tp priros + # ---- defualt values - if (!is.numeric(tp_lb)) { - cli::cli_abort(c( - "`tp_lb` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - if (is.null(tp_ub)) { - tp_ub <- 10 - } + defaults <- default_priors("one_source") - # create error message for n1 priors - if (!is.numeric(tp_ub)) { - cli::cli_abort(c( - "`tp_ub` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- sigma ----- + # supplied <- supplied_priors("one_source") + supplied <- list( + n1 = n1, + n1_sigma = n1_sigma, + dn = dn, + dn_sigma = dn_sigma, + tp_lb = tp_lb, + tp_ub = tp_ub, + sigma_lb = sigma_lb, + sigma_ub = sigma_ub + ) - # set piror for tp - if (is.null(sigma_lb)) { - sigma_lb <- 0 - } - # create error message for tp priros + params <- Map(function(x, d) if (is.null(x)) d else x, supplied, defaults) - if (!is.numeric(sigma_lb)) { - cli::cli_abort(c( - "`sigma_lb` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } + lapply(names(params), function(nm) { + check_numerical(params[[nm]], arg_name = nm) + }) - if (is.null(sigma_ub)) { - sigma_ub <- 10 - } + params_env <- list2env(params, parent = environment()) - # create error message for n1 priors - if (!is.numeric(sigma_ub)) { - cli::cli_abort(c( - "`sigma_ub` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } + # ---- set prior + priors_params <- if (isTRUE(bp)) { + with(params_env, { + brms::stanvar(n1, name = "n1") + + brms::stanvar(n1_sigma, "n1_sigma") + + brms::stanvar(dn, "dn") + + brms::stanvar(dn_sigma, "dn_sigma") + + brms::stanvar(tp_lb, "tp_lb") + + brms::stanvar(tp_ub, "tp_ub") + + brms::stanvar(sigma_lb, "sigma_lb") + + brms::stanvar(sigma_ub, "sigma_ub") + } + ) + } else { - if (isTRUE(bp)) { - priors_params <- brms::stanvar(n1, name = "n1") + - brms::stanvar(n1_sigma, "n1_sigma") + + with(params_env, { brms::stanvar(dn, "dn") + - brms::stanvar(dn_sigma, "dn_sigma") + - brms::stanvar(tp_lb, "tp_lb") + - brms::stanvar(tp_ub, "tp_ub") + - brms::stanvar(sigma_lb, "sigma_lb") + - brms::stanvar(sigma_ub, "sigma_ub") + brms::stanvar(dn_sigma, "dn_sigma") + + brms::stanvar(tp_lb, "tp_lb") + + brms::stanvar(tp_ub, "tp_ub") + + brms::stanvar(sigma_lb, "sigma_lb") + + brms::stanvar(sigma_ub, "sigma_ub") + } + ) } - # ----- dn ----- - - if (isFALSE(bp)) { - # ----- set prirors ----- - - priors_params <- brms::stanvar(dn, "dn") + - brms::stanvar(dn_sigma, "dn_sigma") + - brms::stanvar(tp_lb, "tp_lb") + - brms::stanvar(tp_ub, "tp_ub") + - brms::stanvar(sigma_lb, "sigma_lb") + - brms::stanvar(sigma_ub, "sigma_ub") - } - return(priors_params) } diff --git a/R/two_source_model.R b/R/two_source_model.R index 1a6074b..abea3b3 100644 --- a/R/two_source_model.R +++ b/R/two_source_model.R @@ -63,23 +63,15 @@ two_source_model <- function(bp = FALSE, lambda = NULL) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } + + + check_logical(bp) if (is.null(lambda)) { lambda <- 1 } - if (!(is.numeric(lambda)) || !(lambda %in% c(1, 2))) { - cli::cli_abort(c( - "`lambda` argument must be a numeric value and either `1` or `2`", - "i" = "Please provide `1` or `2`" - )) - } + check_lambda(lambda) if (lambda == 1) { if (isFALSE(bp)) { diff --git a/R/two_source_model_ar.R b/R/two_source_model_ar.R index 9de3c9f..0f2ea5f 100644 --- a/R/two_source_model_ar.R +++ b/R/two_source_model_ar.R @@ -82,24 +82,14 @@ two_source_model_ar <- function( bp = FALSE, lambda = NULL) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } + + check_logical(bp) if (is.null(lambda)) { lambda <- 1 } - if (!(is.numeric(lambda)) || !(lambda %in% c(1, 2))) { - cli::cli_abort(c( - "`lambda` argument must be a numeric value and either `1` or `2`", - "i" = "Please provide `1` or `2`" - )) - } - + check_lambda(lambda) # ---- singe lambda ---- if (lambda == 1) { # ---- no baseline priors ----- diff --git a/R/two_source_model_arc.R b/R/two_source_model_arc.R index 311ee09..5787f18 100644 --- a/R/two_source_model_arc.R +++ b/R/two_source_model_arc.R @@ -84,23 +84,14 @@ two_source_model_arc <- function( bp = FALSE, lambda = NULL) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } + + check_logical(bp) if (is.null(lambda)) { lambda <- 1 } - if (!(is.numeric(lambda)) || !(lambda %in% c(1, 2))) { - cli::cli_abort(c( - "`lambda` argument must be a numeric value and either `1` or `2`", - "i" = "Please provide `1` or `2`" - )) - } + check_lambda(lambda) # ---- singe lambda ---- if (lambda == 1) { diff --git a/R/two_source_priors.R b/R/two_source_priors.R index fd2d02a..b7c5489 100644 --- a/R/two_source_priors.R +++ b/R/two_source_priors.R @@ -20,13 +20,8 @@ #' @export two_source_priors <- function(bp = FALSE) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } + check_logical(bp) if (isFALSE(bp)) { # set priors diff --git a/R/two_source_priors_ar.R b/R/two_source_priors_ar.R index 5a07572..d76a41f 100644 --- a/R/two_source_priors_ar.R +++ b/R/two_source_priors_ar.R @@ -21,12 +21,7 @@ #' @export two_source_priors_ar <- function(bp = FALSE) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } + check_logical(bp) if (isFALSE(bp)) { @@ -41,17 +36,17 @@ two_source_priors_ar <- function(bp = FALSE) { brms::prior(normal(dn, dn_sigma), resp = "d15n", nlpar = "dn"), # Trophic Position (tp) brms::prior(uniform(tp_lb, tp_ub), - lb = tp_lb, ub = tp_ub, resp = "d15n", - nlpar = "tp" + lb = tp_lb, ub = tp_ub, resp = "d15n", + nlpar = "tp" ), # Standard deviation prior brms::prior(uniform(sigma_lb, sigma_ub), - resp = "alpha", - class = "sigma", ub = sigma_ub + resp = "alpha", + class = "sigma", ub = sigma_ub ), brms::prior(uniform(sigma_lb, sigma_ub), - resp = "d15n", - class = "sigma", ub = sigma_ub + resp = "d15n", + class = "sigma", ub = sigma_ub ) ) } @@ -66,29 +61,29 @@ two_source_priors_ar <- function(bp = FALSE) { # Baseline 1 δ15N (n1) brms::prior(normal(n1, n1_sigma), - resp = "d15n", - nlpar = "n1" + resp = "d15n", + nlpar = "n1" ), # Baseline 2 δ15N (n2) brms::prior(normal(n2, n2_sigma), - resp = "d15n", - nlpar = "n2" + resp = "d15n", + nlpar = "n2" ), # Trophic enrichment factor (ΔN) brms::prior(normal(dn, dn_sigma), resp = "d15n", nlpar = "dn"), # Trophic Position (tp) brms::prior(uniform(tp_lb, tp_ub), - lb = tp_lb, ub = tp_ub, resp = "d15n", - nlpar = "tp" + lb = tp_lb, ub = tp_ub, resp = "d15n", + nlpar = "tp" ), # Standard deviation prior brms::prior(uniform(sigma_lb, sigma_ub), - resp = "alpha", - class = "sigma", ub = sigma_ub + resp = "alpha", + class = "sigma", ub = sigma_ub ), brms::prior(uniform(sigma_lb, sigma_ub), - resp = "d15n", - class = "sigma", ub = sigma_ub + resp = "d15n", + class = "sigma", ub = sigma_ub ) ) } diff --git a/R/two_source_priors_arc.R b/R/two_source_priors_arc.R index d548f87..d8580c1 100644 --- a/R/two_source_priors_arc.R +++ b/R/two_source_priors_arc.R @@ -21,12 +21,8 @@ #' @export two_source_priors_arc <- function(bp = FALSE) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } + + check_logical(bp) if (isFALSE(bp)) { diff --git a/R/two_source_priors_params.R b/R/two_source_priors_params.R index fa665ba..3b8093c 100644 --- a/R/two_source_priors_params.R +++ b/R/two_source_priors_params.R @@ -100,261 +100,75 @@ two_source_priors_params <- function( sigma_lb = NULL, sigma_ub = NULL, bp = FALSE) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } - - # ----- a ----- - - # set a to 1 - if (is.null(a)) { - a <- 1 - } - - # create error message for a priros - if (!is.numeric(a)) { - cli::cli_abort(c( - "`a` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set b to 1 - if (is.null(b)) { - b <- 1 - } - # create error message for b priors - if (!is.numeric(b)) { - cli::cli_abort(c( - "`b` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - # ----- c1 ----- - - # set c1 to 21 - if (is.null(c1)) { - c1 <- -21 - } - - # create error message for n1 priros - if (!is.numeric(c1)) { - cli::cli_abort(c( - "`c1` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set c1_sigma to 1 - if (is.null(c1_sigma)) { - c1_sigma <- 1 - } - # create error message for c1 priors - if (!is.numeric(c1_sigma)) { - cli::cli_abort(c( - "`c1_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- c2 ----- - - # set c2 to -25 - if (is.null(c2)) { - c2 <- -26 - } - - # create error message for n1 priros - if (!is.numeric(c2)) { - cli::cli_abort(c( - "`c2` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set c1_sigma to 1 - if (is.null(c2_sigma)) { - c2_sigma <- 1 - } - # create error message for c1 priors - if (!is.numeric(c2_sigma)) { - cli::cli_abort(c( - "`c2_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- n1 ----- - - # set n1 to 9 - if (is.null(n1)) { - n1 <- 8 - } - - # create error message for n1 priros - if (!is.numeric(n1)) { - cli::cli_abort(c( - "`n1` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set n1_sigma to 1 - if (is.null(n1_sigma)) { - n1_sigma <- 1 - } - # create error message for n1 priors - if (!is.numeric(n1_sigma)) { - cli::cli_abort(c( - "`n1_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- n2 ----- - - # set n1 to 9 - if (is.null(n2)) { - n2 <- 9.5 - } - - # create error message for n1 priros - if (!is.numeric(n2)) { - cli::cli_abort(c( - "`n2` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set n1_sigma to 1 - if (is.null(n2_sigma)) { - n2_sigma <- 1 - } - # create error message for n1 priors - if (!is.numeric(n2_sigma)) { - cli::cli_abort(c( - "`n2_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # create error message for dn priros - - - if (is.null(dn)) { - dn <- 3.4 - } - - if (!is.numeric(dn)) { - cli::cli_abort(c( - "`dn` argument must be a numerical value", - "i" = "Please provide a numerical value as a pirorr" - )) - } - - # create error message for dn priors - if (is.null(dn_sigma)) { - dn_sigma <- 0.25 - } - - if (!is.numeric(dn_sigma)) { - cli::cli_abort(c( - "`dn_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - # ----- tp ----- - - # set piror for tp - if (is.null(tp_lb)) { - tp_lb <- 2 - } - - # create error message for tp priros - - if (!is.numeric(tp_lb)) { - cli::cli_abort(c( - "`tp_lb` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - if (is.null(tp_ub)) { - tp_ub <- 10 - } - - # create error message for n1 priors - if (!is.numeric(tp_ub)) { - cli::cli_abort(c( - "`tp_ub` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- sigma ----- - - # set piror for tp - if (is.null(sigma_lb)) { - sigma_lb <- 0 - } - - # create error message for tp priros - - if (!is.numeric(sigma_lb)) { - cli::cli_abort(c( - "`sigma_lb` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - if (is.null(sigma_ub)) { - sigma_ub <- 10 - } - - # create error message for n1 priors - if (!is.numeric(sigma_ub)) { - cli::cli_abort(c( - "`sigma_ub` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - if (isTRUE(bp)) { - priors_params <- + check_logical(bp) + # set defualts + defaults <- default_priors("two_source") + + # ---- suplied + supplied <- list( + a = a, + b = b, + c1 = c1, + c1_sigma = c1_sigma, + c2 = c2, + c2_sigma = c2_sigma, + n1 = n1, + n1_sigma = n1_sigma, + n2 = n2, + n2_sigma = n2_sigma, + dn = dn, + dn_sigma = dn_sigma, + tp_lb = tp_lb, + tp_ub = tp_ub, + sigma_lb = sigma_lb, + sigma_ub = sigma_ub + ) + + # ---- either set defaults or supplied ------ + params <- Map(function(x, d) if (is.null(x)) d else x, supplied, defaults) + + # check them + lapply(names(params), function(nm) { + check_numerical(params[[nm]], arg_name = nm) + }) + # ----- put them in to function envo + params_env <- list2env(params, parent = environment()) + + + + priors_params <- if (isTRUE(bp)) { + with(params_env, { brms::stanvar(a, name = "a") + - brms::stanvar(b, "b") + - brms::stanvar(c1, name = "c1") + - brms::stanvar(c1_sigma, "c1_sigma") + - brms::stanvar(c2, name = "c2") + - brms::stanvar(c2_sigma, "c2_sigma") + - brms::stanvar(n1, name = "n1") + - brms::stanvar(n1_sigma, "n1_sigma") + - brms::stanvar(n2, name = "n2") + - brms::stanvar(n2_sigma, "n2_sigma") + - brms::stanvar(dn, "dn") + - brms::stanvar(dn_sigma, "dn_sigma") + - brms::stanvar(tp_lb, "tp_lb") + - brms::stanvar(tp_ub, "tp_ub") + - brms::stanvar(sigma_lb, "sigma_lb") + - brms::stanvar(sigma_ub, "sigma_ub") - } - - - # ----- dn ----- - - if (isFALSE(bp)) { - # ----- set prirors ----- - - priors_params <- + brms::stanvar(b, "b") + + brms::stanvar(c1, name = "c1") + + brms::stanvar(c1_sigma, "c1_sigma") + + brms::stanvar(c2, name = "c2") + + brms::stanvar(c2_sigma, "c2_sigma") + + brms::stanvar(n1, name = "n1") + + brms::stanvar(n1_sigma, "n1_sigma") + + brms::stanvar(n2, name = "n2") + + brms::stanvar(n2_sigma, "n2_sigma") + + brms::stanvar(dn, "dn") + + brms::stanvar(dn_sigma, "dn_sigma") + + brms::stanvar(tp_lb, "tp_lb") + + brms::stanvar(tp_ub, "tp_ub") + + brms::stanvar(sigma_lb, "sigma_lb") + + brms::stanvar(sigma_ub, "sigma_ub") + } + ) + } else { + with(params_env, { brms::stanvar(a, name = "a") + - brms::stanvar(b, "b") + - brms::stanvar(dn, "dn") + - brms::stanvar(dn_sigma, "dn_sigma") + - brms::stanvar(tp_lb, "tp_lb") + - brms::stanvar(tp_ub, "tp_ub") + - brms::stanvar(sigma_lb, "sigma_lb") + - brms::stanvar(sigma_ub, "sigma_ub") + brms::stanvar(b, "b") + + brms::stanvar(dn, "dn") + + brms::stanvar(dn_sigma, "dn_sigma") + + brms::stanvar(tp_lb, "tp_lb") + + brms::stanvar(tp_ub, "tp_ub") + + brms::stanvar(sigma_lb, "sigma_lb") + + brms::stanvar(sigma_ub, "sigma_ub") + } + ) } return(priors_params) diff --git a/R/two_source_priors_params_ar.R b/R/two_source_priors_params_ar.R index 386f7f6..6674141 100644 --- a/R/two_source_priors_params_ar.R +++ b/R/two_source_priors_params_ar.R @@ -119,205 +119,68 @@ two_source_priors_params_ar <- function( sigma_lb = NULL, sigma_ub = NULL, bp = FALSE) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } - - # ----- a ----- - - # set a to 1 - if (is.null(a)) { - a <- 1 - } - - # create error message for a priros - if (!is.numeric(a)) { - cli::cli_abort(c( - "`a` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set b to 1 - if (is.null(b)) { - b <- 1 - } - # create error message for b priors - if (!is.numeric(b)) { - cli::cli_abort(c( - "`b` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - # ----- n1 ----- - - # set n1 to 9 - if (is.null(n1)) { - n1 <- 8.0 - } - - # create error message for n1 priros - if (!is.numeric(n1)) { - cli::cli_abort(c( - "`n1` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set n1_sigma to 1 - if (is.null(n1_sigma)) { - n1_sigma <- 1 - } - # create error message for n1 priors - if (!is.numeric(n1_sigma)) { - cli::cli_abort(c( - "`n1_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- n2 ----- - - # set n1 to 9 - if (is.null(n2)) { - n2 <- 9.5 - } - - # create error message for n1 priros - if (!is.numeric(n2)) { - cli::cli_abort(c( - "`n2` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set n1_sigma to 1 - if (is.null(n2_sigma)) { - n2_sigma <- 1 - } - # create error message for n1 priors - if (!is.numeric(n2_sigma)) { - cli::cli_abort(c( - "`n2_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ---- dn priors ----- - - - if (is.null(dn)) { - dn <- 3.4 - } - - if (!is.numeric(dn)) { - cli::cli_abort(c( - "`dn` argument must be a numerical value", - "i" = "Please provide a numerical value as a pirorr" - )) - } - # create error message for dn priors - if (is.null(dn_sigma)) { - dn_sigma <- 0.25 - } - - if (!is.numeric(dn_sigma)) { - cli::cli_abort(c( - "`dn_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - # ----- tp ----- - - # set piror for tp - if (is.null(tp_lb)) { - tp_lb <- 2 - } - - # create error message for tp priros - - if (!is.numeric(tp_lb)) { - cli::cli_abort(c( - "`tp_lb` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - if (is.null(tp_ub)) { - tp_ub <- 10 - } - - # create error message for n1 priors - if (!is.numeric(tp_ub)) { - cli::cli_abort(c( - "`tp_ub` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- sigma ----- - - # set piror for tp - if (is.null(sigma_lb)) { - sigma_lb <- 0 - } - - # create error message for tp priros - - if (!is.numeric(sigma_lb)) { - cli::cli_abort(c( - "`sigma_lb` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - if (is.null(sigma_ub)) { - sigma_ub <- 10 - } - - # create error message for n1 priors - if (!is.numeric(sigma_ub)) { - cli::cli_abort(c( - "`sigma_ub` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - - if (isTRUE(bp)) { - priors_params <- + check_logical(bp) + + # ----- set defaults ----- + defaults <- default_priors("two_source_ar") + + + # ---- suplied ----- + supplied <- list( + a = a, + b = b, + n1 = n1, + n1_sigma = n1_sigma, + n2 = n2, + n2_sigma = n2_sigma, + dn = dn, + dn_sigma = dn_sigma, + tp_lb = tp_lb, + tp_ub = tp_ub, + sigma_lb = sigma_lb, + sigma_ub = sigma_ub + ) + + + # ---- either set defaults or supplied ------ + params <- Map(function(x, d) if (is.null(x)) d else x, supplied, defaults) + + # check them + lapply(names(params), function(nm) { + check_numerical(params[[nm]], arg_name = nm) + }) + # ----- put them in to function envo + params_env <- list2env(params, parent = environment()) + + priors_params <- if (isTRUE(bp)) { + with(params_env, { brms::stanvar(a, name = "a") + - brms::stanvar(b, "b") + - brms::stanvar(n1, name = "n1") + - brms::stanvar(n1_sigma, "n1_sigma") + - brms::stanvar(n2, name = "n2") + - brms::stanvar(n2_sigma, "n2_sigma") + - brms::stanvar(dn, "dn") + - brms::stanvar(dn_sigma, "dn_sigma") + - brms::stanvar(tp_lb, "tp_lb") + - brms::stanvar(tp_ub, "tp_ub") + - brms::stanvar(sigma_lb, "sigma_lb") + - brms::stanvar(sigma_ub, "sigma_ub") - } - - - # ----- dn ----- - - if (isFALSE(bp)) { - # ----- set prirors ----- - - priors_params <- + brms::stanvar(b, "b") + + brms::stanvar(n1, name = "n1") + + brms::stanvar(n1_sigma, "n1_sigma") + + brms::stanvar(n2, name = "n2") + + brms::stanvar(n2_sigma, "n2_sigma") + + brms::stanvar(dn, "dn") + + brms::stanvar(dn_sigma, "dn_sigma") + + brms::stanvar(tp_lb, "tp_lb") + + brms::stanvar(tp_ub, "tp_ub") + + brms::stanvar(sigma_lb, "sigma_lb") + + brms::stanvar(sigma_ub, "sigma_ub") + } + ) + } else { + with(params_env, { brms::stanvar(a, name = "a") + - brms::stanvar(b, "b") + - brms::stanvar(dn, "dn") + - brms::stanvar(dn_sigma, "dn_sigma") + - brms::stanvar(tp_lb, "tp_lb") + - brms::stanvar(tp_ub, "tp_ub") + - brms::stanvar(sigma_lb, "sigma_lb") + - brms::stanvar(sigma_ub, "sigma_ub") + brms::stanvar(b, "b") + + brms::stanvar(dn, "dn") + + brms::stanvar(dn_sigma, "dn_sigma") + + brms::stanvar(tp_lb, "tp_lb") + + brms::stanvar(tp_ub, "tp_ub") + + brms::stanvar(sigma_lb, "sigma_lb") + + brms::stanvar(sigma_ub, "sigma_ub") + } + ) } return(priors_params) diff --git a/R/two_source_priors_params_arc.R b/R/two_source_priors_params_arc.R index 8cbc623..ac67419 100644 --- a/R/two_source_priors_params_arc.R +++ b/R/two_source_priors_params_arc.R @@ -138,230 +138,45 @@ two_source_priors_params_arc <- function( sigma_lb = NULL, sigma_ub = NULL, bp = FALSE) { - if (!(is.logical(bp))) { - cli::cli_abort(c( - "`bp` argument must be a logical value", - "i" = "Please provide TRUE or FALSE" - )) - } + + check_logical(bp) # ----- a ----- # set a to 1 - if (is.null(a)) { - a <- 1 - } - - # create error message for a priros - if (!is.numeric(a)) { - cli::cli_abort(c( - "`a` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set b to 1 - if (is.null(b)) { - b <- 1 - } - # create error message for b priors - if (!is.numeric(b)) { - cli::cli_abort(c( - "`b` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - # ----- n1 ----- - - # set n1 to 9 - if (is.null(n1)) { - n1 <- 8.0 - } - - # create error message for n1 priros - if (!is.numeric(n1)) { - cli::cli_abort(c( - "`n1` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set n1_sigma to 1 - if (is.null(n1_sigma)) { - n1_sigma <- 1 - } - # create error message for n1 priors - if (!is.numeric(n1_sigma)) { - cli::cli_abort(c( - "`n1_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- n2 ----- - - # set n1 to 9 - if (is.null(n2)) { - n2 <- 9.5 - } - - # create error message for n1 priros - if (!is.numeric(n2)) { - cli::cli_abort(c( - "`n2` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set n1_sigma to 1 - if (is.null(n2_sigma)) { - n2_sigma <- 1 - } - # create error message for n1 priors - if (!is.numeric(n2_sigma)) { - cli::cli_abort(c( - "`n2_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- c1 ----- - - # set c1 to -21 - if (is.null(c1)) { - c1 <- -21 - } - - # create error message for c1 priros - if (!is.numeric(c1)) { - cli::cli_abort(c( - "`c1` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set c1_sigma to 1 - if (is.null(c1_sigma)) { - c1_sigma <- 1 - } - # create error message for n1 priors - if (!is.numeric(c1_sigma)) { - cli::cli_abort(c( - "`c1_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - # ----- c2 ----- - - # set c2 to -26 - if (is.null(c2)) { - c2 <- -26 - } - - # create error message for c1 priros - if (!is.numeric(c2)) { - cli::cli_abort(c( - "`c2` argument must be a numerical value.", - "i" = "Please provide a numerical value as a piror." - )) - } - - # set c1_sigma to 1 - if (is.null(c2_sigma)) { - c2_sigma <- 1 - } - # create error message for n1 priors - if (!is.numeric(c2_sigma)) { - cli::cli_abort(c( - "`c2_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - # ---- dn priors ----- - - - if (is.null(dn)) { - dn <- 3.4 - } - - if (!is.numeric(dn)) { - cli::cli_abort(c( - "`dn` argument must be a numerical value", - "i" = "Please provide a numerical value as a pirorr" - )) - } - - # create error message for dn priors - if (is.null(dn_sigma)) { - dn_sigma <- 0.25 - } - - if (!is.numeric(dn_sigma)) { - cli::cli_abort(c( - "`dn_sigma` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - # ----- tp ----- - - # set piror for tp - if (is.null(tp_lb)) { - tp_lb <- 2 - } - - # create error message for tp priros - - if (!is.numeric(tp_lb)) { - cli::cli_abort(c( - "`tp_lb` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - if (is.null(tp_ub)) { - tp_ub <- 10 - } - - # create error message for n1 priors - if (!is.numeric(tp_ub)) { - cli::cli_abort(c( - "`tp_ub` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - # ----- sigma ----- - - # set piror for tp - if (is.null(sigma_lb)) { - sigma_lb <- 0 - } - - # create error message for tp priros - - if (!is.numeric(sigma_lb)) { - cli::cli_abort(c( - "`sigma_lb` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - if (is.null(sigma_ub)) { - sigma_ub <- 10 - } - - # create error message for n1 priors - if (!is.numeric(sigma_ub)) { - cli::cli_abort(c( - "`sigma_ub` argument must be a numerical value", - "i" = "Please provide a numerical value as a piror" - )) - } - - - if (isTRUE(bp)) { - priors_params <- + defaults <- default_priors("two_source_arc") + # supplied + supplied <- list( + a = a, + b = b, + n1 = n1, + n1_sigma = n1_sigma, + n2 = n2, + n2_sigma = n2_sigma, + c1 = c1, + c1_sigma = c1_sigma, + c2 = c2, + c2_sigma = c2_sigma, + dn = dn, + dn_sigma = dn_sigma, + tp_lb = tp_lb, + tp_ub = tp_ub, + sigma_lb = sigma_lb, + sigma_ub = sigma_ub + ) + + # ---- either set defaults or supplied ------ + params <- Map(function(x, d) if (is.null(x)) d else x, supplied, defaults) + + # check them + lapply(names(params), function(nm) { + check_numerical(params[[nm]], arg_name = nm) + }) + # ----- put them in to function envo + params_env <- list2env(params, parent = environment()) + + priors_params <- if (isTRUE(bp)) { + with(params_env, { brms::stanvar(a, name = "a") + brms::stanvar(b, "b") + brms::stanvar(n1, name = "n1") + @@ -378,15 +193,10 @@ two_source_priors_params_arc <- function( brms::stanvar(tp_ub, "tp_ub") + brms::stanvar(sigma_lb, "sigma_lb") + brms::stanvar(sigma_ub, "sigma_ub") - } - - - # ----- dn ----- - - if (isFALSE(bp)) { - # ----- set prirors ----- - - priors_params <- + } + ) + } else { + with(params_env, { brms::stanvar(a, name = "a") + brms::stanvar(b, "b") + brms::stanvar(dn, "dn") + @@ -395,6 +205,8 @@ two_source_priors_params_arc <- function( brms::stanvar(tp_ub, "tp_ub") + brms::stanvar(sigma_lb, "sigma_lb") + brms::stanvar(sigma_ub, "sigma_ub") + } + ) } return(priors_params) diff --git a/R/utils.R b/R/utils.R new file mode 100644 index 0000000..c42dcb5 --- /dev/null +++ b/R/utils.R @@ -0,0 +1,177 @@ +#' Error functions +#' @param x prior to check +#' @param arg_name the name of the argument to check. +#' +#' @name error_functions +#' @keywords internal + +check_column_names <- function(x, + arg_name = NULL) { + + if (is.null(arg_name)) { + arg_name <- rlang::as_label(rlang::enexpr(x)) + } + + rv <- c("d13c", "c1", "c2") + + if (!all(rv %in% names(x))) { + mv <- setdiff(rv, names(x)) + + cli::cli_abort(c( + "`{arg_name}` is missing: {mv}", + "i" = "Please provide {mv}" + )) + } +} + +#' @param x prior to check +#' @param arg_name the name of the argument to check. +#' @name error_functions +#' @keywords internal + +check_data_frame <- function(x, + arg_name = NULL) { + + if (is.null(arg_name)) { + arg_name <- rlang::as_label(rlang::enexpr(x)) + } + + if (!(inherits(x, c("data.frame", "tibble", "data.table")))) { + cli::cli_abort(c( + "`{arg_name}` must be a data.frame, tibble, or data.table", + "i" = "Please provide data.frame" + )) + } +} + + +#' @param x prior to check +#' @param arg_name the name of the argument to check. +#' @name error_functions +#' @keywords internal +check_lambda <- function(x, + arg_name = NULL) { + + if (is.null(arg_name)) { + arg_name <- rlang::as_label(rlang::enexpr(x)) + } + + if (!(is.numeric(x)) || !(x %in% c(1, 2))) { + cli::cli_abort(c( + "`{arg_name}` argument must be a numeric value and either `1` or `2`", + "i" = "Please provide `1` or `2`" + )) + } +} + + +#' @param x prior to check +#' @param arg_name the name of the argument to check. +#' +#' @name error_functions +#' @keywords internal + +check_logical <- function(x, arg_name = NULL) { + + if (is.null(arg_name)) { + arg_name <- rlang::as_label(rlang::enexpr(x)) + } + + if (!(is.logical(x))) { + cli::cli_abort(c( + "`{arg_name}` argument must be a logical value", + "i" = "Please provide TRUE or FALSE" + )) + } +} + +#' @param x prior to check +#' @param arg_name the name of the argument to check. +#' +#' @name error_functions +check_numerical <- function(x, arg_name = NULL) { + + if (is.null(arg_name)) { + arg_name <- rlang::as_label(rlang::enexpr(x)) + } + + if (!is.numeric(x) || length(x) != 1) { + cli::cli_abort(c( + "`{arg_name}` argument must be a numerical value.", + "i" = "Please provide a numerical value" + )) + } +} + +#' Set default priors +#' @param model model type +#' @name set_priors +#' @keywords internal + +default_priors <- function(model = c( + "one_source", + "two_source", + "two_source_ar", + "two_source_arc" +)) { + + model <- match.arg(model) + + base_defaults <- list( + dn = 3.4, + dn_sigma = 0.25, + tp_lb = 2, + tp_ub = 10, + sigma_lb = 0, + sigma_ub = 10 + ) + + model_specific <- list( + + one_source = list( + n1 = 9, + n1_sigma = 1 + ), + + two_source = list( + a = 1, + b = 1, + c1 = -21, + c1_sigma = 1, + c2 = -26, + c2_sigma = 1, + n1 = 8, + n1_sigma = 1, + n2 = 9.5, + n2_sigma = 1 + ), + + two_source_ar = list( + a = 1, + b = 1, + n1 = 8, + n1_sigma = 1, + n2 = 9.5, + n2_sigma = 1 + ), + + two_source_arc = list( + a = 1, + b = 1, + n1 = 8, + n1_sigma = 1, + n2 = 9.5, + n2_sigma = 1, + c1 = -21, + c1_sigma = 1, + c2 = -26, + c2_sigma = 1 + ) + ) + + # Merge: specific overrides base + c(model_specific[[model]], + base_defaults) +} + + diff --git a/R/zzz.R b/R/zzz.R index 7955010..2ce19ff 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,27 +1,29 @@ .onAttach <- function(libname, pkgname) { - packageStartupMessage("version 0.1.0 ('one-skate').\nHave you loaded {brms}?") + packageStartupMessage("version 0.1.1 ('two-skate').\nHave you loaded {brms}?") } utils::globalVariables(c( - "n1", - "n1_sigma", - "normal", - "uniform", + "a", "alpha", - "min_alpha", - "max_alpha", - "d13c", + "b", "c1", "c2", + "c1_mean", + "c2_mean", + "c1_sigma", + "c2_sigma", + "d13c", "dn", "dn_sigma", + "max_alpha", + "min_alpha", + "n1", + "n2", + "n1_sigma", + "n2_sigma", + "normal", "sigma_lb", - "sigma_ub", "tp_lb", + "sigma_ub", + "tp_lb", "tp_ub", - "c1_mean", - "c2_mean", "n2", - "n2_sigma", - "c1_sigma", - "c2_sigma", - "a", - "b" + "uniform" )) diff --git a/man/error_functions.Rd b/man/error_functions.Rd new file mode 100644 index 0000000..5106d80 --- /dev/null +++ b/man/error_functions.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{error_functions} +\alias{error_functions} +\alias{check_column_names} +\alias{check_data_frame} +\alias{check_lambda} +\alias{check_logical} +\alias{check_numerical} +\title{Error functions} +\usage{ +check_column_names(x, arg_name = NULL) + +check_data_frame(x, arg_name = NULL) + +check_lambda(x, arg_name = NULL) + +check_logical(x, arg_name = NULL) + +check_numerical(x, arg_name = NULL) +} +\arguments{ +\item{x}{prior to check +@param arg_name the name of the argument to check.} + +\item{arg_name}{the name of the argument to check.} +} +\description{ +Error functions +} +\keyword{internal} diff --git a/man/set_priors.Rd b/man/set_priors.Rd new file mode 100644 index 0000000..2f3b865 --- /dev/null +++ b/man/set_priors.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{set_priors} +\alias{set_priors} +\alias{default_priors} +\title{Set default priors} +\usage{ +default_priors( + model = c("one_source", "two_source", "two_source_ar", "two_source_arc") +) +} +\arguments{ +\item{model}{model type} +} +\description{ +Set default priors +} +\keyword{internal} diff --git a/man/trps-package.Rd b/man/trps-package.Rd index 9dc2988..89bfa98 100644 --- a/man/trps-package.Rd +++ b/man/trps-package.Rd @@ -4,7 +4,7 @@ \name{trps-package} \alias{trps} \alias{trps-package} -\title{trps: Bayesian Trophic Position Models using 'stan'} +\title{trps: Bayesian Trophic Position Models using 'Stan'} \description{ \if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}} diff --git a/tests/testthat/test-add_alpha.R b/tests/testthat/test-add_alpha.R index ad734ec..256f734 100644 --- a/tests/testthat/test-add_alpha.R +++ b/tests/testthat/test-add_alpha.R @@ -31,7 +31,7 @@ test_that("test check if alpha errors ", { test_that("test check if alpha errors ", { expect_error( add_alpha(data = combined_iso[-c(4, 10, 12)]), - "The data.frame is missing: d13c, c1, and c2" + "`data` is missing: d13c, c1, and c2" ) }) diff --git a/tests/testthat/test-one_source_priors_params.R b/tests/testthat/test-one_source_priors_params.R index 602834c..6065962 100644 --- a/tests/testthat/test-one_source_priors_params.R +++ b/tests/testthat/test-one_source_priors_params.R @@ -306,9 +306,9 @@ test_that("test one-source priors sigma_ub", { test_that("test priors fails sigma_ub ", { expect_error( - one_source_priors_params(, + one_source_priors_params( sigma_ub = "test" ), - regexp = "`sigma_ub` argument must be a numerical value" + regexp = "`sigma_ub` argument must be a numerical value." ) }) diff --git a/vignettes/article/estimate_trophic_position_two_source_model_ar.Rmd b/vignettes/article/estimate_trophic_position_two_source_model_ar.Rmd index 95308c9..24eee9a 100644 --- a/vignettes/article/estimate_trophic_position_two_source_model_ar.Rmd +++ b/vignettes/article/estimate_trophic_position_two_source_model_ar.Rmd @@ -56,7 +56,7 @@ from above, $\alpha_{min}$ is the minimum value of $\alpha$ calculated above, an $$ \text{Trophic Position} = \lambda + \frac{(\delta^{15}N_c - -[(\delta^{15}N_{b1} \times \alpha_r) - (\delta^{15}N_{b1} \times (1 - \alpha_r))]}{\Delta N} +[(\delta^{15}N_{b1} \times \alpha_r) + (\delta^{15}N_{b2} \times (1 - \alpha_r))]}{\Delta N} $$