调用时未找到错误对象(dataset,coxph(formula))

时间:2014-12-04 10:50:29

标签: r function with-statement cox-regression

我有一个类mids的多次插补数据集。我使用with()函数使用coxph()函数估计 m 不同的数据集。  但是,我在自己的函数中使用with()函数时遇到了麻烦。

以下代码是重现错误的简化示例:Surv(输入,退出,事件)对象'输入'未找到错误

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&lt; - makeModel(“Surv(开始,停止,事件)”,“X1”,完成(数据))

#这很好用

但是,当我在等式中包含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&lt; - with.coxph(“Surv(开始,停止,事件)”,“X1”,数据)

#Surv中的错误(输入,退出,事件):对象'输入'未找到

1 个答案:

答案 0 :(得分:0)

使用lm函数时我遇到了类似的问题,我希望将formula和/或data参数传递给它。我正在做的就是绕过这个:

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的调用将失败:< / p>

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中显示公式。