larmarange / broom.helpers

A set of functions to facilitate manipulation of tibbles produced by broom
https://larmarange.github.io/broom.helpers/
GNU General Public License v3.0
21 stars 8 forks source link

Failing for `lme4::glmer()` models with factor outcome? #116

Closed ddsjoberg closed 3 years ago

ddsjoberg commented 3 years ago

hey hey! I hope you've been well!

I user posted an issue to stack overflow today while using a glmer() model with a factor outcome. Sorry for the long example code (just taking it from the post). It looks like something goes wrong in the calculation of N? https://stackoverflow.com/questions/68105501/

library(magrittr)

outcome <- c(1,1,1,1,1,1,1,1,1,1,1,NA,1,1,1,1,1,1,1,1,1,1,1,1,1,NA,NA,1,1,1,1,1,1,1,1,1,1,1,1,1,0,NA,1,1,1,1,1,1,NA,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,NA,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,NA,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,NA,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,NA,1,1,1,1,1,1,NA,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,NA,1,1,0,1,1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,NA,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,NA,1,1,1,NA ,1,1,1,1,1,1,1,1,1,NA,1,NA,NA,1,1,1,NA,0,1,1,1,1,NA,1,1,1,1,1,1,1,1,1,1,1,1)

predictor  <- c("91 Days Before", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days Before",
                "91 Days After", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days After", "91 Days Before", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days Before",
                "91 Days After", "91 Days After", "91 Days Before", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days Before", "91 Days Before", "91 Days After",  "91 Days Before",  "91 Days Before",
                "91 Days After", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days After  ", "91 Days After",
                "91 Days Before", "91 Days Before", "91 Days After", "91 Days Before",  "91 Days Before",  "91 Days After",
                "91 Days After", "91 Days After", "91 Days Before", "91 Days Before",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days Before",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days Before",  "91 Days After",
                "91 Days Before", "91 Days Before", "91 Days Before", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days Before", "91 Days After", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days After",
                "91 Days After", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days After", "91 Days After", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days After", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days After",
                "91 Days Before", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days After", "91 Days After", "91 Days Before",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days After", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days After",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days Before", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days Before",
                "91 Days After", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days After", "91 Days Before", "91 Days After",  "91 Days After  ", "91 Days Before",
                "91 Days Before", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days Before", "91 Days After", "91 Days After",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days After", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days Before", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days Before", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days After",
                "91 Days After", "91 Days After", "91 Days After", "91 Days Before",  "91 Days Before",  "91 Days After",
                "91 Days After", "91 Days After", "91 Days After", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days Before",
                "91 Days After", "91 Days After", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days After",
                "91 Days After", "91 Days After", "91 Days Before", "91 Days Before",  "91 Days Before",  "91 Days Before",
                "91 Days Before", "91 Days After", "91 Days Before", "91 Days Before",  "91 Days After  ", "91 Days Before",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days After", "91 Days After", "91 Days After", "91 Days After",  "91 Days After  ", "91 Days After",
                "91 Days Before")

id <- c(46, 109, 82, 98, 98, 104,  98,  82,  27,  27,  25, 104,  44,  77, 102,44, 25, 104,  82,  66,  25,  66,  66,  66,  66, 111,  25, 111, 111,  46, 111, 46, 25, 25, 32,  25, 25, 25, 46,  25,  46,  25, 111,  32, 104, 111,  32, 111, 109,51, 32,  36,   4, 104,  32,  44,  34,  34,  19, 102,  65,  65,  65,  66,  66, 66, 66, 66, 66,  66, 66, 66, 66,  66,  66,  66,  66,  43,  43,  43,  43,  43,  43,43, 68,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49, 49, 49, 49, 49,  49, 49, 49, 49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,49, 49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49,  49, 49, 49, 49, 49,  49, 49, 53, 53,  53,  53,  53,  53,  53,  53,  53,  53,  53,  53,53, 53,  97,  97,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84,  84, 84, 84, 84, 84,  84, 84, 84, 84,  84,  84,  84,  84,  84,  84,  29,  29,  29,  29,29, 29,  29,  13,  13,  13,  13,  13,  13,  13,  13,  13,  34,  34,  34,  24, 24, 24, 24, 24,  32, 32, 32, 32,  32,  76,  17,  17,  14,  14,  93,  85,  85,   6, 6,  6,   6,   6,   6,   6,   6,   6,   6,   6,  28,  28,  28,  28,  28,  28, 28, 28, 28, 28,  88, 88, 88, 88,  88,  88,  51,  51,  51,  51,  51,  51,  51,  92,92, 92,  45,  45,  45,  90,  90,  90,  90,  90,  58,  58,  58,  58,  58,  58, 58, 58, 83, 4,   4, 39, 81, 94,  64,  64,  64,  64,  64,  64,  64,  64,  64,  64,64, 64) 

ex_data <- 
  cbind(id, predictor, outcome) %>% 
  as.data.frame() %>% 
  dplyr::mutate(id = factor(id), 
         predictor = factor(predictor), 
         outcome = factor(outcome))

lme4::glmer(outcome ~ predictor + (1|id), 
            data = ex_data, 
            family = binomial) %>% 
  broom.helpers::tidy_plus_plus(tidy_fun = broom.mixed::tidy)
#> Warning in Ops.factor(tcm, y): '*' not meaningful for factors
#> Error in colSums(tcm * y * w): 'x' must be an array of at least two dimensions

Created on 2021-06-23 by the reprex package (v2.0.0)

larmarange commented 3 years ago

I will look at it tomorrow

larmarange commented 3 years ago

OK just another case illustrating how different models are not consistent.

In that situation, model_get_response() returns a factor and not a numeric vector. Should be fixed by https://github.com/larmarange/broom.helpers/commit/5f03c06098b4420def6cfe1dfe5f50cb8122c6e2

Just wait for few minutes to be sure the commit passes all tests

ddsjoberg commented 3 years ago

wow, you're so fast!

larmarange commented 3 years ago

My pleasure. Not always the case but in that case it was a small fix 😉

Thanks for you continuous reporting