【问题标题】:Create formula call from character string从字符串创建公式调用
【发布时间】:2018-09-19 19:30:37
【问题描述】:

我使用最佳子集选择包来确定构建模型的最佳自变量(我确实有这样做的特定原因,而不是直接使用最佳子集对象)。我想以编程方式提取特征名称并使用生成的字符串来构建我的模型公式。结果会是这样的:

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

如果我在 coxph 调用中对对象 y 和 x 调用 eval,我会得到以下信息:

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

可变长度不同(为 'eval(x)' 找到)

我不确定如何继续。感谢您的输入。

【问题讨论】:

  • as.formula(paste(y, "~", x))

标签: r formula cox-regression


【解决方案1】:

找不到好的骗子,所以发表评论作为答案。

如果您将完整的公式构建为字符串,包括~,您可以在其上使用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

无论哪种方式,结果都是一样的。

【讨论】:

  • 谢谢@Gregor!不知道在尝试不同的选择时我是怎么错过的。谢谢!
  • @ToddShannon 我添加了一个可重现的示例来证明它有效。如果您遇到错误,请确保 (a) 您的变量拼写正确,(b) 它们都存在于您传入的数据框中,并且 (c) 您创建的公式对象看起来正确。如果它仍然不起作用,请更具体地说明您遇到的错误并制作可重现的示例。
  • Aaaahhhhh @Gregor 我发现了这个问题。由于某种原因,在分配 lhs 时我使用了 quote 而不是将字符串放在实际引号中,导致对象属于 call 类而不是character。再次感谢好先生!
猜你喜欢
  • 2016-01-30
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2012-01-18
  • 2016-03-28
  • 1970-01-01
相关资源
最近更新 更多