我首先写下我的问题,以便您可以随时解决它们:
以与我相同的方式选择具有p值和AIC的最佳模型是否正确?
我的模型中的自由度是否是一个问题,特别是对于具有交互作用(...~ treatment * level...
)的模型?
为什么emmeans
的结果(参见底部的cld.mixed_C
表或图)表明,在水平$ up和level $ mid之间似乎没有明显差异stack$level
之间有明显的区别(为什么cld.mixed_C
中的CL这么大?)?如果我使用model_lmer_Clog10
而不是model_lmer_Cinter
,这些差异将由emmeans
承担。这是因为不符合模型的假设吗?
有没有办法消除图中的负下限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")
:
我将以下模型拟合到数据中。在这里,我有一个随机变量,其中包含treatment
嵌套在block
中(level
嵌套在treatment
中,未指定,但可以省略)。
首先,我通过将交互作用与没有交互作用的简单模型(也是log10
和sqrt
转换)进行比较来检查交互作用是否是最佳模型,然后运行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_Cbase
(model_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
然后我运行一个(相当混乱,我道歉)代码,以显示上述treatment
和level
的成对比较:
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
非常感谢。