4

我有一个广义的混合效应模型,如下所示:

d <- data.frame(
    g = sample(c("A","B","C","D","E"), 250, replace=TRUE),
    x = runif(250, max=100),
    y = sample(c(0,1), 250, replace=TRUE)
)

require(lme4)

fm <- lmer(y ~ x + (1 + x | g), data=d, family=binomial)

我想使用dotplot但不绘制 x 的随机斜率分量来绘制截距的随机效应。我的问题是我似乎无法弄清楚如何只访问截距组件而不是随机斜率。

例如,我想要的是这个情节的左侧:

dotplot(ranef(fm, postVar=TRUE))

在此处输入图像描述

使用dotplot(ranef(fm, postVar=TRUE)$g[,2])并没有给我我想要的东西,即使我认为它应该!我看过str(fm),但没有看到任何帮助我更接近的东西。

任何帮助和提示将不胜感激!

4

4 回答 4

3

你几乎在你的原始代码中:

dotplot(ranef(fm, postVar=TRUE))$g[1]

释放每个图的比例的附加提示:

dotplot(ranef(fm, postVar=TRUE),
        scales = list(x =list(relation = 'free')))
于 2012-10-03T20:12:51.730 回答
2

您只需要更加聪明地删除另一列随机效应:

re <- ranef(fm,postVar = TRUE)
re$g$x <- NULL
dotplot(re)

您的其他方法不起作用的原因是dotplot被调度的方法仍然希望其输入看起来像一个元素列表,就像它来自ranef. 因此,您只需要进入并移除那个有问题的列,但保持结构的其余部分不变。

于 2012-06-20T16:19:38.597 回答
2

你看的不是正确的 str() 。

re <- ranef(fm, postVar = TRUE)
str(re)

这向您显示了一个列表,其中第一项是包含您想要的数据框的数据框。我只是从中删除 $x 列。

re[[1]]$x <- NULL
于 2012-06-20T16:20:18.417 回答
2

这应该让你非常接近。我一直想添加对lme4对象的支持,coefplot所以这可能是我的催化剂。

theRan <- ranef(fm, postVar=TRUE)
pv <- attr(theRan$g, "postVar")
se <- pv[1, 1, ]
theIntercepts <- theRan$g[, 1, drop=F]
theFrame <- cbind(theIntercepts, se)
names(theFrame)[1] <- "Intercept"
theFrame$Low <- with(theFrame, Intercept - 2 * se)
theFrame$High <- with(theFrame, Intercept + 2 * se)
theFrame$Variable <- rownames(theFrame)
ggplot(theFrame, aes(y=Intercept, x=reorder(Variable, Intercept))) + geom_linerange(aes(ymin=Low, ymax=High), colour="black") + geom_point(, colour="blue") + coord_flip() + labs(y="Intercept", x=NULL)
于 2012-06-20T18:58:51.370 回答