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