代码之家  ›  专栏  ›  技术社区  ›  aelhak

是否可以使用GROUPBY和DIY将多层次模型(lme)与重复测量/纵向数据相匹配?

  •  0
  • aelhak  · 技术社区  · 8 年前

    考虑下面的纵向/重复测量数据集示例

    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"
    

    有什么想法,如何使这个工作的lme型模型?

    1 回复  |  直到 8 年前
        1
  •  1
  •   MrFlick    8 年前

    不像 lm , lme 将不接受公式作为字符值。您需要显式地将其转换为公式。试着加上 as.formula()

    do(tidy(lme(as.formula(.$frm), ...))) %>%
    
    推荐文章