Создать вызов формулы из строки символов - PullRequest
0 голосов
/ 19 сентября 2018

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

x <- "x1 + x2 + x3"
y <- "Surv(time, event)"

Поскольку я строю модель coxph, формула выглядит следующим образом:

coxph(Surv(time, event) ~ x1 + x2 + x3)

Используя эти строковые поля, я попыталсячтобы построить формулу следующим образом:

form <- y ~ x

Это создает объект класса formula, но когда я вызываю coxph, он не оценивается на основе ссылок, созданных из объекта формулы.Я получаю следующую ошибку:

Error in model.frame.default(formula = y ~ x) : object is not a matrix

Если я вызову eval для объектов y и x в вызове coxph, я получу следующее:

Error in model.frame.default(formula = eval(y) ~ eval(x), data = df) : 

переменной длиныотличаются (найдено для 'eval (x)')

Я не совсем уверен, как поступить.Спасибо за ваш вклад.

1 Ответ

0 голосов
/ 19 сентября 2018

Не удалось найти хороший дурак, поэтому добавьте комментарий в качестве ответа.

Если вы строите полную формулу в виде строки, включая ~, вы можете использовать as.formula для нее, например,

x = "x1 + x2 + x3"
y = "Surv(time, event)"
form = as.formula(paste(y, "~", x))
coxph(form, data = your_data)

В качестве воспроизводимого примера рассмотрим первый пример внизу страницы справки ?coxph:

library(survival)
test1 <- list(time=c(4,3,1,1,2,2,3), 
              status=c(1,1,1,0,1,1,0), 
              x=c(0,2,1,1,1,0,0), 
              sex=c(0,0,0,0,1,1,1)) 
# Fit a stratified model 
coxph(Surv(time, status) ~ x + strata(sex), test1)
# Call:
# coxph(formula = Surv(time, status) ~ x + strata(sex), data = test1)
# 
#    coef exp(coef) se(coef)    z    p
# x 0.802     2.231    0.822 0.98 0.33
# 
# Likelihood ratio test=1.09  on 1 df, p=0.3
# n= 7, number of events= 5 

lhs = "Surv(time, status)"
rhs = "x + strata(sex)"
form = as.formula(paste(lhs, "~", rhs))
form
# Surv(time, status) ~ x + strata(sex)
## formula looks good

coxph(form, test1)
# Call:
# coxph(formula = form, data = test1)
# 
#    coef exp(coef) se(coef)    z    p
# x 0.802     2.231    0.822 0.98 0.33

В любом случае одинаковые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...