I have a data set with 6 clusters, each containing 48 (possibly censored, in which case event = 0
) survival times. The x
column contains a cluster-specific explanatory variable. I try to describe that data with a gamma frailty model as follows
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)
Here is the error message:
Error in if (history[2, 3] < (history[1, 3] + 1)) theta <- mean(history[1:2, :
missing value where TRUE/FALSE needed
Does anyone have an idea on how to debug?
Changing the method of the variance of the random effect, seems to fix the problem.
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)
Maybe this don't answer exactly your question , but when I remove any cluster e.g:
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)
})
the coxph converge and I have the same result for all samples.
I don't have enough information about your data for further analysis but I Tried to do some comparison between different clusters.
library(ggplot2
qplot(data = dat, x=time , y = x , facets= event~cluster)
I notice that 3 groups :
The problem is with the data; you cannot separate cluster-specific effects from your x
if all of the x
are the same in each cluster
.
Looking at the distribution of x
in your data by cluster we can see this:
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
Which is I think what you mean by cluster-specific explanatory variable. This will be a problem in any model because x
is collinear (I think that is the word) with cluster
. Even trying the most basic model:
data$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
The matrix is singular because there is no way to differentiate between the effects of cluster
and x
.
If you have no other variables besides cluster
and x
, then all you can really do is run the effect of the cluster alone:
data$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
Consider that both cluster1
and cluster6
have the same value of x
, and the hazard ratio between them is 83. Perhaps cluster6
was different, perhaps x
acts differently within cluster6
: you can't tell the difference because of the way the data is structured.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With