--- a +++ b/tests/testthat/test-fromParametersSystem.R @@ -0,0 +1,317 @@ +context("fromParam_systemlevel") + +test_that("lag.should.equal.non.lag.in.these.cases",{ + + l1 <- LagEffect(Lag.T=5,L.Ctr.median=3,L.HazardRatio=0.8) + l2 <- LagEffect(Lag.T=20,L.Ctr.median=3,L.HazardRatio=0.8) + + s1 <- Study(N=1000,study.duration=10,ctrl.median=3,k=1.2,acc.period=5,shape=2, + power=0.9,alpha=0.05,r=1,HR=0.8,two.sided=TRUE, + lag.settings=l1) + + s1.nolag <- Study(N=1000,study.duration=10,ctrl.median=3,k=1.2,acc.period=5,shape=2, + power=0.9,alpha=0.05,r=1,HR=0.8,two.sided=TRUE) + + s2 <- Study(N=1000,study.duration=10,ctrl.median=6,k=1.2,acc.period=5,shape=2, + power=0.9,alpha=0.05,r=1,HR=0.75,two.sided=TRUE, + lag.settings=l2) + + a1 <- predict(s1.nolag,time.pred=c(5,8,10),event.pred=c(10,15)) + + + + a2 <- predict(s1,time.pred=c(5,8,10),event.pred=c(10,15)) + a3 <- predict(s2,time.pred=c(5,8,10),event.pred=c(10,15)) + + #remove atrisk columns for check: + p1 <- a1@predict.data + p2 <- a2@predict.data + + p1$at.risk1 <- NULL + p1$at.risk2 <- NULL + p1$atrisk.tot <- NULL + p2$at.risk1 <- NULL + p2$at.risk2 <- NULL + p2$atrisk.tot <- NULL + + expect_equal(p1,p2) + + #Then check atrisk columns + expect_equal(a1@predict.data$at.risk1,a2@predict.data$at.risk1,tol=1e-7) + expect_equal(a1@predict.data$at.risk2,a2@predict.data$at.risk2,tol=1e-7) + expect_equal(a1@predict.data$atrisk.tot,a2@predict.data$atrisk.tot,tol=1e-7) + + expect_equal(a1@grid,a2@grid) + + expect_equal(a1@av.hr,a2@av.hr) + expect_equal(a1@critical.events.req,a2@critical.events.req) + + + + expect_equal(a1@critical.data$at.risk1,a2@critical.data$at.risk1,tol=1e-7) + expect_equal(a1@critical.data$at.risk2,a2@critical.data$at.risk2,tol=1e-7) + expect_equal(a1@critical.data$atrisk.tot,a2@critical.data$atrisk.tot,tol=1e-7) + + + + expect_equal(a1@sfns[[1]]@lambda,a2@sfns[[1]]@lambda) + expect_equal(a1@sfns[[2]]@lambda,a2@sfns[[2]]@lambda) + expect_equal(a2@sfns[[1]]@lambda,a2@sfns[[1]]@lambdaot) + expect_equal(a2@sfns[[2]]@lambda,a2@sfns[[2]]@lambdaot) + + #remove atrisk columns for check: + p1 <- a1@predict.data + p2 <- a3@predict.data + + p1$at.risk1 <- NULL + p1$at.risk2 <- NULL + p1$atrisk.tot <- NULL + p2$at.risk1 <- NULL + p2$at.risk2 <- NULL + p2$atrisk.tot <- NULL + + expect_equal(p1,p2) + + #Then check atrisk columns + expect_equal(a1@predict.data$at.risk1,a3@predict.data$at.risk1,tol=1e-7) + expect_equal(a1@predict.data$at.risk2,a3@predict.data$at.risk2,tol=1e-7) + expect_equal(a1@predict.data$atrisk.tot,a3@predict.data$atrisk.tot,tol=1e-7) + + expect_equal(a1@grid,a3@grid) + expect_equal(a1@av.hr,a3@av.hr) + expect_equal(a1@critical.events.req,a3@critical.events.req) + expect_equal(a1@critical.data,a3@critical.data) + + expect_equal(a1@sfns[[1]]@lambda,a3@sfns[[1]]@lambdaot) + expect_equal(a1@sfns[[2]]@lambda,a3@sfns[[2]]@lambdaot) +}) + +test_that("event.and.time.pred.have.symmetry",{ + #Note due to rounding of events the 'symmetry' only works one way... + + s1 <- Study(N=1000,study.duration=10,ctrl.median=3,k=1.2,acc.period=5,shape=2, + power=0.9,alpha=0.05,r=1,HR=0.8,two.sided=TRUE) + + a1 <- predict(s1,event.pred=c(100,200,300,400)) + + time.pred <- a1@predict.data[,"time"] + + a2 <- predict(s1,time.pred=time.pred) + + expect_true(all(a2@predict.data[,"time.pred"])) + expect_false(any(a1@predict.data[,"time.pred"])) + + a1@predict.data$time.pred <- rep(TRUE,4) + + expect_equal(a1@predict.data,a2@predict.data) + +}) + + +test_that("recruit",{ + + k <- c(0.5,1,2) + + lapply(k,function(x){ + s <- SingleArmStudy(N=1000,study.duration=10,ctrl.median=3,k=x,acc.period=5,shape=1.2) + a <- predict(s,time.pred=5/(2^(1/x))) + expect_equal(1/(2^x)*1000,a@grid[a@grid$time==2.5,]$recruit.tot) + expect_equal(500,a@predict.data[1,]$recruit.tot) + }) + + lapply(k,function(x){ + s <- Study(N=1000,study.duration=10,ctrl.median=3,k=x,acc.period=6, + shape=1.2,power=0.8,alpha=0.05,two.sided=TRUE,r=1.2,HR=0.8) + a <- predict(s,time.pred=6/(2^(1/x))) + expect_equal(1/(2^x)*1000,a@grid[a@grid$time==3,]$recruit.tot) + expect_equal(500,a@predict.data[1,]$recruit.tot) + }) + +}) + + +#this fails on versions < 1.0 +test_that("max.num.events",{ + l <- LagEffect(Lag.T=5,L.Ctr.median=1,L.HazardRatio=0.5) + + s <- Study(N=800,study.duration=36,ctrl.median=3,k=1,acc.period=20, + shape=1,power=0.8,alpha=0.05,two.sided=TRUE,r=1.2,HR=0.5,lag.settings=l) + + a <- predict(s) + + expect_true(all(a@grid$events.tot <= 800)) + + +}) + +test_that("median",{ + + ctrl.median <- c(1:5) + lapply(ctrl.median,function(x){ + s1 <- SingleArmStudy(N=2000,study.duration=20,ctrl.median=x,k=0.01,acc.period=0.000001,shape=1.5) + a <- predict(s1,event.pred=1000) + expect_equal(x,a@predict.data[1,]$time) + + }) +}) + +test_that("single.arm.matches.2.arm",{ + + s1 <- Study(N=2000,study.duration=10,ctrl.median=3,k=1.2,acc.period=5,shape=2, + power=0.9,alpha=0.05,r=1,HR=0.8,two.sided=TRUE) + + s2 <- SingleArmStudy(N=1000,study.duration=10,ctrl.median=3,k=1.2,acc.period=5,shape=2) + + s3 <- Study(N=2000,study.duration=10,ctrl.median=3*sqrt(0.8),k=1.2,acc.period=5,shape=2, + power=0.9,alpha=0.05,r=1,HR=0.8,two.sided=TRUE) + + a1 <- predict(s1) + a2 <- predict(s2) + a3 <- predict(s3) + + expect_equal(a1@grid$events1,a2@grid$events.tot) + expect_equal(a3@grid$events2,a2@grid$events.tot) +}) + + +str1 <- "800 patients recruited, ratio nE/nC=1, 20 months accrual (non-uniform\naccrual, k=2). Lag time: T=4 months, Control for [0,T] median=3 months and\nfor [T,S] Control median=2 months. Exponential survival function.\nHR([0,T])=1 and HR([T,S])=0.5, which gives an average HR=0.77. For a study\nwith no lag and this HR: critical HR value=0.83, alpha(2-sided)=5%,\npower=80%, 466 events required and using the given lag settings: expected\nat time 18.9 months (Experimental/Control: 225/241)." +str2 <- "120 patients recruited, ratio nE/nC=0.5, 20 months accrual (uniform\naccrual, k=1). Control median=2.5 months (lambda=0.29). Experimental\nmedian=4.11 months (lambda=0.18). Weibull survival function shape=1.2.\nHR(Experimental:Control)=0.55, critical HR value=0.71, alpha(1-sided)=5%,\npower=90%, 108 events required expected at time 22.6 months\n(Experimental/Control: 33/75). At (10, 3.2) months the predicted number of\nevents is (37, 5) [Experimental/Control: (10, 1)/(27, 4)]." +str3 <- "100 patients recruited, 5 months accrual (non-uniform accrual, k=1.5). Lag\ntime: T=4 months, Control for [0,T] median=2.5 months and for [T,S]\nControl median=3 months. Weibull survival function shape=2. At 10 months\nthe predicted number of events is 97." + +summary_check <- function(study,time.pred,event.pred,stringoutput){ + prediction <- predict(study,time.pred=time.pred, event.pred=event.pred) + x <- eventPrediction:::getFromParameterText(prediction,DisplayOptions(text.width=75)) + expect_equal(x,stringoutput) +} + +test_that("summary_output",{ + + lagged <- LagEffect(Lag.T = 4,L.Ctr.median = 3, + L.HazardRatio=1 ) + + study <- Study(alpha = 0.05,power = 0.8, + HR = 0.5, r = 1,N = 800, + study.duration = 30,ctrl.median = 2, + k = 2,acc.period = 20,two.sided = TRUE,lag.settings=lagged) + + + summary_check(study,NULL,NULL,str1) + + study <- Study(alpha = 0.05,power = 0.9, + HR = 0.55, r = 0.5,N = 120, + study.duration = 25,ctrl.median = 2.5, + k = 1,acc.period = 20,two.sided = FALSE,shape=1.2) + + summary_check(study,10,5,str2) + lagged <- LagEffect(Lag.T = 4,L.Ctr.median = 2.5) + study <- SingleArmStudy(N=100,study.duration=10,ctrl.median=3,k=1.5, + acc.period=5,shape=2,lag.settings=lagged) + + summary_check(study,10,NULL,str3) +}) + + +test_that("critical_hr",{ + # this compares to the output from non-proportional hazards package + #there are slight differences in the rounding + lagged <- LagEffect(Lag.T = 4,L.Ctr.median = 11, + L.HazardRatio=1 ) + + study <- Study(alpha = 0.05,power = 0.8036576, + HR = 0.6, r =1,N = 780, + study.duration = 25.5,ctrl.median = 11, + k = 2,acc.period = 18,two.sided = TRUE,shape=1,lag.settings=lagged) + + + prediction <- predict(study) + + nph.answer <- 0.8198656 + + expect_equal(nph.answer,prediction@critical.HR,tol=5e-3) + + lagged <- LagEffect(Lag.T = 6,L.Ctr.median = 8, + L.HazardRatio=1 ) + + study <- Study(alpha = 0.05,power = 0.9829889, + HR = 0.5, r =1.5,N = 800, + study.duration = 30,ctrl.median = 8, + k = 0.5,acc.period = 18,two.sided = TRUE,shape=1,lag.settings=lagged) + + + prediction <- predict(study) + + + nph.answer <- 0.8534732 + expect_equal(nph.answer,prediction@critical.HR,tol=5e-3) + + lagged <- LagEffect(Lag.T = 5,L.Ctr.median = 8, + L.HazardRatio=1 ) + + study <- Study(alpha = 0.05,power = 0.9989243, + HR = 0.5, r =1.5,N = 800, + study.duration = 30,ctrl.median = 8, + k = 0.5,acc.period = 6,two.sided = TRUE,shape=1,lag.settings=lagged) + + + prediction <- predict(study) + + + nph.answer <- 0.8572458 + expect_equal(nph.answer,prediction@critical.HR,tol=5e-3) + +}) + +test_that("average hazard ratio",{ + # this compares to the output from non-proportional hazards package + #results do not match exactly: nph uses interval bisection to some tolerance + #whereas eventPrediction calculates the exact integral and is accruate up to + #R's integrate functions accruacy + #Also there are slight differences in the rounding of w1 and w2 (see eventPrediction vignette) + #which will cause small differences to the average HR + + lagged <- LagEffect(Lag.T = 4,L.Ctr.median = 11, + L.HazardRatio=1 ) + + study <- Study(alpha = 0.05,power = 0.9, + HR = 0.6, r =1,N = 780, + study.duration = 25.5,ctrl.median = 11, + k = 2,acc.period = 18,two.sided = FALSE,shape=1,lag.settings=lagged) + + + prediction <- predict(study) + + nph.answer <- 0.7518394 + expect_equal(nph.answer,prediction@av.hr,tol=1.1e-3) + + lagged <- LagEffect(Lag.T = 6,L.Ctr.median = 8, + L.HazardRatio=1 ) + + study <- Study(alpha = 0.05,power = 0.9, + HR = 0.5, r =1.5,N = 800, + study.duration = 30,ctrl.median = 8, + k = 0.5,acc.period = 18,two.sided = FALSE,shape=1,lag.settings=lagged) + + + prediction <- predict(study) + + + nph.answer <- 0.7190647 + expect_equal(nph.answer,prediction@av.hr,tol=1.1e-3) + + lagged <- LagEffect(Lag.T = 5,L.Ctr.median = 8, + L.HazardRatio=1 ) + study <- Study(alpha = 0.05,power = 0.5, + HR = 0.75, r =1.5,N = 800, + study.duration = 30,ctrl.median = 8, + k = 0.5,acc.period = 6,two.sided = FALSE,shape=1,lag.settings=lagged) + + + prediction <- predict(study) + + + nph.answer <- 0.8417572 + expect_equal(nph.answer,prediction@av.hr,tol=1.1e-3) + +}) + +