0

How can I plot with ggplot2 multiple boxplots (in the same figure) to illustrate my model's pairwise comparisons?

  • my model and pairwise comparisons with emmeans:
mod1 <- lmer(CONT_Y ~  MY_GROUP * YEAR + (1|ID), data = dfModels)

group <- emmeans(mod1,~ MY_GROUP|YEAR) 
year <- emmeans(mod1,~YEAR|MY_GROUP) 

my_pairs <- data.frame(group_p) %>% full_join(data.frame(year_p)) 

my_pairs
             contrast YEAR MY_GROUP estimate   SE df t.ratio p.value
1             L1 - L2 2020     <NA>    -0.91 0.53 60   -1.73    0.09
2             L1 - L2 2021     <NA>    -0.31 0.53 60   -0.59    0.56
3 YEAR2020 - YEAR2021 <NA>       G1    -1.14 0.53 60   -2.16    0.03
4 YEAR2020 - YEAR2021 <NA>       G2    -0.54 0.53 60   -1.02    0.31
  • Desired output: something like this

  • How can I plot these tests with multiple boxplots in ggplot2 ?

  • data (and more details on the model and on how I obtained the above effects here):

data <- structure(list(PARTICIPANTS = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                                        3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 
                                        7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 
                                        10L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 
                                        14L, 14L, 14L, 14L, 15L, 15L, 15L, 15L, 16L, 16L, 16L, 16L, 17L, 
                                        17L, 17L, 17L, 18L, 18L, 18L, 18L, 19L, 19L, 19L, 19L, 20L, 20L, 
                                        20L, 20L, 21L, 21L, 21L, 21L), CONT_Y = c(19.44, 20.07, 19.21, 
                                                                                  16.35, 11.37, 12.82, 19.42, 18.94, 19.59, 20.01, 19.7, 17.92, 
                                                                                  18.78, 19.21, 19.27, 18.46, 19.52, 20.02, 16.19, 19.97, 13.83, 
                                                                                  15.93, 14.79, 21.55, 18.8, 19.42, 19.27, 19.37, 17.14, 14.45, 
                                                                                  17.63, 20.01, 20.28, 17.93, 19.36, 20.15, 16.06, 17.04, 19.16, 
                                                                                  20.1, 16.44, 18.39, 18.01, 19.05, 18.04, 19.69, 19.61, 16.88, 
                                                                                  19.02, 20.42, 18.27, 18.43, 18.08, 17.1, 19.98, 19.43, 19.71, 
                                                                                  19.93, 20.11, 18.41, 20.31, 20.1, 20.38, 20.29, 13.6, 18.92, 
                                                                                  19.05, 19.13, 17.75, 19.15, 20.19, 18.3, 19.43, 19.8, 19.83, 
                                                                                  19.53, 16.14, 21.14, 17.37, 18.73, 16.51, 17.51, 17.06, 19.42
                                        ), CATEGORIES = structure(c(1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
                                                                    1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
                                                                    1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
                                                                    1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
                                                                    1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
                                                                    1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("A", 
                                                                                                                            "B"), class = "factor"), MY_GROUP = structure(c(1L, 2L, 1L, 2L, 
                                                                                                                                                                            1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
                                                                                                                                                                            1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
                                                                                                                                                                            1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
                                                                                                                                                                            1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
                                                                                                                                                                            1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L
                                                                                                                            ), .Label = c("G1", "G2"), class = "factor")), row.names = c(NA, 
                                                                                                                                                                                         -84L), class = c("tbl_df", "tbl", "data.frame"))
 


### rename column:

data <- data %>%  rename(., YEAR = CATEGORIES)
Larissa Cury
  • 806
  • 2
  • 11
  • It's hard to understand what you are really looking for, given that boxplots are constructed using whole datasets, not summary statistics such as EMMs. – Russ Lenth Feb 08 '23 at 04:05
  • oh! @RussLenth , I thought about that afterwards using ```predict``` https://stackoverflow.com/questions/75361717/geom-text-not-matching-group-aes?noredirect=1#comment132978615_75361717 would there an approach to plot them directly from ```emmeans``` using https://cran.r-project.org/web/packages/emmeans/vignettes/predictions.html ? – Larissa Cury Feb 09 '23 at 00:06
  • `emmeans()` only summarizes your fitted model, not the data. I just don't see how boxplots would come into play. As described in that vignette, you can plot prediction intervals, but those are not the same as boxplots. – Russ Lenth Feb 09 '23 at 19:08

0 Answers0