Search code examples
rlogistic-regressionnamarginal-effects

R logistic regression and marginal effects - how to exclude NA values in categorical independent variable


I am a beginner with R. I am using glm to conduct logistic regression and then using the 'margins' package to calculate marginal effects but I don't seem to be able to exclude the missing values in my categorical independent variable.

I have tried to ask R to exclude NAs from the regression. The categorical variable is weight status at age 9 (wgt9), and it has three levels (1, 2, 3) and some NAs.

What am I doing wrong? Why do I get a wgt9NA result in my outputs and how can I correct it?

Thanks in advance for any help/advice.

Conduct logistic regression

summary(logit.phbehav <- glm(obese13 ~ gender + as.factor(wgt9) + aded08b, 
data = gui, weights = bdwg01, family = binomial(link = "logit")))

Regression output

term              estimate std.error statistic   p.value
  <chr>                <dbl>     <dbl>     <dbl>     <dbl>
1 (Intercept)        -3.99      0.293     -13.6  2.86e- 42
2 gender              0.387     0.121       3.19 1.42e-  3
3 as.factor(wgt9)2    2.49      0.177      14.1  3.28e- 45
4 as.factor(wgt9)3    4.65      0.182      25.6  4.81e-144
5 as.factor(wgt9)NA   2.60      0.234      11.1  9.94e- 29
6 aded08b            -0.0755    0.0224     -3.37 7.47e-  4

Calculate the marginal effects

effects_logit_phtotal = margins(logit.phtot) 
print(effects_logit_phtotal)
summary(effects_logit_phtotal)

Marginal effects output

> summary(effects_logit_phtotal)
factor     AME     SE       z      p   lower   upper
aded08a -0.0012 0.0002 -4.8785 0.0000 -0.0017 -0.0007
gender  0.0115 0.0048  2.3899 0.0169  0.0021  0.0210
wgt92  0.0941 0.0086 10.9618 0.0000  0.0773  0.1109
wgt93  0.4708 0.0255 18.4569 0.0000  0.4208  0.5207
wgt9NA  0.1027 0.0179  5.7531 0.0000  0.0677  0.1377

Solution

  • First of all welcome to stack overflow. Please check the answer here to see how to make a great R question. Not providing a sample of your data, some times makes it impossible to answer the question. However taking a guess, I think that you have not set your NA values correctly but as strings. This behavior can be seen in the dummy data below.

    First let's create the dummy data:

    v1 <- c(2,3,3,3,2,2,2,2,NA,NA,NA)
    v2 <- c(2,3,3,3,2,2,2,2,"NA","NA","NA")
    v3 <- c(11,5,6,7,10,8,7,6,2,5,3)
    obese <- c(0,1,1,0,0,1,1,1,0,0,0)
    df <- data.frame(obese,v1,v2)
    

    Using the variable named v1, does not include NA as a category:

    glm(formula = obese ~ as.factor(v1) + v3, family = binomial(link = "logit"), 
        data = df)
    
    Deviance Residuals: 
             1           2           3           4           5           6           7           8  
    -2.110e-08   2.110e-08   1.168e-05  -1.105e-05  -2.110e-08   3.094e-06   2.110e-08   2.110e-08  
    
    Coefficients:
                    Estimate Std. Error z value Pr(>|z|)
    (Intercept)       401.48  898581.15       0        1
    as.factor(v1)3    -96.51  326132.30       0        1
    v3                -46.93  106842.02       0        1
    

    While making the string "NA" to factor gives an output similar to the one in question:

    glm(formula = obese ~ as.factor(v2) + v3, family = binomial(link = "logit"), 
        data = df)
    
    Deviance Residuals: 
           Min          1Q      Median          3Q         Max  
    -1.402e-05  -2.110e-08  -2.110e-08   2.110e-08   1.472e-05  
    
    Coefficients:
                     Estimate Std. Error z value Pr(>|z|)
    (Intercept)        394.21  744490.08   0.001        1
    as.factor(v2)3     -95.33  340427.26   0.000        1
    as.factor(v2)NA   -327.07  613934.84  -0.001        1
    v3                 -45.99   84477.60  -0.001        1
    

    Try the following to replace NAs that are strings:

    gui$wgt9[ gui$wgt9 == "NA" ] <- NA
    

    Don't forget to accept any answer that solved your problem.