## ----include = FALSE, label=setup---------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  ##dev="png",
  dpi=50,
  fig.width=7.15, fig.height=5.5,
  out.width="600px",
  fig.retina=1,
  comment = "#>"
  )
fullVignette <- Sys.getenv("_R_FULL_VIGNETTE_") %in% c("1","TRUE") || length(list.files("data"))==0
saveobj <- function(obj, null_elements) {
  x <- get(obj, envir=parent.frame())
  if (length(null_elements)>0) {
    print(object.size(x))
    x[null_elements] <- NULL
    attributes(x)[null_elements] <- NULL
    print(object.size(x))
  }
  saveRDS(x, paste0("data/", obj, ".rds"), compress="xz")
}

library(mets)
 cols <- c("darkred","darkblue","black")
 ltys <- c(1,3,2)
 fig_w <- 5
 fig_h <- 5
 savefig <- TRUE

## ----results="hide", echo=FALSE, eval=!fullVignette---------------------------
## To save time building the vignettes on CRAN, we cache time consuming computations
fitco1 <- readRDS("data/fitco1.rds")
fitco2 <- readRDS("data/fitco2.rds")
fitco3 <- readRDS("data/fitco3.rds")
fitco4 <- readRDS("data/fitco4.rds")
fitace <- readRDS("data/fitace.rds")
fitde <- readRDS("data/fitde.rds")
cse <- readRDS("data/cse.rds")
slr <- readRDS("data/slr.rds")
outacem <- readRDS("data/outacem.rds")
b0 <- readRDS("data/b0.rds")
b1 <- readRDS("data/b1.rds")
b2 <- readRDS("data/b2.rds")
a1 <- readRDS("data/a1.rds")
h2 <- readRDS("data/h2.rds")
concMZ <- readRDS("data/concMZ.rds")
s_mz_country <- readRDS("data/s_mz_country.rds")
s_dz_country <- readRDS("data/s_dz_country.rds")

## ----label=data-prt-----------------------------------------------------------
library(mets)
 set.seed(122)
 data(prt)
 
 dtable(prt,~status+cancer)
 dtable(prt,~zyg+country,level=1)

## ----label=survival-marginal--------------------------------------------------
 # Marginal Cox model here stratified on country without covariates 
 margph <- phreg(Surv(time,cancer)~strata(country)+cluster(id),data=prt)
 plot(margph)

## ----label=survival-pairwise1, eval=fullVignette------------------------------
# # Clayton-Oakes, MLE , overall variance
# fitco1<-twostageMLE(margph,data=prt,theta=2.7)

## -----------------------------------------------------------------------------
 summary(fitco1)

## ----label=survival-pairwise2, eval=fullVignette------------------------------
# fitco2 <- survival.twostage(margph,data=prt,theta=2.7,clusters=prt$id,var.link=0)

## -----------------------------------------------------------------------------
 summary(fitco2)

## ----label=survival-pairwise3, eval=fullVignette------------------------------
#  mm <- model.matrix(~-1+factor(zyg),prt)
#  fitco3<-twostageMLE(margph,data=prt,theta=1,theta.des=mm)

## -----------------------------------------------------------------------------
 summary(fitco3)

## ----label=survival-pairwise4, eval=fullVignette------------------------------
# fitco4 <- survival.twostage(margph,data=prt,theta=1,clusters=prt$id,var.link=0,theta.des=mm)

## -----------------------------------------------------------------------------
 summary(fitco4)
 round(estimate(coef=fitco4$coef,vcov=fitco4$var.theta)$coefmat[,c(1,3:4)],2)

 ## mz kendalls tau
 kendall.ClaytonOakes.twin.ace(fitco4$theta[2],0,K=1000)$mz.kendall
 ## dz kendalls tau
 kendall.ClaytonOakes.twin.ace(fitco4$theta[1],0,K=1000)$mz.kendall

## ----label=survival-polygenic1, eval=fullVignette-----------------------------
#  ### setting up design for random effects and parameters of random effects
#  desace <- twin.polygen.design(prt,type="ace")
# 
#  ### ace model
#  fitace <- survival.twostage(margph,data=prt,theta=1,
#        clusters=prt$id,var.link=0,model="clayton.oakes",
#        numDeriv=1,random.design=desace$des.rv,theta.des=desace$pardes)

## -----------------------------------------------------------------------------
 summary(fitace)

## ----label=survival-polygenic2, eval=fullVignette-----------------------------
#  ### ace model with positive random effects variances
#  # fitacee <- survival.twostage(margph,data=prt,theta=1,
#  #      clusters=prt$id,var.link=1,model="clayton.oakes",
#  #      numDeriv=1,random.design=desace$des.rv,theta.des=desace$pardes)
#  #summary(fitacee)
# 
#  ### ae model
#  #desae <- twin.polygen.design(prt,type="ae")
#  #fitae <- survival.twostage(margph,data=prt,theta=1,
#  #      clusters=prt$id,var.link=0,model="clayton.oakes",
#  #      numDeriv=1,random.design=desae$des.rv,theta.des=desae$pardes)
#  #summary(fitae)
# 
#  ### de model
#  desde <- twin.polygen.design(prt,type="de")
#  fitde <- survival.twostage(margph,data=prt,theta=1,clusters=prt$id,var.link=0,model="clayton.oakes",
# numDeriv=1,random.design=desde$des.rv,theta.des=desde$pardes)
# 

## -----------------------------------------------------------------------------
summary(fitde)

## -----------------------------------------------------------------------------
prt <-  force.same.cens(prt,cause="status")

 dtable(prt,~status+cancer)
 dtable(prt,~status+country)
 dtable(prt,~zyg+country)

## ----label=concordance--------------------------------------------------------
 ## cumulative incidence with cluster standard errors.
 cif1 <- cif(Event(time,status)~strata(country)+cluster(id),prt,cause=2)
 plot(cif1,se=1)

 cifa <- cif(Event(time,status)~+1,prt,cause=2)

 ### concordance estimator, ignoring country differences. 
 p11 <- bicomprisk(Event(time,status)~strata(zyg)+id(id),data=prt,cause=c(2,2))
p11mz <- p11$model$"MZ"
p11dz <- p11$model$"DZ" 

## -----------------------------------------------------------------------------
 par(mfrow=c(1,2))
 ## Concordance
 plot(p11mz,ylim=c(0,0.1));
 plot(p11dz,ylim=c(0,0.1));

## ----label=concordance2-------------------------------------------------------
 library(prodlim)
 outm <- prodlim(Hist(time,status)~+1,data=prt)

 cifzyg <- cif(Event(time,status)~+strata(zyg)+cluster(id),data=prt,cause=2)
 cifprt <- cif(Event(time,status)~country+cluster(id),data=prt,cause=2)
     
 times <- 70:100
 cifmz <- predict(outm,cause=2,time=times,newdata=data.frame(zyg="MZ")) ## cause is 2 (second cause) 
 cifdz <- predict(outm,cause=2,time=times,newdata=data.frame(zyg="DZ"))
    
 ### concordance for MZ and DZ twins<
 cc <- bicomprisk(Event(time,status)~strata(zyg)+id(id),data=prt,cause=c(2,2),prodlim=TRUE)
 ccdz <- cc$model$"DZ"
 ccmz <- cc$model$"MZ"
     
 cdz <- casewise(ccdz,outm,cause.marg=2) 
 cmz <- casewise(ccmz,outm,cause.marg=2)

 dd <- bicompriskData(Event(time,status)~country+strata(zyg)+id(id),data=prt,cause=c(2,2))
 conczyg <- cif(Event(time,status)~strata(zyg)+cluster(id),data=dd,cause=1)

 par(mfrow=c(1,2))
 plot(conczyg,se=TRUE,col=cols[2:1], lty=ltys[2:1], legend=FALSE,xlab="Age",ylab="Concordance")
 legend("topleft",c("concordance-MZ","concordance-DZ"),col=cols[1:2],lty=ltys[1:2])

 plot(cmz,ci=NULL,ylim=c(0,.8),xlim=c(70,97),legend=FALSE,col=cols[c(1,3,3)],lty=ltys[c(1,3,3)],
      ylab="Casewise",xlab="Age")
  plot(cdz,ci=NULL,ylim=c(0,.8),xlim=c(70,97),legend=FALSE,ylab="Casewise",xlab="Age",
      col=c(cols[2],NA,NA), lty=ltys[c(2,3,3)], add=TRUE)
 with(data.frame(cmz$casewise),plotConfRegionSE(time,casewise.conc,se.casewise,col=cols[1]))
 with(data.frame(cdz$casewise),plotConfRegionSE(time,casewise.conc,se.casewise,col=cols[2]))
 legend("topleft",c("casewise-MZ","casewise-DZ","marginal"),col=cols, lty=ltys, bg="white")

 summary(cdz)
 summary(cmz)

 cpred(cmz$casewise,c(70,80))
 cpred(cdz$casewise,c(70,80))

## ----label=concordance3-------------------------------------------------------

 dd <- bicompriskData(Event(time,status)~country+strata(zyg)+id(id),data=prt,cause=c(2,2))
 conczyg <- cif(Event(time,status)~strata(zyg)+cluster(id),data=dd,cause=1)

 par(mfrow=c(1,2))
 plot(conczyg,se=TRUE,legend=FALSE,xlab="Age",ylab="Concordance")
 legend("topleft",c("concordance-DZ","concordance-MZ"),col=c(1,2),lty=1)
 plot(cmz,ci=NULL,ylim=c(0,0.6),xlim=c(70,100),legend=FALSE,col=c(2,3,3),ylab="Casewise",xlab="Age",lty=c(1,3))
 plot(cdz,ci=NULL,ylim=c(0,0.6),xlim=c(70,100),legend=FALSE,ylab="Casewise",xlab="Age",
      col=c(1,3,3), add=TRUE, lty=c(2,3))
 legend("topleft",c("casewise-MZ","casewise-DZ","marginal"),col=c(2,1,3),lty=1)
 with(data.frame(cmz$casewise),plotConfRegionSE(time,casewise.conc,se.casewise,col=2))
 with(data.frame(cdz$casewise),plotConfRegionSE(time,casewise.conc,se.casewise,col=1))


## ----label=concordance4, eval=fullVignette------------------------------------
#  ### new version of Casewise for specific time-point based on binreg
#  dd <- bicompriskData(Event(time,status)~country+strata(zyg)+id(id),data=prt,cause=c(2,2))
#  newdata <- data.frame(zyg=c("DZ","MZ"),id=1)
# 
#  ## concordance
#  bcif1 <- binreg(Event(time,status)~-1+factor(zyg)+cluster(id),dd,time=80,cause=1,cens.model=~strata(zyg))
#  pconc <- predict(bcif1,newdata)
# 
#  ## marginal estimates
#  mbcif1 <- binreg(Event(time,status)~cluster(id),prt,time=80,cause=2)
#  mc <- predict(mbcif1,newdata)
# 
#  ### casewise with improved se's from log-scale
#  cse <- binregCasewise(bcif1,mbcif1)

## -----------------------------------------------------------------------------
 cse 

## ----label=semiparconc, eval=fullVignette-------------------------------------
#  ### semi-parametric modelling of concordance
#  dd <- bicompriskData(Event(time,status)~country+strata(zyg)+id(id),data=prt,cause=c(2,2))
#  regconc <- cifreg(Event(time,status)~country*zyg,data=dd,prop=NULL)
#  regconc
#  ### interaction test
#  wald.test(regconc,coef.null=5:7)
# 
#  regconc <- cifreg(Event(time,status)~country+zyg,data=dd,prop=NULL)
#  regconc
# 
#  ## logistic link
#  logitregconc <- cifreg(Event(time,status)~country+zyg,data=dd)
#  slr <- summary(logitregconc)

## -----------------------------------------------------------------------------
slr
### library(Publish)
### publish(round(slr$exp.coef[,-c(2,5)],2),latex=TRUE,digits=2)

## ----label=additive_gamma, eval=fullVignette----------------------------------
#  timereg <- 0
# if (timereg==1) {
#   times <- seq(50,90,length.out=5)
#   cif1 <- timereg::comp.risk(Event(time,status)~-1+factor(country)+cluster(id),prt,
# 		   cause=2,times=times,max.clust=NULL)
# 
#   mm <- model.matrix(~-1+factor(zyg),prt)
#   out1<-random.cif(cif1,data=prt,cause1=2,cause2=2,theta=1,
# 		  theta.des=mm,same.cens=TRUE,step=0.5)
#   summary(out1)
#   round(estimate(coef=out1$theta,vcov=out1$var.theta)$coefmat[,c(1,3:4)],2)
# 
#   desace <- twin.polygen.design(prt,type="ace")
# 
#   outacem <- Grandom.cif(cif1,data=prt,cause1=2,cause2=2,
#   	 same.cens=TRUE,theta=c(0.45,0.15),var.link=0,
#          step=0.5,theta.des=desace$pardes,random.design=desace$des.rv)
#   ##outacem$score
# }

## -----------------------------------------------------------------------------
timereg <- 0
if (timereg==1) {
  summary(outacem)

 ###  variances
 estimate(coef=outacem$theta,vcov=outacem$var.theta,f=function(p) p/sum(p)^2)

 ## AE polygenic model
 # desae <- twin.polygen.design(prt,type="ae")
 # outaem <- Grandom.cif(cif1,data=prt,cause1=2,cause2=2,
 #    same.cens=TRUE,theta=c(0.45,0.15),var.link=0,
 #        step=0.5,theta.des=desae$pardes,random.design=desae$des.rv)
 # outaem$score
 # summary(outaem)
 # estimate(coef=outaem$theta,vcov=outaem$var.theta,f=function(p)     p/sum(p)^2)

 ## AE polygenic model
 # desde <- twin.polygen.design(prt,type="de")
 # outaem <- Grandom.cif(cif1,data=prt,cause1=2,cause2=2,
 #   same.cens=TRUE,theta=c(0.35),var.link=0,
 #   step=0.5,theta.des=desde$pardes,random.design=desde$des.rv)
 # outaem$score
 # summary(outaem)
 # estimate(coef=outaem$theta,vcov=outaem$var.theta,f=function(p) p/sum(p)^2)

  times <- 90
  cif1 <- timereg::comp.risk(Event(time,status)~-1+factor(country)+cluster(id),prt,
		   cause=2,times=times,max.clust=NULL)

  mm <- model.matrix(~-1+factor(zyg),prt)
  out1<-random.cif(cif1,data=prt,cause1=2,cause2=2,theta=1,
		  theta.des=mm,same.cens=TRUE,step=0.5)
  summary(out1)
  round(estimate(coef=out1$theta,vcov=out1$var.theta)$coefmat[,c(1,3:4)],2)

 desde <- twin.polygen.design(prt,type="de")
 outaem <- Grandom.cif(cif1,data=prt,cause1=2,cause2=2,
	same.cens=TRUE,theta=c(0.35),var.link=0,
        step=0.5,theta.des=desde$pardes,random.design=desde$des.rv)
 outaem$score
 summary(outaem)
 estimate(coef=outaem$theta,vcov=outaem$var.theta,f=function(p) p/sum(p)^2)
}

## ----label=probit1------------------------------------------------------------
rm(prt)
data(prt)
prt0 <-  force.same.cens(prt, cause="status", cens.code=0, time="time", id="id")
prt0$country <- relevel(prt0$country, ref="Sweden")
prt_wide <- fast.reshape(prt0, id="id", num="num", varying=c("time","status","cancer"))
prt_time <- subset(prt_wide,  cancer1 & cancer2, select=c(time1, time2, zyg))
tau <- 95
tt <- seq(70, tau, length.out=5) ## Time points to evaluate model in

## ----b0, eval=fullVignette----------------------------------------------------
# b0 <- bptwin.time(cancer ~ 1, data=prt0, id="id", zyg="zyg", DZ="DZ", type="cor",
#               cens.formula=Surv(time,status==0)~zyg, breaks=tau)

## -----------------------------------------------------------------------------
summary(b0)

## ----label=liability_ace1, eval=fullVignette----------------------------------
# b1 <- bptwin.time(cancer ~ 1, data=prt0, id="id", zyg="zyg", DZ="DZ", type="ace",
#               cens.formula=Surv(time,status==0)~zyg, breaks=tau)

## -----------------------------------------------------------------------------
summary(b1)

## -----------------------------------------------------------------------------
AIC(b0, b1)

## ----label=liability_ace_country, eval=fullVignette---------------------------
# b2 <- bptwin.time(cancer ~ country, data=prt0, id="id", zyg="zyg", DZ="DZ", type="ace",
#               cens.formula=Surv(time,status==0)~zyg+country, breaks=95)

## -----------------------------------------------------------------------------
summary(b2)

## ----label=bptime1, eval=fullVignette-----------------------------------------
# bt0 <- bptwin.time(cancer ~ 1, data=prt0, id="id", zyg="zyg", DZ="DZ", type="ace",
#               cens.formula=Surv(time,status==0)~zyg,
#               summary.function=function(x) x, breaks=tt)
# h2 <- Reduce(rbind, lapply(bt0$coef, function(x) x$heritability))[,c(1,3,4),drop=FALSE]
# concMZ <- Reduce(rbind, lapply(bt0$coef, function(x) x$probMZ["Concordance",,drop=TRUE]))
# 

## -----------------------------------------------------------------------------
par(mfrow=c(1,2))
plot(tt, h2[,1], type="s", lty=1, col=cols[3], xlab="Age", ylab="Heritability", ylim=c(0,1))
lava::confband(tt, h2[,2], h2[,3],polygon=TRUE, step=TRUE, col=lava::Col(cols[3], 0.1), border=NA)
plot(tt, concMZ[,1], type="s", lty=1, col=cols[1], xlab="Age", ylab="Concordance", ylim=c(0,.1))
lava::confband(tt, concMZ[,2], concMZ[,3],polygon=TRUE, step=TRUE, col=lava::Col(cols[1], 0.1), border=NA)

## ----label=biprobittime1------------------------------------------------------
system.time(a.mz <- biprobit.time(cancer~1, id="id", data=subset(prt0, zyg=="MZ"),
                               cens.formula = Surv(time,status==0)~1, pairs.only=TRUE,
                                breaks=tt))
system.time(a.dz <- biprobit.time(cancer~1, id="id", data=subset(prt0, zyg=="DZ"),
                               cens.formula = Event(time,status==0)~1, pairs.only=TRUE,
                               breaks=tt))

#system.time(a.zyg <- biprobit.time(cancer~1, rho=~1+zyg, id="id", data=prt, 
#                               cens.formula = Event(time,status==0)~1,
#                               eqmarg=FALSE, fix.cens.weight
#                               breaks=seq(75,100,by=10)))

a.mz
a.dz

plot(conczyg,se=TRUE,legend=FALSE,xlab="Age",ylab="Concordance", ylim=c(0,0.07))
plot(a.mz, ylim=c(0,.07), col=cols[1], lty=ltys[1], legend=FALSE, add=TRUE)
plot(a.dz, col=cols[2], lty=ltys[2], add=TRUE)

## ----label=biprobittime2, eval=fullVignette-----------------------------------
# a.mz_country <- biprobit.time(cancer~country, id="id", data=subset(prt0, zyg=="MZ"),
#                                cens.formula = Surv(time,status==0)~country, pairs.only=TRUE,
#                                 breaks=tt)
# system.time(a.dz_country <- biprobit.time(cancer~country, id="id", data=subset(prt0, zyg=="DZ"),
#                                cens.formula = Event(time,status==0)~country, pairs.only=TRUE,
#                                breaks=tt))
# 
# s_mz_country <- summary(a.mz_country)
# s_dz_country <- summary(a.dz_country)

## -----------------------------------------------------------------------------
s_mz_country
s_dz_country

## ----label=liability_ace_time1, eval=fullVignette-----------------------------
# ## ACE model (time-varying) with and without adjustment for country
# a1 <- bptwin.time(cancer~1, id="id", data=prt0, type="ace",
#                               zyg="zyg", DZ="DZ",
#                               cens.formula=Surv(time,status==0)~zyg,
#                               breaks=tt)
# 
# #a2 <- bptwin.time(cancer~country, id="id", data=prt0, #type="ace",
# #                              zyg="zyg", DZ="DZ",
# #                              #cens.formula=Surv(time,status==0)~country+zyg,
# #                              breaks=tt)

## -----------------------------------------------------------------------------
plot(a.mz, which=c(6), xlab="Age", ylab="Correlation", ylim=c(0,1), col=cols[1], lty=ltys[1], legend=NULL, alpha=.1)
plot(a.dz, which=c(6), col=cols[2], lty=ltys[2], legend=NULL, add=TRUE, alpha=.1)
legend("topleft", c("MZ tetrachoric correlation", "DZ tetrachoric correlation"),
       col=cols, lty=ltys, lwd=2)

plot(a.mz, which=c(4), xlab="Age", ylab="Relative Recurrence Risk",
     ylim=c(1,20), col=cols[1], lty=ltys[1], legend=NULL, lwd=2, alpha=.1)
plot(a.dz, which=c(4), col=cols[2], lty=ltys[2], legend=NULL, add=TRUE, lwd=2, alpha=.1)
legend("topright", c("MZ relative recurrence risk", "DZ relative recurrence risk"),
       col=cols, lty=ltys, lwd=2)

plot(a1, which=c(5,6), xlab="Age", ylab="Correlation", ylim=c(0,1), col=cols[1:2], lty=ltys[1:2], lwd=2, alpha=0.1,
     legend=c("MZ tetrachoric correlation", "DZ tetrachoric correlation"))

plot(a1, which=c(1), xlab="Age", ylim=c(0,1), col="black", lty=1, ylab="Heritability", legend=NULL, alpha=.1)

## -----------------------------------------------------------------------------
sessionInfo()

## ----saveobj, results="hide", echo=FALSE, eval=fullVignette-------------------
# ## To save time building the vignettes on CRAN, we cache time consuming computations
# 
# rms <- c('id','theta.iid','theta.des','marginal.trunc',
#   'loglikeiid','marginal.surv','theta.iid.naive',
#   'antclust','secluster','cluster.call','trunclikeiid',
#   'logl.iid','score.iid','clusters')
# tmp <- lapply(as.list(paste0("fitco", 1:4)),
#               function(x) saveobj(x, rms))
# 
# rms <- c('random.design','marginal.surv','marginal.trunc','theta.iid','score.iid','loglikeiid','trunclikeiid','antclust','cluster.call','secluster','clusters')
# saveobj("fitace", rms)
# saveobj("fitde", rms)
# 
# saveobj("cse", NULL)
# saveobj("slr", NULL)
# 
# rms <- c("theta.iid", "Clusters", "p11")
# saveobj("outacem", rms)
# 
# rms <- c("model.frame", "score", "id", "logLik")
# saveobj("b0", rms)
# saveobj("b1", rms)
# saveobj("b2", rms)
# saveobj("a1", rms)
# saveobj("h2", NULL)
# saveobj("concMZ", NULL)
# saveobj("s_mz_country", NULL)
# saveobj("s_dz_country", NULL)