вставить формулу вместе как задачу синтаксического анализа формулы - PullRequest
0 голосов
/ 04 августа 2020

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

Простой рабочий пример без 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 могут помочь?

Спасибо

1 Ответ

1 голос
/ 04 августа 2020

Я думаю, это сделает то, что вы хотите

as.formula(paste0("y ~ ", paste(paste(test_vars, collapse="+"), deparse(mm), sep="+")))
# y ~ Trt + Age + V4 + f(Ind, model = "iid") + f(rand, model = "iid")

Поскольку вы строите формулу как строку, нам действительно нужно все как строка, а не выражение в кавычках. Таким образом, deparse поможет превратить это выражение в кавычки в строку для упрощения манипуляций.

Вместо того, чтобы сохранять mm как одно выражение в кавычках, было бы проще, если бы вы сохранили дополнительные термины, которые вы хотите, в виде выражения коллекция. Например, это вернет то же самое

mm <- expression(
  f(Ind, model = 'iid'),
  f(rand, model = "iid")
)
reformulate(c(test_vars, sapply(mm, deparse)), "y")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...