Using data imported with haven
from a dataset that includes labels, I cannot get marginal effects using ggeffect()
from the package ggeffects
or Effect()
from the package effects
When using these functions an error gets prompted, although having checked the number of levels and missing cases in the predictors of a model. This post explains how to debug these last cases, avoiding empty factor levels or missing cases which will impede getting the marginal effects.
Although, in the absence of these problems I still get the error message from ggeffect()
: Can't compute marginal effects, 'effects::Effect()' returned an error.
; or in effects::Effect()
: Error in eval(parse(text = x, keep.source = FALSE)[[1L]])
because some predictor object was not found.
What else can I check in my data to get the marginal effects computed?
Another reason that will impede computing marginal effects with effects::Effect()
(or with ggpredict::ggeffect()
which uses this same function) is the existence of labelled variables in the data, i.e., those columns of class haven_labelled
. This class of variables is common when importing datasets in foreign formats (e.g., SPSS, Stata, SAS) with the haven
library.
In the following example it's clear when does the problem arises:
# Load libraries
library(ggeffects)
library(haven)
# Fit model with no labelled variables
ex1 <- lm(mpg ~ cyl,
data = mtcars)
ggeffect(ex1, term = c("cyl"))
#>
#> # Predicted values of mpg
#> # x = cyl
#>
#> x | Predicted | SE | 95% CI
#> -------------------------------------
#> 4 | 26.38 | 0.90 | [24.53, 28.23]
#> 6 | 20.63 | 0.57 | [19.47, 21.79]
#> 8 | 14.88 | 0.81 | [13.22, 16.54]
# Label one value of variable cyl
mtcars$cyl2 <- labelled(mtcars$cyl, labels = c("6" = 6))
# Fit model with the value-labelled variable cyl2
ex2 <- lm(mpg ~ cyl2,
data = mtcars)
ggeffect(ex2, term = c("cyl2"))
#> Can't compute marginal effects, 'effects::Effect()' returned an error.
#>
#> Reason: non-conformable arguments
#> You may try 'ggpredict()' or 'ggemmeans()'.
#> NULL
effects::Effect(ex2, "cyl2")
#> Error in eval(parse(text = x, keep.source = FALSE)[[1L]]): object 'cyl2' not found
To check if there are columns of type haven_labelled
in your data you can use str(data)
and change those who hold this class to a relevant one. One way to check the class of your For example, you can check the classes of the columns with this code:
library(haven)
mtcars$cyl2 <- labelled(mtcars$cyl, labels = c("6" = 6))
str(mtcars)
#> 'data.frame': 32 obs. of 12 variables:
#> $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
#> $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
#> $ disp: num 160 160 108 258 360 ...
#> $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
#> $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
#> $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
#> $ qsec: num 16.5 17 18.6 19.4 17 ...
#> $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
#> $ am : num 1 1 1 0 0 0 0 0 0 0 ...
#> $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
#> $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
#> $ cyl2: 'haven_labelled' num 6 6 4 6 8 6 8 4 4 6 ...
#> ..- attr(*, "labels")= Named num 6
#> .. ..- attr(*, "names")= chr "6"