biostats_charlene
biostats_charlene

Reputation: 27

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()

Upvotes: 0

Views: 83

Answers (2)

Joseph Larmarange
Joseph Larmarange

Reputation: 116

tbl_regression() relies on broom.helpers package for preparing and improving the tibble returned by tidy(). You can use broom.helpers::tidy_plus_plus() to see the different enhancements made by broom.helpers.

The bug you mentioned has been identified and fixed in the current dev version of broom.helpers. Cf. https://github.com/larmarange/broom.helpers/issues/116

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) 

library(tidyverse)
library(broom.mixed)

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(exponentiate = TRUE, intercept = TRUE) %>%
  knitr::kable()
term original_term variable var_label var_class var_type var_nlevels contrasts contrasts_type reference_row label n_obs n_event effect group estimate std.error statistic p.value conf.low conf.high
(Intercept) (Intercept) (Intercept) (Intercept) NA intercept NA NA NA NA (Intercept) 270 264 fixed NA 2.056839e+04 5.618032e+04 3.6360619 0.0002768 97.3273899 4.346757e+06
predictor91 Days After NA predictor predictor factor dichotomous 2 contr.treatment treatment TRUE 91 Days After 137 134 NA NA 1.000000e+00 NA NA NA NA NA
predictor91 Days Before predictor91 Days Before predictor predictor factor dichotomous 2 contr.treatment treatment FALSE 91 Days Before 133 130 fixed NA 6.825077e-01 7.266704e-01 -0.3587669 0.7197695 0.0846892 5.500312e+00
id.sd__(Intercept) id.sd__(Intercept) id.sd__(Intercept) id.sd__(Intercept) NA ran_pars NA NA NA NA id.sd__(Intercept) NA NA ran_pars id 8.898623e+00 NA NA NA NA NA

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

Upvotes: 1

Ben Bolker
Ben Bolker

Reputation: 226597

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 ...)

Upvotes: 3

Related Questions