两个随机效应的点图合并在同一张图里

4
如果我使用两个随机效应创建一个简单的混合效应模型:
library(lme4)
(fm3 <- lmer(strength ~ 1 + (1 | batch) + (1 | sample), Pastes))

我可以这样访问随机效果:
ranef(fm3)
ranef(fm3)$batch
ranef(fm3)$sample

我无法将随机效应绘制在两个分开的点图中。以下代码可以绘制两个图,但我无法重新编码它以便可以单独绘制每个图:

dotplot(ranef(fm3, postVar=TRUE))

以下内容在我看来很合理,但是并不正确。
dotplot(ranef(fm3, postVar=TRUE)$batch)

感谢您提供的所有帮助,
HTML 标签已保留。

你在使用哪个包?我在基础R中找不到“dotplot”函数。 - juba
抱歉,这是lattice的一部分,会随着lme4自动加载。 - thijs van den bergh
3个回答

2
下面的代码可以解决问题:
print((dotplot(ranef(fm3, postVar=TRUE))$sample), position=c(0, .5, 1, 1), more=TRUE)
print((dotplot(ranef(fm3, postVar=TRUE))$batch), position=c(0, 0, 1, .5)

这源于一个认识,即只需要绘制两个随机效应中的其中一个的预测区间即可:

(dotplot(ranef(fm3, postVar=TRUE))$sample)

并且

(dotplot(ranef(fm3, postVar=TRUE))$batch)

我之前提出的方法是错误的(dotplot(ranef(fm3,postVar = TRUE)$batch)),尽管它确实会产生一些东西。 @juba:感谢您指向lattice。我发现的组合图解决方案更加简洁...

2
你遇到的问题是ranef()将分析结果存储为列表而非数据框。你试图像访问数据框一样访问此列表,所以它无法工作。诀窍是使用双方括号与dotplot一起访问列表。然后,你可以使用grid.arrange快速组合你的绘图(或者你可以使用@juba的解决方案)。
library(lme4)
fm3 <- lmer(strength ~ 1 + (1 | batch) + (1 | sample), Pastes)
d1 <- ranef(fm3, postVar=TRUE)
#double square bracket access the lists in d1
a <- dotplot(d1)[["batch"]]
b <- dotplot(d1)[["sample"]]
#grid.arrange combines your plots
library(gridExtra)
grid.arrange(a,b, nrow=1) 

enter image description here


谢谢!我认为我们两个的答案都提供了正确但略有不同的解决问题的方法。 - thijs van den bergh

0

dotplotlattice 包的一部分,因此您必须使用 grid.layoutviewports 来在一个图表上显示多个绘图。

以下是一种将两个点图并排显示的方法,但由于我对 lattice 还比较新,肯定有更好、更清晰的方法来实现:

grid.newpage()
pushViewport(viewport(0.25,0.5,.5,1))
print(dotplot(rnorm(100)),newpage=FALSE)
upViewport()
pushViewport(viewport(.75,.5,.5,1))
print(dotplot(runif(100)),newpage=FALSE)

这会给出:

enter image description here


1
此解决方案通过引入一些随机数来绘制图形,从而避免了一些问题。请参见以下解决方案。 - thijs van den bergh
@agstudy,正如我所说,我对lattice几乎完全是新手,所以感谢您指出我的近似值... - juba
这里涉及到grid包的问题...例如,接受的解决方案通过grid.extra包中的grid.layout包装器来使用它。 - agstudy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接