Estou tentando executar uma regressão de Cox em um exemplo de conjunto de dados de 2.000.000 de linhas da seguinte maneira, usando apenas R. Esta é uma tradução direta de um PHREG no SAS. A amostra é representativa da estrutura do conjunto de dados original.
##
library(survival)
### Replace 100000 by 2,000,000
test <- data.frame(start=runif(100000,1,100), stop=runif(100000,101,300), censor=round(runif(100000,0,1)), testfactor=round(runif(100000,1,11)))
test$testfactorf <- as.factor(test$testfactor)
summ <- coxph(Surv(start,stop,censor) ~ relevel(testfactorf, 2), test)
# summary(summ)
##
user system elapsed
9.400 0.090 9.481
O principal desafio está no tempo de computação do conjunto de dados original (2m linhas). Tanto quanto eu entendo, no SAS, isso pode levar até 1 dia, ... mas pelo menos termina.
A execução do exemplo com apenas 100.000 observações leva apenas 9 segundos. Posteriormente, o tempo aumenta quase quadraticamente para cada 100.000 incrementos no número de observações.
Não encontrei nenhum meio de paralelizar a operação (por exemplo, podemos aproveitar uma máquina de 48 núcleos, se isso for possível)
Nenhum
biglm
pacote da Revolution Analytics está disponível para regressão de Cox e, portanto, não posso aproveitá-los.
Existe um meio de representá-lo em termos de regressão logística (para a qual existem pacotes no Revolution) ou se existem outras alternativas para esse problema? Eu sei que eles são fundamentalmente diferentes, mas é o mais próximo que posso assumir como uma possibilidade, dadas as circunstâncias.
Respostas:
Eu corro a regressão cox em um conjunto de dados de observação 7'000'000 usando R e isso não é um problema. De fato, nos modelos bivariados, recebo as estimativas em 52 segundos. Eu sugiro que, como R frequentemente, seja um problema relacionado à RAM disponível. Você pode precisar de pelo menos 12 GB para executar o modelo sem problemas.
fonte
Eu fui diretamente para a função hardcore fit ( agreg.fit ), que por baixo do capô é chamada para os cálculos:
No entanto, o tempo decorrido ao dobrar o tamanho da amostra fica quadrático, como você mencionou. Também diminuir o epsilon no coxph.control não ajuda.
fonte