Я пытаюсь склеить формулу для запуска в модели, но у меня возникают проблемы, когда я пытаюсь включить случайные эффекты. Я хочу определить случайные эффекты отдельно, а затем добавить к формуле.
Простой рабочий пример без as.formula
:
library(INLA)
data(Epil)
head(Epil)
##Define the model
formulae = y ~ Trt + Age + V4 + f(Ind, model = "iid") + f(rand, model = "iid")
formulae
# y ~ Trt + Age + V4 + f(Ind, model = "iid") + f(rand, model = "iid")
#WORKS
result = inla(formulae, family = "poisson", data = Epil, control.predictor = list(compute = TRUE))
Теперь, если я хочу сделать это более гибким, где я может изменять случайные эффекты между моделями, но не изменять фиксированные эффекты, я пробовал что-то подобное, используя as.formula
:
test_vars = c("Trt", "Age", "V4")
mm <- quote(
f(Ind, model = 'iid') + f(rand, model = "iid")
)
mm
formula_2 <- as.formula(paste("y ~", paste(paste(test_vars, collapse = "+"), "+", mm)))
formula_2 #wont work here as expected
# y ~ Trt + Age + V4 + +y ~ Trt + Age + V4 + f(Ind, model = "iid")
formula_2 <- as.formula(paste("y ~", paste(paste(test_vars, collapse = "+"), "+", parse(text = mm))))
formula_2 #missing + f(rand, model = "iid")
# y ~ Trt + Age + V4 + +f(Ind, model = "iid")
result1 = inla(formula_2, family = "poisson", data = Epil, control.predictor = list(compute = TRUE))
identical(result, result1)
#FALSE
formula_2
неправильно, и мне просто нужен способ сделать что-то вроде
formula_2 <- as.formula(paste("y ~", paste(paste(test_vars, collapse = "+"), "+", mm)))
где желаемый результат будет:
"y ~ Trt + Age + V4 + f(Ind, model = 'iid') + f(rand,model = 'iid')"
#where I can feed it directly into the model call:
result1 = inla(formula_2, family = "poisson", data = Epil, control.predictor = list(compute = TRUE))
Я бы предпочел не напрямую вручную цитировать ("f(Ind, model = 'iid') + f(rand, model = 'iid')"
) случайные эффекты, поскольку это маскирует их читабельность. Думаю, parse
или eval
могут помочь?
Спасибо