【问题标题】:Extract components from mixed model (lme4) formula从混合模型 (lme4) 公式中提取组件
【发布时间】:2012-12-27 04:41:54
【问题描述】:

我正在尝试在 R 中编写一个接受如下公式的函数:

y ~ 1 + sex + age + (1 | school) + (1 | school:section)

是否有一种简单的方法可以提取此公式的各个组成部分以用于我的函数?例如,我希望能够获取左侧,每个变量,随机效应变量以及它们的嵌套方式等。

有没有比遍历公式解析树更简单的方法?

【问题讨论】:

  • 看看?all.vars和隐藏文件lme4:::findbarslme4:::nobars ...

标签: r formula


【解决方案1】:

如果你想要一个不需要正则表达式的解决方案,我建议你考虑terms

form <- y ~ 1 + sex + age + (1 | school) + (1 | school:section)
terms(form)

## y ~ 1 + sex + age + (1 | school) + (1 | school:section)
## attr(,"variables")
## list(y, sex, age, 1 | school, 1 | school:section)
## attr(,"factors")
##                    sex age 1 | school 1 | school:section
## y                    0   0          0                  0
## sex                  1   0          0                  0
## age                  0   1          0                  0
## 1 | school           0   0          1                  0
## 1 | school:section   0   0          0                  1
## attr(,"term.labels")
## [1] "sex"                "age"                "1 | school"         "1 | school:section"
## attr(,"order")
## [1] 1 1 1 1
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 1
## attr(,".Environment")
## <environment: R_GlobalEnv>

此外,您可以使用attributes 从中提取属性:

attributes(terms(form))$term.labels

## [1] "sex"                "age"                "1 | school"         "1 | school:section"

【讨论】:

  • 不错的答案,不知道+1
【解决方案2】:

扩展@Ben Bolker 的建议:

f1 <- formula(y ~ 1 + sex + age + (1 | school) + (1 | school:section))

左侧(假设左侧有一个变量):

all.vars(terms(f1))[1] # character

变量:

all.vars(delete.response(terms(f1))) # character

随机效应:

lme4:::findbars(f1) # returns list of language items

还有formula.tools 包,虽然它没有专门用于混合效果模型的方法:

library(formula.tools)
lhs(f1)
r1 <- rhs.vars(f1) # gives fixed and random effects as character
r1[grepl("\\|", r1)] # character vector of random effects

【讨论】:

  • 不幸的是,lsh()rhs.vars() 在应用于 lmerMod 时都会返回错误:Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘rhs.vars’ for signature ‘"lmerMod"’
【解决方案3】:

可能是这样的:

x <- as.formula("y ~ 1 + sex + age + (1 | school) + (1 | school:section)")
x[[2]]
x[[3]][2]

你也可以使用strsplit

strsplit(as.character(x[[3]][2]), "\\+")

【讨论】:

    【解决方案4】:
    > form <- y ~ 1 + sex + age + (1 | school) + (1 | school:section)
    > form[1]
    `~`()
    > form[2]
    y()
    > form[3]
    1 + sex + age + (1 | school) + (1 | school:section)()
    

    所以基本上你应该将 LHS 和 RHS 作为列表元素来处理。要拆分 RHS,您可以使用 TylerRinker 的答案。

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多