lmer 随机截距和斜率的自定义图
custom plot of lmer random intercepts and slopes
我想想办法修改solution provided by Didzis Elferts in response to this post。
我有一个具有随机截距和随机斜率的模型,而在最初的问题中是关于一个只有随机截距的模型。我无法弄清楚如何根据随机截距 和 斜率的答案修改代码。
我没有使用 dotplot()
或 sjPlot
自动完成所有这些操作的原因是我想构建一个更加自定义的绘图,以更有条理的方式绘制随机截距和斜率,在反映随机组所属的固定效应组的方面下。我认为能够做到这一点的唯一方法是提取随机斜率、截距及其方差,并将我的固定效应类别作为数据框中的其他列。因此,或者如果有人有一种简单的方法来自定义点图或其他类型的图以按固定效果类别排序,我洗耳恭听!
我调整了可重现的代码以表明我的意思:
向Dyestuff
数据集添加一些变量,将用作随机斜率变量
library("lme4")
Dyestuff$variable <- rep(c("X","Y"), each = 15)
运行 随机截距和随机斜率模型(而不只是随机截距模型)
fit1 <- lmer(Yield ~ variable + (variable|Batch), Dyestuff)
其余代码与前面的 post 相同,除了我使用 condVar=TRUE 之外,因为 postVar 自从提出原始问题以来已经贬值;但请注意,该属性仍需要命名为 postVar
randoms<-ranef(fit1, condVar = TRUE)
qq <- attr(ranef(fit1, condVar = TRUE)[[1]], "postVar")
str(qq)
rand.interc<-randoms$Batch
df<-data.frame(Intercepts=randoms$Batch[,1],
sd.interc=2*sqrt(qq[,,1:length(qq)]),
lev.names=rownames(rand.interc))
在qq中随机截距和斜率,sd.interc不起作用。我收到此消息:
Error in qq[, , 1:length(qq)] : subscript out of bounds
我已经试过了,但似乎做不好。
我想如果你想要截距的条件模式的标准差,你应该使用 sqrt(qq[1,1,])
;这会提取 conditional-variance 数组的每个“切片”的 (1,1) 元素。
df <- data.frame(Intercepts=randoms$Batch[,1],
sd.interc=2*sqrt(qq[1,1,]),
lev.names=rownames(rand.interc))
(我不确定你为什么将这些值加倍,我想这是将它们用作置信度条的 half-widths 的初步?)
不过,现在有更容易使用的工具。
broom.mixed::tidy(fit1, "ran_vals", conf.int = TRUE)
给予
# A tibble: 12 × 8
effect group level term estimate std.error conf.low conf.high
<chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 ran_vals Batch A (Intercept) -12.2 14.8 -41.2 16.8
2 ran_vals Batch B (Intercept) -1.93 14.8 -30.9 27.0
3 ran_vals Batch C (Intercept) 14.1 14.8 -14.9 43.1
...
或as.data.frame(ranef(fit1))
(这甚至内置于lme4
)
我想想办法修改solution provided by Didzis Elferts in response to this post。
我有一个具有随机截距和随机斜率的模型,而在最初的问题中是关于一个只有随机截距的模型。我无法弄清楚如何根据随机截距 和 斜率的答案修改代码。
我没有使用 dotplot()
或 sjPlot
自动完成所有这些操作的原因是我想构建一个更加自定义的绘图,以更有条理的方式绘制随机截距和斜率,在反映随机组所属的固定效应组的方面下。我认为能够做到这一点的唯一方法是提取随机斜率、截距及其方差,并将我的固定效应类别作为数据框中的其他列。因此,或者如果有人有一种简单的方法来自定义点图或其他类型的图以按固定效果类别排序,我洗耳恭听!
我调整了可重现的代码以表明我的意思:
向Dyestuff
数据集添加一些变量,将用作随机斜率变量
library("lme4")
Dyestuff$variable <- rep(c("X","Y"), each = 15)
运行 随机截距和随机斜率模型(而不只是随机截距模型)
fit1 <- lmer(Yield ~ variable + (variable|Batch), Dyestuff)
其余代码与前面的 post 相同,除了我使用 condVar=TRUE 之外,因为 postVar 自从提出原始问题以来已经贬值;但请注意,该属性仍需要命名为 postVar
randoms<-ranef(fit1, condVar = TRUE)
qq <- attr(ranef(fit1, condVar = TRUE)[[1]], "postVar")
str(qq)
rand.interc<-randoms$Batch
df<-data.frame(Intercepts=randoms$Batch[,1],
sd.interc=2*sqrt(qq[,,1:length(qq)]),
lev.names=rownames(rand.interc))
在qq中随机截距和斜率,sd.interc不起作用。我收到此消息:
Error in qq[, , 1:length(qq)] : subscript out of bounds
我已经试过了,但似乎做不好。
我想如果你想要截距的条件模式的标准差,你应该使用 sqrt(qq[1,1,])
;这会提取 conditional-variance 数组的每个“切片”的 (1,1) 元素。
df <- data.frame(Intercepts=randoms$Batch[,1],
sd.interc=2*sqrt(qq[1,1,]),
lev.names=rownames(rand.interc))
(我不确定你为什么将这些值加倍,我想这是将它们用作置信度条的 half-widths 的初步?)
不过,现在有更容易使用的工具。
broom.mixed::tidy(fit1, "ran_vals", conf.int = TRUE)
给予
# A tibble: 12 × 8
effect group level term estimate std.error conf.low conf.high
<chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 ran_vals Batch A (Intercept) -12.2 14.8 -41.2 16.8
2 ran_vals Batch B (Intercept) -1.93 14.8 -30.9 27.0
3 ran_vals Batch C (Intercept) 14.1 14.8 -14.9 43.1
...
或as.data.frame(ranef(fit1))
(这甚至内置于lme4
)