Search code examples
rlme4gtsummary

R, Getting the error message 'x' must be an array of at least two dimensions when using tbl_regression with glmer


I am getting the error message Error in colSums(tcm * y * w) : 'x' must be an array of at least two dimensions when I run the code below:

glmer(outcome ~ predictor + (1|id), 
      data = df, 
      family = binomial) %>% 
  tbl_regression()

For context, I am looking to see whether the outcome (Patient satisfaction of encounter, 1 = Satisfied, 0 = Not-Satisfied) changes based on whether the physician completes a workshop. The reason why GLMER is used instead of GLM is because there are multiple patients for each physician. Therefore, it is a repeated measurement.

To reproduce error message:

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() %>% 
  mutate(id = factor(id), 
         predictor = factor(predictor), 
         outcome = factor(outcome))

glmer(outcome ~ predictor + (1|id), 
      data = ex_data, 
      family = binomial) %>% 
  tbl_regression()

Solution

  • tl;dr gtsummary() doesn't know to handle responses that are factors (base-R, and by extension glmer, is almost pathologically flexible about the ways in which it will accept the response values for a binomial-type regression, but you're generally better off using a numeric value).

    It would be a public service to post an issue at the gtsummary issues list.

    Avoid cbind(), because that will automatically coerce all vectors to the same type.

    library(tidyverse)
    library(gtsummary)
    
    ex_data <- tibble(id, predictor, outcome) %>% 
      mutate(across(c(id, predictor), factor)
    g1 <- glmer(outcome ~ predictor + (1|id), 
          data = ex_data, 
          family = binomial)
    tbl_regression(g1)
    

    It probably makes sense to save the glmer fit rather than piping it directly to tbl_regression() because you might want to do other things with it (diagnostic plots, coefficient/dot-whisker plots, predictions, model comparison ...)