我在使用公式,环境和survfit()
时遇到了问题。
lm()
的内容正常,但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>
即使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
这里(与lm-fits相反),formula(fits[[1]])
没有
工作!
所以,我的具体问题是:我怎样才能找回使用的公式
适合fits[[1]]
?
答案 0 :(得分:2)
问题是当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
可以使用formula(fits[[1]])
使用formula
泛型提取公式。 lm
的{{1}} S3方法是
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)
# }
返回fits[[1]]$formula
时,NULL
会在对象中查找forumla.lm
属性并找到相应的公式
terms
fits[[1]]$terms
个对象没有survfit
或x$formula
,因此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()
或者手动将公式放入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
x$call$formula