From c4d53edd329bcf87f9f6018352925584bd848166 Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Wed, 8 Nov 2023 14:45:11 +1000 Subject: [PATCH] better conditional_effect plots; better error propagation of mgcv models --- NAMESPACE | 3 +++ R/conditional_effects.R | 11 +++++++---- R/get_mvgam_priors.R | 6 ++---- R/mvgam.R | 6 ++---- man/conditional_effects.mvgam.Rd | 7 +------ src/mvgam.dll | Bin 1064960 -> 1064960 bytes tests/testthat/Rplots.pdf | Bin 22858 -> 22882 bytes 7 files changed, 15 insertions(+), 18 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index f7c59a52..72f812f7 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -111,6 +111,9 @@ importFrom(brms,pstudent_t) importFrom(brms,qstudent_t) importFrom(brms,rstudent_t) importFrom(brms,student) +importFrom(ggplot2,scale_colour_discrete) +importFrom(ggplot2,scale_fill_discrete) +importFrom(ggplot2,theme_classic) importFrom(grDevices,devAskNewPage) importFrom(grDevices,hcl.colors) importFrom(grDevices,rgb) diff --git a/R/conditional_effects.R b/R/conditional_effects.R index a405431d..4888ae44 100644 --- a/R/conditional_effects.R +++ b/R/conditional_effects.R @@ -3,6 +3,7 @@ #' Display conditional effects of one or more numeric and/or categorical #' predictors in `mvgam` models, including two-way interaction effects. #' @importFrom brms conditional_effects +#' @importFrom ggplot2 scale_colour_discrete scale_fill_discrete theme_classic #' @importFrom marginaleffects plot_predictions #' @importFrom graphics plot #' @importFrom grDevices devAskNewPage @@ -114,7 +115,8 @@ conditional_effects.mvgam = function(x, rug = rug, ...) + scale_fill_discrete(label = roundlabs) + - scale_colour_discrete(label = roundlabs) + scale_colour_discrete(label = roundlabs) + + theme_classic() } @@ -128,7 +130,8 @@ conditional_effects.mvgam = function(x, rug = rug, ...) + scale_fill_discrete(label = roundlabs) + - scale_colour_discrete(label = roundlabs) + scale_colour_discrete(label = roundlabs) + + theme_classic() } if(length(cond_labs[[i]]) == 3){ @@ -142,7 +145,8 @@ conditional_effects.mvgam = function(x, rug = rug, ...) + scale_fill_discrete(label = roundlabs) + - scale_colour_discrete(label = roundlabs) + scale_colour_discrete(label = roundlabs) + + theme_classic() } @@ -161,7 +165,6 @@ conditional_effects.mvgam = function(x, plot.mvgam_conditional_effects = function(x, plot = TRUE, ask = FALSE, - theme = NULL, ...){ out <- x for(i in seq_along(out)){ diff --git a/R/get_mvgam_priors.R b/R/get_mvgam_priors.R index 86d6e2bb..d6d2c8a5 100644 --- a/R/get_mvgam_priors.R +++ b/R/get_mvgam_priors.R @@ -479,10 +479,8 @@ get_mvgam_priors = function(formula, stop(paste('Missing values found in data predictors:\n', attr(ss_gam, 'condition')), call. = FALSE) - } - - if(grepl('fewer unique', ss_gam[1])){ - stop('A term has fewer unique covariate combinations than specified maximum degrees of freedom', + } else { + stop(paste(ss_gam[1]), call. = FALSE) } } diff --git a/R/mvgam.R b/R/mvgam.R index fce4a86a..08ad7f97 100644 --- a/R/mvgam.R +++ b/R/mvgam.R @@ -755,10 +755,8 @@ mvgam = function(formula, stop(paste('Missing values found in data predictors:\n', attr(ss_gam, 'condition')), call. = FALSE) - } - - if(grepl('fewer unique', ss_gam[1])){ - stop('A term has fewer unique covariate combinations than specified maximum degrees of freedom', + } else { + stop(paste(ss_gam[1]), call. = FALSE) } } diff --git a/man/conditional_effects.mvgam.Rd b/man/conditional_effects.mvgam.Rd index 058715d6..dc286bca 100644 --- a/man/conditional_effects.mvgam.Rd +++ b/man/conditional_effects.mvgam.Rd @@ -15,7 +15,7 @@ ... ) -\method{plot}{mvgam_conditional_effects}(x, plot = TRUE, ask = FALSE, theme = NULL, ...) +\method{plot}{mvgam_conditional_effects}(x, plot = TRUE, ask = FALSE, ...) \method{print}{mvgam_conditional_effects}(x, ...) } @@ -47,11 +47,6 @@ Defaults to \code{TRUE}.} \item{ask}{\code{Logical}. Indicates if the user is prompted before a new page is plotted. Only used if plot is \code{TRUE}. Default is \code{FALSE}.} - -\item{theme}{A \code{\link[ggplot2:theme]{theme}} object -modifying the appearance of the plots. -For some basic themes see \code{\link[ggplot2:ggtheme]{ggtheme}} -and \code{\link[bayesplot:theme_default]{theme_default}}.} } \value{ \code{conditional_effects} returns an object of class diff --git a/src/mvgam.dll b/src/mvgam.dll index 1e4f45009ff40cf961b8c020b1d2fd911cce4024..b2557de620a145f8bddf6a472a568fe59d629dce 100644 GIT binary patch delta 77 zcmV~$%MCz407cQ5@&8R9y08`n=w>WlA`uB~*ozH~+&w+mImi3f`*xk|?YeF5&9aY( hKp0^~C?XMyM5H1UxhO;_Dp4P}=CPOS&g6C9@B>YPBNzYx delta 77 zcmWm5y$wJ>0EXeX!}&RG4_jy@2C&U3zC@y77_rOSvx7t-p8kokkFnnt`@X}zj>c<7 fB*F+QQjv*VI8lgFRH7DMG@?BS-SyYg-Qk%&emf+| diff --git a/tests/testthat/Rplots.pdf b/tests/testthat/Rplots.pdf index 0e3180f0a781e40e27aa7802907d5fc013c42e1e..8dff305e56f3cdcb39e7e760b284b565edfdc51f 100644 GIT binary patch delta 9640 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�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 Mb3-6kbu_vE3nkx(4*&oF delta 9616 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