1

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?

Crimc
  • 195
  • 17
  • If you would like to preserve value Android variable labels, you could try to import the data with `sjlabelled::read_spss()`. Does this help? – Daniel Apr 21 '20 at 21:49
  • Great! Yes, it helps. Nonetheless, OP assumes having read the data with `haven` – Crimc Apr 22 '20 at 05:28
  • 2
    "The goal of haven is not to provide a labelled vector that you can use everywhere in your analysis. The goal is to provide an intermediate datastructure that you can convert into a regular R data frame." (https://haven.tidyverse.org/articles/semantics.html). `sjlabelled::read_spss()` uses haven, but coerces the data into a format (i.e. numeric, factor, ...) that is "readable" by other packages w/o losing the value and variable labels. Same can be used to set/get labels, see http://strengejacke.github.io/sjlabelled for details. – Daniel Apr 22 '20 at 07:34

1 Answers1

1

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"
Crimc
  • 195
  • 17