Régression de Cox à grande échelle avec R (Big Data)

8

J'essaie d'exécuter une régression de Cox sur un échantillon de données de 2 000 000 lignes comme suit en utilisant uniquement R. Il s'agit d'une traduction directe d'un PHREG dans SAS. L'échantillon est représentatif de la structure de l'ensemble de données d'origine.

##
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 

Le principal défi réside dans le temps de calcul de l'ensemble de données d'origine (2 m de lignes). Pour autant que je sache, en SAS, cela peut prendre jusqu'à 1 jour, ... mais au moins ça se termine.

  • L'exécution de l'exemple avec seulement 100 000 observations ne prend que 9 secondes. Par la suite, le temps augmente presque quadratique pour chaque tranche de 100 000 incréments du nombre d'observations.

  • Je n'ai trouvé aucun moyen de paralléliser l'opération (par exemple, nous pouvons exploiter une machine à 48 cœurs si cela était possible)

  • Ni biglmaucun package de Revolution Analytics n'est disponible pour la régression de Cox, et je ne peux donc pas en tirer parti.

Existe-t-il un moyen de représenter cela en termes de régression logistique (pour laquelle il existe des packages dans Revolution) ou s'il existe d'autres alternatives à ce problème? Je sais qu'ils sont fondamentalement différents, mais c'est le plus proche que je puisse supposer comme une possibilité compte tenu des circonstances.

xbsd
la source
2
La régression logistique conditionnelle et la régression de Cox sont strictement liées. stayconsistent.wordpress.com/2009/01/25/…
boscovich
avez-vous pu trouver une solution élégante à cela? Je calcule les FC à partir de pour des milliers de gènes sur plusieurs ensembles de données, et est un goulot d'étranglement. À l'heure actuelle, j'utilise pour boucler sur les gènes. La pile PS ne me laisse pas commenter car je suis un nouvel utilisateur. coxphcoxphapply
Arshi Arora

Réponses:

2

Je lance une régression cox sur un ensemble de données d'observation de 7'000'000 en utilisant R et ce n'est pas un problème. En effet, sur les modèles bivariés, j'obtiens les estimations en 52 secondes. Je suggère que c'est, comme souvent avec R, un problème lié à la RAM disponible. Vous devrez peut-être au moins 12 Go pour exécuter le modèle en douceur.

Mesozoik
la source
1

Je suis allé directement à la fonction hardcore fit ( agreg.fit ), qui sous le capot est appelée pour les calculs:

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)

Cependant, le temps écoulé lorsque le doublement de la taille de l'échantillon devient quadratique, comme vous l'avez mentionné. Diminuer également l'epsilon dans coxph.control n'aide pas.

lambruscoAcido
la source