survfit中的R公式

And*_*eas 1 r formula survival-analysis

我在公式、环境和survfit().

对于 ,事情运行良好,lm()但对于 ,却失败了survfit()

一般问题陈述:

我正在对一些数据拟合一系列公式。因此,我使用作为变量传递的公式来调用建模函数。稍后,我想使用拟合对象中的公式。

(从我天真的角度来看,问题来自于survfit没有记录环境。)

详细示例

预期行为如lm()

library("plyr")

preds <- c("wt", "qsec")

f <- function() {
  lm(mpg ~ wt, data = mtcars)
}

fits <- alply(preds, 1, function(pred)
{
  modform <- reformulate(pred, response = "mpg")

  lm(modform, data = mtcars)
})

fits[[1]]$call$formula
##modform
formula(fits[[1]])
## mpg ~ wt
## <environment: 0x1419d1a0>
Run Code Online (Sandbox Code Playgroud)

即使fits[[1]]$call$formula解决了modform我仍然可以得到原始公式formula(fits[[1]])

但事情失败了survfit()

library("plyr")
library("survival")

preds <- c("resid.ds", "rx", "ecog.ps")

fits <- 
  alply(preds, 1, function(pred)
  {
    modform <- paste("Surv(futime, fustat)", pred, sep = " ~ ")
    modform <- as.formula(modform)
    print(modform)

    fit <- survfit(modform, data = ovarian)
  })

fits[[1]]$call$formula
## modform
formula(fits[[1]])
## Error in eval(expr, envir, enclos) : object 'modform' not found
Run Code Online (Sandbox Code Playgroud)

在这里(与 lm-fits 相比)formula(fits[[1]])不起作用!

所以,我的具体问题是:如何取回用于拟合的公式fits[[1]]

raw*_*awr 5

问题是,当x$formula是时NULL,对于一个lm对象,有一个备份计划来获取公式;survfit这对于对象来说不存在

library("plyr")
library("survival")

preds <- c("wt", "qsec")
f <- function() lm(mpg ~ wt, data = mtcars)

fits <- alply(preds, 1, function(pred) {
  modform <- reformulate(pred, response = "mpg")
  lm(modform, data = mtcars)
})

fits[[1]]$formula
# NULL
Run Code Online (Sandbox Code Playgroud)

formula(fits[[1]])可以使用通用的公式来提取formula。S3lm方法formula

stats:::formula.lm

# function (x, ...) 
# {
#   form <- x$formula
#   if (!is.null(form)) {
#     form <- formula(x$terms)
#     environment(form) <- environment(x$formula)
#     form
#   }
#   else formula(x$terms)
# }
Run Code Online (Sandbox Code Playgroud)

因此,当fits[[1]]$formula返回时NULL,在对象中forumla.lm查找terms属性并找到公式

fits[[1]]$terms
Run Code Online (Sandbox Code Playgroud)

对象survfit没有x$formulaor x$terms,因此formula(x)给出错误

preds <- c("resid.ds", "rx", "ecog.ps")
fits <-  alply(preds, 1, function(pred) {
    modform <- paste("Surv(futime, fustat)", pred, sep = " ~ ")
    modform <- as.formula(modform)
    fit <- survfit(modform, data = ovarian)
  })

fits[[1]]$formula
# NULL

formula(fits[[1]]) ## error

formula(fits[[1]]$terms)
# list()
Run Code Online (Sandbox Code Playgroud)

您可以通过将公式插入调用并对其求值来解决此问题

modform <- as.formula(paste("Surv(futime, fustat)", 'rx', sep = " ~ "))
substitute(survfit(modform, data = ovarian), list(modform = modform))
# survfit(Surv(futime, fustat) ~ rx, data = ovarian)

eval(substitute(survfit(modform, data = ovarian), list(modform = modform)))

# Surv(futime, fustat) ~ rx

# Call: survfit(formula = Surv(futime, fustat) ~ rx, data = ovarian)
# 
#      n events median 0.95LCL 0.95UCL
# rx=1 13      7    638     268      NA
# rx=2 13      5     NA     475      NA
Run Code Online (Sandbox Code Playgroud)

或者手动将公式代入x$call$formula

fit <- survfit(modform, data = ovarian)
fit$call$formula
# modform
fit$call$formula <- modform
fit$call$formula
# Surv(futime, fustat) ~ rx

fit
# Call: survfit(formula = Surv(futime, fustat) ~ rx, data = ovarian)
# 
#      n events median 0.95LCL 0.95UCL
# rx=1 13      7    638     268      NA
# rx=2 13      5     NA     475      NA
Run Code Online (Sandbox Code Playgroud)