循环Cox回归模型在多个预测变量上的应用

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

有人知道如何解决这个问题或者如何编写相关代码吗?

1个回答

5
由于模型以奇怪的方式评估它们的公式,因此最好创建一个字符串并将其转换为公式,而不是使用substitute。可以使用reformulate,但通常情况下更好的方法是创建一个临时函数,如Is there a better alternative than string manipulation to programmatically build formulas?所述。(reformulate通常更可取,因为它会测试输入的语法正确性,但在这种情况下它会搞乱响应变量。)
创建这个临时函数:
tmpfun <- function(x) as.formula(paste("Surv(Time,Status)",x,sep="~"))
< p > 提供给 lapply 的函数的主体可能是:

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

(您没有提供可重现的示例,但我认为这应该可以解决...)
为了增加额外(但完全不必要的)的酷感,您可以尝试用两个单独的 lapply 调用来替换整个调用,一个从变量名列表中制作公式列表,另一个从公式列表中制作拟合模型列表。
formlist <- lapply(varlist,tmpfun)
models <- lapply(formlist,data=Gen,ties="efron")

1
很抱歉,我不知道(也无法猜测)您在代码方面遇到了什么问题,除非有更多信息。我承认我还没有测试过它,但如果您提供一个可重现的示例(http://tinyurl.com/reproducible-000),我可以自己测试我的答案。制作一个可重现的示例需要更多时间,而且可能不是您想要的,所以现在这个负担就落在您身上... - Ben Bolker
我自己找到了一个代码中的错误,但你仍需要提供更多信息! - Ben Bolker
好的,我已经亲自测试过了。你(至少)需要使用tmpform <- as.formula(paste("Surv(Time,Status)",x,sep="~"))而不是使用reformulate。等我有时间时,我会回来编辑我的答案并解释原因。 - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接