Можно ли использовать группировку и приборку для подгонки многоуровневых моделей (lme) к повторным измерениям / продольным данным?

Рассмотрим следующий пример набора данных продольных / повторных измерений

library(tidyverse)
library(broom)
library(nlme)

data <- read.csv("https://stats.idre.ucla.edu/stat/data/study2.csv")
data <- data %>% mutate(dbp =rnorm(120, 30:150), sbp = rnorm(120, 50:200),bmi 
= rnorm(120,15:40), chol = rnorm(120,50:350), insulin = rnorm(120,2:40), educ = rnorm(120,5:10))

я могу использовать group_by %>% do(tidy(*)) запустить несколько нескорректированных и скорректированных одноуровневых регрессионных моделей (циклический просмотр списка результатов и рисков) и извлечь результаты модели в кадр данных следующим образом

out <-c("pulse","insulin","chol")
exp <- c("factor(exertype)","sbp","dbp")
conf <- c("bmi","factor(diet)")

#Unadjusted models - single level regression (lm)
#################################################
Unadjusted <- expand.grid(out, exp) %>%
group_by(Var1) %>% rowwise() %>%
summarise(frm = paste0(Var1, "~", Var2)) %>%
group_by(model_id = row_number(),frm) %>%
do(tidy(lm(.$frm, data = data))) %>%
mutate(lci = estimate-(1.96*std.error)) %>%
mutate(uci = estimate+(1.96*std.error))

#Adjusted models - single level regression (lm)
###############################################
Adjusted <- expand.grid(out, exp, conf) %>%
group_by(Var1, Var2) %>%
summarise(Var3 = paste0(Var3, collapse = "+")) %>%
rowwise() %>%
summarise(frm = paste0(Var1, "~", Var2, "+", Var3)) %>%
group_by(model_id = row_number(), frm) %>%
do(tidy(lm(.$frm, data = data))) %>%
mutate(lci = estimate-(1.96*std.error)) %>%
mutate(uci = estimate+(1.96*std.error))

Я хотел бы использовать тот же процесс для подбора многоуровневых моделей для учета повторяющихся данных. используя пример кода:

lme(sbp ~ pulse+factor(diet)+time, data=data, random= ~time|id, method ="ML")

ОДНАКО, когда я пытаюсь сделать это, например, используя:

#Unadjusted models - multi-level regression (lme)
#################################################
Unadjusted <- expand.grid(out, exp) %>%
group_by(Var1) %>% rowwise() %>%
summarise(frm = paste0(Var1, "~", Var2)) %>%
group_by(model_id = row_number(),frm) %>%
do(tidy(lme(.$frm, data = data, random= ~time|id, method = "ML"))) %>%
mutate(lci = estimate-(1.96*std.error)) %>%
mutate(uci = estimate+(1.96*std.error))

Я получаю следующее сообщение об ошибке:

Error in UseMethod("lme") : no applicable method for 'lme' applied to an object of class "character"

Любые идеи о том, как заставить это работать для моделей типа Ime?

1 ответ

Решение

В отличие от lm, lme не примет формулу в качестве значения символа. Вам нужно явно привести его к формуле. Попробуйте просто добавить as.formula()

do(tidy(lme(as.formula(.$frm), ...))) %>%
Другие вопросы по тегам