
R version 2.15.0 (2012-03-30)
Copyright (C) 2012 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: i686-pc-linux-gnu (32-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library(coxme)
Loading required package: survival
Loading required package: splines
Loading required package: bdsmatrix

Attaching package: 'bdsmatrix'

The following object is masked from 'package:base':

    backsolve

Loading required package: nlme
Loading required package: Matrix
Loading required package: lattice
> 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
> 
> #
> # Test out the refine.n code, using the simdata
> #  A simple diagonal variance
> #
> # For original testing we had nsim=100, changed to 10 for a CRAN speedup
> nsim <- 10
> var  <- .3   #sizeable
> 
> set.seed(20)
> fit1 <- coxme(Surv(time, status) ~ age + trt + (trt|inst) + strata(inst),
+               vfixed=.3, simdata, refine.n=nsim, refine.detail=TRUE)
> 
> debug <- fit1$refine.detail 
> 
> nfrail <- length(unlist(ranef(fit1)))
> hmatbb <- fit1$hmat[1:nfrail, 1:nfrail]
> bhat <- unlist(ranef(fit1))  #random coefs
> set.seed(20)
> rdf <- coxme.control()$refine.df
> bmat <- matrix(rnorm(nfrail*nsim), nfrail)  # replicate the simulations
> bmat <- backsolve(hmatbb, bmat) /
+     rep(sqrt(rchisq(nsim, rdf)/rdf), each=nfrail)
> bmat <- bmat + bhat
> if (!is.null(debug)) all.equal(bmat, debug$bmat)
[1] TRUE
> 
> clog <- double(nsim)
> Xmat <- scale(as.matrix(simdata[,c('age', 'trt')]), fit1$means, FALSE)
> 
> # Part 1, loglik for a set of nearby Cox models
> fix.lp <- Xmat %*% fixef(fit1)
> for (i in 1:nsim) {
+     lp <- fix.lp + bmat[simdata$inst,i]*simdata$trt
+     tfit <- coxph(Surv(time, status) ~ offset(lp) + strata(inst), simdata)
+     clog[i] <- tfit$loglik
+     }
> if (!is.null(debug)) aeq(clog, debug$loglik)
[1] TRUE
> 
> # Part 2: Taylor series for the PPL
> b.sig <- t(bmat-bhat) %*% hmatbb  #b time sqrt(H)
> taylor <- rowSums(b.sig^2)/2
> 
> temp2 <- cbind(clog-colSums(bmat^2)/.6 , fit1$log[3] - taylor)
> m2 <- fit1$log[2]
> errhat <- exp(temp2[,1]-m2) - exp(temp2[,2]-m2)
> 
> require(mvtnorm)
Loading required package: mvtnorm
> tdens <- dmvt(t(bmat), delta=bhat, sigma=as.matrix(solve(hmatbb)), df=rdf)
> gdens <- -(log(2*pi) + log(.3))*nfrail/2
> 
> errhat <- errhat * exp(gdens-tdens)  # account for importance sampling dis
> if (!is.null(debug)) {
+     aeq(errhat, debug$errhat)
+     }
[1] TRUE
> mtemp <- mean(errhat)
> aeq(c(log(1+ mean(errhat)), sqrt(var(errhat)/nsim)/(1+mtemp)), fit1$refine)
[1] TRUE
> 
> 
> proc.time()
   user  system elapsed 
  2.300   0.044   2.338 
