0

私は、クラス mids の乗算帰属データセットを持っています。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 <- 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 <- with.coxph("Surv(開始、停止、イベント)"、"X1"、データ)

# Surv(enter,exit,event) のエラー: オブジェクト 'enter' が見つかりません

4

1 に答える 1

0

関数を使用するときに同様の問題があり、 and/or引数をlm渡したいと思いました。それを回避するために私が今していることは次のとおりです。formuladata

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)

説明

関数内で作成されたモデルを使用するには、それぞれのスロットを明示的に変更する必要がありましmDataupdate.

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 に答える