如何从混合效果 Tidymodels 中提取随机截距
How to extract random intercepts from mixed effects Tidymodels
我正在尝试使用 lme4
和 multilevelmod
从 tidymodels 中提取 随机截距 。我可以使用下面的 lme4 来做到这一点:
使用 R 和 lme4:
library("tidyverse")
library("lme4")
# set up model
mod <- lmer(Reaction ~ Days + (1|Subject),data=sleepstudy)
# create expanded df
expanded_df <- with(sleepstudy,
data.frame(
expand.grid(Subject=levels(Subject),
Days=seq(min(Days),max(Days),length=51))))
# create predicted df with **random intercepts**
predicted_df <- data.frame(expanded_df,resp=predict(mod,newdata=expanded_df))
predicted_df
# plot intercepts
ggplot(predicted_df,aes(x=Days,y=resp,colour=Subject))+
geom_line()
使用整洁模型:
# example from
# https://github.com/tidymodels/multilevelmod
library("multilevelmod")
library("tidymodels")
library("tidyverse")
library("lme4")
#> Loading required package: parsnip
data(sleepstudy, package = "lme4")
# set engine to lme4
mixed_model_spec <- linear_reg() %>% set_engine("lmer")
# create model
mixed_model_fit_tidy <-
mixed_model_spec %>%
fit(Reaction ~ Days + (1 | Subject), data = sleepstudy)
expanded_df_tidy <- with(sleepstudy,
data.frame(
expand.grid(Subject=levels(Subject),
Days=seq(min(Days),max(Days),length=51))))
predicted_df_tidy <- data.frame(expanded_df_tidy,resp=predict(mixed_model_fit_tidy,new_data=expanded_df_tidy))
ggplot(predicted_df_tidy,aes(x=Days,y=.pred,colour=Subject))+
geom_line()
使用 predict()
函数似乎只能给出固定效应预测。
有没有办法从 tidymodels 和 multilevelmod 中提取随机截距?我知道这个包仍在开发中,所以在这个阶段可能无法实现。
我认为您可以按如下方式解决此问题:
predicted_df_tidy <- mutate(expanded_df_tidy,
.pred = predict(mixed_model_fit_tidy,
new_data=expanded_df_tidy,
type = "raw", opts=list(re.form=NULL)))
bind_cols()
而不是 mutate()
在某些情况下可能有用吗?
- 问题是
multilevelmod
internally sets the default for prediction to re.form = NA;上面的代码将其重置为 re.form = NULL
(这是 lme4
默认值,即在预测中包括所有随机效应)
如果你真的想要随机拦截(仅)我想你可以 predicted_df_tidy %>% filter(Days==0)
PS 如果你想了解更多 'tidy' 我想你可以使用 purrr::cross_df()
代替 expand.grid
并将结果直接传递给 mutate()
...
我正在尝试使用 lme4
和 multilevelmod
从 tidymodels 中提取 随机截距 。我可以使用下面的 lme4 来做到这一点:
使用 R 和 lme4:
library("tidyverse")
library("lme4")
# set up model
mod <- lmer(Reaction ~ Days + (1|Subject),data=sleepstudy)
# create expanded df
expanded_df <- with(sleepstudy,
data.frame(
expand.grid(Subject=levels(Subject),
Days=seq(min(Days),max(Days),length=51))))
# create predicted df with **random intercepts**
predicted_df <- data.frame(expanded_df,resp=predict(mod,newdata=expanded_df))
predicted_df
# plot intercepts
ggplot(predicted_df,aes(x=Days,y=resp,colour=Subject))+
geom_line()
使用整洁模型:
# example from
# https://github.com/tidymodels/multilevelmod
library("multilevelmod")
library("tidymodels")
library("tidyverse")
library("lme4")
#> Loading required package: parsnip
data(sleepstudy, package = "lme4")
# set engine to lme4
mixed_model_spec <- linear_reg() %>% set_engine("lmer")
# create model
mixed_model_fit_tidy <-
mixed_model_spec %>%
fit(Reaction ~ Days + (1 | Subject), data = sleepstudy)
expanded_df_tidy <- with(sleepstudy,
data.frame(
expand.grid(Subject=levels(Subject),
Days=seq(min(Days),max(Days),length=51))))
predicted_df_tidy <- data.frame(expanded_df_tidy,resp=predict(mixed_model_fit_tidy,new_data=expanded_df_tidy))
ggplot(predicted_df_tidy,aes(x=Days,y=.pred,colour=Subject))+
geom_line()
使用 predict()
函数似乎只能给出固定效应预测。
有没有办法从 tidymodels 和 multilevelmod 中提取随机截距?我知道这个包仍在开发中,所以在这个阶段可能无法实现。
我认为您可以按如下方式解决此问题:
predicted_df_tidy <- mutate(expanded_df_tidy,
.pred = predict(mixed_model_fit_tidy,
new_data=expanded_df_tidy,
type = "raw", opts=list(re.form=NULL)))
bind_cols()
而不是mutate()
在某些情况下可能有用吗?- 问题是
multilevelmod
internally sets the default for prediction to re.form = NA;上面的代码将其重置为re.form = NULL
(这是lme4
默认值,即在预测中包括所有随机效应)
如果你真的想要随机拦截(仅)我想你可以 predicted_df_tidy %>% filter(Days==0)
PS 如果你想了解更多 'tidy' 我想你可以使用 purrr::cross_df()
代替 expand.grid
并将结果直接传递给 mutate()
...