{"id":13400525,"url":"https://github.com/strengejacke/ggeffects","last_synced_at":"2025-04-11T03:30:09.828Z","repository":{"id":41300822,"uuid":"93021495","full_name":"strengejacke/ggeffects","owner":"strengejacke","description":"Estimated Marginal Means and Marginal Effects from Regression Models for ggplot2","archived":false,"fork":false,"pushed_at":"2025-03-26T07:31:27.000Z","size":265399,"stargazers_count":591,"open_issues_count":46,"forks_count":41,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-03T20:41:39.290Z","etag":null,"topics":["estimated-marginal-means","hacktoberfest","marginal-effects","prediction"],"latest_commit_sha":null,"homepage":"https://strengejacke.github.io/ggeffects","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/strengejacke.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-01T05:54:36.000Z","updated_at":"2025-04-01T19:42:29.000Z","dependencies_parsed_at":"2023-11-02T14:33:27.552Z","dependency_job_id":"316fc8b3-a8f1-4936-a833-6eb00babf356","html_url":"https://github.com/strengejacke/ggeffects","commit_stats":{"total_commits":1924,"total_committers":13,"mean_commits":148.0,"dds":"0.011434511434511463","last_synced_commit":"4deb5520ef0df9941bb41136a06cda1923d227aa"},"previous_names":[],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strengejacke%2Fggeffects","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strengejacke%2Fggeffects/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strengejacke%2Fggeffects/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strengejacke%2Fggeffects/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/strengejacke","download_url":"https://codeload.github.com/strengejacke/ggeffects/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248335290,"owners_count":21086553,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["estimated-marginal-means","hacktoberfest","marginal-effects","prediction"],"created_at":"2024-07-30T19:00:52.939Z","updated_at":"2025-04-11T03:30:09.747Z","avatar_url":"https://github.com/strengejacke.png","language":"R","funding_links":[],"categories":["R"],"sub_categories":[],"readme":"\r\n# ggeffects - Estimated Marginal Means and Adjusted Predictions from Regression Models\u003cimg src=\"man/figures/logo.png\" align=\"right\" /\u003e\r\n\r\n[![DOI](http://joss.theoj.org/papers/10.21105/joss.00772/status.svg)](https://doi.org/10.21105/joss.00772)\r\n[![Documentation](https://img.shields.io/badge/documentation-ggeffects-orange.svg?colorB=E91E63)](https://strengejacke.github.io/ggeffects/)\r\n[![downloads](http://cranlogs.r-pkg.org/badges/ggeffects)](https://cranlogs.r-pkg.org/)\r\n[![total](http://cranlogs.r-pkg.org/badges/grand-total/ggeffects)](https://cranlogs.r-pkg.org/)\r\n\r\nLüdecke D (2018). *ggeffects: Tidy Data Frames of Marginal Effects from\r\nRegression Models.* Journal of Open Source Software, 3(26), 772. doi:\r\n[10.21105/joss.00772](https://doi.org/10.21105/joss.00772)\r\n\r\n## Maintenance mode\r\n\r\n*Package **ggeffects** is in maintenance mode and will be superseded by\r\nthe [**modelbased-package**](https://easystats.github.io/modelbased/)\r\nfrom the [easystats-project](https://easystats.github.io/easystats/).*\r\n\r\n*The main reason is to reduce double maintenance burden for me. We have\r\nlargely revised the **modelbased** package, adding many new features,\r\nrevising the plotting capabilities, and last not least we added full\r\nsupport for the **marginaleffects** package as (defaul) backend for\r\nestimating marginal means, effects and contrasts.*\r\n\r\n***ggeffects**, which has a pretty stable `predict_response()` function\r\nto calculate adjusted predictions for many, many models, and which has\r\nvery matured plotting capabilities, lately got a `test_prediction()`\r\nfunction to calculate contrasts and pairwise comparisons, too, also\r\nbuilt on top of **marginaleffects**. Effectively, there are now two\r\npackages I’m involved with very similar tasks and functionality.\r\nHowever, **marginaleffects** is undergoing substantial changes right\r\nnow, meaning I had to re-write a lot of code in `test_predictions()` to\r\nmake it work again (`test_predictions()` is still available, relying on\r\nthe **emmeans** package, and hence no longer that feature-rich as it was\r\nbefore). Therefore, I decided to remove all functionality that relied on\r\n**marginaleffects**, and focussing on **modelbased** instead, to reduce\r\nmaintenance burden for me.*\r\n\r\n***modelbased** is easier to maintain, because it was written lateley,\r\nwith more package development experience on our side. Furthermore, it\r\nhas a clear and intuitive user interface and is pretty stable and\r\nfinished right now. It also offers some features that **ggeffects** has\r\nnot included, like estimating marginal effects (and not only adjusted\r\npredictions or marginal means). Thus, future development of new features\r\nwill happen in **modelbased**. **ggeffects** will still be maintained,\r\ni.e. bugs will be fixed if possible, and maybe smaller new features will\r\nbe added.*\r\n\r\n*Your code using functions like `predict_response()`, `ggpredict()` or\r\n`plot()` will still work, will still work in the future and there will\r\nbe no limitations regarding functionality for those functions! If you\r\nonly used these functions, there is no reason to worry or to change\r\nanything! However, to leverage the full power of predictions, including\r\ncontrasts and pairwise comparisons or calculating marginal effects, the\r\nrecommendation is to switch to\r\n[**modelbased-package**](https://easystats.github.io/modelbased/)!*\r\n\r\n## Why do we need (marginal/conditional) effects or (adjusted) predicted values?\r\n\r\nAfter fitting a model, it is useful generate model-based estimates\r\n(expected values, or *adjusted predictions*) of the response variable\r\nfor different combinations of predictor values. Such estimates can be\r\nused to make inferences about relationships between variables - adjusted\r\npredictions tell you: what is the expected ouctome for certain values or\r\nlevels of my predictors?\r\n\r\n*Adjusted predictions* or *marginal means* are often easier to\r\nunderstand than raw regression coefficients. In particular, their\r\nvisualization allows to intuitively get the idea of how predictors and\r\noutcome are associated, even for complex models.\r\n\r\n## Aims of this package\r\n\r\n**ggeffects** is a light-weight package that aims at easily calculating\r\nadjusted predictions and estimated marginal means at meaningful values\r\nof covariates from statistical models. Furthermore, it is possible to\r\ncompute contrasts or pairwise comparisons, to test predictions and\r\ndifferences in predictions for statistical significance. Finally, you\r\ncan easily produce nice figures to visualize the results.\r\n\r\nWhat you basically would need for your workflow is:\r\n\r\n- `predict_response()` (understand your results)\r\n- `test_predictions()` (check for “significant” results)\r\n- `plot()` (communicate your results)\r\n\r\nThree core ideas describe the philosophy of the function design and help\r\nusers to achieve the above mentioned goals:\r\n\r\n1)  Functions are type-safe and always return a data frame with the\r\n    same, consistent structure;\r\n\r\n2)  there is a simple, unique approach to calculate adjusted predictions\r\n    and estimated marginal means for many different models;\r\n\r\n3)  the package supports “labelled data” (Lüdecke 2018), which allows\r\n    human readable annotations for graphical outputs.\r\n\r\nThis means, users do not need to care about any expensive steps after\r\nmodeling to visualize the results. The returned as data frame is ready\r\nto use with the **ggplot2**-package, however, there is also a\r\n`plot()`-method to easily create publication-ready figures.\r\n\r\nAdjusted predictions or estimated marginal means are always calculated\r\non the *response* scale, which is the easiest and most intuitive scale\r\nto interpret the results.\r\n\r\nIt is easy to start, you just need one function: `predict_response()`,\r\nand two arguments: the model and the “focal terms”, i.e. the predictors\r\nthat you are mainly interested in. Examples are shown below.\r\n\r\n## So, when do I need the *ggeffects* package?\r\n\r\nYou should use *ggeffects*…\r\n\r\n- … when you want to understand how predictors and outcome are related,\r\n  no matter whether you have simple or complex models, interaction or\r\n  transformed terms. See how to start [in this\r\n  vignette](https://strengejacke.github.io/ggeffects/articles/ggeffects.html).\r\n  The syntax for the *ggeffects* functions is super easy and consistent\r\n  across the different type of models and complexity.\r\n\r\n- … when you want to perform pairwise comparisons, in order to see\r\n  whether there are statistically significant differences in the\r\n  association of, for instance, different groups or categories of your\r\n  predictors and your outcome (“effects”, or sometimes “marginal\r\n  effects”).\r\n\r\n- … when you need impressive figures instead of long, confusing tables\r\n  to describe your results. There are several examples in the\r\n  [documentation](https://strengejacke.github.io/ggeffects/), for\r\n  example [this\r\n  vignette](https://strengejacke.github.io/ggeffects/articles/introduction_plotmethod.html).\r\n\r\n- … and even when you want to check, whether your model appropriately\r\n  describes your data. See [this\r\n  vignette](https://strengejacke.github.io/ggeffects/articles/introduction_partial_residuals.html)\r\n  to learn more about how to use *ggeffects* for model diagnostics.\r\n\r\nA workflow in R would then include using following functions in this\r\norder: `predict_response()`, `plot()`, and `test_predictions()` - that’s\r\nall you need! See also [this example\r\nworkflow](https://strengejacke.github.io/ggeffects/articles/practical_glm_workflow.html)\r\nusing logistic regression.\r\n\r\n## Installation\r\n\r\n[![CRAN](https://www.r-pkg.org/badges/version/ggeffects)](https://cran.r-project.org/package=ggeffects)\r\n[![parameters status\r\nbadge](https://strengejacke.r-universe.dev/badges/ggeffects)](https://strengejacke.r-universe.dev)\r\n\r\n| Type | Source | Command |\r\n|----|----|----|\r\n| Release | CRAN | `install.packages(\"ggeffects\")` |\r\n| Development | r - universe | `install.packages(\"ggeffects\", repos = \"https://strengejacke.r-universe.dev\")` |\r\n| Development | GitHub | `remotes::install_github(\"strengejacke/ggeffects\")` |\r\n\r\nOr you can run\r\n[`ggeffects::install_latest()`](https://strengejacke.github.io/ggeffects/reference/install_latest.html)\r\nto install the latest development version from r-universe.\r\n\r\n## Adjusted predictions at…: marginalizing over non-focal predictors\r\n\r\n`predict_response()` is a wrapper around three “workhorse” functions,\r\n`ggpredict()`, `ggemmeans()` and `ggaverage()`. Depending on the value\r\nof the `margin` argument, `predict_response()` calls one of those\r\nfunctions, with different arguments. It’s important to note that:\r\n\r\n1.  Predictions are always returned on the *response scale*, no matter\r\n    which model is used. This is the most intuitive scale to interpret\r\n    your results (the predicted values).\r\n\r\n2.  The response is predicted at the values or levels of your *focal\r\n    terms*, i.e. you specify the predictors you are mainly interested\r\n    in, using the `terms` argument. The predicted values are calculated\r\n    for these values, while all other predictors are marginalized over.\r\n\r\nThe `margin` argument in `predict_response()` indicates how to\r\nmarginalize over the *non-focal* predictors, i.e. those variables that\r\nare *not* specified in `terms`. Each option answers slightly different\r\nquestions. Possible values are:\r\n\r\n- `\"mean_reference\"` and `\"mean_mode\"`: `\"mean_reference\"` calls\r\n  `ggpredict()`, i.e. non-focal predictors are set to their mean\r\n  (numeric variables), reference level (factors), or “most common” value\r\n  (mode) in case of character vectors. `\"mean_mode\"` calls\r\n  `ggpredict(typical = c(numeric = \"mean\", factor = \"mode\"))`,\r\n  i.e. non-focal predictors are set to their mean (numeric variables) or\r\n  mode (factors, or “most common” value in case of character vectors).\r\n\r\n  Question answered: “What is the predicted (or: expected) value of the\r\n  response at meaningful values or levels of my focal terms for a\r\n  ‘typical’ observation in my data?”, where ‘typical’ refers to certain\r\n  characteristics of the remaining predictors.\r\n\r\n- `\"marginalmeans\"`: calls `ggemmeans()`, i.e. non-focal predictors are\r\n  set to their mean (numeric variables) or marginalized over the levels\r\n  or “values” for factors and character vectors. Marginalizing over the\r\n  factor levels of non-focal terms computes a kind of “weighted average”\r\n  for the values at which these terms are hold constant. There are\r\n  different weighting options that can be chosen with the `weights`\r\n  argument.\r\n\r\n  Question answered: “What is the predicted (or: expected) value of the\r\n  response at meaningful values or levels of my focal terms for an\r\n  ‘average’ observation in my data?”. It refers to randomly picking a\r\n  subject of your sample and the result you get on average.\r\n\r\n- `\"empirical\"` (or on of its aliases, `\"counterfactual\"` or\r\n  `\"average\"`): calls `ggaverage()`, i.e. non-focal predictors are\r\n  marginalized over the observations in your sample. The response is\r\n  predicted for each subject in the data and predicted values are then\r\n  averaged across all subjects, aggregated/grouped by the focal terms.\r\n  Averaging is applied to “counterfactual” predictions (Dickerman and\r\n  Hernán 2020). There is a more detailed description in [this\r\n  vignette](https://strengejacke.github.io/ggeffects/articles/technical_differencepredictemmeans.html).\r\n\r\n  Question answered: “What is the predicted (or: expected) value of the\r\n  response at meaningful values or levels of my focal terms for the\r\n  ‘average’ observation in the population?”. It does not only refer to\r\n  the actual data in your sample, but also “what would be if” we had\r\n  more data, or if we had data from a different population.\r\n\r\n## Documentation and Support\r\n\r\nPlease visit \u003chttps://strengejacke.github.io/ggeffects/\u003e for\r\ndocumentation and vignettes. For questions about the functionality, you\r\nmay either contact me via email or also file an issue.\r\n\r\n## ggeffects supports many different models and is easy to use\r\n\r\nAdjusted predictions can be calculated for many different models.\r\nCurrently supported model-objects are: averaging, bamlss, bayesglm,\r\nbayesx, betabin, betareg, bglmer, bigglm, biglm, blmer, bracl, brglm,\r\nbrmsfit, brmultinom, cgam, cgamm, clm, clm2, clmm, coxph, feglm, fixest,\r\nflac, flic, gam, Gam, gamlss, gamm, gamm4, gee, geeglm, glimML, glm,\r\nglm.nb, glm_weightit, glmer.nb, glmerMod, glmgee, glmmPQL, glmmTMB,\r\nglmrob, glmRob, glmx, gls, hurdle, ivreg, lm, lm_robust, lme, lmerMod,\r\nlmrob, lmRob, logistf, logitr, lrm, mblogit, mclogit, MCMCglmm, merMod,\r\nmerModLmerTest, MixMod, mixor, mlogit, multinom, multinom_weightit,\r\nnegbin, nestedLogit, nlmerMod, ols, ordinal_weightit, orm, phyloglm,\r\nphylolm, plm, polr, rlm, rlmerMod, rq, rqs, rqss, sdmTMB, speedglm,\r\nspeedlm, stanreg, survreg, svyglm, svyglm.nb, tidymodels, tobit,\r\ntruncreg, vgam, vglm, wblm, wbm, Zelig-relogit, zeroinfl, zerotrunc.\r\n\r\nSupport for models varies by marginalization method (the `margin`\r\nargument), i.e. although `predict_response()` supports most models, some\r\nmodels are only supported exclusively by one of the four downstream\r\nfunctions (`ggpredict()`, `ggemmeans()`, `ggeffect()` or `ggaverage()`).\r\nThis means that not all models work for every `margin` option of\r\n`predict_response()`. Other models not listed here might work as well,\r\nbut are currently not tested.\r\n\r\nInteraction terms, splines and polynomial terms are also supported.\r\nThere is a generic `plot()`-method to plot the results using\r\n**ggplot2**.\r\n\r\n## Examples\r\n\r\nThe returned data frames always have the same, consistent structure and\r\ncolumn names, so it’s easy to create ggplot-plots without the need to\r\nre-write the function call. `x` and `predicted` are the values for the\r\nx- and y-axis. `conf.low` and `conf.high` could be used as `ymin` and\r\n`ymax` aesthetics for ribbons to add confidence bands to the plot.\r\n`group` can be used as grouping-aesthetics, or for faceting.\r\n\r\n`predict_response()` requires at least one, but not more than four terms\r\nspecified in the `terms`-argument. Predicted values of the response,\r\nalong the values of the first term are calculated, optionally grouped by\r\nthe other terms specified in `terms`.\r\n\r\n### Adjusted predictions for one focal predictor\r\n\r\n``` r\r\nlibrary(ggeffects)\r\nlibrary(splines)\r\nlibrary(datawizard)\r\ndata(efc, package = \"ggeffects\")\r\nefc \u003c- to_factor(efc, c(\"c161sex\", \"e42dep\"))\r\nfit \u003c- lm(barthtot ~ c12hour + bs(neg_c_7) * c161sex + e42dep, data = efc)\r\n\r\npredict_response(fit, terms = \"c12hour\")\r\n#\u003e # Predicted values of barthtot\r\n#\u003e \r\n#\u003e c12hour | Predicted |       95% CI\r\n#\u003e ----------------------------------\r\n#\u003e       4 |     89.91 | 84.18, 95.63\r\n#\u003e      12 |     89.34 | 83.62, 95.06\r\n#\u003e      22 |     88.63 | 82.90, 94.36\r\n#\u003e      36 |     87.64 | 81.88, 93.40\r\n#\u003e      49 |     86.72 | 80.90, 92.53\r\n#\u003e      70 |     85.23 | 79.30, 91.16\r\n#\u003e     100 |     83.10 | 76.92, 89.29\r\n#\u003e     168 |     78.28 | 71.24, 85.33\r\n#\u003e \r\n#\u003e Adjusted for:\r\n#\u003e * neg_c_7 =       11.83\r\n#\u003e * c161sex =        Male\r\n#\u003e *  e42dep = independent\r\n```\r\n\r\nA possible call to ggplot could look like this:\r\n\r\n``` r\r\nlibrary(ggplot2)\r\nmydf \u003c- predict_response(fit, terms = \"c12hour\")\r\nggplot(mydf, aes(x, predicted)) +\r\n  geom_line() +\r\n  geom_ribbon(aes(ymin = conf.low, ymax = conf.high), alpha = 0.1)\r\n```\r\n\r\n![](man/figures/unnamed-chunk-3-1.png)\u003c!-- --\u003e\r\n\r\nHowever, there is also a `plot()`-method. This method uses convenient\r\ndefaults, to easily create the most suitable plot for the predictions.\r\n\r\n``` r\r\nmydf \u003c- predict_response(fit, terms = \"c12hour\")\r\nplot(mydf)\r\n```\r\n\r\n![](man/figures/unnamed-chunk-4-1.png)\u003c!-- --\u003e\r\n\r\n### Adjusted predictions for several focal predictors\r\n\r\nWith three variables, predictions can be grouped and faceted.\r\n\r\n``` r\r\nresult \u003c- predict_response(fit, terms = c(\"neg_c_7\", \"c161sex\", \"e42dep\"))\r\n# we want a more compact table, thus we use `print()` explicitly\r\nprint(result, collapse_table = TRUE, collapse_ci = TRUE)\r\n#\u003e # Predicted values of barthtot\r\n#\u003e \r\n#\u003e neg_c_7 | c161sex |               e42dep |     Predicted (95% CI)\r\n#\u003e -----------------------------------------------------------------\r\n#\u003e       7 |    Male |          independent |  93.73 (87.01, 100.44)\r\n#\u003e      12 |         |                      |  86.89 (81.09,  92.70)\r\n#\u003e      17 |         |                      |  80.62 (73.69,  87.54)\r\n#\u003e      28 |         |                      | 148.54 (85.66, 211.42)\r\n#\u003e       7 |         |   slightly dependent |  87.41 (81.27,  93.56)\r\n#\u003e      12 |         |                      |  80.58 (76.32,  84.84)\r\n#\u003e      17 |         |                      |  74.31 (68.46,  80.15)\r\n#\u003e      28 |         |                      | 142.23 (79.71, 204.75)\r\n#\u003e       7 |         | moderately dependent |  78.29 (72.08,  84.49)\r\n#\u003e      12 |         |                      |  71.46 (67.64,  75.27)\r\n#\u003e      17 |         |                      |  65.18 (59.75,  70.60)\r\n#\u003e      28 |         |                      | 133.10 (70.44, 195.76)\r\n#\u003e       7 |         |   severely dependent |  41.93 (35.66,  48.21)\r\n#\u003e      12 |         |                      |  35.10 (30.98,  39.22)\r\n#\u003e      17 |         |                      |  28.82 (23.41,  34.24)\r\n#\u003e      28 |         |                      |  96.75 (34.08, 159.41)\r\n#\u003e       7 |  Female |          independent |  98.04 (93.06, 103.02)\r\n#\u003e      12 |         |                      |  86.61 (81.85,  91.37)\r\n#\u003e      17 |         |                      |  82.58 (77.33,  87.82)\r\n#\u003e      28 |         |                      |  81.57 (64.41,  98.73)\r\n#\u003e       7 |         |   slightly dependent |  91.73 (87.89,  95.57)\r\n#\u003e      12 |         |                      |  80.30 (77.43,  83.17)\r\n#\u003e      17 |         |                      |  76.26 (72.57,  79.96)\r\n#\u003e      28 |         |                      |  75.26 (58.64,  91.87)\r\n#\u003e       7 |         | moderately dependent |  82.60 (78.62,  86.59)\r\n#\u003e      12 |         |                      |  71.17 (68.79,  73.56)\r\n#\u003e      17 |         |                      |  67.14 (63.95,  70.33)\r\n#\u003e      28 |         |                      |  66.13 (49.52,  82.74)\r\n#\u003e       7 |         |   severely dependent |  46.25 (41.93,  50.57)\r\n#\u003e      12 |         |                      |  34.82 (32.27,  37.37)\r\n#\u003e      17 |         |                      |  30.78 (27.67,  33.90)\r\n#\u003e      28 |         |                      |  29.78 (13.33,  46.23)\r\n#\u003e \r\n#\u003e Adjusted for:\r\n#\u003e * c12hour = 42.10\r\n\r\nggplot(result, aes(x = x, y = predicted, colour = group)) +\r\n  geom_line() +\r\n  facet_wrap(~facet)\r\n```\r\n\r\n![](man/figures/unnamed-chunk-5-1.png)\u003c!-- --\u003e\r\n\r\n`plot()` works for this case, as well:\r\n\r\n``` r\r\nplot(result)\r\n```\r\n\r\n![](man/figures/unnamed-chunk-6-1.png)\u003c!-- --\u003e\r\n\r\n## Citation\r\n\r\nIn case you want / have to cite my package, please use\r\n`citation('ggeffects')` for citation information:\r\n\r\nLüdecke D (2018). *ggeffects: Tidy Data Frames of Marginal Effects from\r\nRegression Models.* Journal of Open Source Software, 3(26), 772. doi:\r\n[10.21105/joss.00772](https://doi.org/10.21105/joss.00772)\r\n\r\n## References\r\n\r\n\u003cdiv id=\"refs\" class=\"references csl-bib-body hanging-indent\"\r\nentry-spacing=\"0\"\u003e\r\n\r\n\u003cdiv id=\"ref-dickerman_counterfactual_2020\" class=\"csl-entry\"\u003e\r\n\r\nDickerman, Barbra A., and Miguel A. Hernán. 2020. “Counterfactual\r\nPrediction Is Not Only for Causal Inference.” *European Journal of\r\nEpidemiology* 35 (7): 615–17.\r\n\u003chttps://link.springer.com/article/10.1007/s10654-020-00659-8\u003e.\r\n\r\n\u003c/div\u003e\r\n\r\n\u003cdiv id=\"ref-daniel_ludecke_2018_1249216\" class=\"csl-entry\"\u003e\r\n\r\nLüdecke, Daniel. 2018. “Sjlabelled: Labelled Data Utility Functions,”\r\nMay. \u003chttps://doi.org/10.5281/zenodo.1249215\u003e.\r\n\r\n\u003c/div\u003e\r\n\r\n\u003c/div\u003e\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrengejacke%2Fggeffects","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstrengejacke%2Fggeffects","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrengejacke%2Fggeffects/lists"}