0

我有一个中间类的多重估算数据集。我使用 with() 函数通过 coxph() 函数估计m个不同的数据集。但是,我在自己的函数中使用 with() 函数时遇到了问题。

下面的代码是重现错误的简化示例:未找到 Surv(enter,exit,event) object 'enter' 中的错误

list<-"X1+X2"
var.used<-formula(paste("Surv(enter,exit,event)~",list,sep=""))

with.coxph<-function(form,dataset){
 with(dataset,coxph(form))
}

with.coxph(var.used,data)

当我简单地自行运行该功能时:

with(dataset, coxph(Surv(enter,exit,event)~X1+X2))

它工作正常。

我认为问题与调用 with() 的环境有关。我在这里找到了不同的帖子,但我似乎无法让它工作。我尝试将数据集和公式分配给全局环境:

with.coxph2<-function(form,dataset){
 assign(".dataset",dataset,envir=.GlobalEnv)
 assign(".form",dataset,envir=.GlobalEnv)
 with(dataset,coxph(form))
 remove(".dataset",dataset,envir=.GlobalEnv)
 remove(".form",dataset,envir=.GlobalEnv)
}

with.coxph2(var.used,data)

但这产生了同样的错误。

编辑

我已尝试按如下所述解决问题。当我只是在没有 with() 语句的情况下运行该函数时,它可以完美运行。

makeModel<-function(resp, explan, mData) {
 mF <- formula(paste(resp, paste(explan, collapse = "+"), sep = "~"))
 mod <- coxph(mF, data = mData)
 mod$call$formula <- mF
 mod$call$data <- as.symbol(deparse(substitute(mData)))
 mod
}

cp <- makeModel("Surv(start, stop, event)", "X1", complete(data))

# 这很好用

但是,当我在等式中包含 with() 语句时,我仍然会遇到同样的错误:

with.coxph<-function(resp, explan, mData) {
 mF <- formula(paste(resp, paste(explan, collapse = "+"), sep = "~"))
 mod <- with(mData,coxph(mF))
 mod$call$formula <- mF
 mod$call$data <- as.symbol(deparse(substitute(mData)))
 mod
}

cp <- with.coxph("Surv(start, stop, event)", "X1", data)

# Surv 中的错误(进入,退出,事件):找不到对象“进入”

4

1 回答 1

0

我在使用该lm函数时遇到了类似的问题,我想将formulaand/ordata参数传递给它。这就是我现在正在做的事情来规避这一点:

makeModel <- function(resp, explan, mData) {
   mF <- formula(paste(resp, paste(explan, collapse = "+"), sep = "~"))
   mod <- coxph(mF, data = mData)
   mod$call$formula <- mF
   mod$call$data <- as.symbol(deparse(substitute(mData)))
   mod
}

makeModelBad <- function(resp, explan, mData) {
   mF <- formula(paste(resp, paste(explan, collapse = "+"), sep = "~"))
   coxph(mF, data = mData)
}

library(survival)
example(coxph) # to load the data

(cp <- makeModel("Surv(start, stop, event)", "x", test2))
# Call:
# coxph(formula = Surv(start, stop, event) ~ x, data = test2)
#
#
#      coef exp(coef) se(coef)       z    p
# x -0.0211     0.979    0.795 -0.0265 0.98
#
# Likelihood ratio test=0  on 1 df, p=0.979  n= 10, number of events= 7 

cp.bad <- makeModelBad("Surv(start, stop, event)", "x", test2)

解释

为了使用在函数内部创建的模型,我必须明确更改相应的插槽,因为mData在函数外部不知道update,例如调用将失败:

update(cp, . ~ 1) # works
update(cp.bad, . ~ 1) # does not work
# Error in terms.formula(formula, special, data = data) : 
# object 'mData' not found 

对插槽的更改formula,更能吸引眼球,以显示print对象中的公式。

于 2014-12-04T12:05:06.093 回答