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