Nothing
library(coxme)
options(na.action='na.exclude', contrasts=c('contr.treatment', 'contr.poly'))
aeq <- function(x,y, ...) all.equal(as.vector(x), as.vector(y), ...)
#
# Same data set as slope1
#
set.seed(56)
n.subject <- seq(180, by=21, length=9) # number of subjects
slope <- sort(-.5 + rnorm(9, sd=.5)) # true treament effects
inst <- rep(1:9, n.subject)
n <- length(inst)
simdata <- data.frame(id=1:n, inst=inst,
trt= rep(0:1, length=n),
age= runif(n, 40, 70))
#risk goes up 30%/decade of age
simdata$hazard <- .8* exp(simdata$trt * rep(slope, n.subject) +
(simdata$age-55) * .03)
rtime <- function(hazard, censor=c(1,2)) {
stime <- rexp(length(hazard), rate=hazard)
ctime <- runif(length(hazard), censor[1], censor[2])
list(time= pmin(stime, ctime), status=1*(stime <=ctime))
}
temp <- rtime(simdata$hazard)
simdata$time <- temp$time
simdata$status <- temp$status
contr.none <- function(n,contrasts=T) {
if(is.numeric(n) && length(n) == 1.)
levs <- 1.:n
else {
levs <- n
n <- length(n)
}
contr <- array(0., c(n, n), list(levs, levs))
contr[seq(1., n^2., n + 1.)] <- 1.
contr
}
options(contrasts=c('contr.none', 'contr.poly'))
igchol <- function(x) {
dd <- diag(x)
ll <- as.matrix(x)
ll %*% diag(dd) %*% t(ll)
}
#Hammer through fit3 an iteration at a time
# Iteration 0, first form
cox1 <- coxph(Surv(time, status) ~ factor(inst)*trt + age, simdata,
iter=0, x=T)
indx <- c(1:9, 12:20, 11,10) #order of variables in coxph
cx1 <- cox1$x[,indx]
cox1 <- coxph(Surv(time, status) ~ cx1, simdata, iter=0, x=T)
dt1 <- coxph.detail(cox1)
u1 <- apply(dt1$score, 2, sum)
imat1 <- apply(dt1$imat,1:2, sum)
fit3a <- coxme(Surv(time, status) ~ age + trt + (1|inst) + (trt|inst),
simdata, vfixed=list(.1,.3), iter=0)
aeq(u1, fit3a$u)
pen1 <- diag(c(rep(1/.1,9), rep(1/.3,9), 0,0))
aeq(imat1+pen1, as.matrix(igchol(fit3a$hmat)))
# Iteration 0, second form
idlist <- sort(outer(1:9, 0:1, paste, sep='/'))
mat1 <- matrix(diag(18), 18, dimnames=list(idlist, idlist))
mat2 <- bdsBlock(idlist, rep(1:9, each=2))
mat3 <- diag(rep(0:1, 9))
dimnames(mat3) <- list(idlist, idlist)
fit3b <- coxme(Surv(time, status) ~ age + trt + (1|inst/trt), simdata,
varlist=coxmeMlist(list(mat2, mat3), rescale=F, pdcheck=F),
vfixed=c(.1,.3), iter=0)
group <- strata(simdata$inst, simdata$trt, shortlabel=T, sep='/')
cox2 <- coxph(Surv(time, status) ~ group + age + trt, simdata,
iter=0, x=T)
dt2 <- coxph.detail(cox2)
u2 <- apply(dt2$score, 2, sum)
aeq(fit3b$u, u2)
imat2 <- apply(dt2$imat, 1:2, sum)
pen2 <- matrix(0., 20,20)
pen2[1:18, 1:18] <- solve(.1*mat2 + .3*mat3)
aeq(imat2 + pen2, as.matrix(igchol(fit3b$hmat)))
# This function should map between coefficients
map <- matrix(0, 20,20)
for (i in 1:9) {
map[i, 2*i -1] <- 1
map[i+9, 2*i -1] <- -1
map[i+9, 2*i] <- 1
}
map[19,19] <- 1
map[20,20] <- 1
aeq(u1 %*%map, u2) #scores map
aeq(pen2, t(map) %*% pen1 %*% map) #penalty matrices map
aeq(imat2, t(map) %*% imat1 %*% map) # Cox variances map
# Now iteration 1
step1 <- solve(imat1 + pen1, u1)
step2 <- solve(imat2 + pen2, u2)
aeq(solve(fit3a$hmat, fit3a$u), step1)
aeq(solve(fit3b$hmat, fit3b$u), step2)
fit3a.1 <- coxme(Surv(time, status) ~ age + trt + (1|inst) + (trt|inst),
simdata, vfixed=list(.1,.3), iter=1)
aeq(c(unlist(ranef(fit3a.1)), fixef(fit3a.1)), step1)
fit3b.1 <- coxme(Surv(time, status) ~ age + trt + (1|inst/trt), simdata,
varlist=coxmeMlist(list(mat2, mat3), rescale=F, pdcheck=F),
vfixed=c(.1,.3), iter=1)
aeq(c(unlist(ranef(fit3b.1)), fixef(fit3b.1)), step2)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.