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]]?
问题是,当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)