Regressão Cox em larga escala com R (Big Data)

8

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 biglmpacote 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.

xbsd
fonte
2
A regressão logística condicional e a regressão de Cox estão estritamente relacionadas. stayconsistent.wordpress.com/2009/01/25/…
boscovich
coxphcoxphapply

Respostas:

2

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.

Mesozoik
fonte
1

Eu fui diretamente para a função hardcore fit ( agreg.fit ), que por baixo do capô é chamada para os cálculos:

n <- nrow(test)
y <- as.matrix(test[, 1:3])
attr(y, "type") <- "right"
x <- matrix(1:11, n, 11, byrow=TRUE)
colnames(x) <- paste("level", 1:11, sep="")
x <- x[, -2] == test$testfactor
mode(x) = "numeric"

fit2 <- agreg.fit(x, y, strata=NULL, control=coxph.control(), method="efron", 
                  init=rep(0, 10), rownames=1:n)

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.

lambruscoAcido
fonte