Извлечь компоненты из формулы смешанной модели (lme4)

Я пытаюсь написать функцию в R, которая принимает формулу, такую ​​как:

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

Есть ли простой способ извлечь различные компоненты этой формулы для использования в моей функции? Например, я хотел бы иметь возможность получить левую сторону, каждую переменную, переменные случайных эффектов и то, как они вложены, и т.д.

Есть ли более простой способ сделать это, чем идти по дереву синтаксического анализа?

Ответ 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"

Ответ 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

Ответ 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.