Skip to content

Latest commit

 

History

History
1215 lines (1050 loc) · 61 KB

NEWS.md

File metadata and controls

1215 lines (1050 loc) · 61 KB
title
NEWS for the emmeans package

emmeans 1.10.1.90xxx

  • Added a startup message and help(untidy)
  • Added rbind method for summary_emm objects (#480). Note that summary_emm objects already have estimates, P-values, etc. computed, so rbinding them preserves those results. On the other hand, rbinding emmGrid or emm_list objects produce new emmGrid objects which have not yet been summarized and any adjust methods are applied to the whole result.

emmeans 1.10.1

  • With gls or lme models, mode = "satterthwaite" and mode = "appx-satterthwaite" failed when model was fitted with no explicit data argument (#465)
  • We decided to export the .emmc functions, just to make it easier to see and use them
  • Added a new contrast function wtcon.emmc(levs, wts, cmtype, ...) which generates contrasts via multcomp::contrMat(wts, type = cmtype, ...)
  • contrast() gains a new argument wts which can be passed to some .emmc functions including eff.emmc, del.eff.emmc, and wtcon.emmc. If wts is left missing, we pass equal weights of . If we specify wts = NA, we retrieve weights from the object (potentially different in each bygroup). Otherwise, the same fixedwts` are used in each group.
  • Added a weights() method for emmGrid objects
  • Modification to pwpp() to play along if contrast() changes the by variable via options (#472)
  • After some wiggling around, we now allow strata() factors to be included in the reference grid for survival models. It is up to the user to decide what is sensible. (#429, #473)

emmeans 1.10.0

  • Restored tau argument (now optional) for rq models (#458)
  • Fixed issue where a multivariate factor having numeric levels may mismatch a level in at even when apparently valid (#458)
  • Added cross.adjust to legal arguments that can be passed via misc slot
  • Robustified code for cross.adjust
  • Fixed masking of vcov. in glmgee support (#460)
  • Fixed an error in xtable() method for summary_emm objects
  • Added inner argument to make.tran() to allow for compound transform; e.g., make.tran("inverse", inner = "sqrt") is reciprocal sqrt (#462)

emmeans 1.9.0

  • Warning message about prior weights was sometimes unnecessary. We now suppress it when all the prior weights are equal.
  • Fix to MuMIn support with subset argument (#455)
  • Repair to coding error for nested models (#457)
  • Added glmtoolbox::glmgee support (#454)
  • qdrg() modified such that we often don't need to specify data when object is specified.
  • Support for for rq, rqs now incorporates all tau values in the model as a pseudofactor (#458). The tau argument itself is deprecated and ignored if specified.

emmeans 1.8.9

  • Added functions make.meanint() and make.symmint() that return functions that compute symmetric intervals. The old meanint() and symmint() functions that return symmetric intervals of width 2 are retained for back-compatibility
  • Small repairs to multinom support so it works with a model where the response is a matrix of counts (#439)
  • Enhancements/fixes for MuMIn support (#442)
  • qdrg() has replaced its ordinal.dim argument with ordinal, a list with elements dim and mode -- which now fully supports all the modes available for ordinal models (#444). (ordinal.dim still works for backward compatibility.)
  • Fix to bookkeeping bug in emtrends (#448)
  • Fix to averaging support with certain predictor function calls (#449)

emmeans 1.8.8

  • Bug correction in contrast when tran is a list (#428)
  • Bug correction to suppress a nuisance warning when the number of prior weights is 0 or 1 (which indeed doesn't match the number of rows of data, but also isn't really an issue) (Commit d921152 for easystats)
  • Bug correction for strata() terms in survival models (#429)
  • Added a risk-ratio and a probit example to the Transformations vignette.
  • Multivariate levels were mishandled when specified out of order in at (#430)
  • Fix to flow error in qdrg() where we didn't always get V right
  • Change to adjustment methods when there are non-estimable cases. Now we always adapt the family size to include only the estimable ones. This may change some adjusted P values or confidence limits obtained in past versions, when the model is rank-deficient.
  • vcov.emmGrid() now only returns elements where object@misc$display == TRUE. We also label the dimensions and provide a sep argument for creating labels.

emmeans 1.8.7

  • Correction to a bug introduced in version 1.8.4, where we tried to provide for an offset argument in the same way as an offset() term in the model formula. Unfortunately, that change also caused wrong estimates to be computed when the offset involves a nonlinear function such as log(), and made for whopping inconsistencies in the narrative about offsets in the "sophisticated" vignette; I apologize for these embarrassing errors.

    We now provide for both kinds of offset specifications, but in different ways as explained in a new section in the "xplanations" vignette. The "subtle difference" mentioned in the NEWS for 1.8.4 no longer applies.

  • Change in qdrg(). If object is specified, default for df is df.residual(object) rather than object$df.residual, since df.residual() is a standard method.

  • as.mcmc() now uses get_emm_option("sep") in labeling factor combinations (#425).

emmeans 1.8.6

  • Major fix to emm_basis.averaging to take care of quirks in these models (#402, #409)
  • Added decreasing argument to cld.emmGrid() for compatibility with multcomp::cld.glht() and others.
  • Fix to bug in emtrends() when data is specified (semTools issue 119) ... and related tune-up to ref_grid() to avoid issues with repeat calls (#413)
  • Tweak to emm_list methods to make them more user-friendly (#417)
  • We added a pwts argument to recover_data.call(), needed because prior weights did not always come through. This provides a reliable way of passing prior weights in a recover_data() method

emmeans 1.8.5

  • passing scale info to emmip_ggplot() (#397)
  • Changes to as.data.frame behavior. It has been made more forceful in preserving annotations (i.e., summary_emm behavior) so that users don't blind themselves to potentially important information. Also, some users seem to force display of the data frame in order to see more digits; so we now are taking a compromise approach: showing more digits but still as a summary_emm object with annotations also displayed.
  • Added Chisq value to results of test(..., joint = TRUE) and joint_tests() when df2 is infinite (per request in #400)
  • The basics vignette has undergone a major revision that I hope helps more in getting users oriented. It starts by discussing the fact that EMMs' underpinnings are more in experiments than observational data, and emphasizes more the process of first getting a good model.
  • The confidence-intervals vignette has been updated to reflect the same example with pigs as is used in basics
  • Following Issue #403 on GitHub, we are taking a much stricter approach with anything involving the sigma value in the @misc slot. For any models that are not in the "gaussian" family, sigma is initialized to NA and this has some implications:
    • Bias adjustment: Bias adjustment is disabled by default for all non-Gaussian family models, and a warning is issued. You can enable bias adjustment by providing a valid sigma value; however, for generalized linear models the value of sigma(model) *is often inappropriate for bias adjustment, and in fact anyway. you should not do that, and for mixed models, you should calculate sigma based on the random effects. See the vignette on transformations.
    • Prediction intervals: With non-Gaussian models, predict(..., interval = "prediction") will refuse to work, with no option to override. Same with specifying PIs = TRUE in plot() or emmip(). The calculations done for prediction intervals are only valid for Gaussian models. You may do predictions for non-Gaussian models via simulating a posterior predictive distribution with Bayesian approach; see an illustration in the "sophisticated" vignette.
    • The above changes will help reduce the incidence of users using the package incorrectly with GLMs, GLMMs, and GEEs. But there's still the issue that Gaussian mixed models will often have a wrong default sigma value associated with them, resulting in incorrect PIs and incorrect bias adjustments. I have not figured out how I might help prevent that, but it probably will involve making tedious modifications to these models' emm_basis methods. Maybe some future improvements to be made.
  • Bug fix for matching terms in averaging objects (#402)
  • Bug fix for mira objects when data is required (#406)

emmeans 1.8.4

  • Fix to scale() response transformation when either center or scale is FALSE. I also added support for center() and standardize() from the datawizard package as response transformations, though these are mapped to scale().

  • Citation correction (#391)

  • Removed a message about contrasting transformed objects that even confuses me! (I added a topic in the FAQs vignette instead)

  • Added new exported function inverse available as a response transformation

  • I have quietly deprecated the previous I_bet() function, because it produced a message that was confusing to inexperienced users. Instead, we have tweaked some functions/methods so they seem to work the same way with an emm_list object (using its first element) as an emmGrid object.

  • We have removed the functions convert_workspace() and convert_scripts() that were intended to clean up existing code and objects for the ancient version of lsmeans. We also completely removed several old functions from the codebase. Previously, we just ignored them.

  • More reliable dispatching of recover_data() and emm_basis() methods (#392)

  • New permute_levels() function to change the order of levels of a factor (#393)

  • This may alter results of existing code for models involving offsets: A user discovered an issue whereby offsets specified in an offset() model term are accounted for, but those specified in an offset = ... argument are ignored. We have revised the recover_data() and ref_grid() code so that offsets specified either way (or even both) are treated the same way (which is to include them in predictions unless overridden by an offset argument in emmeans() or ref_grid()).

    This change creates a subtle difference in cases where you want offsets to depend on other predictors: In a model with formula y ~ trt + offset(off), if you used to specify cov.reduce = off ~ trt, now you need cov.reduce = .offset. ~ trt. The latter will work the same with the model y ~ trt, offset = off.

  • Recoded some portions of the support functions for zeroinfl and hurdle objects. We now use numerical differentiation to do the delta method, and this comes out a lot cleaner.

  • Per the improved count-model support, we are now exporting and have documented two new functions hurdle.support() and zi.support() that may be useful in providing comparable support in other packages that offer zero-inflated models.

  • Efficiency improvements: Several places in the code where we multiply a matrix by a diagonal matrix, we replace this by equivalent code using the sweep() function.

  • Over time, too many users have latched on to the idea that emmeans(model, pairwise ~ treatment(s)) as the recipe for using emmeans(). It works okay when you have just one factor, but when you have three factors, say, pairwise ~ fac1*fac2*fac3 gives you every possible comparison among cell means; often, this creates an intractable amount of output (e.g., 378 comparisons in a 3x3x3 case) -- most of which are diagonal comparisons.

    So now, if a user is in interactive mode, specifies contrasts in a direct emmeans() call (i.e., sys.parent() == 0), there is more than one primary factor (not including by factors), and there are more than 21 contrasts as a result (e.g. more than 7 levels compared pairwise), we issue an advisory warning message: "You may have generated more contrasts than you really wanted...". Because of the restrictions on when this warning is issued, it should not affect reverse-dependent package checks at all.

emmeans 1.8.3

  • Fix to logic error in regrid() (#287, revisited)
  • Fix to nbasis calculation in ordinal models (#387)
  • Bias-adjustment example added when we have random slopes
  • New addl.vars argument allows including variables (say, for random slopes) in the reference grid.
  • Removed dependence on xtable package. The xtable methods are now dynamically registered. This reduces the number of package dependencies from 8 to 7 (as of this version).
  • Added alt text to all pictures in vignettes (#389). This makes the materials more accessible per guidelines from the A11Y project.
  • Added "atanh" to the options in make.tran() and to the "named" response transformations that are auto-detected
  • make.tran() replaces param argument with alpha and beta (param is still supported for backward compatibility) and documentation has been revised in hopes of making everything clearer

emmeans 1.8.2

  • Extended cld() so it can show findings rather than non-findings, in two different ways: Using delta, groupings are based on actual tests of equivalence with threshold delta; or setting signif.sets = TRUE, means that have the same letter are significantly different. We also added a vignette on "Re-engineering CLDs".
  • Bug fix for subtle error in emtrends() (#133)
  • Improved customization of emmip() so that we can specify color, linetype, and symbol are all associated with groupings; and addition of an example to produce a black-and-white plot. Note: While the default appearance of plots is unchanged, plots from your existing code may be altered if you have used linearg, dotarg, etc.
  • Allow vcov. to be coercible to a matrix, or a function that yields a result coercible to a matrix (#383)
  • Robustness improvement for "appx-satterthwaite" method (#384)
  • Added counterfactuals argument to ref_grid(), setting up a reference grid consisting of the stated factors and a constructed factor, .obs.no.. We then (by default) average this grid over the covariate distribution. This facilitates G-computation under the exchangeability assumption for counterfactuals.

emmeans 1.8.1

  • Fixed new bug in summary() introduced in #359 and reported in #364
  • Fixed as.data.frame.emm_list() so it preserves annotations like in as.data.frame.emmGrid()
  • Fix to mgcv::gam support to accommodate fancier smoothers and more accurately detect random terms (#365, #366, #369)
  • Fix in call to summary() from inside a function (#367)
  • Added a delta argument to hpd.summary(), thus allowing a way to assess equivalence with Bayesian estimates (#370)
  • Bug fix for stanreg estimability code when subset was used in model.
  • emmip() and plot.emmGrid() now do appropriate things if point.est or frequentist appear among the ... arguments, when we have Bayesian models (note also, frequentist was removed from the visible arguments for plot.emmGrid).
  • With Bayesian models, emmip() plotted intervals regardless of CIs; this has been corrected
  • Added head() and tail() methods for emmGrid objects
  • In [.summary_emm(), we changed the default to as.df = FALSE so that annotations are still visible by default. This also preserves annotations in head() and tail() for summaries
  • New emm_example() function used to tidy-up certain help-file examples when they are conditional on an external package
  • Continued efforts to prevent users from hiding annotations they need to see. The functions/methods summary(), confint(), test(), and as.data.frame() all produce data frames with annotations intact and visible. Additional wrapping in data.frame(), as.data.frame(), etc. is completely unnecessary, and if you send questions or bug reports with such code, I will regard it as willful ignorance and will refuse to respond. See also the news for version 1.8.0.

emmeans 1.8.0

  • Fixed minor bug in lme support (#356)
  • Added support for svyolr objects from the survey package (#350)
  • Improvements to mgcv::gam support. Previously, random smoothers were included. Thanks for Maarten Jung for observing this and helping to identify them.
  • Improvements to test(..., joint = TRUE) and joint_tests()...
    • Sometimes did incorrect computations with rank deficient models
    • "est.fcns" attribute is actually estimable
    • Results for (confounded) entry in joint_tests() is now much better formulated and more robust.
    • Added section related to this in xplanations vignette
    • Version dependency for estimability (>= 1.4.1) due to a bug in version 1.4
  • In joint_tests(), we changed the default from cov.reduce = range to cov.reduce = meanint, where meanint(x) returns mean(x) + c(-1, 1). This centers the covariate values around their means, rather than their midranges, and is more in line with the default of ref_grid(..., cov.reduce = mean). However, this change in default will change the results of joint_tests() from past experiences with models having covariates that interact with factors or other covariates. We also added a section on covariates to the help for joint_tests(), and added another function symmint() for use in cov.reduce.
  • print.summary_emm() now puts by groups in correct order rather than in order of appearance.
  • The as.data.frame method has a new argument destroy.annotations, which defaults to FALSE -- in which case it returns a summary_emm object (which inherits from data.frame). I see that many users routinely wrap their results in as.data.frame because they want to access displayed results in later steps. But in doing so they have missed potentially useful annotations. Users who have used as.data.frame to see results with lots of digits should instead use emm_options(opt.digits = FALSE).
  • New R version dependency >= 4.1.0, allowing freedom to use the forward pipe operator |> and other features.
  • Housecleaning: We removed completely the trend argument in emmeans(), which has long since been deprecated. We removed wrappers that implement pmmeans(), pmtrends(), etc. -- which I believe nobody ever used.

emmeans 1.7.5

  • Modified the defaults for several methods for class emm_list, and added more complete documentation. We also added hidden emm_list support to several functions like add_grouping(), emmip(), and emmeans() itself. These changes, we hope, help in situations where users create objects like emm <- emmeans(model, pairwise ~ treatment) but are not experienced or attuned to the distinction between emmGrid and emm_list objects. The mechanism for this is to provide a default of \code{I_bet(1)} for which element of the emm_list to use. A message is shown that specifies which element was selected and encourages the user to specify it explicitly in the future via either [[ ]] or a which argument; for example, plot(emm[[1]]) or plot(emm, which = 1).
  • The object returned by joint_tests() and test(..., joint = TRUE) now has an "est.fcns" attribute, which is a list of the linear functions associated with the joint test(s).
  • joint_tests() results now possibly include a (confounded) entry for effects not purely explained by a model term.f
  • New cross.adjust argument in summary.emmGrid() allows for additional P-value adjustment across by groups.
  • Apparently, glm.nb support no longer requires data (#355) so the documentation was updated.

emmeans 1.7.4

  • Added an argument enhance.levels to contrast() that allows better labeling of the levels being contrasted. For example, now (by default) if a factor treat has numeric levels, then comparisons will have levels like treat1 - treat2 rather than 1 - 2. We can request similar behavior with non-numeric levels, but only if we specify which factors.
  • Two new functions comb_facs() and split_fac() for manipulating the factors in an emmGrid.
  • Added an argument wts to eff.emmc and del.eff.emmc, which allows for weighted versions of effect-style contrasts (#346)
  • Made qdrg() more robust in accommodating various manifestations of rank-deficient models.
  • qdrg() now always uses df if provided. Previously forced df = Inf when a link function was provided.
  • Fix to df.error calculation with gls (#347)

emmeans 1.7.3

  • argument change ref_grid(..., transform = ...) now should be ref_grid(..., regrid = ...) to avoid confusing transform with the tran option (which kind of does the opposite). If we match transform and don't match tran, it will still work, but a message is displayed with advice to use regrid instead.
  • Repairs to averaging support (#324). Previous versions were potentially dead wrong except for models created by lm() (and maybe some of those were bad too)
  • Added a which argument to emm() to select which list elements to pass to multcomp::glht()
  • Support for rank-deficient gls models (note that nlme allows such models with gls, but not lme)
  • Bug in lqm / lqmm support (#340)
  • Other minor corrections (e.g. #334)

emmeans 1.7.2

  • Improvements to averaging support (#319)
  • Fixed bug in comparison arrows when by = NULL (#321) (this bug was a subtle byproduct of the name-checking in #305) Note this fixes visible errors in the vignettes for ver 1.7.1-1
  • Patch for gamlss support (#323)
  • Added withAutoprint() to documentation examples with require() clauses, so we see interactive-style results
  • Correction to a logic error in adjustment corrections in summary.emmGrid (#31)
  • Revised summary.emmGrid() so that if we have both a response transformation and a link function, then both transformations are followed through with type = "response". Previously, I took the lazy way out and used summary(regrid(object, transform = "unlink"), type = "response") (see #325)
  • Fix to force_regular() which caused an unintended warning (#326)
  • Fixes to issues in emtrends() (#327)

emmeans 1.7.1

  • Support from multinomial models in mgcv::gam (#303) thanks to Hannes Riebl
  • Bug fix for spaces in by variable names (#305). Related to this are:
    • plot.emmGrid() now forces all names to be syntactically valid
    • In as.data.frame.emmGrid(), we changed the optional argument to check.names (defaulting to TRUE), and it actually has an effect. So by default, the result will have syntactically valid names; this is a change, but only because optional did not work right (because it is an argument for `as.data.frame.list()).
  • Fix for missing column names in linfct from emmeans() (#308)
  • Added gnls support (#313, #314, thanks to Fernando Miguez)
  • Modified glm support so that df.residual is used when the family is gaussian or gamma. Thus, e.g., we match lm results when the model is fitted with a Gaussian family. Previously we ignored the d.f. for all glm objects.
  • New vignette example with percentage differences
  • More graceful handling of comparisons when there is only one mean; and a related FAQ

emmeans 1.7.0

Notable changes

  • New rg.limit option (and argument for ref_grid()) to limit the number of rows in the reference grid (#282, #292). This change could affect existing code that used to work -- but only in fairly extreme situations. Some users report extreme performance issues that can be traced to the size of the reference grid being in the billions, causing memory to be paged, etc. So providing this limit really is necessary. The default is 10,000 rows. I hope that most existing users don't bump up against that too often. The nuisance (or non.nuisance) argument in ref_grid() (see below) can help work around this limit.
  • New nuisance option in ref_grid(), by which we can specify names of factors to exclude from the reference grid (accommodating them by averaging) (#282, #292). These must be factors that don't interact with anything, even other nuisance factors. This provides a remedy for excessive grid sizes.
  • Improvements to and broadening of qdrg():
    • Changed the order of arguments in to something a bit more natural
    • Default for contrasts now object$contrasts when object is specified
    • Detection of multivariate situations
    • Added ordinal.dim argument to support ordinal models
  • New force_regular() function adds invisible rows to an irregular emmGrid to make it regular (i.e., covers all factor combinations)

Bug fixes and tweaks

  • Removed dependency on plyr package (#298)
  • Fix to bug in regrid() with nested structures (#287)
  • Fix bug in rbind() which mishandled @grid$.offset.
  • Major repairs to clm and clmm support to fix issues related to rank deficiency and nested models, particularly with mode = "prob" (#300)
  • Allow type to be passed in emmeans() when object is already an emmGrid (incidentally noticed in #287)
  • Code to prevent a warning when an existing factor is coerced to a factor in the model formula -- see SO question
  • Add documentation note for add_grouping with multiple reference factors (#291)

emmeans 1.6.3

  • Clarification of documentation of ref_grid(object, vcov. = ...) (#283)
  • Fix to emmtrends() with covariate formulas (#284)
  • Improved parts of "Basics" vignette - removed "back story", revised guidance on $P$ values and models
  • Allow for > 1 reference factor in add_grouping() (#286)
  • Repairs to contrast() to avoid all-nonEst results in irregular nested structures

emmeans 1.6.2

  • Fixed navigation error in vignette index
  • Discouraging message added to cld() results. Also am providing an emm_list method for emm_list objects.
  • Added mvcontrast() function (#281) and assoc vignette material
  • Added update.summary_emm()

emmeans 1.6.1

  • Fixed a bug in parsing a response transformation (#274)
  • Changed handling of contrast() so that log2 and log10 transformations are handled just like log. (#273) Also disabled making ratios with genlog as it seems ill-advised.
  • Added support for log1p transformation
  • Improved detection of cases where Tukey adjustment is [in]appropriate (#275)
  • Added type = "scale" argument to plot.emmGrid() and emmip(). This is the same as type = "response" except the scale itself is transformed (i.e., a log scale if the log transformation was used). Since the same transformation is used, the appearance of the plot will be the same as with type = "lp", but with an altered axis scale. Currently this is implemented only with engine = "ggplot".
  • Fixed bug whereby Scheffe is ignored when there is only one contrast, even though scheffe.rank > 1 was specified. (#171)
  • Added a subset() method for emmGrid objects
  • Bug fixes for mcmc and mcmc.list objects (#278, #279)
  • test() shows null whenever it is nonzero on the chosen scale (#280)

emmeans 1.6.0

This version has some changes that affect all users, e.g., not saving .Last.ref_grid, so we incremented the sub-version number.

  • Changed handling of logit transformations in contrast(), so that the odds-ratio transformation persists into subsequent contrast() calls e.g., interaction contrasts.
  • We also made contrast(..., type = ...) work correctly
  • Bug fix so that all p.adjust.methods work (#267)
  • Support for mblogit extended to work with mmblogit models (#268) (However, since, mclogit pkg incorporates its own interface)
  • Added export option in print.emmGrid() and print.emm_summary()
  • Changed default for emm_options(save.ref_grid = FALSE). Years ago, it seemed potentially useful to save the last reference grid, but this is extra overhead, and writes in the user's global environment. The option remains if you want it.
  • Added a note advising against using as.data.frame (because we lose potentially important annotations), and information/example on how to see more digits (which I guess is why I'm seeing users do this).
  • Further refinement to nesting detection. A model like y ~ A:B detected A %in% B and B %in% A, and hence A %in% A*B and B %in% A*B due to a change in 1.4.6. Now we omit cases where factors are nested in themselves!
  • Expansion of cov.reduce formulas to allow use of custom models for predicting mediating covariates

emmeans 1.5.5

  • The multinom "correction" in version 1.5.4 was actually an "incorrection." It was right before, and I made it wrong! If analyzing multinom models, use a version other than 1.5.4
  • Repairs to support for mblogit models
  • Bug fix for survreg support (#258) -- survreg() doesn't handle missing factor levels the same way as lm(). This also affects results from coxph(), AER::tobit(), ...
  • Addition of a note in help auto.noise dataset, and changing that example and vignette example to have noise/10 as the response variable. (Thanks to speech and hearing professor Stuart Rosen for pointing out this issue in an e-mail comment.)
  • Bug fix for appx-satterthwaite mode in gls/lme models (#263)
  • Added mode = "asymptotic" for gls/lme models.
  • Added facetlab argument to emmip_ggplot() so user can control how facets are labeled (#261)
  • Efficiency improvements in joint_tests() (#265)
  • Bug fixes in joint_tests() and interaction contrasts for nested models (#266)
  • Improvement to multinom support suggested by this SO question

emmeans 1.5.4

  • Fix to bug in rbind.emm_list() to default for which
  • Fix for a glitch in recovering data for gee models (#249)
  • Support for svyglm objects (#248)
  • Better support for lqm, lqmm, and added support for rq & rqs objects (quantreg package). User may pass summary or boot arguments such as method, se, R, ... (#250)
  • Correction to multinom objects (SEs were previously incorrect) and addition of support for related mclogit::mblogit objects. If at all possible, users should re-run any pre-1.5.4 analyses of multinomial models
    Note: This correction was wrong! If using multinomial models, you should use some version other than 1.5.4!
  • Change to less misleading messages and documentation related to the N.sim argument of regrid(). We are no longer calling this a posterior sample because this is not really a Bayesian method, it is just a simulated set of regression coefficients.

emmeans 1.5.3

  • Per long-time threats, we really are removing CLD() once and for all. We tried in version 1.5.0, but forced to cave due to downstream problems.
  • Addition of levels<- method that maps to update(... levels =) (#237)
  • Fix cld() so it works with nested cases (#239)
  • Enable coef() method to work with contrasts of nested models. This makes it possible for pwpp() to work (#239)
  • Fixed a coding error in plot() that occurs if we use `type = "response" but there is in fact no transformation (reported on StackOverflow)
  • Added "log10" and "log2" as legal transformations in regrid()
  • Revised vignette example for MCMC models, added example with bayestestR
  • Expanded support for ordinal models to all link functions available in ordinal (errors-out if ordinal not installed and link not available in stats::make.link())
  • Cleaned-up emmip() to route plot output to rendering functions emmip_ggplot() and emmip_lattice(). These functions allow more customization to the plot and can also be called independently. (To do later, maybe next update: the same for plot.emmGrid(). What to name rendering functions?? -- suggestions?)
  • Cleaned up code for .emmc functions so that parenthesization of levels does not get in the way of ref, exclude, or include arguments (#246)
  • Fix to bug in emtrends() when data is specified (#247)
  • Tries harder to recover original data when available in the object (#247). In particular, sometimes this is available, e.g., in $model slot in a lm object, as long as there are no predictor transformations. This provides a little bit more safety in cases the data have been removed or altered.
  • Tweaks to rbind.emm_list() to allow subsetting. (Also documentation & example)

emmeans 1.5.2

  • Change to plot.emmGrid(... comparisons = TRUE) where we determine arrow bounds and unnecessary-arrow deletions separately in each by group. See also Stack Overflow posting
  • emmeans() with contrasts specified ignores adjust and passes to contrast() instead. Associated documentation improved (I hope)
  • Bug-fix for missing cases in plot(..., comparisons = TRUE) (#228)
  • Robustified plot.emmGrid() so that comparison arrows work correctly with back-transformations. (Previously we used regrid() in that case, causing different CIs and PIs depending on comparisons) (#230)
  • Bug fixes in support for stan_polr models.
  • Bug fix for incorrect (and relatively harmless) warning in several models (#234)
  • Lower object size via removing unnecessary environment deps (#232)
  • Repairs to as.list() and as.emmGrid() to fully support nesting and submodels.

emmeans 1.5.1

  • Additional checking for potential errors (e.g. memory overload) connected with submodel support. Also, much more memory-efficient code therein (#218, #219)
  • A new option enable.submodel so user can switch off submodel support when unwanted or to save memory.
  • multinom support for N.sim option
  • Modification to internal dispatching of recover_data and emm_basis so that an external package's methods are always found and given priority whether or not they are registered (#220)
  • Patches to gamlss support. Smoothers are not supported but other aspects are more reliable. See CV posting
  • Improvement to auto-detection of transformations (#223)
  • Added aes argument in pwpp() for more control over rendering (#178)
  • Fix to a situation in plot.emmGrid() where ordering of factor levels could change depending on CIs and PIs (#225)

emmeans 1.5.0

  • Changed help page for joint_tests() to reflect cov.keep (ver. 1.4.2)
  • emm_options() gains a disable argument to use for setting aside any existing options. Useful for reproducible bug reporting.
  • In emmeans() with a contr argument or two-sided formula, we now suppress several particular ... arguments from being passed on to contrast() when they should apply only to the construction of the EMMs (#214)
  • More control of what ... arguments are passed to methods
  • CLD() was deprecated in version 1.3.4. THIS IS THE LAST VERSION where it will continue to be available. Users should use multcomp::cld() instead, for which an emmGrid method will continue to exist.
  • Experimental submodel option
    • Bug fix therein (#217)
  • Enhancements to mgcv::gam support (#216)
  • New ubds dataset for testing with messy situations
  • Added minimal support for lqm and lqmm models (#213)
  • Interim support for user-supplied contrasts for stanreg models (#212)

emmeans 1.4.8

  • Bug fix and smoother support for stanreg objects (#202)
  • Fix to emmip() to be consistent between one curve and several, in whether points are displayed (style option)
  • Added "scale" option to make.tran()
  • Auto-detection of standardized response transformation
  • Fix to a scoping issue in emtrends() (#201)
  • Bug fix for #197 created a new issue #206. Both now fixed.
  • Non-existent reference levels in trt.vs.ctrl.emmc() now throws an error (#208)
  • Added a default for linfct (the identity) to emmobj
  • Provisions for more flexible and consistent labeling/naming of results. This includes added emm_options "sep" and "parens", and a parens argument in contrast(). sep controls how factor levels are combined when ploted or contrasted, and parens sets whether, what, and how labels are parenthesized in contrast(). In constructing contrasts of contrasts, for example, labels like A - B - C - D are now (A - B) - (C - D), by default. To reproduce old labeling, do `emm_options(sep = ",", parens = "a^")

emmeans 1.4.7

  • Repairs to pwpp() so it plays nice with nonestimable cases
  • Added "xplanations" vignette with additional documentation on methods used. (comparison arrows, for starters)
  • Touch-ups to plot(), especially regarding comparison arrows
  • Bug fix for stanreg models (#196)
  • Fixed error in emmeans(obj, "1", by = "something") (#197)
  • eff_size() now supports emm_list objects with a $contrasts component, using those contrasts. This helps those who specify pairwise ~ treatment.
  • Labels in contrast() for factor combinations with by groups were wacky (#199)
  • emtrends() screwed up with multivariate models (#200).
  • Added a new argument calc to summary(). For example, calc = c(n = ~.wgt.) will add a column of sample sizes to the summary.

emmeans 1.4.6

  • Improvements to coxph support for models with strata
  • emmeans() with specs of class list now passes any offset and trend arguments (#179)
  • Added plim argument to pwpp() to allow controlling the scale
  • More documentation on using params (#180)
  • Robustified support for gls objects when data are incomplete (#181)
  • Fixed bug in joint_tests() and test(..., joint = TRUE) that can occur with nontrivial @dffun() slots (#184)
  • Improved support for Satterthwaite-based methods in gls (#185) and renamed boot-satterthwaite to appx-satterthwaite (#176)
  • Further repairs to nesting-related code (#186)
  • Fix transform argument in ref_grid() so it is same as in regrid() (#188)
  • Added pwpm() function for displaying estimates, pairwise comparisons, and P values in matrix form

emmeans 1.4.5

  • Change to .all.vars() that addresses #170
  • Addition of hidden argument scheffe.rank in summary.emmGrid() to manually specify the desired dimensionality of a Scheffe adjustment (#171)
  • Provided for ... to be included in options in calls to emmeans() and contrast(). This allows passing any summary() argument more easily, e.g., emmeans(..., type = "response", bias.adjust = TRUE, infer = c(TRUE, TRUE)) (Before, we would have had to wrap this in summary())
  • Added a plotit argument to plot.emmGrid() that works similarly to that in emmip().
  • Removed startup message for behavior change in 1.4.2; it's been long enough.
  • Fixed bug with character predictors in at` (#175)

emmeans 1.4.4

  • Fixed bug in emmeans() associated with non-factors such as Date (#162)
  • Added nesting.order option to emmip() (#163)
  • New style argument for emmip() allows plotting on a numeric scale
  • More robust detection of response transformations (#166)
  • Ensure pwpp() has tick marks on P-value axis (#167)
  • Bug fix for regrid() for error when estimates exceed bounds
  • Bug fix in auto-detecting nesting (#169) to make it less "enthusiastic"
  • Fixes to formula operations needed because formula.tools:::as.character.formula messes me up (thanks to Berwin Turloch, UWA, for alerting me)
  • Making dqrg() more visible in the documentation (because it's often useful)
  • Added more methods for emm_list objects, e.g. rbind() and as.data.frame(), as.list(), and as.emm_list()

emmeans 1.4.3.01

  • Fixed bug in post-grid support that affects, e.g., the ggeffects package (#161)

emmeans 1.4.3

  • Added "bcnPower" option to make.tran() (per car::bcnPower())
  • Scoping correction for emmtrends() (#153)
  • Allow passing ... to hook functions (need exposed by #154)
  • Addition to regrid() whereby we can fake any response transformation -- not just "log" (again inspired by #154)
  • Informative message when pbkrtest or lmerTest is not found (affects merMod objects) (#157)
  • Change in pwpp() to make extremely small P values more distinguishable

emmeans 1.4.2

  • First argument of emtrends() is now object, not model, to avoid potential mis-matching of the latter with optional mode argument
  • emtrends() now uses more robust and efficient code whereby a single reference grid is constructed containing all needed values of var. The old version could fail, e.g., in cases where the reference grid involves post-processing. (#145)
  • Added scale argument to contrast()
  • Added new "identity" contrast method
  • New eff_size() function for Cohen effect sizes
  • Expanded capabilities for interaction contrasts (#146)
  • New cov.keep argument in ref_grid() for specifying covariates to be treated just like factors (#148). A side effect is that the system default for indicator variables as covariates is to treat them like 2-level factors. This could change the results obtained from some analyses using earlier versions. To replicate old analyses, set emm_options(cov.keep = character(0)).
  • Added merMod-related options as convenience arguments (#150)
  • Bug fixes: regrid ignored offsets with Bayesian models; emtrends() did not supply options and misc arguments to emm_basis() (#143)

emmeans 1.4.1

  • Added non-estimability infrastructure for Bayesian models, stanreg in particular (#114)
  • Added max.degree argument in emtrends() making it possible to obtain higher-order trends (#133). Plus minor tuneups, e.g., smaller default increment for difference quotients
  • Made emmeans() more forgiving with 'byvariables; e.g.,emmeans(model, ~ dose | treat, by = "route")will find bothbyvariables whereas previously"route"` would be ignored.
  • Temporary fix for glitch in gls support where Satterthwaite isn't always right.
  • Attempt to make annotations clearer and more consistent regarding degrees-of-freedom methods.
  • Provisions whereby externally provided emm_basis() and recover_data() methods are used in preference to internal ones - so package developers can provide improvements over what I've cobbled together.
  • Tried to produce more informative message when recover_data() fails
  • Fixed bug in contrast() in identifying true contrasts (#134)
  • Fixed a bug in plot.summary_emm() regarding CIs and intervals (#137)
  • Improved support for response transformations. Models with formulas like like log(y + 1) ~ ... and 2*sqrt(y + 0.5) ~ ... are now auto-detected. [This may cause discrepancies with examples in past usages, but if so, that would be because the response transformation was previously incorrectly interpreted.]
  • Added a ratios argument to contrast() to decide how to handle log and logit
  • Added message/annotation when contrasts are summarized with type = "response" but there is no way to back-transform them (or we opted out with ratios = FALSE)

emmeans 1.4

  • Added a courtesy function .emm_register() to make it easier for other packages to register their emmeans support methods
  • Clarified the "confidence intervals" vignette discussion of infer, explaining that Bayesian models are handled differently (#128)
  • Added PIs option to plot.emmGrid() and emmip() (#131). Also, in plot.emmGrid(), the intervals argument has been changed to CIs for sake of consistency and less confusion; intervals is still supported for backaward compatibility.
  • plot.emmGrid gains a colors argument so we can customize colors used.
  • Bug fix for glht support (#132 contributed by Balsz Banfai)
  • regrid gains sim and N.sim arguments whereby we can generate a fake posterior sample from a frequentist model.

emmeans 1.3.5.1

  • Bug fix for gls objects with non-matrix apVar member (#119)
  • Repairs faulty links in 1.3.5 vignettes

emmeans 1.3.5

  • First steps to take prediction seriously. This includes
    • Addition of a sigma argument to ref_grid() (defaults to sigma(object) if available)
    • Addition of an interval argument in predict.emmGrid()
    • Addition of a likelihood argument in as.mcmc to allow for simulating from the posterior predictive distribution
    • Crude provisions for bias adjustment when back-transforming. This is not really prediction, but it is made possible by availability of sigma in object
  • Further steps to lower the profile of cld() and CLD()
  • Family size for Tukey adjustment was wrong when using exclude (#107)
  • Provided for direct passing of info from recover_data to emm_basis
  • Attempts to broaden MCMCglmm support

emmeans 1.3.4

  • Un-naming a lot of arguments in do.call(paste, ...) and do.call(order, ...), to prevent problems with factor names like method that are argument names for these functions (#94)
  • Fix to a logic error in summary.emmGrid() whereby transformations of class list were ignored.
  • Enhancement to update.emmGrid(..., levels = levs) whereby we can easily relabel the reference grid and ensure that the grid and roles slots stay consistent. Added vignette example.
  • Clarified ordering rules used by emmeans(). We now ensure that the original order of the reference grid is preserved. Previously, the grid was re-ordered if any numeric or character levels occurred out of order, per order()
  • Curbing use of "statistical significance" language. This includes additional vignette material and plans to deprecate CLD() due to its misleading display of pairwise-comparison tests.
  • Bug fix for betareg objects, where the wrong terms component was sometimes used.
  • Correction to logic error that affected multiplicity adjustments when by variables are present (#98).
  • Addition of pwpp() function to plot P values of comparisons
  • Improvement to summary(..., adjust = "scheffe"). We now actually compute and use the rank of the matrix of linear functions to obtain the F numerator d.f., rather than trying to guess the likely correct value.
  • Removal of vignette on transitioning from lsmeans -- it's been a long enough time now.

emmeans 1.3.3

  • Fix to unintended consequence of #71 that caused incorrect ordering of contrast() results if they are later used by emmeans(). This was first noticed with ordinal models in prob mode (#83).
  • Improved checking of conformability of parameters -- for models with rank deficiency not handled same way as lm()'s NA convention
  • Added basic support for sommer::mmer, MuMIn::averaging, and mice::mira objects
  • Fix in nnet::multinom support when there are 2 outcomes (#19)
  • Added Satterthwaite d.f. to gls objects
  • famSize now correct when exclude or include is used in a contrast function (see #68)
  • Stronger warnings of possible bias with aovList objects, in part due to the popularity of afex::aov_ez() which uses these models.
  • Updates to FAQs vignette

emmeans 1.3.2

  • I decided to enable "optimal digits" display by default. In summaries, we try to show enough---but not too much---precision in estimates and confidence intervals. If you don't like this and want to revert to the old (exaggerated precision) behavior, do emm_options(opt.digits = FALSE)
  • Added include argument to most .emmc functions (#67)
  • Now allow character values for ref, exclude, and include in .emmc functions (#68)
  • Better handling of matrix predictors (#66)
  • Fixed over-zealous choice to not pass ... arguments in emmeans() when two-sided formulas are present
  • Fix to clm support when model is rank-deficient
  • Fix to regrid(..., transform = "log") error when there are existing non-estimable cases (issue #65)
  • Improvements to brmsfit support (#43)
  • Added support for mgcv::gam and mgcv::gamm models
  • .my.vcov() now passes ... to clients
  • Removed glmmADMB support. This package appears to be dormant
  • Fixed ordering bug for nested models (#71)
  • Support for manova object no longer requires data keyword (#72)
  • Added support for multivariate response in aovlist models (#73)
  • Documentation clarification (#76)
  • Fix to CLD fatal error when sort = TRUE (#77)
  • Fix to issue with weights and incomplete cases with lme objects (#75)
  • Nested fixed-effects yielded NonEsts when two factors are nested in the same factor(s) (#79)

emmeans 1.3.1

  • "mvt" adjustment ignored by grouping
  • contrast() mis-labeled estimates when levels varied among by groups (most prominently this happened in CLD(..., details = TRUE))
  • Changed aovlist support so it re-fits the model when non-sum-to-zero contrasts were used
  • print.summary_emm() now cleans up numeric columns with zapsmall()
  • More robust handling of nesting in ref_grid() and update(), and addition of covnest argument for whether to include covariates when auto-detecting nesting
  • Revision of some vignettes
  • Fixed bug in hpd.summary() and handoff to it from summary()
  • Fixed bug where ref_grid() ignored mult.levs
  • Fixes in emmeans where it passes ... where it shouldn't
  • CLD() now works for MCMC models (uses frequentist summary)
  • Addition of opt.digits option

emmeans 1.3.0

  • Deprecated functions like ref.grid() put to final rest, and we no longer support packages that provide recover.data or lsm.basis methods
  • Courtesy exports .recover_data() and .emm_basis() to provide access for extension developers to all available methods
  • Streamlining of a stored example in inst/extdata
  • Fix to .all.vars() that could cause errors when response variable has a function call with character constants.
  • Relabeling of differences as ratios when appropriate in regrid() (so results match summary() labeling with type = "response").
  • plot.emmGrid(..., comparisons = TRUE, type = "response") produced incorrect comparison arrows; now fixed

emmeans 1.2.4

  • Support for model formulas such as df$y ~ df$treat + df[["cov"]]. This had failed previously for two obscure reasons, but now works correctly.
  • New simplify.names option for above types of models
  • emm_options() with no arguments now returns all options in force, including the defaults. This makes it more consistent with options()
  • Bug fix for emtrends(); produced incorrect results in models with offsets.
  • Separated the help pages for update.emmGrid() and emm_options()
  • New qdrg() function (quick and dirty reference grid) for help with unsupported model objects

emmeans 1.2.3

  • S3 methods involving packages multcomp and coda are now dynamically registered, not merely exported as functions. This passes checks when S3 methods are required to be registered.
  • cld() has been deprecated in favor of CLD(). This had been a headache. multcomp is the wrong place for the generic to be; it is too fancy a dance to export cld with or without having multcomp installed.
  • Added vignette caution regarding interdependent covariates
  • Improved glmmADMB support to recover contrasts correctly

emmeans 1.2.2

  • Removed ggplot2, multcomp, and coda to Suggests -- thus vastly reducing dependencies
  • Added a FAQ to the FAQs vignette
  • Modified advice in xtending.Rmd vignette on how to export methods
  • Fixes to revpairwise.emmc and cld regarding comparing only 1 EMM
  • cld.emm_list now returns results only for object[[ which[1] ]], along with a warning message.
  • Deprecated emmeans specs like cld ~ group, a vestige of lsmeans as it did not work correctly (and was already undocumented)

emmeans 1.2.1

  • Moved brms to Suggests (dozens and dozens fewer dependencies)

emmeans 1.2

  • Index of vignette topics added
  • New, improved (to my taste) vignette formats
  • Fixed df bug in regrid (#29)
  • Fixed annotation bug for nested models (#30)
  • Better documentation for lme models in "models" vignette
  • Additional fixes for arguments passed to .emmc functions (#22)
  • Support added for logical predictors (who knew we could have those? not me)
  • Replaced tex/pdf "Extending" vignette with Rmd/html
  • Overhauled the faulty logic for df methods in emm_basis.merMod
  • Added Henrik to contributors list (long-standing oversight)
  • Added exclude argument to most .emmc functions: allows user to omit certain levels when computing contrasts
  • New hpd.summary() function for Bayesian models to show HPD intervals rather than frequentist summary. Note: summary() automatically reroutes to it. Also plot() and emmip() play along.
  • Rudimentary support for brms package
  • Ad hoc Satterthwaite method for nlme::lme models

emmeans 1.1.3

  • Formatting corrections in documentation
  • Fixed bug for survival models where Surv() was interpreted as a response transformation.
  • Fixed bug (issue #19) in multinom support
  • Fixed bug (issue #22) in optional arguments with interaction contrasts
  • Fixed bug (issue #23) in weighting with character predictors
  • Clarifying message when cld() is applied to an emm_list (issue #24)
  • Added offset argument to ref_grid() (scalar offset only) and to emmeans() (vector offset allowed) -- (issue #18)
  • New optional argument for [.summary_emm to choose whether to retain its class or coerce to a data.frame (relates to issue #14)
  • Added reverse option for trt.vs.ctrl and relatives (#27)

emmeans 1.1.2

  • Changed the way terms is accessed with lme objects to make it more robust
  • emmeans:::convert_scripts() renames output file more simply
  • Added [ method for class summary_emm
  • Added simple argument for contrast - essentially the complement of by
  • Improved estimability handling in joint_tests()
  • Made ref_grid() accept ylevs list of length > 1; also slight argument change: mult.name -> mult.names
  • Various bug fixes, bullet-proofing
  • Fixes to make Markdown files render better

emmeans 1.1

  • Fixed a bug in emmeans() wherein weights was ignored when specs is a list
  • Coerce data argument, if supplied to a data.frame (recover_data() doesn't like tibbles...)
  • Added as.data.frame method for emmGrid objects, making it often possible to pass it directly to other functions as a data argument.
  • Fixed bug in contrast() where by was ignored for interaction contrasts
  • Fixed bug in as.glht() where it choked on df = Inf
  • Fixed bug occurring when a model call has no data or subset
  • New joint_tests() function tests all [interaction] contrasts

emmeans 1.0

  • Added preliminary support for gamlss objects (but doesn't support smoothing). Additional argument is what = c("mu", "sigma", "nu", "tau") It seems to be flaky when the model of interest is just ~ 1.
  • Improved support for models with fancy variable names (containing spaces and such)
  • Fixed a bug whereby emmeans() might pass data to contrast()
  • Added some missing documentation for summary.emmGrid()
  • Repaired handling of emm_options(summary = ...) to work as advertised.
  • Changed many object names in examples and vignettes from xxx.emmGrid to xxx.emm (result of overdoing the renaming the object class itself)
  • Changed emmGrid() function to emm() as had been intended as alternative to mcp() in multcomp::glht() (result of ditto).
  • Fixed error in exporting cld.emm_list()
  • Fixed a bug whereby all CIs were computed using the first estimate's degrees of freedom.
  • Now using Inf to display d.f. for asymptotic (z) tests. (NA will still work too but Inf is a better choice for consistency and meaning.)
  • Bug fix in nesting-detection code when model has only an intercept

emmeans 0.9.1

  • Documentation corrections (broken links, misspellings, mistakes)
  • More sophisticated check for randomized data in recover_data() now throws an error when it finds recovered data not reproducible
  • Added support for gam::gam objects
  • Fixes to vcov() calls to comply with recent R-devel changes

emmeans 0.9

This is the initial major version that replaces the lsmeans package. Changes shown below are changes made to the last real release of lsmeans (version 2.27-2). lsmeans versions greater than that are transitional to that package being retired.

  • We now emphasize the terminology "estimated marginal means" rather than "least-squares means"
  • The flagship functions are now emmeans(), emtrends(), emmip(), etc. But lsmeans(), lstrends(), etc. as well as pmmeans() etc. are mapped to their corresponding emxxxx() functions.
  • In addition, we are trying to avoid names that could get confused as S3 methods. So, ref.grid -> ref_grid, lsm.options -> emm_options, etc.
  • Classes ref.grid and lsmobj are gone. Both are replaced by class emmGrid. An as.emmGrid() function is provided to convert old objects to class emmGrid.
  • I decided to revert back to "kenward-roger" as the default degrees-of-freedom method for lmerMod models. Also added options disable.lmerTest and lmerTest.limit, similar to those for pbkrtest.
  • Documentation and NAMESPACE are now "ROxygenated"
  • Additional neuralgia and pigs datasets
  • Dispatching of emmmeans() methods is now top-down rather than convoluted intermingling of S3 methods
  • Improved display of back-transformed contrasts when log or logit transformation was used: We change any -s in labels to /s to emphasize that thnese results are ratios.
  • A message is now displayed when nesting is auto-detected in ref_grid. (Can be disabled via emm_options())
  • Options were added for several messages that users may want to suppress, e.g., ones about interactions and nesting.
  • Greatly overhauled help page for models. It is now a vignette, with a quick reference chart linked to details, and is organized by similarities instead of packages.
  • Support for 'mer' objects (lme4.0 package) removed.
  • A large number of smaller interlinked vignettes replaces the one big one on using the package. Several vignettes are linked in the help pages.
  • Graphics methods plot() and emmip() are now ggplot2-based. Old lattice-based functionality is still available too, and there is a graphics.engine option to choose the default.
  • Non-exported utilities convert_workspace() and convert_scripts() to help with transition
  • Moved Suggests pkgs to Enhances when not needed for building/testing

NOTE: emmeans is a continuation of the lsmeans package.

New developments will take place in emmeans, and lsmeans will remain static and eventually will be archived.