Я выполняю перекрестную проверку модели пропорциональных рисков конкурирующих рисков. С помощью mstate
pacakge я подготовил свои данные и подгоняю их с survival::coxph
. Я получаю подобранный объект модели Кокса для моих обучающих данных, но я хочу оценить частичную вероятность моих обученных коэффициентов с моими тестовыми данными.
Если мне нужно, я сам напишу функцию частичного правдоподобия, но я бы предпочел этого не делать (хотя, вероятно, это было бы хорошо для меня). Пакет выживания вычисляет в этом коде C, но расчет вероятности встроена в функцию подгонки. Может быть, есть способ исправить параметры или какие-то другие инструменты, чтобы легко получить частичную вероятность?
Минимальный рабочий пример
# Adapted from examples in the mstate vignette
# http://cran.r-project.org/web/packages/mstate/vignettes/Tutorial.pdf
# beginning at the bottom of page 28
library(mstate)
library(survival)
# Get data. I add a second explanatory variable (badx) for illustration
# Also divide the data by subject into training and test sets.
data(aidssi)
si <- aidssi # Just a shorter name
si$badx <- sample(c("A", "B"), size = nrow(si), replace = TRUE)
si$fold <- sample(c("train", "test"), size = nrow(si), replace = TRUE, prob = c(0.7, 0.3))
tmat <- trans.comprisk(2, names = c("event-free", "AIDS", "SI"))
si$stat1 <- as.numeric(si$status == 1)
si$stat2 <- as.numeric(si$status == 2)
# Convert the data to a long competing risks format
silong <- msprep(time = c(NA, "time", "time"),
status = c(NA,"stat1", "stat2"),
data = si, keep = c("ccr5", "badx", "fold"), trans = tmat)
silong <- na.omit(silong)
silong <- expand.covs(silong, c("ccr5", "badx"))
train.dat <- subset(silong, fold == "train")
test.dat <- subset(silong, fold == "test")
Данные выглядят так:
> head(silong)
An object of class 'msdata'
Data:
id from to trans Tstart Tstop time status ccr5 badx fold ccr5WM.1 ccr5WM.2 badxB.1 badxB.2
1 1 1 2 1 0 9.106 9.106 1 WW A train 0 0 0 0
2 1 1 3 2 0 9.106 9.106 0 WW A train 0 0 0 0
3 2 1 2 1 0 11.039 11.039 0 WM B train 1 0 1 0
4 2 1 3 2 0 11.039 11.039 0 WM B train 0 1 0 1
5 3 1 2 1 0 2.234 2.234 1 WW B train 0 0 1 0
6 3 1 3 2 0 2.234 2.234 0 WW B train 0 0 0 1
Теперь переменная ccr5
может быть смоделирована как специфическая для перехода или как имеющая равный пропорциональный эффект для всех переходов. Модели бывают:
train.mod.equal <- coxph(Surv(time, status) ~ ccr5 + badx + strata(trans),
data = train.dat)
train.mod.specific <- coxph(Surv(time, status) ~ ccr5WM.1 + ccr5WM.2 + badx + strata(trans),
data = train.dat)
Теперь я хотел бы использовать тестовые данные, чтобы оценить выбор переменной относительно того, должен ли ccr5
зависеть от перехода или нет. У меня большой набор данных и множество переменных - в основном, но не все категориальных, - которые могут быть одинаковыми. Оценка - вот где я застрял.
# We can fit the same models to the test data,
# this yields new parameter estimates of course,
# but the model matrices might be useful
test.mod.equal <- coxph(Surv(time, status) ~ ccr5 + badx + strata(trans),
data = test.dat)
test.mod.specific <- coxph(Surv(time, status) ~ ccr5WM.1 + ccr5WM.2 + badx + strata(trans),
data = test.dat)
test.eq.mm <- model.matrix(test.mod.equal)
test.sp.mm <- model.matrix(test.mod.specific)
# We can use these to get the first part of the sum of the partial likelihood:
xbeta.eq <- test.eq.mm[test.dat$status == 1, ] %*% coef(train.mod.equal)
xbeta.sp <- test.sp.mm[test.dat$status == 1, ] %*% coef(train.mod.specific)
# We can also get linear predictors
lp.eq <- predict(train.mod.equal, newdata = test.dat, type = "lp")
lp.sp <- predict(train.mod.specific, newdata = test.dat, type = "lp")
Я надеюсь вычислить частичное правдоподобие для каждой из моделей на тестовых данных с оценками коэффициентов обучения. Возможно, мне стоит переместить вопрос в раздел «Перекрестная проверка» и спросить, достаточно ли близка сумма линейных предикторов (или сумма линейных предикторов, исключая цензурированные случаи) к эквивалентной мере.
predict.coxph
. - person IRTFM   schedule 04.11.2014ccr5
превосходит переменную, специфичную для перехода, тогда как переменнаяbadx
- нет (игнорируя тот факт, чтоbadx
достаточно плох, чтобы ее вообще выбросить). И я счастлив наказать модели, относящиеся к конкретному переходу, за установку дополнительного параметра. - person Gregor Thomas   schedule 05.11.2014logLik()
для получения логарифмической вероятности неомодели, а затем добавить к этому статистику теста LRT. Тогда я смогу напрямую сравнить моделиtest.eq
иtest.sp
. Или, может быть, мне просто нужно запустить нулевые модели с каждым изoffset
s ... - person Gregor Thomas   schedule 05.11.2014