2016-10-16 10 views
1

Ich habe Probleme mit Formeln, Umgebungen und survfit().R Formel in Survfit

Die Dinge funktionieren gut für lm(), aber sie scheitern für survfit().

Allgemeine Problemstellung:

Ich bin eine Reihe von Formeln auf bestimmte Daten passen. Also rufe ich die Modellierungsfunktion mit der als Variable übergebenen Formel auf. Später, Ich möchte mit der Formel aus dem angepassten Objekt arbeiten.

(Aus meiner naiven Sicht kommt das Problem von survfit nicht die Umwelt aufnehmen.)

Detailliertes Beispiel

Erwartetes Verhalten wie in lm() gesehen:

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> 
obwohl

Selbst fits[[1]]$call$formula löst sich auf modform Ich kann immer noch die ursprüngliche Formel mit formula(fits[[1]]) erhalten.

Aber die Dinge nicht für 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 

Hier (und im Gegensatz zu lm-fits), formula(fits[[1]]) nicht Arbeit!

Also, meine spezifische Frage ist: Wie kann ich die Formel wieder zu fits[[1]] passen?

+0

'passen rawr

+0

Danke! Das funktioniert. Ich nehme an, dass es keine Möglichkeit gibt, die Formel von 'passt [[1]]' wiederherzustellen, wie es im Beispielcode der Frage erzeugt wird. In diesem Fall: Wenn Sie Ihren Kommentar als Antwort schreiben, akzeptiere ich das. – Andreas

Antwort

2

Das Problem ist, dass, wenn x$formulaNULL ist, für ein lm Objekt gibt es einen Backup-Plan, um die Formel zu erhalten; dies gilt jedoch nicht für survfit Objekte

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 

Die Formel kann mit formula(fits[[1]]) extrahiert werden, die die formula Generika verwendet.Die lm S3 Methode für formula ist

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) 
# } 

Also, wenn fits[[1]]$formula kehrt NULL, forumla.lm für ein terms Attribut im Objekt sieht und findet die Formel, die Art und Weise

fits[[1]]$terms 

Die survfit Objekte haben nicht x$formula oder x$terms, also formula(x) gibt einen Fehler

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() 

Sie können dieses Problem beheben, indem Sie die Formel in dem Aufruf eingefügt und es

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 

oder durch manuell setzen die Formel in 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

Wirklich nette Antwort. Sehr geschätzt. – Andreas