Можно ли использовать группировку и приборку для подгонки многоуровневых моделей (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), ...))) %>%