0

I’ve been scouring the web for the last few days looking at the documentation for map2. I have taken a training set, nested the data and created coxph models for it, saving those models in the nested table. Now I want to predict from that model, but I want to use a type=“expected" as, according to the documentation (R documentation: predict.coxph)

The survival probability for a subject is equal to exp(-expected)

I’ve adapted the relevant code to reproduce my issues using the mpg data set.

I have 4 examples below that do not work after the predict function that does work. Please note that I have removed the coxph.null models from this set, so the only models are of class(coxph). This code can be used to replicate the errors.

#Needed libraries
library(ggplot2)
library(tidyverse)
library(purrr)
library(broom)
library(survival)
#Create data set
mpg_data <- mpg
mpg_data <- mpg_data %>% 
  mutate(mpg_diff = cty - hwy)
mpg_data <- mpg_data %>% 
  mutate(EVENT = (mpg_diff >= -8))
set.seed(1)
mpg_data <- mpg_data %>% 
  mutate(TIME_TO_EVENT = as.integer(runif(234, 1, 100)))
mpg_nested <- mpg_data %>% 
  group_by(manufacturer) %>% 
  mutate(n_prot = length(model)) %>% 
  nest()
# Stepwise regression 
stepwise <- function(data) {
  response <- Surv(time = data$TIME_TO_EVENT, event = data$EVENT, type = "right") 
full <- "Surv(time = data$TIME_TO_EVENT, event = data$EVENT, type = 'right') ~ data$cyl+data$cty+data$hwy+data$displ"
x <- factor(as.factor(data$model))
full <- ifelse(nlevels(x) >= 2, paste(full, "as.character(data$model)", sep = "+"), full)
x <- factor(as.factor(data$trans))
full <- ifelse(nlevels(x) >= 2, paste(full, "as.character(data$trans)", sep = "+"), full)
x <- factor(as.factor(data$drv))
full <- ifelse(nlevels(x) >= 2, paste(full, "as.character(data$drv)", sep = "+"), full)
null_model_ONE <- coxph(response ~ 1, data=data)
full_model_ONE <- coxph(as.formula(full), data=data)
model_ONE <- step(null_model_ONE, scope=list(lower=null_model_ONE, upper=full_model_ONE))
}
survival_mpg <- mpg_nested %>%  
  mutate(model_fit = map(data, stepwise))
#Predicting values
#This works but is not type="expected"
survival_mpg_predict <- survival_mpg %>% 
  mutate(mpg_predict = map2(model_fit, data, predict))
##TRY 1##
predict.F <- function(model_fit, data){
  predict(model_fit, newdata=data, type="expected")
}
survival_mpg_predict <- survival_mpg %>% 
  mutate(mpg_predict = map2(model_fit, data, predict.F))
#Error in mutate_impl(.data, dots) : Evaluation error: requires numeric/complex matrix/vector arguments.
##Try 2##
survival_mpg_predict <- survival_mpg %>% 
  mutate(mpg_predict = map2(model_fit, data, predict(model_fit, newdata = data, type="expected")))
#Error in mutate_impl(.data, dots) : Evaluation error: no applicable method for 'predict' applied to an object of class "list".
##Try 3##
survival_mpg_predict <- survival_mpg %>% 
  mutate(mpg_predict = map2(model_fit, data, ~ predict(.x, newdata = .y, type="expected")))
#Error in mutate_impl(.data, dots) : Evaluation error: requires numeric/complex matrix/vector arguments.
##Try 4##
survival_mpg_predict <- survival_mpg %>% 
  mutate(mpg_predict = map2(model_fit, data, function(model_fit, data) predict(model_fit, newdata=data, type="expected")))
#Error in mutate_impl(.data, dots) : Evaluation error: requires numeric/complex matrix/vector arguments.
www
  • 38,575
  • 12
  • 48
  • 84
  • It looks like this is due to the models that have no variables in them. For example, take a look at the second model in the list. If you try to predict using the `newdata` argument you get the same error: `predict(survival_mpg$model_fit[[2]], survival_mpg$data[[2]], type = "expected")`. If you don't give it a new dataset it seems to work. As you are using the same data for prediction as the model fit, you may be able to drop the `newdata` argument all together. – aosmith Feb 14 '18 at 19:21
  • Thank you for the quick response. For this set, I am trying to predict on the same data. So, removing the newdata argument and switching to the map() function worked! – Wendy Tate Feb 14 '18 at 19:31

1 Answers1

0

Modifying ##TRY 1## to remove the newdata argument and change the map2() function to the map() function worked

predict.F <- function(model_fit, data){
predict(model_fit, type="expected")
}
survival_mpg_predict <- survival_mpg %>% 
mutate(mpg_predict = map(model_fit, predict.F))