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"