Определение объема с формулами в объектах coxph - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь написать набор функций, где первая функция соответствует модели Кокса (через 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' не найден

1 Ответ

1 голос
/ 11 ноября 2019

Похоже, это работает, по крайней мере, в узком смысле, заставляя 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) по сравнению с другими типами моделей.

...