qqmath函数使用lmer软件包的输出产生很好的随机效应图 . 也就是说,qqmath非常适合绘制层次模型中的截距及其在点估计周围的误差 . 下面使用名为Dyestuff的lme4包中的内置数据,给出了lmer和qqmath函数的一个示例 . 代码将使用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输出的拦截,我很乐意听到它! (例如,你能用dotplot做点1-3吗?)
谢谢 .
编辑:如果可以合理格式化,我也可以使用替代的dotplot . 我只是喜欢ggmath情节的外观,所以我开始提出一个问题 .
3 回答
一种可能性是使用库
ggplot2
绘制类似的图形,然后您可以调整绘图的外观 .首先,
ranef
对象保存为randoms
. 然后截距的方差保存在对象qq
中 .对象
rand.interc
只包含具有级别名称的随机截取 .所有对象都放在一个数据框中 . 对于错误间隔
sd.interc
计算为2倍平方根方差 .如果您需要根据值在图中订购拦截,则应重新排序
lev.names
. 如果拦截应按级别名称排序,则可以跳过此行 .此代码生成绘图 . 根据因子水平,现在点数将根据
shape
而不同 .Didzis的回答很棒!只是将它包装一点,我把它放入它自己的功能,其行为很像
qqmath.ranef.mer()
和dotplot.ranef.mer()
. 除了Didzis的答案,它还处理具有多个相关随机效应的模型(如qqmath()
和dotplot()
) . 与qqmath()
的比较:与
dotplot()
的比较:有时,为随机效应设置不同的比例可能是有用的 - 这是
dotplot()
强制执行的 . 当我试图放松这个时,我不得不改变刻面(见这个answer) .另一种方法是从每个随机效应的分布中提取模拟值并绘制这些值 . 使用
merTools
包,可以轻松地从lmer
或glmer
对象获取模拟,并绘制它们 .randoms
现在是一个对象,看起来像:它提供了分组因子的名称,我们获得估计的因子的级别,模型中的术语以及模拟值的均值,中值和标准差 . 我们可以使用它来生成类似于上面的毛虫图:
哪个产生:
一个很好的特性是具有不重叠零的置信区间的值以黑色突出显示 . 您可以使用
level
参数来修改间隔的宽度,以根据您的需要制作更宽或更窄的置信区间 .