2016-10-16 2 views
1

数式、環境、およびsurvfit()に問題があります。Rサバイフィットの式

lm()の場合は正常に動作しますが、survfit()の場合は失敗します。

一般的な問題の記述:

私はいくつかのデータへの数式のシリーズをフィッティングしています。だから、私は モデリング関数を変数として渡された数式と呼んでいます。後で 私はフィットしたオブジェクトから数式で作業したい。

(ビューの私の素朴な視点から、トラブルが環境を記録していない 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$formulamodformに解決できます はまだ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-フィットとは対照的に)、formula(fits[[1]])はない 作業を行います!

私の具体的な質問は次のとおりです。 の式を返信してfits[[1]]に合わせるにはどうすればよいですか?

+0

'<収まるように式を置くことによって評価することによって、この問題を解決することができます - evalの(代替(survfit(modformを、 data =卵巣)、list(modform = modform))) 'または単に式をsurvifitオブジェクトに追加して' fit $ call $ formula < - modform'そして 'fit'を返してください – rawr

+0

ありがとう!それは動作します。私は、問題のサンプルコードで生成されているように、fits [1]]から数式を復元する方法はありませんか?その場合:あなたが答えとしてあなたのコメントを書くなら、私はそれを受け入れるでしょう。 – Andreas

答えて

2

x$formulaNULLの場合、lmオブジェクトの場合、数式を取得するバックアップ計画があります。この式は一般的なformulaを使用formula(fits[[1]])で抽出することができる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ためlm S3方法は

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戻りNULLforumla.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

fit <- survfit(modform, data = ovarian) 
fit$call$formula 
# modform 
fit$call$formula <- modform 
fit$call$formula 
# Surv(futime, fustat) ~ rx 

fit 
# 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 
+0

本当に素敵な答えです。とても有難い。 – Andreas