随机坡度Cox比例危害

时间:2018-07-09 12:57:32

标签: cox-regression random-effects

我一直在尝试使用coxme为模型中的每个协变量提取随机斜率。

library (coxme)
Start <- runif(5000, 1985, 2015)
Stop <- Start + runif(5000, 2, 10)
S <- data.frame (
  X1 <- runif(5000, 5.0, 7.5),
  X2 <- runif(5000, 5.0, 7.5),
  D <- rbinom(5000, 1, 0.8), 
  Letters <- sample(LETTERS, 5000, replace = TRUE), 
  Start <- Start,
  Stop <- Stop
  )

S_ind1 <- Surv (time = S$Start, time2 = S$Stop, event = S$D)
a <- coxme (S_ind1 ~ X1 + X2 + (X1 + X2|Letters), data = S)

我得到的是:

Error in gchol(kfun(theta, varlist, vparm, ntheta, ncoef)) : 
NA/NaN/Inf in foreign function call (arg 5)
In addition: Warning messages:
1: In sqrt(xvar * zvar) : NaNs produced
2: In sqrt(xvar * zvar) : NaNs produced

使用我自己的数据时,我经常得到:

Error in coxme.fit(X, Y, strats, offset, init, control, weights = weights,  : 
  'Calloc' could not allocate memory (56076596 of 8 bytes)

是否可以使用coxme包括随机斜率?

如果没有,是否还有其他使用其他软件包的替代方法?

1 个答案:

答案 0 :(得分:1)

coxme软件包作者Terry Therneau的回答-他要求我在此处发布。

下面是我对您的示例的重写,删除了Surv间接寻址,并在data.frame调用中使用了“ =”(对于<-在这种情况下有效,我感到有些惊讶),并添加了set.seed因此该示例是可重复的。

library (coxme)

set.seed(1953)
time1 <- runif(5000, 1985, 2015)
time2 <- time1 + runif(5000, 2, 10)
test <- data.frame (
  x1 = runif(5000, 5.0, 7.5),
  x2 = runif(5000, 5.0, 7.5),
  death = rbinom(5000, 1, 0.8), 
  letters = sample(LETTERS, 5000, replace = TRUE), 
  time1 = time1,
  time2 = time2)

fit1 <- coxme(Surv(time1, time2, death) ~ x1 + x2 + (1|letters), data=test)
fit2 <- coxme(Surv(time1, time2, death) ~ x1 + x2 + (1+x1 | letters), test)
fit3 <- coxme(Surv(time1, time2, death) ~ x1 + x2 + (1+x2 | letters), test)
fit4 <- coxme(Surv(time1, time2, death) ~ x1 + x2 + (1+ x1 + x2 | letters),
              data=test, vinit= c(1e-6, 1e-8, 1e-8))

* 1。所有模型都可以工作到fit4。

  1. 我发现您的模型令人担忧,因为它的斜率是随机的,但没有随机的截距,就像通过原点进行的所有回归都使我担心的那样:我很难插拔结果。尽管lme默认将拦截项放在其中,但coxme不会。

  2. 我希望fit4能够奏效,并且可能会有更好的初始估计。 Coxme的基础代码是我在所有生存工作中遇到的最困难的最大化问题,在某种意义上说,最大化器很容易丢失并且永远找不到解决方法,这是很难的。该功能有时需要通过有限的迭代次数和/或起始估算来掌握。我希望不是这样,并且我有一些长期计划,通过添加基于MCMC的备用最大化器来改善此问题,从理论上讲,它不会丢失,但是会花费更长的计算时间。

  3. 如果任何方差太接近零,则sqrt()消息倾向于作为舍入误差的函数出现。当然,在您的测试用例中,实际MLE的方差为0。当发生这种情况时,我经常会通过对固定方差序列(vfixed参数)进行拟合来直接检查零方差。如果似然性是恒定的或随着方差达到1e-6或更小而增加,则我认为MLE为零,并从模型中删除该随机项。 特里·T。*