使用qqmath或dotplot绘制来自lmer(lme4软件包)的随机效果:如何使其看起来精美? [英] Plot random effects from lmer (lme4 package) using qqmath or dotplot: How to make it look fancy?

查看:317
本文介绍了使用qqmath或dotplot绘制来自lmer(lme4软件包)的随机效果:如何使其看起来精美?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用lmer软件包的输出,qqmath函数可以很好地绘制出各种随机效果的毛毛虫图.也就是说,qqmath擅长绘制层次模型的截距,误差在点估计值附近.以下是lmer和qqmath函数的示例,该示例使用lme4程序包中称为Dyestuff的内置数据.该代码将使用ggmath函数生成分层模型和漂亮的图.

The qqmath function makes great caterpillar plots of random effects using the output from the lmer package. That is, qqmath is great at plotting the intercepts from a hierarchical model with their errors around the point estimate. An example of the lmer and qqmath functions are below using the built-in data in the lme4 package called Dyestuff. The code will produce the hierarchical model and a nice plot using the ggmath function.

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组合也可以从中受益:

The last line of code produces a really nice plot of each intercept with the error around each estimate. But formatting the qqmath function seems to be very difficult, and I've been struggling to format the plot. I've come up with a few questions that I cannot answer, and that I think others could also benefit from if they are using the lmer/qqmath combination:

  1. 有没有办法采用上面的qqmath函数并添加一些 选项,例如将某些点设置为空白或填充为空白,或 不同点的颜色不同?例如,您可以将Batch变量的A,B和C点填充为空白,然后将其余的点填充为空白吗?
  2. 是否可以为每个点添加轴标签(也许沿着 例如,y轴的顶部或右侧)?
  3. 我的数据具有接近45个截距,因此可以添加 标签之间的间距,以便它们不会彼此碰到? 主要是,我有兴趣区分/标记 图,在ggmath函数中似乎很麻烦/不可能.
  1. Is there a way to take the qqmath function above and add a few options, such as, making certain points empty vs. filled-in, or different colors for different points? For example, can you make the points for A,B, and C of the Batch variable filled, but then the rest of the points empty?
  2. Is it possible to add axis labels for each point (maybe along the top or right y axis, for example)?
  3. My data has closer to 45 intercepts, so it is possible to add spacing between the labels so they do not run into each other? MAINLY, I am interested in distinguishing/labeling between points on the graph, which seems to be cumbersome/impossible in the ggmath function.

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

So far, adding any additional option in the qqmath function produce errors where I would not get errors if it was a standard plot, so I'm at a loss.

此外,如果您觉得有更好的程序包/功能可以绘制来自lmer输出的截距,我想听听! (例如,您可以使用点图来做1-3点吗?)

Also, if you feel there is a better package/function for plotting intercepts from lmer output, I'd love to hear it! (for example, can you do points 1-3 using dotplot?)

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

I'm also open to an alternative dotplot if it can be reasonably formatted. I just like the look of a ggmath plot, so I'm starting with a question about that.

推荐答案

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

One possibility is to use library ggplot2 to draw similar graph and then you can adjust appearance of your plot.

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

First, ranef object is saved as randoms. Then variances of intercepts are saved in object qq.

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

对象rand.interc仅包含具有级别名称的随机截距.

Object rand.interc contains just random intercepts with level names.

rand.interc<-randoms$Batch

所有对象都放在一个数据框中.对于误差间隔,sd.interc计算为方差的平方根的2倍.

All objects put in one data frame. For error intervals sd.interc is calculated as 2 times square root of variance.

df<-data.frame(Intercepts=randoms$Batch[,1],
              sd.interc=2*sqrt(qq[,,1:length(qq)]),
              lev.names=rownames(rand.interc))

如果需要根据值在情节中对截距进行排序,则应重新对lev.names进行排序.如果应按级别名称对拦截进行排序,则可以跳过此行.

If you need that intercepts are ordered in plot according to value then lev.names should be reordered. This line can be skipped if intercepts should be ordered by level names.

df$lev.names<-factor(df$lev.names,levels=df$lev.names[order(df$Intercepts)])

此代码生成图.现在,点将根据因子水平而shape有所不同.

This code produces plot. Now points will differ by shape according to factor levels.

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)

这篇关于使用qqmath或dotplot绘制来自lmer(lme4软件包)的随机效果:如何使其看起来精美?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆