2015-03-13 60 views
1

我試圖擬合一個大的離散比例 - 危害模型(〜100k行,〜10k事件)。爲此,我使用coxph(..., method = "exact")所推薦survival package documentation文檔,其中指出:R的Cox迴歸中的「精確」關係的分割錯誤

「精確局部可能性」是相當於一個條件Logistic模型,並且當所述的時間是一個小組離散值是適當的。如果存在大量關係和(開始,停止)式生存數據,則計算時間將過度。

大約有與coxph和大量關係的計算難度一些警告,但根據在同一個包的文檔clogit

確切的局部可能性的計算可能會很慢但是。如果一個特定的階層有20個主題中的10個,我們必須加上一個分母,其中包含選擇20箇中的10個,即20!/(10!10!)= 184756個術語的所有可能的方式。 Gail等人描述了一種快速遞歸方法,該方法在很大程度上改善了這一點;它被合併到survival包的2.36-11版中。

所以我沒想到計算問題太糟糕了。儘管如此,當我嘗試在我的數據集上擬合一個不重要的(單預測)Cox模型的變體時,我遇到了很多分割錯誤。一個是「C堆棧溢出」,導致在短期和甜(和無信息)消息:

Error: segfault from C stack overflow 
Execution halted 

另一種是「存儲器未被映射」的錯誤,當我意外翻轉「事件」布爾發生所以,我不得不〜90K事件,而不是〜10K:

*** 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 
+0

您可以使用'survival'中包含的任何數據集來重現嗎? (使用'data(package ='survival')'列出這些) – jaimedash 2015-03-13 19:57:23

+1

Segfaults應該提示你打包一個可重複的例子並將它發送給Terry Therneau。據我所知他不經常訪問。 – 2015-03-13 20:07:16

+0

@BondedDust:謝謝你的提醒。不過,我也很想知道是否有任何可能的解決方法,直到錯誤得到修復。 – 2015-03-13 20:47:22

回答

1

我能夠使之與泊松模型數據集。 (我有一個大的數據集,我很不願意冒險在一個可能的段錯誤。)

fit <- glm( I(status == 0) ~ litter +offset(log(time)), 
       data = data, family=poisson) 

> fit 

Call: glm(formula = I(status == 0) ~ litter + offset(log(time)), family = poisson, 
    data = data) 

Coefficients: 
(Intercept)  litter 
    -4.706485 -0.003883 

Degrees of Freedom: 149999 Total (i.e. Null); 149998 Residual 
Null Deviance:  60500 
Residual Deviance: 60150 AIC: 280200 

litter影響這個估計應該是類似於您從考克斯PH模型得到什麼。 ststu

+0

哦,我之前沒有見過泊松偏移技巧。這很聰明!不過,這種模式不是假設有一個持續的危險嗎? – 2015-03-13 21:44:22

+0

是的,但'coxph'也承擔了一個持續的相對危險。 – 2015-03-13 21:46:16

+0

對不起,我的意思是泊松迴歸假設*基線*危險函數是恆定的,而不僅僅是恆定的相對危險性(而Cox迴歸沒有對基線危險的形狀作出任何假設,儘管它假設任何兩個數據點之間的恆定風險比)。 – 2015-03-13 21:53:37