Giter Club home page Giter Club logo

bivppl's Introduction

Bivariate Survival Outcome Analysis Using Penalized Partial Likelihood (BivPPL)

Lili Wang 2019-08-06

Purpose

This R package is to analyze bivariate survival outcomes. Here specifically, we implement this method to analyze alternating recurrent events using a bivariate correlated frailty model. Both the regression parameters and the variance-covariance matrix will be estimated. This R package allows data to have many clusters. The estimation procedure is similar to the traditional PPL method as established in coxme, while we do not require knowing the correlation direction between the correlated two events.

This R package will be improved and upgraded in the near future.

Install the package

To install the R package from Github, you will need to install another R package "devtools". Please uncomment the codes to install them.

# install.packages("devtools")
# library(devtools)
# install_github("lilywang1988/BivPPL")
library(BivPPL)
#> Loading required package: survival
#> Loading required package: Matrix
#> Loading required package: mvtnorm

Vignettes

Generate alternating recurrent event data using gen.data, beta1 and beta2 are regression parameters for the two events, theta is defining the 3 different entries of the variance-covariance matrix of the two correlated frailties. N is the number of clusters or subjects in the framework of alternating recurrent events.

set.seed(100)
N<-100 # number of clusters
beta1 <- c(0.5,-0.3,0.5) # regression parameters for event type 1
beta2 <- c(0.8,-0.2,0.3) # regression parameters for event type 2
beta  <- c(beta1,beta2)
theta <- c(0.25,0.25,-0.125) # variance-covariance matrix for the bivariate frailty (denoted as D), it is a vector (D[1,1],D[2,2], D[1,2])
lambda01 <- 1
lambda02 <- 1
cen <- 10 # maximum censoring time
centype <- TRUE # fixed censoring time at cen

data <- gen.data(N,beta1,beta2,theta,lambda01,lambda02,c=cen,Ctype=centype)
ptm<-proc.time()
res <- BivPPL(data)
proc.time() - ptm
#>    user  system elapsed 
#>  20.534   0.917  21.703
res$beta_hat
#> [1]  0.52126635 -0.26535133  0.45676406  0.74664981 -0.06705498  0.24962866
res$beta_ASE
#> [1] 0.05652019 0.05266173 0.05729070 0.06239355 0.05456852 0.05988814
res$D_hat
#>            r1_hat     r2_hat
#> r1_hat  0.3791955 -0.2053474
#> r2_hat -0.2053474  0.2104612


# fit the model assuming the independence between the two frailties
ptm<-proc.time()
res2 <- BivPPL(data,independence=T)
proc.time() - ptm
#>    user  system elapsed 
#>   9.938   0.525  10.718
res2$beta_hat
#> [1]  0.51974445 -0.26578661  0.44356750  0.73519612 -0.06245907  0.23199444
res2$beta_ASE
#> [1] 0.05700419 0.05297851 0.05777039 0.06270781 0.05549611 0.06043905
res2$D_hat
#>           [,1]      [,2]
#> [1,] 0.3742242 0.0000000
#> [2,] 0.0000000 0.1866389

# A likelihood ratio test
LRT<-2*(res$LogMargProb-res2$LogMargProb)
print(round(pchisq(abs(LRT),df=1,lower.tail = F),3))
#>       [,1]
#> [1,] 0.002


# sparsen the Hessian matrix
ptm<-proc.time()
res3 <- BivPPL(data,huge=TRUE)
proc.time() - ptm
#>    user  system elapsed 
#>  13.449   0.110  13.773
res3$beta_hat
#>         z11         z12         z13         z21         z22         z23 
#>  0.52042943 -0.26522250  0.45584999  0.74594886 -0.06716247  0.24938898
res3$beta_ASE
#> [1] 0.05649124 0.05267874 0.05726610 0.06227382 0.05454575 0.05985640
res3$D_hat
#>            r1_hat     r2_hat
#> r1_hat  0.3728382 -0.2018795
#> r2_hat -0.2018795  0.2062161

# Compare with coxme
# install.packages("coxme")
library(coxme)
#> Loading required package: bdsmatrix
#> 
#> Attaching package: 'bdsmatrix'
#> The following object is masked from 'package:base':
#> 
#>     backsolve
data_coxme <- tocoxme(data) # assume that we do not know the two events are negatively associated and we transform the data to be positively associated
ptm<-proc.time()
res_coxme <- coxme(Surv(data_coxme$time,data_coxme$delta)~data_coxme$Z1+data_coxme$Z2+(1|data_coxme$b0)+(1|data_coxme$b1)+(1|data_coxme$b2)+strata(data_coxme$joint)) # disable the Hessian matrix sparsening and likelihood refining
proc.time() - ptm
#>    user  system elapsed 
#>  48.536   0.224  48.857
res_coxme$coefficients 
#> data_coxme$Z11 data_coxme$Z12 data_coxme$Z13 data_coxme$Z21 data_coxme$Z22 
#>     0.52065085    -0.26593336     0.44450391     0.73457314    -0.06255747 
#> data_coxme$Z23 
#>     0.23176550
sqrt(diag(vcov(res_coxme)))
#> [1] 0.05707456 0.05301526 0.05782401 0.06267015 0.05545393 0.06039687
assemble(as.vector(unlist(res_coxme$vcoef)))
#>              [,1]         [,2]
#> [1,] 0.3809510825 0.0003215251
#> [2,] 0.0003215251 0.1838460080

data_coxme_n <- tocoxme_n(data) # assume that we know the two events are negatively associated 
ptm<-proc.time()
res_coxme_n<- coxme(Surv(data_coxme_n$time,data_coxme_n$delta)~data_coxme_n$Z1+data_coxme_n$Z2+(data_coxme_n$Z0|data_coxme_n$b0)+(1|data_coxme_n$b1)+(1|data_coxme_n$b2)+strata(data_coxme_n$joint))
proc.time() - ptm
#>    user  system elapsed 
#>  57.075   0.256  57.395
res_coxme_n$coefficients 
#> data_coxme_n$Z11 data_coxme_n$Z12 data_coxme_n$Z13 data_coxme_n$Z21 
#>       0.52257408      -0.26556525       0.45768187       0.74671591 
#> data_coxme_n$Z22 data_coxme_n$Z23 
#>      -0.06678617       0.24903043
sqrt(diag(vcov(res_coxme_n)))
#> [1] 0.05664816 0.05273497 0.05739250 0.06244051 0.05465062 0.05995059
assemble_n(as.vector(unlist(res_coxme_n$vcoef)))
#>            [,1]       [,2]
#> [1,]  0.3861649 -0.2004567
#> [2,] -0.2004567  0.2103093

bivppl's People

Contributors

lilywang1988 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.