从混合模型(lme4)公式中提取组件

her*_*s10 10 r formula

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

y ~ 1 + sex + age + (1 | school) + (1 | school:section)
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法来提取这个公式的各种组件,以便在我的函数中使用?例如,我希望能够获得左侧,每个变量,随机效应变量以及它们如何嵌套等.

有没有比走公式解析树更简单的方法呢?

seb*_*n-c 10

如果你想要一个不需要正则表达式的解决方案,我建议你考虑一下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>
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用attributes以下方法从中提取属性

attributes(terms(form))$term.labels

## [1] "sex"                "age"                "1 | school"         "1 | school:section"
Run Code Online (Sandbox Code Playgroud)


dar*_*sco 7

扩展@Ben Bolker的建议:

f1 <- formula(y ~ 1 + sex + age + (1 | school) + (1 | school:section))
Run Code Online (Sandbox Code Playgroud)

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

all.vars(terms(f1))[1] # character
Run Code Online (Sandbox Code Playgroud)

变量:

all.vars(delete.response(terms(f1))) # character
Run Code Online (Sandbox Code Playgroud)

随机效应:

lme4:::findbars(f1) # returns list of language items
Run Code Online (Sandbox Code Playgroud)

还有这个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
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ker 1

也许是这样的:

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

您也可以使用strsplit如下所示:

strsplit(as.character(x[[3]][2]), "\\+")
Run Code Online (Sandbox Code Playgroud)