New:
reticulate handling and to @arcruz0 for JAX prediction functions.sampleSelection models with type="conditional" are now supported.partykit package: lmtree and glmtree.Bug:
avg_predictions() did not respect the wts argument when using variables to create counterfactual predictions. Thanks to @strengejacke for report #1596.datagrid() with newdata= instead of model=. Issue #1584.brms models with categorical outcomes. Thanks to @mattansb for a proposed solution and to @strengejacke for report #1392.New functions:
prune() deletes internal information from a marginaleffects object to save memory space.components() returns internal information from a marginaleffects object.New features:
inferences(method = "rsample", group = ...). Issue #1528.datagrid() gains a new grid_type = "dataframe" option that binds columns element-wise rather than creating cross-products, requiring all explicit vectors to have the same length.datagrid() gains a FUN argument to apply the same function to all variable types, overriding grid_type defaults but not specific FUN_* arguments.equivalence argument is now supported for bayesian models. It returns the share of posterior draws in the equivalence interval.Misc:
AER::tobit() can use type="link"systemfit models.tidymodels() can now do conformal prediction with inferences().hypotheses() attempts to post-process a previous marginaleffects call.newdata. Useful for Issue #6 in marginaleffectsJAX.inferences(). Unfortunately, we cannot support them because they are not guaranteed to come with an appropriate update() class.inferences() new computes p-values for method = "fwb". conf_type can now be "perc" or "wald" for method = "simulation".get_dataset() now delegates most of the work to the Rdatasets package (optional dependency).attr(x, "marginaleffects").inferences() by avoiding repeated calls to get_modeldata()vcov="HC0" for glmmTMB models. Requires 1.1.12 of glmmTMB and >1.4.0 of insight. Thanks to @strengejacke for report #1562.Bugs:
sampleSelection models.betareg models with Log(nu) parameter. Thanks to @strengejacke for report #1568.Breaking changes:
marginaleffects can no longer compute standard errors for fixest models in the following configurations (see Issue #1487):predictions() in all model.slopes() and comparisons() in models with non-linear link (ex: fepois), that is, with a $family component.estimator argument of the inferences() function is simpler:inferences(est_fun(data), estimator = est_fun, method = "rsample")inferences(data, estimator = est_fun, method = "rsample")Bugs:
vcov=FALSE in lme4 and glmmTMB models. Thanks to @ASKurz for report #1460.inferences() passes extra arguments to boot(), as documented.inferences(method="rsample") should not collapse estimates when term is not unique (ex: contrast, by, etc.)inferences(method="rsample") does not retain all attributes (data, model, etc.) in every iteration.inferences(method="rsample") alignment bug between estimates and CIs.Misc:
inferences() gets an optional estimator argument. This should be a function that accepts a data frame and returns a marginaleffects object. This is especially useful when the estimation strategy involves multiple steps such as computing weights, estimating a model, and computing a treatment effect via G-computation. In that case, we specify an estimator() function and the inferences() function returns a clean marginaleffects object with all the draws, without having to manually process the raw output from a bootstrap package.brms models, the extra argument incl_autocor no longer raises a warning. Thanks to @robbinscalebj for report #1473.get_dataset() examples to avoid CRAN note.mlogit support is back for predictions() and avg_predictions(). A vignette is added to the websiteBreaking change:
datagrid() now sorts values of variables that are not explicitly supplied. This may change the row order of some results. Thanks to @mattansb for feature request #1439.hypothesis=ratio~ is now 1. With hypothesis=difference~ it is still 0. Thanks to Uffe Heide-Jørgensen for report #1453.New:
hypothesis argument can specify 1-tailed tests with strings: avg_predictions(model, hypothesis = "b1 <= 3")get_dataset() no longer requires the user to specify the package argument. It automatically searches the data index for a unique matching dataset.hypotheses() adds response names to term names. This allows hypothesis="groupa_var1=groupb_var1". Thanks to @mattansb for report #1432.vcov accepts "rsample", "boot", "fwb", and "simulation". The object is automatically passed to inferences(method=) with default arguments. This is only meant as a shortcut. To customize the bootstrap strategy, users should use inferences().get_dataset() downloads Parquet files instead of CSV. Faster.inferences() methods "fwb" and "rsample" can now be parallelized using the global options(marginaleffects_parallel_inferences=TRUE)df="residual" calls insight::get_df(model) to get degrees of freedom for the p value computation. This usually delegates extraction to df.residual().datagrid() ensures integers stay integers. Thanks to @mattansb for report #1439.inferences() now uses the mvtnorm package instead of MASS to draw multivariate normal numbers for simulation-based inference.Bugs:
rms package now allows tibbles. Thanks to @stephenrho for report #1428.get_vcov() workaround when vcov does not match dimensions of jacobian. Thanks to @fisher-j for report #1439.Misc:
Bugs:
df is now respected when using the multcomp argument. Thanks to @TonyRoberson for report #1414 and to @ngreifer for the solution.hypotheses() has both a number in hypothesis and a value in multcomp. Thanks to J. Rohrer for Issue #1381.tidymodelstype is respected for models of class betareg. Thanks to @strengejacke for reporting issue #1391.revreference is available again in the hypothesis argument.conformal_score="residual_sq" incorrectly added the score to the prediction instead of absolute residual. Coverage was probably incorrect, with wider intervals than necessary. Issue #1407.hypotheses() supports multiple imputation objects from mice. Thanks to @ASKurz for raising issue #1420.tidymodels() reshape bug.revreference is available again in the hypothesis argument.Miscellaneous:
collapse is not necessary for hypothesis formulas. Thanks to @ngreifer for Issue #1383.Breaking changes in preparation for 1.0.0 release:
hypothesis argument no longer accepts strings like "reference" or "pairwise". Use the formula interface instead: hypothesis= ~referencetype is now "survival" for models of class coxph, flexsurvreg, and coxph_weightit.p_adjust argument deprecated because of name-matching conflict with p argument in quantile regression and others. The recommended workflow is now to pass the object to the hypotheses() function and use its multcomp argument.marginaleffects, meffects, marginal_means, deltamethod, datagridcf. newdata="marginalmeans" was changed to newdata="balanced" several releases ago, but backward compatibility was maintained. This shortcut is no longer available at all.New:
hypothesis argument is more flexible. Thanks to @mattansb for requests, testing, and documentation.hypothesis = ratio ~ meandev | groupidhypothesis = ~ poly | groupidhypothesis = ~ helmert | groupidhypothesis = ~ trt_vs_ctrl | groupidhypothesis = ~ I(foo(x)) | groupidhypothesis = ~ I(\(x) c(a = x[1], b = mean(x[2:length(x))))get_dataset() to download example data frames from the https://marginaleffects.com website. Thanks to @bshor for the feature request.multcomp argument for the hypotheses() function.hypotheses() inherits the conf_level from marginaleffects objects when available. Otherwise, the default remains 0.95.lme4 and glmmTMB models with re.form=NULLdf.residual() methods tries to call stats::df.residual() on the "model" attribute. If that fails or returns NULL, we return Inf.hypotheses() calls. Issue #1316.get_draws(). Thanks to @andymilne for feature request #1318.rvar column from get_draws() is now printed by default.scale(), for example. Thanks to @barryrowlingson for the report.inferences(method="boot"). Thanks to @nremenyi for issue #1352.hypothesis=~pairwise only errors when there are more than 300 comparisons. options(marginaleffects_safe=FALSE) to disable this check.Bugs:
marginaleffects_lean but necessary for printing.by. Thanks to @Koalha for report #1290.avg_comparisons(by=data.frame()) and avg_slopes(by=data.frame()). Thanks to @andymilne for report #1313.hypotheses(p, hypothesis=~reference) did not work for some p objects. Issue #1310.gray is respected for the points argument in plot_*()hypotheses(x, joint=1:2) did not work when x was a marginaleffects object. Thanks to @mattansb for report #1340Breaking changes in preparation for 1.0.0 release:
by argument. This may change the order of estimates, which can affect hypothesis tests using positional indices like b1-b2=0.Bugs:
avg_predictions(). Thanks to @vbrazao for report #1230.systemfit models returned no standard errors when the same variables entered in different parts of the model. Thanks to @mronkko for report #1233.New features:
marginaleffects objects by setting the new global option options(marginaleffects_lean = TRUE). This will strip the return objects of all information about the original model and data, as well ancillary attributes. The benefit of dramatically smaller return objects comes at the cost of not being able to run some post-processing inference functions like hypotheses() on these lean objects. Thanks to @grantmcdermott for the suggestion and code contribution #1267.Misc:
hypothesis="b1=b2" can be dangerous if row order is modified. A warning is now issued once per session with detailed advice. This warning can be disabled with options(marginaleffects_safe=FALSE).ggplot2 object returned by plot_*() functions now includes the estimates as a default object. This allows things like: plot_predictions(model, condition="x")+geom_line(). Thanks to @mattansb for code contribution #1259.haven_labelled. Thanks to @mwindzio for report #1238.lme4 and glmmTMB models, warnings are now silenced when the user specifically passes re.form=NULL. Thanks to @mattansb for the feature request.options(marginaleffects_startup_message = FALSE).posterior_draws() is renamed get_draws() because it also applies to bootstrap and simulation-based inference draws.get_coef() and get_vcov() are now documented on the main website, as they are useful helper functions.Breaking change:
mlogit is deprecated. The reason is that the data structure for these models is one observation-choice per row. Every other model-fitting package supported by marginaleffects treats rows as individual observations. The observation-choice structure made it harder to track indices and match individual predictions to rows in the original data. This added a lot of complexity to marginaleffects, and the results were not always reliable or safe.Bugs:
glmmTMB supporttype="zprob". Thanks to @jgeller112 for issue #1189.hypotheses() bug resolved. Thanks to @reikookamoto for the code submission.multinom_weightit models with insight version 0.20.4 and greater would produce an error. Thanks to Noah Greifer.hypotheses(joint = TRUE) would throw an error if sample sizes could not be computed, even if they were not needed. Thanks to Noah Greifer.hypotheses(joint = TRUE) respects the vcov argument. Thanks to @kennchua for report #1214.ordbetareg models in glmmTMB are now supported. Thanks to @jgeller112 for code contribution #1221.tidymodels(): Indexing overrode the value of predictors in the output data frame. The numerical estimates were unaffected. Thanks to @agmath for report #1209.Breaking changes:
type="invlink(link)" is no longer default in avg_predictions() or when calling predictions() with the by argument. It is still default in predictions() without the by argument. The backtransform strategy is still available with by setting type="invlink(link)" explicitly.type argument in plot_comparisons() now defaults to NULL, which is now consistent with comparisons() and avg_comparisons(). Before, the default was type="response". Thanks to @giakhang1906 for report #1202.New models supported:
stpm2, pstpm2, gsm, and aft models from rstpm2. Thanks to @aghaynes and @mclements.glm_weightit, coxph_weightit, multinom_weightit, and ordinal_weightit models from Weightit. Thanks to @ngreifer.glmmgee from the glmtoolbox package. Thanks to @adrianolszewski for the request and @lhvanegasp for help with implementation.New features:
future is more efficient by chunking tasks to avoid passing large objects to every worker for every future. Issue #1158.newdata are passed to the hypothesis function when newdata is supplied explicitly. Thanks to @gravesti for report #1175.hypotheses(joint=TRUE): do not call stats::nobs() unless necessary.hypotheses() supports formulas in the hypothesis argument: hypotheses(model, hypothesis = ratio ~ reference)options("marginaleffects_print_omit" = "s.value")plot_predictions(mod, condition = list(x = "fivenum"))print() no longer prints contrast and term columns when values are unique. The labels were often very long, and the content is already explicit in the call itself, so there's no ambiguity.discrete argument is used with mgcv::bam and mgcv::gam models objects. Thanks to @Aariq for the request.tidymodels support is improved. Users can now directly feed some of them without specifying newdata explicitly. Thanks to @davidkane9 for the feature request.Bugs:
NA for some commands in survey models. Thanks to @weikang9009 for report #1161.tinytable theme.New:
hypothesis accepts formulas like: ratio ~ sequential | groupcomparisons(mod, variables = list(am = 1:0, vs = 0:1)). Thanks to K. Henry for report #1137.options(marginaleffects_safe = FALSE) disables some safety checks and allows unadvisable (but potentially) useful features like many pairwise comparisons. Thanks to D.Locke for the feature request.newdata="balanced" is a shortcut to produce estimates at combinations of all categorical predictors, holding numeric predictors at their means. Equivalent to datagrid(grid_type="balanced")Misc:
specify_hypothesis(). This function was clearly marked as experimental, and has been available only for one release. It was a bad idea. Users should supply a custom function or a formula to the hypothesis argument. The new formula interface, in particular, makes it very easy to conduct group-wise hypothesis tests.Bugs:
mlogit models due to factor conversion. This raised an error before returning result, so there is no numerical danger.survey package models work when row.names(model) is not coercible to integers. Thanks to @ngreifer for report #1131.comparison argument of the comparisons() function is automatically switched to the avg version of the function shortcuts when calling avg_comparisons() or setting by=TRUE. For example, comparison="ratio" becomes comparison="ratioavg" when calling avg_comparisons(). Note that comparison="ratioavg" is equivalent to: comparison = \(hi,lo) mean(hi)/mean(lo)survreg objects from survival::survreg().inferences() for GLM models and type="invlink", where the wrong scale would be reported for confidence intervals.Breaking changes:
group column is preserved when the original variable is a factor. This may change the order of output, which could have an effect on hypothesis tests using the hypothesis="b1=b3" syntax.New:
specify_hypothesis() returns functions to be used in the hypothesis argument of predictions(), comparisons(), and slopes(). This convenience function can be used to specify complex aggregations and estimands for hypothesis tests (ex: by subgroups or with custom functions).hypothesis argument accepts "meandev" and "meanotherdev" to compute deviations from the mean estimate.survey package models when the by argument is not used.hypotheses() is called twice on the same object.print("tinytable") adds footnotes to the table with columns and type information.Bugs:
mlogit predict() method does not play well with data.table. Thanks to @andrewheiss for report #1086.newdata in predictions() when hypothesis can change the meaning of rows. Avoid Issue #1105 reported by @strengejacke.inferences() did not work with the transform argument. Thanks to Demetri Pananos for report #1115.Breaking changes:
datagrid() no longer includes the response variable by default when it is not explicitly specified by the user. Use the new response argument to include it.datagrid(grid_type="balanced") returns factors ordered by level rather than by order of appearance in the original data.datagrid(). Necessary to fix issue #1079 (see below).New modeling packages supported:
flexsurv: Thanks to @mattwarkentin for code contributions in PR #781. https://cran.r-project.org/web/packages/flexsurv/index.htmlREndo: https://cran.r-project.org/web/packages/REndo/index.htmlNew:
wts=TRUE tries to retrieves weights used in a weighted fit such as lm() with the weights argument or a model fitted using the survey package. Thanks to @ngreifer for feature requestprint.marginaleffects() supports style="tinytable", which returns a tinytable object. Call print(avg_slopes(model)) to get a nice printed table in Quarto or Rmarkdown documents, via Typst, LaTeX or HTML. Default print format can be set using: options(marginaleffects_print_style="tinytable")hypothesis argument accepts a function which takes a marginaleffects data frame and returns a transformed data frame with term and estimate columns.datagrid() gets a response argument (default is FALSE) to control if the response variable is included or excluded from the grid-building process.base::subset() and dplyr::filter() functions can be called with a single argument in newdata to select a subset of rows from the dataset used to fit the model.df argument in hypotheses() accepts a vector of length 2 to control degrees of freedom in F tests.nlme::lme() objects raise a warning about degrees of freedom. Thanks to and @stefgehrig and @huftis for discussion in Issue #960.Major bugs:
datagrid() or condition. Thanks to @snhansen for report #1079.glmmTMB models now report correct standard errors, and raise a warning that these standard errors only account for uncertainty in fixed effect parameters. Thanks to contributors to Issue #1024 and especially to @bbolker for discussion and solution.Minor bugs:
comparison function returns NA in bayesian models. Thanks to @Sandhu-SS for report #1017.datagrid() returns an object with full attributes when by is used. Thanks to @Sandhu-SS for report #1058.inferences(method="simulation") with inferences() function. Thanks to @davidarmstrong for report #1054.This release represents a major step towards 1.0.0. Some functions are renamed and now raise deprecation warnings. After 1.0.0, the API will become much more stable, and any change will have to be very deliberate with much lead time and deprecation delays.
Breaking changes:
tidy() no longer takes the average of estimates in the original model object. Users who want an aggregate estimate should call the relevant avg_*() function, or use the by argument explicitly. The previous behavior led to unexpected behavior and increased code complexity a lot.summary() methods are removed. These have never provided any additional information; they just reprinted the output already available with the standard print method. At least the default summary() for data frames (which is now triggered on marginaleffects object) provides a different view on the content of the object.plot_cco(), plot_cme(), and plot_cap() were renamed in version 0.9.0, one year ago. They are now fully removed from the package.New:
datagrid(grid_type = "balanced") creates a balanced grid with all unique values of categorical predictors. This can be used with predictions() to compute marginal means as in the emmeans package.mvgam package support (multivariate generalized additive models)Deprecation warnings:
deltamethod() has been named hypotheses() for a while. We now issue a deprecation warning and it will be removed eventually.datagridcf() will eventually be deprecated and removed from the package. We will raise a warning for at least one year before removing the function. Identical results can be obtained with datagrid(..., grid_type="counterfactual")marginal_means() will eventually be deprecated and removed from the package. We will raise a warning for at least one year before removing the function. Identical results can be obtained using the predictions() function and the grid_type="balanced" argument of datagrid(). Examples are in the marginal means vignette on the website.Minor:
Bug fixes:
hypotheses(joint = "string") for comparisons() objects (no result was returned). Thanks to @BorgeJorge for report #981.brms models. Thanks to @winterstat for report #1006.Breaking changes:
comparisons() now uses "forward contrasts" by default for numeric predictors, instead of "centered contrasts". This can lead to small numerical differences in non-linear models.variables argument of the comparisons() function no longer accepts numeric vectors unless they are of length 2, specifying the low and high contrast values. This is to avoid ambiguity between the two vector version. Users should supply a data frame or a function instead. This is nearly as easy, and removes ambiguity.New supported packages:
dbarts: https://cran.r-project.org/package=dbartsmvgam: https://nicholasjclark.github.io/mvgam/ Not available on CRAN yet, but this package maintains its own marginaleffects support function.rms::Gls: https://cran.r-project.org/package=rmsMisc:
comparisons(): The variables argument now accepts functions and data frames for factor, character, and logical variables.plot_cap(), plot_cme(), and plot_cco(). These function names will be removed in version 1.0.0.options(modelsummary_factory_default=...) is respected in Quarto and Rmarkdown documents.Bugs:
wts argument now respected in avg_slopes() for binary variables. Thanks to @trose64 for report #961comparison argument of comparisons() did not supply the correct x vector length for bayesian models when the by argument is used. Thanks to @Sandhu-SS for report #931.facet_grid) when plotting using conditioncomparisons(): When variables is a vector of length two and newdata has exactly two columns, there was ambiguity between custom vectors and length two vector of contrasts. Bug reported by C. Rainey on Twitter.fixest::fenegbin.Machine learning support:
tidymodels packagemlr3 packageMisc:
hypotheses() to inferences(). Thanks to @Tristan-Siegfried for code contribution #908.survival::survreg(). Thanks to Carlisle Rainey for Report #911.column_names argument in print.marginaleffects() to suppress the printed column names at the bottom of the printout.comparison argument of the comparisons() function can now operate on x and on newdata directly (e.g., to check the number of observations).predict().Bugs:
gamlss models generated an error related to the what argument. Thanks to @DHLocke for Issue #933hypotheses(): The FUN argument handles group columns gracefully.Amelia for multiple imputation.Documentation:
Bug fix:
predictions() function could be inaccurate when (a) running version 0.15.0, (b) type is NULL or invlink(link), (c) model is glm(), and (d) the hypothesis argument is non-numeric. Thanks to @strengejacke for report #903New:
inferences()hypothesis argument now accepts multiple string formulas.type argument now accepts an explicit invlink(link) value instead of silently back-transforming. Users are no longer pointed to type_dictionary. Instead, they should call their function with a bad type value, and they will obtain a list of valid types. The default type value is printed in the output. This is useful because the default type value is NULL, so the user often does not explicitly decide.Support new models:
survey::svyolr()Misc:
inferences(method="simulation") uses the original point estimate rather than the mean of the simulation distribution. Issue #851.newdata=NULLpredictions() and marginalmeans() (#880, #882, @etiennebacher).Bug fix:
newdata="median" returned mean of binary variables. Thanks to @jkhanson1970 for report #896.Breaking changes:
term, by, and variables explicitly supplied to datagrid. This can affect hypothesis tests computed using the b1, b2, b3, and other indices.numderiv argument use a different procedure to select the step size used in the finite difference numeric derivative used to compute standard errors: abs(x) * sqrt(.Machine$double.eps). The numerical results may not be exactly identical to previous versions of marginaleffects, but the step size should be adequate in a broader variety of cases. Note that users can use the numderiv argument for more control on numeric differentiation, as documented.bife models are no longer supported pending investigation in weird results in the tests. Looking for volunteers write more thorough tests.New:
logistf package.DCchoice package.stats::nlshypotheses() can now accept raw data frame, which gives a lot of flexibility for custom contrasts and functions. See the Hypothesis vignette for an example.numderiv argument allows users to use finite difference (center or forward) or Richardson's method to compute the numerical derivatives used in the calculation of standard errors.Bug fixes:
inferences() supports the cross argument for comparisons() objects. Thanks to Kirill Solovev for report #856.splines::bs() in formulas could produce incorrect results due to weirdness in stats::model.matrix(). Thanks to @chiungming for report #831.mgcv with ocat are now supported. Thanks to Lorenzo Fabbri for Issue #844.quantreg problem with rowid merge did not affect estimates but did not return the full original data. Issue #829.get_modeldata() extracts weights variable when available.predictions() is no longer broken in some inferences() calls. Issue #853comparison=differenceavg some models where all predictors are categorical. Thanks to Karl Ove Hufthammer for report #865.Misc:
Breaking change:
glmmTMB: Standard errors are no longer supported because they may have been erroneous. Follow Issue #810 on Github for developments: https://github.com/vincentarelbundock/marginaleffects/issues/810New:
hypothesis argument accepts wildcards: hypothesis = "b*=b1"s.value column in all output: Shannon transforms for p values. See Greenland (2019).marginal_means supports mira (mice objects).comparisons(): The variables arguments now accepts arbitrary numeric vectors of length equal to the number of rows in newdata. This allows users to specify fully custom treatment sizes. In the documentation examples, we show how to estimate the difference for a 1 standard deviation shift in a regressor, where the standard deviation is calculated on a group-wise basis.comparisons(): the variables argument now accepts "revpairwise", "revsequential", "revreference" for factor and character variables.comparisons(): the comparison argument now accept "lift" and "liftavg".Performance:
Bug fixes:
newdata is a function call. Thanks to @jcccf for report #814 and to @capnrefsmmat for the proposed fix using the rlang package.Breaking change:
by argument. This may break hypothesis tests conducted by indexing b1, b2, etc. This was necessary to fix Issue #776. Thanks to @marcora for the report.New:
hypotheses(): Joint hypothesis tests (F and Chi-square) with the joint and joint_test arguments.vcov.hypotheses method.wts is now available in plot_predictions(), plot_comparisons(), and plot_slopes().Bug:
by argument. Thanks to @shirdekel for report #782.vcov() and coef() methods for marginaleffects objects.wts are accepted with the by argument.predictions() and avg_predictions() no longer use an automatic backtransformation for GLM models unless hypothesis is NULL.vcov() can be used to retrieve a full variance-covariance matrix from objects produced by comparisons(), slopes(), predictions(), or marginal_means() objects.mice multiple imputation, the pooled model using mice::pool is attached to the model attribute of the output. This means that functions like modelsummary::modelsummary() will not erroneously report goodness-of-fit statistics from just a single model and will instead appropriately report the statistics for the pooled model. Thanks to @Tristan-Siegfried for PR #740.Performance:
inferences() is now up to 17x faster and much more memory-efficient when method is "boot" or "rsample" (#770, #771, @etiennebacher).Bugs:
brms models with nl=TRUE and a single predictor generated an error. Thanks to @Tristan-Siegried for Report #759.avg_predictions(): Incorrect group-wise averaging when all predictors are categorical, the variables variable is used, and we are averaging with avg_ or the by argument. Thanks to BorgeJorge for report #766.datagrid() when called inside a user-written function. Thanks to @NickCH-K for report #769 and to @capnrefsmmat for the diagnostics.Breaking change:
hypothesis with b1, b2, ... indexing.Support new models:
nlme::lme()phylolm::phylolm()phylolm::phyloglm()New:
comparisons() accepts data frames with two numeric columns ("low" and "high") to specify fully customizable contrasts.datagrid() gets a new by argument to create apply grid-making functions within groups.plot_*() gain a newdata argument for use with by.Bug:
comparisons(comparison = "lnratioavg") ignored wts argument. Thanks to Demetri Pananos for report #737.ordinal::clm(): incorrect standard errors when location and scale parameters are the same. Thanks to MrJerryTAO for report #718.datagrid() means newdata argument gets ignored. Thanks to Josh Errickson for report #721.by argument. Thanks to Sam Brilleman for report #723.ordinal::clm() models. Thanks to MrJerryTAO for report #729.glmmTMB models with zero-inflated components are supported. Thanks to @Helsinki-Ronan and @strengejacke for report #734.Breaking changes:
type column is replaced by type attribute.predictions() only works with officially supported model types (same list as comparisons() and slopes()).Renamed arguments (backward compatibility is preserved):
transform_pre -> comparisontransform_post -> transformNew:
p_adjust argument: Adjust p-values for multiple comparisons.equivalence argument available everywhere.Performance:
avg_*() functions for models with only categorical predictors and many rows of data, using deduplication and weights instead of unit-level estimates.lm() and glm() models using RcppEigen.Bugs:
mira objects was not pooling all datasets. Thanks to @Generalized for report #711.predictions() with by and wts. Thanks to Noah Greifer for report #695.afex: some models generated errors. Thanks to Daniel Lüdecke for report #696.group column name is always forbidden. Thanks to Daniel Lüdecke for report #697.plot_comparisons() with a list in variables.type="link" produced an error with some categorical brms models. Thanks to @shirdekel for report #703.predictions(variables = ...) for glmmTMB models. Thanks to Daniel Lüdecke for report #707.by with user-specified function in comparison and factor predictor did not aggregate correctly. Thanks to @joaotedde for report #715.ordinal::clm: Support cum.prob and linear.predictor prediction types. Thanks to @MrJerryTAO for report #717.Performance:
New models supported:
MCMCglmm::MCMCglmmRchoice::hetprobRchoice::ivpmlmice and any package which can return a list of imputed data frames (e.g., Amelia, missRanger, etc.)Plot improvements:
by argument to display marginal estimates by subgroup.rug argument to display tick marks in the margins.points argument in plot_predictions() to display a scatter plot.gray argument to plot in grayscale using line types and shapes instead of color.effect argument is renamed to variables in plot_slopes() and plot_comparisons(). This improves consistency with the analogous slopes() and comparisons() functions.Other:
mice mira objects. The multiple imputation vignette was rewritten.variables_grid argument in marginal_means() is renamed newdata. Backward compatibility is maintained.avg_*() returns an informative error when vcov is "satterthwaite" or "kenward-roger"newdata is not NULLhypothesis includes a b# larger than the available number of estimates.avg_predictions(model, variables = "x") computes average counterfactual predictions by subgroups of xdatagrid() and plot_*() functions are faster in datasets with many extraneous columns.predictions(type = NULL) with glm() and Gam() we first make predictions on the link scale and then backtransform them. Setting type="response" explicitly makes predictions directly on the response scale without backtransformation.glmmTMB models.numDeriv package for numeric differentiation in the calculation of delta method standard error. A global option can now be passed to numDeriv::jacobian:options(marginaleffects_numDeriv = list(method = "simple", method.args = list(eps = 1e-6)))options(marginaleffects_numDeriv = list(method = "Richardson", method.args = list(eps = 1e-6)))options(marginaleffects_numDeriv = NULL)print.marginaleffects now prints all columns supplied to newdatahypothesisBugfixes:
avg_predictions(by =) did not work when the dataset included a column named term. Issue #683.brms models with multivariate outcome collapsed categories in comparisons(). Issue #639.hypotheses() now works on lists and in calls to lapply(), purrr::map(), etc. Issue #660.Breaking changes:
estimate column instead of the function-specific predicted, comparisons, dydx, etc. This change only affects unit-level estimates, and not average estimates, which already used the estimate column name.transform_avg argument in tidy() deprecated. Use transform_post instead.plot_*(draw=FALSE) now return the actual variable names supplied to the condition argument, rather than the opaque "condition1", "condition2", etc.New models supported:
blme package.New features:
avg_predictions(), avg_comparisons(), avg_slopes()hypotheses() function and equivalence argument.inferences() function: simulation-based inferences and bootstrap using the boot, rsample, and fwb package.df argument to set degrees of freedom manually for p and CI.print() for all objects.by argumentTRUE returns average (marginal) predictions, comparisons, or slopes.hypothesis argumentcomparisons(mod, transform_pre = "ratio", hypothesis = 1)tidy(), and summary(): conf_level, transform_post, etc.?comparisonsRenamed functions (backward-compatibility is maintained by keeping the old function names as aliases):
marginaleffects() -> slopes()posteriordraws() -> posterior_draws()marginalmeans() -> marginal_means()plot_cap() -> plot_predictions()plot_cme() -> plot_slopes()plot_cco() -> plot_comparisons()Bug fixes:
plot_*() the threenum and minmax labels did not correspond to the correct numeric values.mlogit error with factors.vcov argument now accepts functions for most models.Other:
slopes()deltamethod() can run hypothesis tests on objects produced by the comparisons(), marginaleffects(), predictions(), and marginalmeans() functions. This feature relies on match.call(), which means it may not always work when used programmatically, inside functions and nested environments. It is generally safer and more efficient to use the hypothesis argument.plot_cme() and plot_cco() accept lists with user-specified values for the regressors, and can display nice labels for shortcut string-functions like "threenum" or "quartile".posterior_draws: new shape argument to return MCMC draws in various formats, including the new rvar structure from the posterior package.transform_avg function gets printed in summary() output.transform_post and transform_avg support string shortcuts: "exp" and "ln"mlm models from lm(). Thanks to Noah Greifer.Bug fixes:
hypothesis argument with bayesian models and tidy() used to raise an error.comparisons() output for brms models.Breaking change:
interaction argument is deprecated and replaced by the cross argument. This is to reduce ambiguity with respect to the interaction argument in emmeans, which does something completely different, akin to the difference-in-differences illustrated in the Interactions vignette.71 classes of models supported, including the new:
rms::olsrms::lrmrms::ormNew features:
plot_cme(), plot_cap(), and plot_cco() are now much more flexible in specifying the comparisons to display. The condition argument accepts lists, functions, and shortcuts for common reference values, such as "minmax", "threenum", etc.variables argument of the comparisons() function is more flexible:variables argument of the comparisons function.variables argument of the predictions() function is more flexible:brms models (see Bayesian analysis vignette)New vignettes:
Bug fixes and minor improvements:
conf_level in summary() and tidy() is now NULL, which inherits the conf_level value in the original comparisons/marginaleffects/predictions calls.fixest::i() are parsed properly as categorical variablesbetareg objects, inference can now be done on all coefficients using deltamethod(). previously only the location coefficients were available.crch package, a number of bugs have been fixed; standard errors should now be correct for deltamethod(), marginaleffects(), etc.tidy() function for glmmTMB models without random effects, which caused all t statistics to be identical.gamlss. Thanks to Marcio Augusto Diniz.marginalmeans() accepts a wts argument with values: "equal", "proportional", "cells".by argumentmarginalmeans only accepts data frames.byfun argument for the predictions() function to aggregate using different functions.hypothesis argumentwts argument is respected in by argument and with *avg shortcuts in the transform_pre argument.tidy.predictions() and tidy.marginalmeans() get a new transform_avg argument.marginaleffects. Thanks to timpipeseek.Breaking changes:
by is deprecated in summary() and tidy(). Use the same by argument in the main functions instead: comparisons(), marginaleffects(), predictions()variables argument of the predictions() function. Use newdata="fivenum" or "grid", "mean", or "median" instead.Critical bug fix:
New supported packages and models:
survival::clogitbiglm: The main quantities can be computed, but not the delta method standard errors. See https://github.com/vincentarelbundock/marginaleffects/issues/387New vignette:
New features:
slope argument in marginaleffects(): eyex, dyex, eydxdatagrid() accepts functions: datagrid(newdata = mtcars, hp = range, mpg = fivenum, wt = sd)datagridcf() function to create counterfactual datasets. This is a shortcut to the datagrid() function with default to grid_type = "counterfactual"by arguments in predictions(), comparisons(), marginaleffects()newdata shortcuts: "tukey", "grid"transform_pre in comparisons()marginalmeans() now back transforms confidence intervals when possible.vcov argument string shortcuts are now case-insensitivecomparisons() for binary predictors is now a difference between 1 and 0, rather than +1 relative to baseline.New supported packages and models:
tidymodels objects of class tidy_model are supported if the fit engine is supported by marginaleffects.New function:
deltamethod(): Hypothesis tests on functions of parametersplot_cco(): Plot conditional contrastsNew arguments:
hypothesis for hypothesis tests and custom contraststransform_post in predictions()wts argument in predictions() only affects average predictions in tidy() or summary().New or improved vignettes:
Deprecated or renamed arguments:
contrast_factor and contrast_numeric arguments are deprecated in comparisons(). Use a named list in the variables argument instead. Backward compatibility is maintained.transform_post argument in tidy() and summary() is renamed to transform_avg to disambiguate against the argument of the same name in comparisons(). Backward compatibility is preserved.Misc:
tidy.predictions() computes standard errors using the delta method for average predictionsgam models with matrix columns.eps in marginaleffects() is now "adaptive" by default: it equals 0.0001 multiplied the range of the predictor variablecomparisons() now supports "log of marginal odds ratio" in the transform_pre argument. Thanks to Noah Greifer.transform_pre shortcuts: dydx, expdydxtidy.predictions() computes standard errors and confidence intervals for linear models or GLM on the link scale.Breaking changes:
type no longer accepts a character vector. Must be a single string.conf.int argument deprecated. Use vcov = FALSE instead.New supported packages and models:
mlogitmhurdletobit1glmmTMBNew features:
interaction argument in comparisons() to compute interactions between contrasts (cross-contrasts).by argument in tidy() and summary() computes group-average marginal effects and comparisons.transform_pre argument can define custom contrasts between adjusted predictions (e.g., log adjusted risk ratios). Available in comparisons().transform_post argument allows back transformation before returning the final results. Available in comparisons(), marginalmeans(), summary(), tidy().variables argument of the comparisons() function accepts a named list to specify variable-specific contrast types.vcov argument. This requires version 0.17.1 of the insight package.sandwich package shortcuts: vcov = "HC3", "HC2", "NeweyWest", and more.vcov = "satterthwaite" or "kenward-roger"vcov = ~cluster_variablemarginalmeans() allows interactionsbrms models using type = "average". See vignette on the marginaleffects website.eps argument for step size of numerical derivativemarginaleffects and comparisons now report confidence intervals by default.data.table package yields substantial performance improvements.New pages on the marginaleffects website: https://marginaleffects.com/
Argument name changes (backward compatibility is preserved:
conf.level -> conf_leveldatagrid():FUN.factor -> FUN_factor (same for related arguments)grid.type -> grid_typeNew supported packages and models:
stats::loesssampleSelection::selectionsampleSelection::heckitMisc:
mgcv::bam models allow exclude argument.include_smooth argument.New function:
comparisons() computes contrastsMisc:
predictions() and plot_cap() include confidence intervals for linear modelsggplot2::theme_set() callNew supported models:
mclogit::mclogitrobust::lmRobrobustlmm::rlmerfixest confidence intervals in predictionsMisc:
modelbased::visualisation_matrix in newdata without having to specify x explicitly.tidy.predictions() and summary.predictions() methods.Support for new models and packages:
brglm2::braclmclogit::mblogitscam::scamlmerTest::lmerMisc:
numDeriv dependency, but make it available via a global option:
options("marginaleffects_numDeriv" = list(method = "Richardson", method.args = list(eps = 1e-5, d = 0.0001)))documentation bugfix
Breaking changes:
predictions returns predictions for every observation in the original
dataset instead of newdata=datagrid().marginalmeans objects have new column names, as do the corresponding tidy
and summary outputs.New supported packages and models:
brms::brmrstanarm::stanglmbrglm2::brmultinomMASS::glmmPQLaod::betabinMisc:
datagrid function supersedes typical and counterfactual with the grid.type
argument. The typical and counterfactual functions will remain available
and exported, but their use is not encouraged.posterior_draws function can be applied to a predictions or a
marginaleffects object to extract draws from the posterior distribution.marginalmeans standard errors are now computed using the delta method.predictions standard errors are now computed using the delta method when they are not available from insight::get_predicted.brmslme4data.table package is installed, marginaleffects will automatically use it to speed things up.marginaleffects output.type argument.emmeansBreaking change:
data argument becomes newdata in all functions.New supported packages and models:
lme4:glmer.nbmgcv::gamordinal::clmmgcvmarginalmeans:
variables_grid argumentpredictions:
mgcvplot_cap
type argumentMisc:
First release. Bravo!
Thanks to Marco Avina Mendoza, Resul Umit, and all those who offered comments and suggestions.
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.