# ggeffects makes regression output readable, and it is heading into maintenance mode

> ggeffects is an R package that turns regression models into tidy data frames of adjusted predictions and marginal means, with plots that feed straight into ggplot2. Its author has announced that the package is in maintenance mode and that new work is going into the modelbased package instead.

**strengejacke/ggeffects** — Estimated Marginal Means and Marginal Effects from Regression Models for ggplot2

- Repository: https://github.com/strengejacke/ggeffects
- Website: https://strengejacke.github.io/ggeffects
- Stars: 608 · Forks: 45
- Language: R
- License: NOASSERTION
- Published: 2026-10-22 · Updated: 2026-10-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/strengejacke-ggeffects

## Coefficients are not the same thing as answers

The question the package exists to answer is stated in the README in plain terms. After fitting a model it is useful to generate model based estimates of the response variable, that is expected values or adjusted predictions, for different combinations of predictor values, and those estimates are what let you make inferences about relationships between variables. The framing throughout is that adjusted predictions, also called marginal means, are often easier to understand than raw regression coefficients, and that visualising them gives an intuitive sense of how predictors and outcome are associated, even for complex models. This is the argument for the whole package. A coefficient tells you the change in log odds per unit of a predictor and leaves the reader to do the arithmetic. A prediction says what the model expects to happen for a particular group, at a particular value, which is the sentence a reader actually wants. ggeffects is a light-weight package aimed at calculating exactly those numbers at meaningful covariate values, along with contrasts and pairwise comparisons to test whether differences in predictions are significant, and with figures to show the result.

## Three functions cover the whole workflow

The README names the three functions a workflow needs, and each one maps to a stage. predict_response() is for understanding your results, test_predictions() is for checking whether results are significant, and plot() is for communicating them. The design goal was that each function is type safe and always returns a data frame with the same, consistent structure, and that there is a single, uniform approach to calculating adjusted predictions and estimated marginal means across many different model types, including simple and complex models with interactions and transformed terms. The consistency is the practical payoff. When every function hands back the same shape of data frame, a script that plots one model can plot the next model without branching, and the result is directly consumable by the ggplot2 package, with a plot() method offered for publication ready figures without writing the plotting code by hand.

## Predictions on the response scale, with labelled data

Two design choices are worth pulling out. First, adjusted predictions and estimated marginal means are always calculated on the response scale, which the project calls the easiest and most intuitive scale to interpret the results, so a logistic model comes back as a probability rather than a log odds value. Second, the package supports labelled data, following the convention introduced in 2018, which allows human readable annotations in the graphical output, so a figure can carry the label of a factor level instead of a bare code. The practical promise is that no expensive steps are needed after modelling before the results can be visualised. The returned data frame is ready to use with ggplot2, and the data frame itself is the object to keep, which makes it easy to save the numbers and redraw the figure later.

## The package is in maintenance mode and modelbased takes over

The most important thing on the page is the maintenance mode notice at the top, and it deserves to be read before anything else. ggeffects is in maintenance mode and will be superseded by the modelbased package from the easystats project. The stated reason is a personal one and a sensible one: to reduce a double maintenance burden for the author. The explanation is that the modelbased package has been largely revised, has gained many new features, has had its plotting capabilities revised and has full support for the marginaleffects package as the default backend for estimating marginal means, effects and contrasts. So there are now two packages by the same author doing nearly the same job, and the author describes the situation bluntly, saying that effectively there are two packages with very similar tasks and functionality. The trigger was churn in marginaleffects, which is undergoing substantial changes, which forced a rewrite of a lot of code in test_predictions(), and the result is that all functionality relying on marginaleffects was removed from ggeffects. test_predictions() is still available, but it now relies on the emmeans package and is no longer as feature rich as it was.

## What stays working and what moves across

The maintenance notice is careful about compatibility, and that is the part that decides whether you can ignore the announcement. Code using functions such as predict_response(), ggpredict() or plot() will still work, will still work in the future, and there are no limitations regarding functionality for those functions. If you only used those, the notice says there is no reason to worry and no reason to change anything. What does move is the newer half of the package. To get the full power of predictions, including contrasts, pairwise comparisons or calculating marginal effects, the recommendation is to switch to the modelbased package. The comparison of the two is also in the notice, and it is not a close call on features: modelbased is easier to maintain because it was written later with more package development experience behind it, it has a clear and intuitive user interface, it is stable and finished, and it offers things ggeffects never had, such as estimating marginal effects rather than only adjusted predictions or marginal means. Future development of new features will happen in modelbased. ggeffects will still be maintained in the sense that bugs will be fixed if possible and maybe smaller new features will be added.

## Starting with one function and two arguments

The entry point is small. You need one function, predict_response(), and two arguments: the model and the focal terms, which are the predictors you are mainly interested in. The focal terms concept is the piece that makes the output readable, because it is what decides which combinations of values the predictions are computed for. The README points to a vignette for how to start and another for the plotting method, both published with the package documentation, and the package documentation site is the main reference. The situations the package is meant for are listed explicitly: understanding how predictors and outcome are related no matter how complex the model, performing pairwise comparisons to see whether differences between groups or categories are statistically significant, and producing figures instead of long, confusing tables to describe results.

## A conventional R package, an unusual licence, and dated releases

The repository is laid out like a well established R package, with an R directory, NAMESPACE, DESCRIPTION, man pages, tests, vignettes, inst, a data directory, a pkgdown configuration, a NEWS file, a lintr configuration and the paper directory used for the Journal of Open Source Software submission. There is a CRAN-SUBMISSION file and a cran-comments.md, which are the artefacts of a package that has been through CRAN, and the package has been published on CRAN since the beginning, with the citation the project asks users to give being the 2018 Journal of Open Source Software paper by Ludecke, volume 3, issue 26, article 772, with a DOI. The licence is the unusual part. GitHub cannot classify it, so the repository ships a LICENSE file and a LICENSE.md instead of one of the standard licences, and anyone using the package in a commercial or redistributed setting needs to read that file rather than assume. The release record shows three recent versions, v2.0.0 on 2024-11-27, v2.1.0 on 2025-01-20 and v2.2.0 on 2025-02-05, and the last push was on 2026-08-19, which is consistent with a package in maintenance mode rather than an abandoned one.

## Conclusion

ggeffects still fits an existing analysis pipeline that relies on predict_response() or ggpredict(), because the project states that those functions keep working with no loss of functionality and that bugs will still be fixed. It does not fit a new project that needs contrasts, pairwise comparisons or marginal effects, because that work is moving to the modelbased package and the marginaleffects dependency was removed. Before you start something new, read the maintenance mode note at the top of the README, decide whether modelbased is the better home for your analysis, and check the licence file yourself, since the repository ships a custom licence that GitHub cannot classify.

## FAQ

### What does ggeffects do?

It calculates adjusted predictions, also called estimated marginal means, for a fitted regression model at meaningful values of the predictors, always on the response scale. It returns a consistent data frame that is ready to use with ggplot2, and it can also produce contrasts, pairwise comparisons and plots.

### Is ggeffects still being developed?

The package is in maintenance mode. The author states that it will be superseded by the modelbased package from the easystats project, that new features will be developed there, and that ggeffects will still have bugs fixed and possibly small features added.

### Will my existing ggeffects code keep working?

The maintenance notice says code using predict_response(), ggpredict() or plot() will keep working with no limitations on functionality for those functions. The functionality that relies on the marginaleffects package was removed, and test_predictions() now relies on the emmeans package instead.

### Which functions do I need for a full workflow?

predict_response() to understand the results, test_predictions() to check whether results are significant, and plot() to communicate them. Each is designed to return the same data frame structure so the output can be used directly with ggplot2.

## Sources

- [Issues](https://github.com/strengejacke/ggeffects/issues)
- [Project website](https://strengejacke.github.io/ggeffects)
- [README](https://github.com/strengejacke/ggeffects/blob/master/README.md)
- [Releases](https://github.com/strengejacke/ggeffects/releases)
- [strengejacke/ggeffects on GitHub](https://github.com/strengejacke/ggeffects)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/strengejacke-ggeffects
