Breaking changes:
- The default
type
is now "survival" for models of classcoxph
,flexsurvreg
, andcoxph_weightit
. p_adjust
argument deprecated because of name-matching conflict withp
argument in quantile regression and others. The recommended workflow is now to pass the object to thehypotheses()
function and use itsmultcomp
argument.- Removed long deprecated functions from the code base. These functions were already raising errors:
marginaleffects
,meffects
,marginal_means
,deltamethod
,datagridcf
.
New:
- New
multcomp
argument for thehypotheses()
function. hypotheses()
inherits theconf_level
frommarginaleffects
objects when available. Otherwise, the default remains 0.95.- More informative warning for
lme4
andglmmTMB
models withre.form=NULL
df.residual()
methods tries to callstats::df.residual()
on the "model" attribute. If that fails or returnsNULL
, we returnInf
.
Bugs:
- Version 0.24.0 accidentally removed the "contrast" column from the output object in calls with only one focal predictor. This column is reinstated.
- Reinstate some attributes lost with
marginaleffects_lean
but necessary for printing. - Encoding issue in bayesian models with
by
. Thanks to @Koalha for report #1290. - Retain necessary attribute information to ensure that "lean" return objects still print correctly #1295.
Breaking change:
- Rows are now sorted when using the
by
argument. This may change the order of estimates, which can affect hypothesis tests using positional indices likeb1-b2=0
.
Bugs:
- Intercept only model now works with
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:
- Users can reduce the size of
marginaleffects
objects by setting the new global optionoptions(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 likehypotheses()
on these lean objects. Thanks to @grantmcdermott for the suggestion and code contribution #1267.
Misc:
- Using positional indices with
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 withoptions(marginaleffects_safe=FALSE)
. - The
ggplot2
object returned byplot_*()
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. - Be less strict about combining columns of different types. This allows us to handle types like
haven_labelled
. Thanks to @mwindzio for report #1238. - In
lme4
andglmmTMB
models, warnings are now silenced when the user specifically passesre.form=NULL
. Thanks to @mattansb for the feature request. - New startup message appears once per 24hr period and can be suppressed using
options(marginaleffects_startup_message = FALSE)
. posterior_draws()
is renamedget_draws()
because it also applies to bootstrap and simulation-based inference draws.get_coef()
andget_vcov()
are now documented on the main website, as they are useful helper functions.
Breaking change:
- Support for
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 bymarginaleffects
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 tomarginaleffects
, and the results were not always reliable or safe.
Bugs:
- Improved
glmmTMB
support- Standard errors are produced in models with
type="zprob"
. Thanks to @jgeller112 for issue #1189. hypotheses()
bug resolved. Thanks to @reikookamoto for the code submission.
- Standard errors are produced in models with
multinom_weightit
models withinsight
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 thevcov
argument. Thanks to @kennchua for report #1214.ordbetareg
models inglmmTMB
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 inavg_predictions()
or when callingpredictions()
with theby
argument. It is still default inpredictions()
without theby
argument. The backtransform strategy is still available with by settingtype="invlink(link)"
explicitly.- The
type
argument inplot_comparisons()
now defaults toNULL
, which is now consistent withcomparisons()
andavg_comparisons()
. Before, the default wastype="response"
. Thanks to @giakhang1906 for report #1202.
New models supported:
stpm2
,pstpm2
,gsm
, andaft
models fromrstpm2
. Thanks to @aghaynes and @mclements.glm_weightit
,coxph_weightit
,multinom_weightit
, andordinal_weightit
models fromWeightit
. Thanks to @ngreifer.glmmgee
from theglmtoolbox
package. Thanks to @adrianolszewski for the request and @lhvanegasp for help with implementation.
New features:
- Parallel computation with
future
is more efficient by chunking tasks to avoid passing large objects to every worker for every future. Issue #1158. - All columns of
newdata
are passed to thehypothesis
function whennewdata
is supplied explicitly. Thanks to @gravesti for report #1175. hypotheses(joint=TRUE)
: do not callstats::nobs()
unless necessary.hypotheses()
supports formulas in thehypothesis
argument:hypotheses(model, hypothesis = ratio ~ reference)
- Global option:
options("marginaleffects_print_omit" = "s.value")
- Round significant digits for labels in
plot_predictions(mod, condition = list(x = "fivenum"))
print()
no longer printscontrast
andterm
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.- No warning raised when
discrete
argument is used withmgcv::bam
andmgcv::gam
models objects. Thanks to @Aariq for the request. tidymodels
support is improved. Users can now directly feed some of them without specifyingnewdata
explicitly. Thanks to @davidkane9 for the feature request.
Bugs:
- Average lift and average comparisons with user-supplied functions could be be calculated incorrectly when all predictors were categorical. Thanks to @Dpananos for Issue #1151.
- Indexing bug returned
NA
for some commands insurvey
models. Thanks to @weikang9009 for report #1161. - Respect default
tinytable
theme. - Inverted confidence interval bounds with some inverse link functions. Thanks to @strengejacke for report #1204.
New:
hypothesis
accepts formulas like:ratio ~ sequential | group
- Allow reverse binary contrasts:
comparisons(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 todatagrid(grid_type="balanced")
Misc:
- Deprecation warning for
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 thehypothesis
argument. The new formula interface, in particular, makes it very easy to conduct group-wise hypothesis tests. - Type checks are a bit looser to accommodate custom models.
Bugs:
- Fix regression in
mlogit
models due to factor conversion. This raised an error before returning result, so there is no numerical danger. survey
package models work whenrow.names(model)
is not coercible to integers. Thanks to @ngreifer for report #1131.
- The
comparison
argument of thecomparisons()
function is automatically switched to theavg
version of the function shortcuts when callingavg_comparisons()
or settingby=TRUE
. For example,comparison="ratio"
becomescomparison="ratioavg"
when callingavg_comparisons()
. Note thatcomparison="ratioavg"
is equivalent to:comparison = \(hi,lo) mean(hi)/mean(lo)
- Fixed a bug ("non-conformable arguments") when using
survreg
objects fromsurvival::survreg()
. - Fixed bug in
inferences()
for GLM models andtype="invlink"
, where the wrong scale would be reported for confidence intervals.
Breaking changes:
- The order of the
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 thehypothesis="b1=b3"
syntax.
New:
- New experimental function:
specify_hypothesis()
returns functions to be used in thehypothesis
argument ofpredictions()
,comparisons()
, andslopes()
. 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.- Do not raise extraneous warning for
survey
package models when theby
argument is not used. - Informative error when
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 withdata.table
. Thanks to @andrewheiss for report #1086.- Avoid merging
newdata
inpredictions()
whenhypothesis
can change the meaning of rows. Avoid Issue #1105 reported by @strengejacke. inferences()
did not work with thetransform
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 newresponse
argument to include it.datagrid(grid_type="balanced")
returns factors ordered by level rather than by order of appearance in the original data.- Order of some rows in the output may differ when using
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.html
New:
wts=TRUE
tries to retrieves weights used in a weighted fit such aslm()
with theweights
argument or a model fitted using thesurvey
package. Thanks to @ngreifer for feature requestprint.marginaleffects()
supportsstyle="tinytable"
, which returns atinytable
object. Callprint(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 amarginaleffects
data frame and returns a transformed data frame withterm
andestimate
columns.datagrid()
gets aresponse
argument (default isFALSE
) to control if the response variable is included or excluded from the grid-building process.- The
base::subset()
anddplyr::filter()
functions can be called with a single argument innewdata
to select a subset of rows from the dataset used to fit the model.- Ex: avg_comparisons(fit, variables = "treatment", newdata = subset(treatment == 1))`
- Better warning for unsupported arguments.
df
argument inhypotheses()
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:
- Some results could be mislabelled with factor variables used in combination with
datagrid()
orcondition
. 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:
- Uninformative error when a custom
comparison
function returnsNA
in bayesian models. Thanks to @Sandhu-SS for report #1017. datagrid()
returns an object with full attributes whenby
is used. Thanks to @Sandhu-SS for report #1058.inferences(method="simulation")
withinferences()
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 relevantavg_*()
function, or use theby
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 defaultsummary()
for data frames (which is now triggered onmarginaleffects
object) provides a different view on the content of the object.plot_cco()
,plot_cme()
, andplot_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 withpredictions()
to compute marginal means as in theemmeans
package.mvgam
package support (multivariate generalized additive models)
Deprecation warnings:
deltamethod()
has been namedhypotheses()
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 withdatagrid(..., 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 thepredictions()
function and thegrid_type="balanced"
argument ofdatagrid()
. Examples are in the marginal means vignette on the website.
Minor:
- Better warning messages for unsupported matrix columns, enhancing user experience and troubleshooting.
- Various improvements to documentation.
- Typos
- Repository hosts model objects for easier testing.
Bug fixes:
- Error on
hypotheses(joint = "string")
forcomparisons()
objects (no result was returned). Thanks to @BorgeJorge for report #981. - Enhanced support for multi-equation Bayesian models with
brms
models. Thanks to @winterstat for report #1006. - Parameter names with spaces could break standard errors. Thanks to @Lefty2021 for report #1005.
Breaking changes:
- The
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. - The
variables
argument of thecomparisons()
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 ownmarginaleffects
support function.rms::Gls
: https://cran.r-project.org/package=rms
Misc:
comparisons()
: Thevariables
argument now accepts functions and data frames for factor, character, and logical variables.- Deprecation warning for:
plot_cap()
,plot_cme()
, andplot_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 inavg_slopes()
for binary variables. Thanks to @trose64 for report #961- Custom functions in the
comparison
argument ofcomparisons()
did not supply the correctx
vector length for bayesian models when theby
argument is used. Thanks to @Sandhu-SS for report #931. - Add support for two facet variables (through
facet_grid
) when plotting usingcondition
comparisons()
: Whenvariables
is a vector of length two andnewdata
has exactly two columns, there was ambiguity between custom vectors and length two vector of contrasts. Bug reported by C. Rainey on Twitter.- Superfluous warning with
fixest::fenegbin
.
Machine learning support:
tidymodels
packagemlr3
package
Misc:
- New vignettes:
- Inverse Probability Weighting
- Machine Learning
- Matching
- Add support for
hypotheses()
toinferences()
. Thanks to @Tristan-Siegfried for code contribution #908. - Support
survival::survreg()
. Thanks to Carlisle Rainey for Report #911. column_names
argument inprint.marginaleffects()
to suppress the printed column names at the bottom of the printout.- The function supplied to the
comparison
argument of thecomparisons()
function can now operate onx
and onnewdata
directly (e.g., to check the number of observations). - More informative errors from
predict()
.
Bugs:
- Some
gamlss
models generated an error related to thewhat
argument. Thanks to @DHLocke for Issue #933
hypotheses()
: TheFUN
argument handlesgroup
columns gracefully.- Native support for
Amelia
for multiple imputation.
Documentation:
- New section on "Complex aggregations" in the Hypothesis testing vignette.
Bug fix:
- Results of the
predictions()
function could be inaccurate when (a) running version 0.15.0, (b)type
isNULL
orinvlink(link)
, (c) model isglm()
, and (d) thehypothesis
argument is non-numeric. Thanks to @strengejacke for report #903
New:
- Conformal prediction via
inferences()
hypothesis
argument now accepts multiple string formulas.- The
type
argument now accepts an explicitinvlink(link)
value instead of silently back-transforming. Users are no longer pointed totype_dictionary
. Instead, they should call their function with a badtype
value, and they will obtain a list of valid types. The defaulttype
value is printed in the output. This is useful because the defaulttype
value isNULL
, so the user often does not explicitly decide. - Allow install with Rcpp 1.0.0 and greater.
Support new models:
survey::svyolr()
Misc:
inferences(method="simulation")
uses the original point estimate rather than the mean of the simulation distribution. Issue #851.- Better documentation and error messages for
newdata=NULL
- Some performance improvements for
predictions()
andmarginalmeans()
(#880, #882, @etiennebacher).
Bug fix:
newdata="median"
returned mean of binary variables. Thanks to @jkhanson1970 for report #896.
Breaking changes:
- Row order of the output changes for some objects. Rows are not sorted alphabetically by
term
,by
, and variables explicitly supplied todatagrid
. This can affect hypothesis tests computed using the b1, b2, b3, and other indices. - New procedure
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 ofmarginaleffects
, but the step size should be adequate in a broader variety of cases. Note that users can use thenumderiv
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:
- Support:
logistf
package. - Support:
DCchoice
package. - Support:
stats::nls
hypotheses()
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 thecross
argument forcomparisons()
objects. Thanks to Kirill Solovev for report #856.splines::bs()
in formulas could produce incorrect results due to weirdness instats::model.matrix()
. Thanks to @chiungming for report #831.mgcv
withocat
are now supported. Thanks to Lorenzo Fabbri for Issue #844.quantreg
problem withrowid
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 someinferences()
calls. Issue #853- Inaccurate averaging with
comparison=differenceavg
some models where all predictors are categorical. Thanks to Karl Ove Hufthammer for report #865.
Misc:
- Major refactor to simplify the code base and make maintenance easier.
Breaking change:
glmmTMB
: Standard errors are no longer supported because they may have been erroneous. Follow Issue #810 on Github for developments: #810
New:
hypothesis
argument accepts wildcards:hypothesis = "b*=b1"
s.value
column in all output: Shannon transforms for p values. See Greenland (2019).marginal_means
supportsmira
(mice
objects).comparisons()
: Thevariables
arguments now accepts arbitrary numeric vectors of length equal to the number of rows innewdata
. 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()
: thevariables
argument now accepts "revpairwise", "revsequential", "revreference" for factor and character variables.comparisons()
: thecomparison
argument now accept "lift" and "liftavg".
Performance:
- Computing elasticities for linear models is now up to 30% faster (#787, @etiennebacher).
Bug fixes:
- Better handling of environments when
newdata
is a function call. Thanks to @jcccf for report #814 and to @capnrefsmmat for the proposed fix using therlang
package. - Degrees of freedom mismatch for joint hypothesis tests. Thanks to @snhansen for report #789.
Breaking change:
- Row order of output has changed for many calls, especially those using the
by
argument. This may break hypothesis tests conducted by indexingb1
,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 thejoint
andjoint_test
arguments.vcov.hypotheses
method.wts
is now available inplot_predictions()
,plot_comparisons()
, andplot_slopes()
.
Bug:
- Wrong order of rows in bayesian models with
by
argument. Thanks to @shirdekel for report #782.
vcov()
andcoef()
methods formarginaleffects
objects.- Strings in
wts
are accepted with theby
argument. predictions()
andavg_predictions()
no longer use an automatic backtransformation for GLM models unlesshypothesis
isNULL
.vcov()
can be used to retrieve a full variance-covariance matrix from objects produced bycomparisons()
,slopes()
,predictions()
, ormarginal_means()
objects.- When processing objects obtained using
mice
multiple imputation, the pooled model usingmice::pool
is attached to themodel
attribute of the output. This means that functions likemodelsummary::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. - More informative error messages on some prediction problems. Thanks to @andymilne for Report #751.
Performance:
inferences()
is now up to 17x faster and much more memory-efficient whenmethod
is"boot"
or"rsample"
(#770, #771, @etiennebacher).
Bugs:
brms
models withnl=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, thevariables
variable is used, and we are averaging withavg_
or theby
argument. Thanks to BorgeJorge for report #766.- Bug when
datagrid()
when called inside a user-written function. Thanks to @NickCH-K for report #769 and to @capnrefsmmat for the diagnostics.
Breaking change:
- Row orders are now more consistent, but may have changed from previous version. This could affect results from
hypothesis
withb1
,b2
, ... indexing.
Support new models:
nlme::lme()
phylolm::phylolm()
phylolm::phyloglm()
New:
- Vignette on 2x2 experimental designs. Thanks to Demetri Pananos.
comparisons()
accepts data frames with two numeric columns ("low" and "high") to specify fully customizable contrasts.datagrid()
gets a newby
argument to create apply grid-making functions within groups.plot_*()
gain anewdata
argument for use withby
.
Bug:
comparisons(comparison = "lnratioavg")
ignoredwts
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.- Incorrect label for "2sd" comparisons. Thanks to Andy Milne for report #720.
- Invalid factor levels in
datagrid()
meansnewdata
argument gets ignored. Thanks to Josh Errickson for report #721. - Error in models with only categorical predictors and the
by
argument. Thanks to Sam Brilleman for report #723. - Elasticities are now supported for
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 bytype
attribute.predictions()
only works with officially supported model types (same list ascomparisons()
andslopes()
).
Renamed arguments (backward compatibility is preserved):
transform_pre
->comparison
transform_post
->transform
New:
p_adjust
argument: Adjust p-values for multiple comparisons.equivalence
argument available everywhere.
Performance:
- Much faster results in
avg_*()
functions for models with only categorical predictors and many rows of data, using deduplication and weights instead of unit-level estimates. - Faster predictions in
lm()
andglm()
models usingRcppEigen
. - Bayesian models with many rows. Thanks to Etienne Bacher. #694
- Faster predictions, especially with standard errors and large datasets.
Bugs:
- Multiple imputation with
mira
objects was not pooling all datasets. Thanks to @Generalized for report #711. - Support for more models with offsets. Thanks to @mariofiorini for report #705.
- Error on
predictions()
withby
andwts
. 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.- Blank graphs in
plot_comparisons()
with a list invariables
. type="link"
produced an error with some categoricalbrms
models. Thanks to @shirdekel for report #703.- Error on
predictions(variables = ...)
forglmmTMB
models. Thanks to Daniel Lüdecke for report #707. by
with user-specified function incomparison
and factor predictor did not aggregate correctly. Thanks to @joaotedde for report #715.ordinal::clm
: Supportcum.prob
andlinear.predictor
prediction types. Thanks to @MrJerryTAO for report #717.
Performance:
- 2-4x faster execution for many calls. Thanks to Etienne Bacher.
New models supported:
MCMCglmm::MCMCglmm
Rchoice::hetprob
Rchoice::ivpml
- Multiple imputation using
mice
and any package which can return a list of imputed data frames (e.g.,Amelia
,missRanger
, etc.)
Plot improvements:
- New
by
argument to display marginal estimates by subgroup. - New
rug
argument to display tick marks in the margins. - New
points
argument inplot_predictions()
to display a scatter plot. - New
gray
argument to plot in grayscale using line types and shapes instead of color. - The
effect
argument is renamed tovariables
inplot_slopes()
andplot_comparisons()
. This improves consistency with the analogousslopes()
andcomparisons()
functions. - The plotting vignette was re-written.
Other:
- Support multiple imputation with
mice
mira
objects. The multiple imputation vignette was rewritten. - The
variables_grid
argument inmarginal_means()
is renamednewdata
. Backward compatibility is maintained. avg_*()
returns an informative error whenvcov
is "satterthwaite" or "kenward-roger"- "satterthwaite" and "kenward-roger" are now supported when
newdata
is notNULL
- Informative error when
hypothesis
includes ab#
larger than the available number of estimates. avg_predictions(model, variables = "x")
computes average counterfactual predictions by subgroups ofx
datagrid()
andplot_*()
functions are faster in datasets with many extraneous columns.- In
predictions(type = NULL)
withglm()
andGam()
we first make predictions on the link scale and then backtransform them. Settingtype="response"
explicitly makes predictions directly on the response scale without backtransformation. - Standard errors now supported for more
glmmTMB
models. - Use the
numDeriv
package for numeric differentiation in the calculation of delta method standard error. A global option can now be passed tonumDeriv::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:
- Print fewer significant digits.
print.marginaleffects
now prints all columns supplied tonewdata
- Less redundant labels when using
hypothesis
- Many improvements to documentation.
Bugfixes:
- Standard errors could be inaccurate in models with non-linear components (and interactions) when some of the coefficients were very small. This was related to the step size used for numerical differentiation for the delta method. Issue #684.
avg_predictions(by =)
did not work when the dataset included a column namedterm
. Issue #683.brms
models with multivariate outcome collapsed categories incomparisons()
. Issue #639.hypotheses()
now works on lists and in calls tolapply()
,purrr::map()
, etc. Issue #660.
Breaking changes:
- All functions return an
estimate
column instead of the function-specificpredicted
,comparisons
,dydx
, etc. This change only affects unit-level estimates, and not average estimates, which already used theestimate
column name. - The
transform_avg
argument intidy()
deprecated. Usetransform_post
instead. plot_*(draw=FALSE)
now return the actual variable names supplied to thecondition
argument, rather than the opaque "condition1", "condition2", etc.
New models supported:
blme
package.
New features:
- New functions:
avg_predictions()
,avg_comparisons()
,avg_slopes()
- Equivalence, non-inferiority, and non-superiority tests with the
hypotheses()
function andequivalence
argument. - New experimental
inferences()
function: simulation-based inferences and bootstrap using theboot
,rsample
, andfwb
package. - New
df
argument to set degrees of freedom manually for p and CI. - Pretty
print()
for all objects. by
argumentTRUE
returns average (marginal) predictions, comparisons, or slopes.- Supports bayesian models.
hypothesis
argument- Numeric value sets the null used in calculating Z and p.
- Example:
comparisons(mod, transform_pre = "ratio", hypothesis = 1)
- All arguments from the main functions are now available through
tidy()
, andsummary()
:conf_level
,transform_post
, etc. - Bayesian posterior distribution summaries (median, mean, HDI, quantiles) can be customized using global options. See
?comparisons
Renamed 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:
- Incorrect results: In 0.8.1,
plot_*()
thethreenum
andminmax
labels did not correspond to the correct numeric values. - Fix corner case for slopes when the dataset includes infinite values.
mlogit
error with factors.- The
vcov
argument now accepts functions for most models.
Other:
- Removed major performance bottleneck for
slopes()
deltamethod()
can run hypothesis tests on objects produced by thecomparisons()
,marginaleffects()
,predictions()
, andmarginalmeans()
functions. This feature relies onmatch.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 thehypothesis
argument.plot_cme()
andplot_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
: newshape
argument to return MCMC draws in various formats, including the newrvar
structure from theposterior
package.transform_avg
function gets printed insummary()
output.transform_post
andtransform_avg
support string shortcuts: "exp" and "ln"- Added support for
mlm
models fromlm()
. Thanks to Noah Greifer.
Bug fixes:
hypothesis
argument with bayesian models andtidy()
used to raise an error.- Missing values for some regressors in the
comparisons()
output forbrms
models.
Breaking change:
- The
interaction
argument is deprecated and replaced by thecross
argument. This is to reduce ambiguity with respect to theinteraction
argument inemmeans
, 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::ols
rms::lrm
rms::orm
New features:
- Plots:
plot_cme()
,plot_cap()
, andplot_cco()
are now much more flexible in specifying the comparisons to display. Thecondition
argument accepts lists, functions, and shortcuts for common reference values, such as "minmax", "threenum", etc. variables
argument of thecomparisons()
function is more flexible:- Accepts functions to specify custom differences in numeric variables (e.g., forward and backward differencing).
- Can specify pairs of factors to compare in the
variables
argument of thecomparisons
function.
variables
argument of thepredictions()
function is more flexible:- Accepts shortcut strings, functions, and vectors of arbitrary length.
- Integrate out random effects in bayesian
brms
models (see Bayesian analysis vignette)
New vignettes:
- Experiments
- Extending marginal effects
- Integrating out random effects in bayesian models
Bug fixes and minor improvements:
- The default value of
conf_level
insummary()
andtidy()
is nowNULL
, which inherits theconf_level
value in the originalcomparisons
/marginaleffects
/predictions
calls. - Fix typo in function names for missing "lnratioavgwts"
- Interactions with
fixest::i()
are parsed properly as categorical variables - For
betareg
objects, inference can now be done on all coefficients usingdeltamethod()
. previously only the location coefficients were available. - For objects from
crch
package, a number of bugs have been fixed; standard errors should now be correct fordeltamethod()
,marginaleffects()
, etc. - Fixed a bug in the
tidy()
function forglmmTMB
models without random effects, which caused all t statistics to be identical.
- New supported model class:
gamlss
. Thanks to Marcio Augusto Diniz. marginalmeans()
accepts awts
argument with values: "equal", "proportional", "cells".by
argument- accepts data frames for complex groupings.
- in
marginalmeans
only accepts data frames. - accepts "group" to group by response level.
- works with bayesian models.
byfun
argument for thepredictions()
function to aggregate using different functions.hypothesis
argument- The matrix column names are used as labels for hypothesis tests.
- Better labels with "sequential", "reference", "pairwise".
- new shortcuts "revpairwise", "revsequential", "revreference"
wts
argument is respected inby
argument and with*avg
shortcuts in thetransform_pre
argument.tidy.predictions()
andtidy.marginalmeans()
get a newtransform_avg
argument.- New vignettes:
- Unit-level contrasts in logistic regressions. Thanks to @arthur-albuquerque.
- Python Numpy models in
marginaleffects
. Thanks to timpipeseek. - Bootstrap example in standard errors vignette.
Breaking changes:
by
is deprecated insummary()
andtidy()
. Use the sameby
argument in the main functions instead:comparisons()
,marginaleffects()
,predictions()
- Character vectors are no longer supported in the
variables
argument of thepredictions()
function. Usenewdata="fivenum"
or "grid", "mean", or "median" instead.
Critical bug fix:
- Contrasts with interactions were incorrect in version 0.6.0. The error should have been obvious to most analysts in most cases (weird-looking alignment). Thanks to @vmikk.
New supported packages and models:
survival::clogit
biglm
: The main quantities can be computed, but not the delta method standard errors. See #387
New vignette:
- Elasticity
- Frequently Asked Questions
New features:
- Elasticity and semi-elasticity using the new
slope
argument inmarginaleffects()
: eyex, dyex, eydx datagrid()
accepts functions:datagrid(newdata = mtcars, hp = range, mpg = fivenum, wt = sd)
- New
datagridcf()
function to create counterfactual datasets. This is a shortcut to thedatagrid()
function with default togrid_type = "counterfactual"
- New
by
arguments inpredictions()
,comparisons()
,marginaleffects()
- New
newdata
shortcuts: "tukey", "grid" - New string shortcuts for
transform_pre
incomparisons()
marginalmeans()
now back transforms confidence intervals when possible.vcov
argument string shortcuts are now case-insensitive- The default contrast in
comparisons()
for binary predictors is now a difference between 1 and 0, rather than +1 relative to baseline. - documentation improvements
New supported packages and models:
tidymodels
objects of classtidy_model
are supported if the fit engine is supported bymarginaleffects
.
New function:
deltamethod()
: Hypothesis tests on functions of parametersplot_cco()
: Plot conditional contrasts
New arguments:
hypothesis
for hypothesis tests and custom contraststransform_post
inpredictions()
wts
argument inpredictions()
only affects average predictions intidy()
orsummary()
.
New or improved vignettes:
- Hypothesis Tests and Custom Contrasts using the Delta Method: https://marginaleffects.com/vignettes/hypothesis.html
- Multiple Imputation: https://marginaleffects.com/vignettes/multiple_imputation.html
- Causal Inference with the g-Formula: https://marginaleffects.com/vignettes/gcomputation.html (Thanks to Rohan Kapre for the idea)
Deprecated or renamed arguments:
contrast_factor
andcontrast_numeric
arguments are deprecated incomparisons()
. Use a named list in thevariables
argument instead. Backward compatibility is maintained.- The
transform_post
argument intidy()
andsummary()
is renamed totransform_avg
to disambiguate against the argument of the same name incomparisons()
. Backward compatibility is preserved.
Misc:
tidy.predictions()
computes standard errors using the delta method for average predictions- Support
gam
models with matrix columns. eps
inmarginaleffects()
is now "adaptive" by default: it equals 0.0001 multiplied the range of the predictor variablecomparisons()
now supports "log of marginal odds ratio" in thetransform_pre
argument. Thanks to Noah Greifer.- New
transform_pre
shortcuts: dydx, expdydx tidy.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. Usevcov = FALSE
instead.
New supported packages and models:
mlogit
mhurdle
tobit1
glmmTMB
New features:
interaction
argument incomparisons()
to compute interactions between contrasts (cross-contrasts).by
argument intidy()
andsummary()
computes group-average marginal effects and comparisons.transform_pre
argument can define custom contrasts between adjusted predictions (e.g., log adjusted risk ratios). Available incomparisons()
.transform_post
argument allows back transformation before returning the final results. Available incomparisons()
,marginalmeans()
,summary()
,tidy()
.- The
variables
argument of thecomparisons()
function accepts a named list to specify variable-specific contrast types. - Robust standard errors with the
vcov
argument. This requires version 0.17.1 of theinsight
package.sandwich
package shortcuts:vcov = "HC3"
,"HC2"
,"NeweyWest"
, and more.- Mixed effects models:
vcov = "satterthwaite"
or"kenward-roger"
- One-sided formula to clusters:
vcov = ~cluster_variable
- Variance-covariance matrix
- Function which returns a named squared matrix
marginalmeans()
allows interactions- Bayesian Model Averaging for
brms
models usingtype = "average"
. See vignette on themarginaleffects
website. eps
argument for step size of numerical derivativemarginaleffects
andcomparisons
now report confidence intervals by default.- New dependency on the
data.table
package yields substantial performance improvements. - More informative error messages and warnings
- Bug fixes and performance improvements
New pages on the marginaleffects
website: https://marginaleffects.com/
- Alternative software packages
- Robust standard errors (and more)
- Performance tips
- Tables and plots
- Multinomial Logit and Discrete Choice Models
- Generalized Additive Models
- Mixed effects models (Bayesian and Frequentist)
- Transformations and Custom Contrasts: Adjusted Risk Ratio Example
Argument name changes (backward compatibility is preserved:
- Everywhere:
conf.level
->conf_level
datagrid()
:FUN.factor
->FUN_factor
(same for related arguments)grid.type
->grid_type
New supported packages and models:
stats::loess
sampleSelection::selection
sampleSelection::heckit
Misc:
mgcv::bam
models allowexclude
argument.- Gam models allow
include_smooth
argument. - New tests
- Bug fixes
New function:
comparisons()
computes contrasts
Misc:
- Speed optimizations
predictions()
andplot_cap()
include confidence intervals for linear models- More robust handling of in-formula functions: factor(), strata(), mo()
- Do not overwrite user's
ggplot2::theme_set()
call
- Bug fixes
New supported models:
mclogit::mclogit
robust::lmRob
robustlmm::rlmer
fixest
confidence intervals inpredictions
Misc:
- Support
modelbased::visualisation_matrix
innewdata
without having to specifyx
explicitly. tidy.predictions()
andsummary.predictions()
methods.- Documentation improvements.
- CRAN test fixes
Support for new models and packages:
brglm2::bracl
mclogit::mblogit
scam::scam
lmerTest::lmer
Misc:
- Drop
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))) - Bugfixes
- Documentation improvements
- CRAN tests
documentation bugfix
Breaking changes:
predictions
returns predictions for every observation in the original dataset instead ofnewdata=datagrid()
.marginalmeans
objects have new column names, as do the correspondingtidy
andsummary
outputs.
New supported packages and models:
brms::brm
rstanarm::stanglm
brglm2::brmultinom
MASS::glmmPQL
aod::betabin
Misc:
datagrid
function supersedestypical
andcounterfactual
with thegrid.type
argument. Thetypical
andcounterfactual
functions will remain available and exported, but their use is not encouraged.posterior_draws
function can be applied to apredictions
or amarginaleffects
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 frominsight::get_predicted
.- New vignette on Bayesian models with
brms
- New vignette on Mixed effects models with
lme4
- If the
data.table
package is installed,marginaleffects
will automatically use it to speed things up. - Contrast definition reported in a separate column of
marginaleffects
output. - Safer handling of the
type
argument. - Comprehensive list of supported and tests models on the website.
- Many bug fixes
- Many new tests, including several against
emmeans
Breaking change:
data
argument becomesnewdata
in all functions.
New supported packages and models:
lme4:glmer.nb
mgcv::gam
ordinal::clm
mgcv
marginalmeans
:
- New
variables_grid
argument
predictions
:
- Support
mgcv
plot_cap
- New
type
argument
Misc:
- New validity checks and tests
First release. Bravo!
Thanks to Marco Avina Mendoza, Resul Umit, and all those who offered comments and suggestions.