简体   繁体   中英

order.terms does not reorder terms in sjPlot's plot_model

I have code to graph a simple three-level one factor regression and I can't convince sjPlot to reorder the terms on the X-axis and I wondered if anyone could help me figure out what is going on.

My code:

m0 <- lmer(ans ~ type + (1|subject/target), data=behavioral_data)
summary(m0)

p1 <- plot_model(m0, 
                 type = "pred", 
                 terms = c("type"),
                 order.terms = c(2, 1),
                 auto.label = F,
                 title = "Model Estimates of Answer (Marginal Effects)",
                 axis.title = c("Target Type", "Answer")
)

The output the model summary produces:

Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: ans ~ type + (1 | subject/target)
   Data: behavioral_data

REML criterion at convergence: 15354

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.8944 -0.7136 -0.1561  0.6646  3.2381 

Random effects:
 Groups         Name        Variance Std.Dev.
 target:subject (Intercept) 0.1434   0.3787  
 subject        (Intercept) 0.3051   0.5524  
 Residual                   1.7003   1.3040  
Number of obs: 4447, groups:  target:subject, 444; subject, 37

Fixed effects:
             Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)   2.74088    0.10181  48.14515  26.922   <2e-16 ***
typeN        -0.03277    0.06509 404.96582  -0.503   0.6149    
typeY        -0.14263    0.06506 404.00056  -2.193   0.0289 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The graph I get:

在此处输入图像描述

I expected order.terms = c(2, 1) to reorder Y and N. What am I missing?

Since what plot_model() turned back is a ggplot-object, you could add other ggplot-related functions to post modify the plot. For example, try this:

p1 <- plot_model(m0, 
                 type = "pred", 
                 terms = c("type"),
                 order.terms = c(2, 1),
                 auto.label = F,
                 title = "Model Estimates of     Answer (Marginal Effects)",
                 axis.title = c("Target Type", "Answer")
) + scale_x_discrete(limits=c("S", "Y", "N"))

The limits=() argument in the discrete-series could accept a vector of characters to indicate the order of the x-axis.

Alternatively, you could apply a fct_relevel() function from the forcats package, which will order the factors in the same way for all future regressions. Applying this function to the original dataset before running the regression and the plot_model function solves this issue.

Example:

data2 <- data %>%
  mutate(name = fct_relevel(name, 
            "north", "north-east", "east", 
            "south-east", "south", "south-west", 
            "west", "north-west"))

Now, when you apply the data.table to regression and plot using plot_model, the factors will show up in the order above.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM