3

我需要为几个变量运行 cox 回归模型,所以我想写一个循环来实现它。但无论如何它都不起作用。下面是我使用的代码

names(Gen) 
varlist <- names(hsb2)[8:11]  ## get the variables i want to involve in loop
models <- lapply(varlist, function(x) {
    coxph(substitute(Surv(Time, Status) ~ i, list(i = as.name(x))), data = Gen, ties="efron")
})

我得到的错误信息为

errors in terms.default(formula, special, data = data) : 
  no terms component nor attribute

任何人都知道如何解决这个问题或如何编写代码?

4

1 回答 1

5

因为模型以有趣的方式评估他们的公式,所以您最好创建一个字符串并将其转换为一个公式,使用reformulateas 在 是否有比字符串操作更好的替代方案来以编程方式构建公式?而不是substitute. (reformulate通常更可取,因为它会测试输入的语法正确性,但在这种情况下,它会破坏响应变量。)

创建这个临时函数:

tmpfun <- function(x) as.formula(paste("Surv(Time,Status)",x,sep="~"))

提供给的函数的主体lapply可以是:

coxph(tmpfun(x), data = Gen, ties="efron")

(你没有提供一个可重复的例子,但我认为这应该工作......)

lapply为了获得额外的(但完全不必要的)酷感,您可以尝试用两个单独的调用替换整个调用lapply,一个从变量名称列表中制作公式列表,另一个从公式列表中制作拟合模型列表。

formlist <- lapply(varlist,tmpfun)
models <- lapply(formlist,data=Gen,ties="efron")
于 2012-10-26T19:50:45.273 回答