在R(coxph)中拟合伽玛脆弱模型

时间:2012-12-03 06:39:03

标签: r error-handling

我有一个data set有6个群集,每个群集包含48个(可能是审查,在这种情况下为event = 0)生存时间。 x列包含特定于群集的解释变量。我尝试使用伽玛脆弱模型描述该数据如下

 library(survival)

 mod <- coxph(Surv(time, event) ~ 
   x + frailty.gamma(cluster, eps=1e-10, method="em", sparse=0),
              outer.max=1000, iter.max=10000,
              data=data)

以下是错误消息:

Error in if (history[2, 3] < (history[1, 3] + 1)) theta <- mean(history[1:2,  : 
  missing value where TRUE/FALSE needed

有没有人知道如何调试?

3 个答案:

答案 0 :(得分:8)

替代解决方案:更改方差因子

改变随机效应的方差方法似乎可以解决问题。

e.g:

mod.aic <- coxph(Surv(time, event) ~ 
               x + frailty.gamma(cluster, eps=1e-10, method="aic", sparse=0),
             outer.max=1000, iter.max=10000,
             data=dat)

plot(survfit(mod.aic), col=4)

enter image description here

ddd hoc解决方案:如果我们删除一个群集

,则有效

也许这不能完全回答你的问题,但当我删除任何群集时,例如:

par(mfrow=c(2,3))
res <- sapply( 1:6 , function(x) {
                      mod <- 
                        coxph(Surv(time, event) ~ 
                        x + frailty.gamma(cluster, eps=1e-10, method="em", sparse=0),
                        outer.max=1000, iter.max=10000,
                        data=subset(dat,cluster != x)
                        )
                     plot(survfit(mod), col=4,main= paste ('cluster', x, 'is removed'))
                     legend(10,1,mod$iter)
              })

coxph收敛,我对所有样本都有相同的结果。

enter image description here

我没有足够的有关您的数据的信息以供进一步分析,但我试图在不同的群集之间进行一些比较。

library(ggplot2
qplot(data = dat, x=time , y = x , facets= event~cluster)

enter image description here

我注意到3组:

  1. 集群1,3,5:事件均匀分布
  2. 群集2,4:事件只是很短的时间。
  3. 群集6:惊人的(仅限事件1)

答案 1 :(得分:4)

问题在于数据;如果xx的所有cluster都相同,则无法将特定于群集的效果与x分开。

按群集查看数据中table(data$x,data$cluster) 1 2 3 4 5 6 0 0 48 0 48 48 0 1 48 0 48 0 0 48 的分布情况,我们可以看到:

x

我认为特定于群集的解释变量的含义是什么。这将是任何模型中的问题,因为clusterdata$cluster<-as.factor(data$cluster) mod <- coxph(Surv(time, event) ~ x + cluster, data=data) Warning message: In coxph(Surv(time, event) ~ x + cluster, data = data) : X matrix deemed to be singular; variable 5 共线(我认为这是单词)。即使尝试最基本的模型:

cluster

矩阵是单数的,因为无法区分xcluster的效果。

如果除了xdata$cluster<-as.factor(data$cluster) coxph(Surv(time, event) ~ cluster,data=data) Call: coxph(formula = Surv(time, event) ~ cluster, data = data) coef exp(coef) se(coef) z p cluster2 1.070 2.92 0.382 2.80 5.1e-03 cluster3 0.499 1.65 0.384 1.30 1.9e-01 cluster4 1.705 5.50 0.365 4.68 2.9e-06 cluster5 2.058 7.83 0.370 5.56 2.7e-08 cluster6 4.415 82.69 0.399 11.06 0.0e+00 之外没有其他变量,那么你所能做的就是单独运行集群的效果:

cluster1

考虑cluster6x都具有相同的cluster6值,它们之间的风险比为83.也许x不同,也许{{1}在cluster6中行为不同:由于数据的结构方式,你无法区分它们。

答案 2 :(得分:3)

以下是Terry Therneau(coxph的作者)给出的答案。

我看了你的数据:

> table(x, cluster)
     1  2  3  4  5  6
  0  0 48  0 48 48  0
  1 48  0 48  0  0 48

您的协变量“x”完全由群集变量预测。 如果您适合固定效果模型:   coxph(Surv(时间,事件)〜因子(簇)+ x)

然后将“x”变量声明为冗余。当随机效应的方差是 足够大,当方差足够大时,在伽马模型中也会发生同样的情况。您的模型接近此限制,解决方案失败。如手册页中所述,现在首选coxme函数。

最后,您的特定错误消息是由“稀疏”的无效值引起的。我会在程序中添加一张支票。 您可能希望“sparse = 10”强制进行非稀疏计算。