【问题标题】:error object not found when calling with(dataset, coxph(formula))调用 with(dataset, coxph(formula)) 时找不到错误对象
【发布时间】:2015-02-02 05:15:08
【问题描述】:

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

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

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

#这很好用

但是,当我在等式中包含 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

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

【问题讨论】:

    标签: r function with-statement cox-regression


    【解决方案1】:

    我在使用 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 将失败:

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

    【讨论】:

    • 非常感谢您的帮助!但是,我仍然无法让它与 with() 函数一起使用。我已在上述评论的编辑中复制了您的功能。
    • 好吧,你为什么坚持使用with 语句来运行它? coxph 有一个 data 语句是有原因的,我想不出有什么好的理由不使用 data 语句而改用 with 语句。所以也许你可以详细说明一下?
    • 据我所知,这是将多重插补数据集拟合到 coxph() 的唯一方法。多重插补数据由 m 个数据集组成,所有这些数据集都必须适合 coxph 回归。在 which(dataset, coxph(form) 运行之后,我基本上进行了 m 分析,然后必须将其汇总以获得最终结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2019-08-01
    • 2023-03-24
    • 2017-09-28
    • 2018-06-06
    相关资源
    最近更新 更多