julian.bothe at elitepartner.de
2013-Nov-13 14:46 UTC
[R] issues with calling predict.coxph.penal (survival) inside a function - subset-vector not found. Because of NextMethod?
Hello everyone, I got an issue with calling predict.coxph.penal inside a function. Regarding the context: My original problem is that I wrote a function that uses predict.coxph and survfit(model) to predict a lot of survival-curves using only the basis-curves for the strata (as delivered by survfit(model) ) and then adapts them with the predicted risk-scores. Because there are cases where my new data has strata which didn't exist in the original model I exclude them, using a Boolean vector inside the function. I end up with a call like this: predict (coxph_model, newdata[subscript_vector,] ) This works fine for coxph.model, but when I fit a model with a spline (class coxph.penal), I get an error: "Error in `[.data.frame`(newdata, [subscript_vector, ) : object '[subscript_vector ' not found" I suppose this is because of NextMethod, but I am not sure how to work around it. I also read a little bit about all those matching-and-frame-issues, But must confess I am not really into it. I attach a reproducible example. Any help or suggestions of work-arounds will be appreciated. Thanks Julian> version_ platform x86_64-w64-mingw32 arch x86_64 os mingw32 system x86_64, mingw32 status major 3 minor 0.1 year 2013 month 05 day 16 svn rev 62743 language R version.string R version 3.0.1 (2013-05-16) nickname Good Sport ##TEST-DATA # Create the simplest test data set test1 <- data.frame(time=c(4,3,1,1,2,2,3), status=c(1,1,1,0,1,1,0), x=c(0,2,1,1,1,0,0), sex=c(0,0,0,0,1,1,1)) # Fit a stratified model fit1 <- coxph(Surv(time, status) ~ x + strata(sex), test1) summary(fit1) #fit stratified wih spline fit2 <- coxph(Surv(time, status) ~ pspline(x, df=2) + strata(sex), test1) summary(fit2) #function to predict within predicting_function <- function(model, newdata){ subs <-vector(mode='logical', length=nrow(newdata)) subs[1:length(subs)]<- TRUE ret <- predict (model, newdata=newdata[subs,]) return(ret) } predicting_function(fit1, test1) # works predicting_function(fit2,test1) #doesnt work - Error in `[.data.frame`(newdata, subs, ) : object 'subs' not found # probably because of NextMethod #--------> traceback()#12: `[.data.frame`(newdata, subs, ) #11: newdata[subs, ] #10: is.data.frame(data) #9: model.frame.default(data = newdata[subs, ], formula = ~pspline(x, # df = 2) + strata(sex), na.action = function (object, ...) # object) #8: model.frame(data = newdata[subs, ], formula = ~pspline(x, df = 2) + # strata(sex), na.action = function (object, ...) # object) #7: eval(expr, envir, enclos) #6: eval(tcall, parent.frame()) #5: predict.coxph(model, newdata = newdata[subs, ]) #4: NextMethod("predict", object, ...) #3: predict.coxph.penal(model, newdata = newdata[subs, ]) #2: predict(model, newdata = newdata[subs, ]) at #5 #1: predicting_function(fit2, test1) [[alternative HTML version deleted]]
Simon Zehnder
2013-Nov-13 15:35 UTC
[R] issues with calling predict.coxph.penal (survival) inside a function - subset-vector not found. Because of NextMethod?
Works for me: predicting_function(fit2,test1) 1 2 3 4 5 6 7 -1.0481141 0.1495946 0.4492597 0.4492597 0.9982492 -0.4991246 -0.4991246 Best Simon On 13 Nov 2013, at 15:46, julian.bothe at elitepartner.de wrote:> Hello everyone, > > > > I got an issue with calling predict.coxph.penal inside a function. > > > > Regarding the context: My original problem is that I wrote a function that > uses predict.coxph and survfit(model) to predict > > a lot of survival-curves using only the basis-curves for the strata (as > delivered by survfit(model) ) and then adapts them with > > the predicted risk-scores. Because there are cases where my new data has > strata which didn't exist in the original model I exclude > > them, using a Boolean vector inside the function. > > I end up with a call like this: predict (coxph_model, > newdata[subscript_vector,] ) > > > > This works fine for coxph.model, but when I fit a model with a spline > (class coxph.penal), I get an error: > > "Error in `[.data.frame`(newdata, [subscript_vector, ) : object > '[subscript_vector ' not found" > > > > I suppose this is because of NextMethod, but I am not sure how to work > around it. I also read a little bit about all those > matching-and-frame-issues, > > But must confess I am not really into it. > > > > I attach a reproducible example. > > Any help or suggestions of work-arounds will be appreciated. > > > > Thanks > > Julian > > > >> version > > _ > > platform x86_64-w64-mingw32 > > arch x86_64 > > os mingw32 > > system x86_64, mingw32 > > status > > major 3 > > minor 0.1 > > year 2013 > > month 05 > > day 16 > > svn rev 62743 > > language R > > version.string R version 3.0.1 (2013-05-16) > > nickname Good Sport > > > > > > ##TEST-DATA > > > > # Create the simplest test data set > > test1 <- data.frame(time=c(4,3,1,1,2,2,3), > > status=c(1,1,1,0,1,1,0), > > x=c(0,2,1,1,1,0,0), > > sex=c(0,0,0,0,1,1,1)) > > > > # Fit a stratified model > > fit1 <- coxph(Surv(time, status) ~ x + strata(sex), test1) > > summary(fit1) > > > > #fit stratified wih spline > > fit2 <- coxph(Surv(time, status) ~ pspline(x, df=2) + strata(sex), test1) > > summary(fit2) > > > > #function to predict within > > > > predicting_function <- function(model, newdata){ > > subs <-vector(mode='logical', length=nrow(newdata)) > > subs[1:length(subs)]<- TRUE > > > > ret <- predict (model, newdata=newdata[subs,]) > > return(ret) > > } > > > > predicting_function(fit1, test1) # works > > > > predicting_function(fit2,test1) #doesnt work - Error in > `[.data.frame`(newdata, subs, ) : object 'subs' not found > > # probably because of NextMethod > > > > #-------- > >> traceback() > > #12: `[.data.frame`(newdata, subs, ) > > #11: newdata[subs, ] > > #10: is.data.frame(data) > > #9: model.frame.default(data = newdata[subs, ], formula = ~pspline(x, > > # df = 2) + strata(sex), na.action = function (object, ...) > > # object) > > #8: model.frame(data = newdata[subs, ], formula = ~pspline(x, df = 2) + > > # strata(sex), na.action = function (object, ...) > > # object) > > #7: eval(expr, envir, enclos) > > #6: eval(tcall, parent.frame()) > > #5: predict.coxph(model, newdata = newdata[subs, ]) > > #4: NextMethod("predict", object, ...) > > #3: predict.coxph.penal(model, newdata = newdata[subs, ]) > > #2: predict(model, newdata = newdata[subs, ]) at #5 > > #1: predicting_function(fit2, test1) > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.