Search code examples
rr-havenmarginal-effects

`ggeffect` or `Effect`cannot estimate marginal effects in model after checking factor levels and missing data


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?


Solution

  • 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"