具有混合效应模型的估计边际均值:模型选择和结果解释

时间:2019-02-19 16:22:13

标签: r lme4 lsmeans emmeans

我首先写下我的问题,以便您可以随时解决它们:

  1. 以与我相同的方式选择具有p值和AIC的最佳模型是否正确?

  2. 我的模型中的自由度是否是一个问题,特别是对于具有交互作用(...~ treatment * level...)的模型?

  3. 为什么emmeans的结果(参见底部的cld.mixed_C表或图)表明,在水平$ up和level $ mid之间似乎没有明显差异stack$level之间有明显的区别(为什么cld.mixed_C中的CL这么大?)?如果我使用model_lmer_Clog10而不是model_lmer_Cinter,这些差异将由emmeans承担。这是因为不符合模型的假设吗?

  4. 有没有办法消除图中的负下限CL?

我想比较包含三个不同stack$treatment(上,中,下)的三个stack$level(W; C; F)中stack$continuous的差异。

stack <- structure(list(treatment = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L), .Label = c("W", "C", "F"), class = "factor"), 
    block = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
    1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L
    ), level = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 
    1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 1L, 2L, 2L, 2L, 
    3L, 3L, 3L), .Label = c("up", "mid", "low"), class = "factor"), 
    continuous = c(2.71097672953743, 3.65651341057938, 2.54600229936132, 
    63.2884147056461, 47.6120381265922, 35.7709752585528, 138.618364821712, 
    138.364742211133, 248.629954375939, 3.91496531831404, 4.14426270796186, 
    3.90287641449911, 51.619396872644, 56.2744358488691, 40.8303737226699, 
    174.673343321081, 185.181589166907, 260.523764718931, 4.03192255652607, 
    3.09513270445542, 2.45237238277809, 61.645621226552, 75.8775130347202, 
    47.1098329758748, 347.373110867901, 209.39376817372, 254.575864308321
    )), row.names = c(NA, -27L), class = "data.frame")

这里是boxplot(continuous~treatment+level,data=stack, xlab="treatment", ylab="continuous")

enter image description here

我将以下模型拟合到数据中。在这里,我有一个随机变量,其中包含treatment嵌套在block中(level嵌套在treatment中,未指定,但可以省略)。

首先,我通过将交互作用与没有交互作用的简单模型(也是log10sqrt转换)进行比较来检查交互作用是否是最佳模型,然后运行anova:< / p>

library(lme4)
# no interactions:
model_lmer_Cbase <- lmer((continuous) ~  treatment + level + 
                                 (1|block/treatment),data= stack, REML = FALSE)
#interactions:
model_lmer_Cinter <- lmer((continuous) ~  treatment * level + 
                                  (1|block/treatment),data= stack, REML = FALSE)


anova_models_compare <- anova(model_lmer_Cbase, model_lmer_Cinter)

anova_models_compare表:

                  Df      AIC      BIC    logLik deviance    Chisq Chi Df Pr(>Chisq)
model_lmer_Cbase   8 274.2591 284.6258 -129.1296 258.2591       NA     NA         NA
model_lmer_Cinter 12 271.6778 287.2279 -123.8389 247.6778 10.58129      4 0.03169548

最好的模型是model_lmer_Cbasemodel_lmer_Cinter的p值<.05,即使AIC低于model_lmer_Cbase,也意味着较低的解释力):

model_lmer_C <- lmer((continuous) ~  treatment + level + (1|block/treatment), 
                     data= stack, REML = TRUE)

然后我用估计的边际均值创建图:

library(multcompView)
library(emmeans)

lsm.mixed_C<-emmeans::emmeans(model_lmer_C,pairwise ~  treatment * level, type="response")

cld.mixed_C<-data.frame(CLD(lsm.mixed_C,alpha=0.05,Letters=letters,
                                adjust="tukey"))

cld.mixed_C表如下:

  treatment level   response       SE       df   lower.CL  upper.CL .group
1         W    up  10.176389 13.77472 14.28571 -34.590414  54.94319      a
2         W   mid  53.379809 13.77472 14.28571   8.613006  98.14661      a
3         W   low 276.898486 13.77472 14.28571 232.131682 321.66529      b
4         C    up   8.625707 13.77472 14.28571 -36.141097  53.39251      a
5         C   mid  51.829127 13.77472 14.28571   7.062323  96.59593      a
6         C   low 275.347804 13.77472 14.28571 230.581000 320.11461      b
7         F    up  -9.446419 13.77472 14.28571 -54.213222  35.32038      a
8         F   mid  33.757001 13.77472 14.28571 -11.009802  78.52380      a
9         F   low 257.275678 13.77472 14.28571 212.508875 302.04248      b

然后我运行一个(相当混乱,我道歉)代码,以显示上述treatmentlevel的成对比较:

trim <- function (x) gsub("^\\s+|\\s+$", "", x) 
cld.mixed_C$.group <- trim(cld.mixed_C$.group)
# I want to rename some variables:
library(dplyr)

## sort factors in a specific order:
cld.mixed_C$level = factor(cld.mixed_C$level ,levels=c("up", "mid", "low"))
cld.mixed_C$treatment = factor(cld.mixed_C$treatment,levels=c("W", "C", "F"))
# order table according to specific order:
cld.mixed_C <- cld.mixed_C[with(cld.mixed_C, order(treatment, level)), ]

library(ggplot2)
cld.mixed_C$treatment = factor(cld.mixed_C$treatment, 
                               levels=c("W", "C", "F")) ### Order the levels for printing
cld.mixed_C$level = factor(cld.mixed_C$level,levels=c("up", "mid", "low"))
cld.mixed_C<- with(cld.mixed_C, cld.mixed_C[order(treatment, level),])
rownames(cld.mixed_C) <- NULL 
pd = position_dodge(0.6)    ### How much to jitter the points on the plot
plot.mixed.lme<-ggplot(cld.mixed_C,aes(x = treatment,y=response, color= level,
                                       label=.group))+ 
        theme_bw()+
        geom_point(shape  = 15, size   = 4, position = pd) +
        geom_errorbar(aes(ymin  =  lower.CL,ymax  =  upper.CL),width =0.2,
                      size = 1, position = pd) +
        theme(axis.title   = element_text(face = "bold"),
              axis.text    = element_text(face = "bold"),
              plot.caption = element_text(hjust = 0)) +
        #following lines adds legend inside the boxplot. 
        theme(legend.justification=c(1,0), legend.position=c(0.1,0.7),
              legend.direction="vertical",
              legend.box="vertical",
              legend.box.just = c("top"), 
              legend.background = element_rect(fill=alpha('white', 0.4)))+
        theme(plot.title = element_blank(), axis.title.x = element_blank()) +
        #remove grid lines (I only remove managem):
        theme(panel.grid.major.x = element_blank() ,
              panel.grid.major.y = element_blank(), 
              panel.grid.minor.x = element_blank(),
              panel.grid.minor.y = element_blank()) +
        ylab("Estimated marginal mean\ncontinuous") +
        theme(axis.text = element_text(size = 15)) +labs(hjust=0.5) +
        geom_text(nudge_x = c(-0.3, 0, 0.3, -0.3, 0, 0.3,-0.3, 0, 0.3),
                  nudge_y = c(40, 40, 40, 40, 40, 40, 40, 40, 40),
                  color   = "black", size= 6) +
        scale_color_manual(values = c("#333333", "#669966", "slategray3"))

plot.mixed.lme

非常感谢。

enter image description here

0 个答案:

没有答案