使用 R(大数据)进行大规模 Cox 回归

机器算法验证 r 物流 生存 sas cox模型
2022-03-16 04:27:00

我正在尝试仅使用 R 在样本 2,000,000 行数据集上运行 Cox 回归,如下所示。这是 SAS 中 PHREG 的直接翻译。样本代表了原始数据集的结构。

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

主要挑战在于原始数据集(2m 行)的计算时间。据我了解,在 SAS 中,这可能需要长达 1 天的时间,......但至少它完成了。

  • 运行仅包含 100,000 个观测值的示例仅需 9 秒。此后,观察次数每增加 100,000 次,时间几乎呈二次方增长。

  • 我还没有找到任何方法来并行化操作(例如,如果可能的话,我们可以利用 48 核机器)

  • Revolution Analytics 的任何软件包都biglm不能用于 Cox 回归,因此我无法利用这些。

有没有一种方法可以用逻辑回归(Revolution 中有包)来表示这个问题,或者这个问题是否还有其他替代方案?我知道它们在根本上是不同的,但鉴于这种情况,这是我能假设的最接近的可能性。

2个回答

我使用 R 在 7'000'000 观察数据集上运行 cox 回归,这不是问题。事实上,在双变量模型上,我在 52 秒内得到了估计值。我建议它与 R 一样经常是与可用 RAM 相关的问题。您可能需要至少 12GB 才能顺利运行模型。

我直接进入了硬核拟合函数(agreg.fit),它在引擎盖下被调用来进行计算:

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)

但是,正如您所提到的,将样本量加倍时所用的时间是二次的。减少 coxph.control中的 epsilon也无济于事。