使用来自lmer软件包的输出,qqmath函数可以绘制出巨大的随机效果履带图。也就是说,qqmath擅长绘制层次模型的截距,误差在点估计值附近。以下是lmer和qqmath函数的一个示例,该示例使用lme4软件包中称为Dyestuff的内置数据。该代码将使用ggmath函数生成层次模型和漂亮的图。

library("lme4")
data(package = "lme4")

# Dyestuff
# a balanced one-way classiï¬cation of Yield
# from samples produced from six Batches

summary(Dyestuff)

# Batch is an example of a random effect
# Fit 1-way random effects linear model
fit1 <- lmer(Yield ~ 1 + (1|Batch), Dyestuff)
summary(fit1)
coef(fit1) #intercept for each level in Batch

# qqplot of the random effects with their variances
qqmath(ranef(fit1, postVar = TRUE), strip = FALSE)$Batch

代码的最后一行生成了每个截距的漂亮图,每个估计值周围都有误差。但是格式化qqmath函数似乎非常困难,而且我一直在努力格式化绘图。我提出了一些我无法回答的问题,我认为如果其他人使用lmer / qqmath组合也可以从中受益:
  • 是否可以采用上面的qqmath函数并添加一些
    选项,例如将某些点设为空白或填充为空白,或
    不同点的颜色不同?例如,您可以将Batch变量的A,B和C点填充为空白,然后将其余的点填充为空白吗?
  • 是否可以为每个点添加轴标签(也许沿着
    例如,y轴的顶部或右侧)?
  • 我的数据接近45个拦截点,因此可以添加
    标签之间的间距,以便它们不会彼此碰到?
    主要是,我有兴趣区分/标记
    图,在ggmath函数中似乎很麻烦/不可能。

  • 到目前为止,在qqmath函数中添加任何其他选项都会产生错误,如果它是标准绘图,我将不会得到错误,所以我很茫然。

    另外,如果您觉得有一个更好的软件包/函数可以绘制来自lmer输出的截距,我希望听到它! (例如,您可以使用点图进行1-3点吗?)

    编辑:如果可以合理设置格式,我也可以选择替代的点图。我只喜欢ggmath图的外观,所以我从一个问题开始。

    最佳答案

    一种可能性是使用库ggplot2绘制类似的图形,然后可以调整图的外观。

    首先,将ranef对象另存为randoms。然后,截距的差异将保存在对象qq中。

    randoms<-ranef(fit1, postVar = TRUE)
    qq <- attr(ranef(fit1, postVar = TRUE)[[1]], "postVar")
    

    对象rand.interc仅包含带有级别名称的随机拦截。
    rand.interc<-randoms$Batch
    

    所有对象都放在一个数据框中。对于误差间隔,sd.interc计算为方差的平方根的2倍。
    df<-data.frame(Intercepts=randoms$Batch[,1],
                  sd.interc=2*sqrt(qq[,,1:length(qq)]),
                  lev.names=rownames(rand.interc))
    

    如果需要根据值在情节中对截距进行排序,则应重新排序lev.names。如果应按级别名称对拦截进行排序,则可以跳过此行。
    df$lev.names<-factor(df$lev.names,levels=df$lev.names[order(df$Intercepts)])
    

    这段代码产生了情节。现在,根据因子水平,点将因shape而不同。
    library(ggplot2)
    p <- ggplot(df,aes(lev.names,Intercepts,shape=lev.names))
    
    #Added horizontal line at y=0, error bars to points and points with size two
    p <- p + geom_hline(yintercept=0) +geom_errorbar(aes(ymin=Intercepts-sd.interc, ymax=Intercepts+sd.interc), width=0,color="black") + geom_point(aes(size=2))
    
    #Removed legends and with scale_shape_manual point shapes set to 1 and 16
    p <- p + guides(size=FALSE,shape=FALSE) + scale_shape_manual(values=c(1,1,1,16,16,16))
    
    #Changed appearance of plot (black and white theme) and x and y axis labels
    p <- p + theme_bw() + xlab("Levels") + ylab("")
    
    #Final adjustments of plot
    p <- p + theme(axis.text.x=element_text(size=rel(1.2)),
                   axis.title.x=element_text(size=rel(1.3)),
                   axis.text.y=element_text(size=rel(1.2)),
                   panel.grid.minor=element_blank(),
                   panel.grid.major.x=element_blank())
    
    #To put levels on y axis you just need to use coord_flip()
    p <- p+ coord_flip()
    print(p)
    

    关于r - 使用qqmath或dotplot绘制来自lmer(lme4软件包)的随机效果:如何使其看起来精美?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13847936/

    10-08 22:08