Я пытаюсь подогнать большую дискретную модель пропорциональных опасностей (~ 100 тыс. строк, ~ 10 тыс. событий). Для этого я использовал coxph(..., method = "exact")
, как рекомендовано в документации пакета выживания. документация, в которой указано:
«Точное частичное правдоподобие» эквивалентно условной логистической модели и подходит, когда время представляет собой небольшой набор дискретных значений. Если имеется большое количество ничьих и (старт, стоп) данных о выживании стиля, время вычислений будет чрезмерным.
Были некоторые предупреждения о вычислительной сложности с coxph
и большом количестве связей, но согласно документации для clogit
в том же пакете:
Однако вычисление точного частичного правдоподобия может быть очень медленным. Если в определенной страте было, скажем, 10 событий из 20 предметов, мы должны сложить знаменатель, включающий все возможные способы выбора 10 из 20, что составляет 20!/(10! 10!) = 184756 членов. Гейл и др. описывают метод быстрой рекурсии, который в значительной степени улучшает это; он был включен в версию 2.36-11 пакета
survival
.
Так что я не ожидал, что вычислительные проблемы будут слишком плохими. Тем не менее, я столкнулся со многими ошибками сегментации, когда пытался подогнать варианты тривиальной (с одним предиктором) модели Кокса к моему набору данных. Одним из них является «переполнение стека C», что приводит к короткому и приятному (и неинформативному) сообщению:
Error: segfault from C stack overflow
Execution halted
Другая ошибка «память не отображается», которая произошла, когда я случайно перевернул логическое значение «событие», так что у меня было ~ 90 000 событий вместо ~ 10 000:
*** caught segfault ***
address 0xffffffffac577830, cause 'memory not mapped'
Traceback:
1: fitter(X, Y, strats, offset, init, control, weights = weights, method = method, row.names(mf))
2: coxph(Surv(time, status == EVENT.STATUS) ~ litter, data = data, method = "exact")
aborting ...
Для справки, код, который я запускаю, просто coxph(Surv(t, d) ~ x, data = data, method = 'exact')
. t
— столбец целых чисел, d
— логическое значение, а x
— число с плавающей запятой.
Это известные проблемы? Существуют ли обходные пути?
РЕДАКТИРОВАТЬ: Вот некоторый код, воспроизводящий проблему в наборе данных rats
(реплицируется 1000 раз):
library(survival)
print("constructing data")
data <- rats
SIZE <- nrow(rats)
# passes with 100 reps, but fails with 100 on my machine (MacBook Pro, 16g RAM)
REPS <- 1000
# set to 0 for "memory not mapped", 1 for "C stack overflow"
EVENT.STATUS <- 0
data <- data[rep(seq_len(SIZE), REPS), ]
print(summary(data$status == EVENT.STATUS))
print("fitting model")
fit <- coxph(Surv(time, status == EVENT.STATUS) ~ litter,
data = data, method = "exact")
А вот version
:
platform x86_64-apple-darwin14.0.0
arch x86_64
os darwin14.0.0
system x86_64, darwin14.0.0
status
major 3
minor 1.2
year 2014
month 10
day 31
svn rev 66913
language R
version.string R version 3.1.2 (2014-10-31)
nickname Pumpkin Helmet
survival
? (используйте `data(package='survival')`, чтобы перечислить их) - person jaimedash   schedule 13.03.2015try
, но это не сработает с segfaults. Вы уверены, что вам нужно использовать точное? Другими моделями пропорциональных опасностей, которые, возможно, больше подходят для сгруппированных данных, являются модели Пуассона-Глма. - person IRTFM   schedule 13.03.2015try
также не будет полезен, даже если он сработает для segfault, потому что мне нужно фактически обучить модель, а не просто восстановиться после ошибки. - person Ben Kuhn   schedule 13.03.2015