Извлечь компоненты из формулы смешанной модели (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.