Область видимости с помощью формул в объектах coxph

Я пытаюсь написать набор функций, в которых первая функция соответствует модели cox (через coxph в пакете survival в R), а вторая функция получает расчетную выживаемость для нового набора данных с учетом подходящего объекта модели из первой функции. . Я столкнулся с какой-то проблемой области видимости, которую я не совсем знаю, как решить без существенного рефакторинга моего кода (единственный способ, которым я мог бы это сделать, был бы гораздо менее общим и гораздо труднее читать).

У меня есть очень похожий набор функций, основанных на функции glm, которые не сталкиваются с той же проблемой и дают мне ожидаемые ответы. Я включил короткий рабочий пример ниже, который демонстрирует проблему. glue.cox и glue.glm — это функции, которые имеют базовую функциональность, которую я пытаюсь получить. glue.glm работает так, как ожидалось (выдает те же значения из расчета в глобальной среде), но glue.cox жалуется, что не может найти данные, которые использовались для подбора модели кокса, и завершается с ошибкой. Я не понимаю, как это сделать с substitute, но я подозреваю, что это путь вперед. Я уперся в стену экспериментами.

 library(survival)

 data.global = data.frame(time=runif(20), x=runif(20))
 newdata.global = data.frame(x=c(0,1))
 f1 = Surv(time) ~ x # this is the part that messes it up!!!!! Surv gets eval
 f2 = time ~ x # this is the part that messes it up!!!!! Surv gets eval
 myfit.cox.global = coxph(f1, data=data.global)
 myfit.glm.global = glm(f2, data=data.global)
 myfit.glm.global2 = glm(time ~ x, data=data.global)


 myfit.cox <- function(f, dat.local){
   coxph(f, data=dat.local)
 }

 myfit.glm <- function(f, dat.local){
   glm(f, data=dat.local)
 }

 mypredict.cox <- function(ft, dat.local){
   newdata = data.frame(x=c(0,1))
   tail(survfit(ft, newdata)$surv, 1)
 }

 mypredict.glm <- function(ft, dat.local){
   newdata = data.frame(x=c(0,1))
   predict(ft, newdata)
 }

 glue.cox <- function(f, dat.local){
   fit = myfit.cox(f, dat.local)
   mypredict.cox(fit, dat.local)
 }

 glue.glm <- function(f, dat.local){
   fit = myfit.glm(f, dat.local)
   mypredict.glm(fit, dat.local)
 }

 # these numbers are the goal for non-survival data
 predict(myfit.glm.global, newdata = newdata.global)               

0.5950440 0.4542248

 glue.glm(f2, data.global) 

0.5950440 0.4542248 # это работает

 # these numbers are the goal for survival data
 tail(survfit(myfit.cox.global, newdata = newdata.global)$surv, 1)

[20,] 0.02300798 0.03106081

 glue.cox(f1, data.global) 

Ошибка в eval(predvars, data, env): объект 'dat.local' не найден


person alex keil    schedule 10.11.2019    source источник


Ответы (1)


Похоже, это работает, по крайней мере, в узком смысле, когда glue.cox() работает так, как хотелось бы:

myfit.cox <- function(f, dat.local){
    environment(f) <- list2env(list(dat.local=dat.local))
    coxph(f, data=dat.local)
}

Хитрость заключается в том, что большинство функций моделирования/обработки моделей R ищут данные в среде, связанной с формулой.

Я не знаю, почему glue.glm работает без дополнительных копаний, за исключением общего утверждения, что объекты [g]lm хранят больше информации, необходимой для внутренней обработки (например, в элементе $qr), чем другие типы моделей.

person Ben Bolker    schedule 10.11.2019
comment
Красиво - он исправил рабочий пример, а также фактический пример. Благодарю вас! Похоже, это могло быть причиной для функций cph и survift.cph в пакете rms. Объяснение в документации похоже на ваши мысли о том, почему он работал с [g]lm (объекты coxph не содержат исходных данных, а объекты cph содержат) - однако я столкнулся с другими проблемами с этим пакетом. - person alex keil; 11.11.2019