From c3a4f7e126730be90a0e45c2f6be3e5ed2fdd804 Mon Sep 17 00:00:00 2001 From: Kuenzel Date: Fri, 17 May 2024 10:46:14 +0200 Subject: [PATCH 1/8] fixed bug in generate_data and adapted tests --- R/generate_data.R | 21 ++++++++++++++------ tests/testthat/test-aalen_johansen.R | 4 ++-- tests/testthat/test-inc_prop.R | 2 +- tests/testthat/test-one_minus_kaplan_meier.R | 2 +- tests/testthat/test-prop_trans_inc_dens.R | 2 +- tests/testthat/test-prop_trans_inc_dens_ce.R | 2 +- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/R/generate_data.R b/R/generate_data.R index df9a53b..c1dadca 100644 --- a/R/generate_data.R +++ b/R/generate_data.R @@ -39,7 +39,14 @@ generate_data <- function(n, haz_death, haz_soft) { assert_count(n, positive = TRUE) - assert_numeric(cens, lower = 0, finite = TRUE, any.missing = FALSE, len = 2L, unique = TRUE, sorted = TRUE) + assert_numeric( + cens, + lower = 0, + finite = TRUE, + any.missing = FALSE, + len = 2L, + unique = TRUE, + sorted = TRUE) assert_number(haz_ae, finite = TRUE) assert_number(haz_death, finite = TRUE) assert_number(haz_soft, finite = TRUE) @@ -52,11 +59,13 @@ generate_data <- function(n, ) haz_all <- sum(haz) result$time_to_event <- stats::rexp(n = n, rate = haz_all) - result$type_of_event <- 1L + stats::rbinom( - n = n, - size = 2, - prob = haz / haz_all - ) + + result$type_of_event <- sample( + 1:3, + size = n, + prob = haz / haz_all, + replace = TRUE) + result$cens <- stats::runif(n = n, min = cens[1L], max = cens[2L]) result$type_of_event <- ifelse( result$time_to_event <= result$cens, diff --git a/tests/testthat/test-aalen_johansen.R b/tests/testthat/test-aalen_johansen.R index 971dad6..64cf2ac 100644 --- a/tests/testthat/test-aalen_johansen.R +++ b/tests/testthat/test-aalen_johansen.R @@ -8,7 +8,7 @@ test_that("Aalen Johansen works as expected", { haz_soft = 0.5 ) result <- aalen_johansen(data = df, ce = 2, tau = 4) - expected <- c(ae_prob = 0.2719, ae_prob_var = 0.0119, ce_prob = 0.7281, ce_prob_var = 0.0119) + expected <- c(ae_prob = 0.4792, ae_prob_var = 0.0266, ce_prob = 0.5208, ce_prob_var = 0.0266) expect_equal(result, expected, tolerance = 1e-4) }) @@ -39,7 +39,7 @@ test_that("Aalen Johansen works without competing events", { df <- df[df$type_of_event != 2, ] df <- df[df$type_of_event != 3, ] result <- aalen_johansen(data = df, ce = 2, tau = 4) - expected <- c(ae_prob = 0.5897, ae_prob_var = 0.0404, ce_prob = 0, ce_prob_var = 0) + expected <- c(ae_prob = 0.7643, ae_prob_var = 0.0363, ce_prob = 0, ce_prob_var = 0) expect_equal(result, expected, tolerance = 1e-4) }) diff --git a/tests/testthat/test-inc_prop.R b/tests/testthat/test-inc_prop.R index e12fd11..d632cf0 100644 --- a/tests/testthat/test-inc_prop.R +++ b/tests/testthat/test-inc_prop.R @@ -8,6 +8,6 @@ test_that("inc_prop works as expected", { haz_soft = 0.5 ) result <- inc_prop(data = df, tau = 4) - expected <- c(ae_prob = 0.2, ae_prob_var = 0.0064) + expected <- c(ae_prob = 0.24, ae_prob_var = 0.0073) expect_equal(result, expected, tolerance = 1e-4) }) diff --git a/tests/testthat/test-one_minus_kaplan_meier.R b/tests/testthat/test-one_minus_kaplan_meier.R index 92e78de..06bed4d 100644 --- a/tests/testthat/test-one_minus_kaplan_meier.R +++ b/tests/testthat/test-one_minus_kaplan_meier.R @@ -8,7 +8,7 @@ test_that("one_minus_kaplan_meier works as expected", { haz_soft = 0.5 ) result <- one_minus_kaplan_meier(data = df, tau = 4) - expected <- c(ae_prob = 0.3771350, ae_prob_var = 0.0260535) + expected <- c(ae_prob = 0.5865, ae_prob_var = 0.0394) expect_equal(result, expected, tolerance = 1e-4) }) diff --git a/tests/testthat/test-prop_trans_inc_dens.R b/tests/testthat/test-prop_trans_inc_dens.R index e870379..8b28e0d 100644 --- a/tests/testthat/test-prop_trans_inc_dens.R +++ b/tests/testthat/test-prop_trans_inc_dens.R @@ -8,6 +8,6 @@ test_that("prop_trans_inc_dens works as expected", { haz_soft = 1.2 ) result <- prop_trans_inc_dens(data = df, tau = 0.1) - expected <- c(ae_prob = 0.33325, ae_prob_var = 0.0365) + expected <- c(ae_prob = 0.5554, ae_prob_var = 0.0325) expect_equal(result, expected, tolerance = 1e-4) }) diff --git a/tests/testthat/test-prop_trans_inc_dens_ce.R b/tests/testthat/test-prop_trans_inc_dens_ce.R index da730b2..973aa5c 100644 --- a/tests/testthat/test-prop_trans_inc_dens_ce.R +++ b/tests/testthat/test-prop_trans_inc_dens_ce.R @@ -8,6 +8,6 @@ test_that("prop_trans_inc_dens_ce works as expected", { haz_soft = 1.2 ) result <- prop_trans_inc_dens_ce(data = df, ce = 2, tau = 0.1) - expected <- c(ae_prob = 0.296148137, ae_prob_var = 0.002755189) + expected <- c(ae_prob = 0.18114, ae_prob_var = 0.00205) expect_equal(result, expected, tolerance = 1e-4) }) From 7cf7a2f7bd6083ebc0bde8c79ab19795002d5937 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 08:50:03 +0000 Subject: [PATCH 2/8] [skip style] [skip vbump] Restyle files --- R/generate_data.R | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/R/generate_data.R b/R/generate_data.R index c1dadca..c7189c7 100644 --- a/R/generate_data.R +++ b/R/generate_data.R @@ -46,7 +46,8 @@ generate_data <- function(n, any.missing = FALSE, len = 2L, unique = TRUE, - sorted = TRUE) + sorted = TRUE + ) assert_number(haz_ae, finite = TRUE) assert_number(haz_death, finite = TRUE) assert_number(haz_soft, finite = TRUE) @@ -64,7 +65,8 @@ generate_data <- function(n, 1:3, size = n, prob = haz / haz_all, - replace = TRUE) + replace = TRUE + ) result$cens <- stats::runif(n = n, min = cens[1L], max = cens[2L]) result$type_of_event <- ifelse( From 5700e1834bcde51f6aef7f77030771906daccb09 Mon Sep 17 00:00:00 2001 From: Kuenzel Date: Fri, 17 May 2024 17:28:21 +0200 Subject: [PATCH 3/8] added test to show old version of generate_data fails --- tests/testthat/test-generate_data.R | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/testthat/test-generate_data.R b/tests/testthat/test-generate_data.R index 9b0ac63..70aaea2 100644 --- a/tests/testthat/test-generate_data.R +++ b/tests/testthat/test-generate_data.R @@ -12,3 +12,18 @@ test_that("generate_data works as expected", { expect_identical(result$id, 1:10) expect_integer(result$type_of_event, lower = 0, upper = 3, any.missing = FALSE) }) + +test_that("show bug in v1 of generate_data", { + set.seed(123) + df <- generate_data( + n = 10^6, + cens = c(1000, 1001), + haz_ae = 0.2, + haz_death = 0.3, + haz_soft = 0.5 + ) + result <- inc_prop(data = df, tau = 4) + expected <- c(ae_prob = 0.2) + expect_equal(result["ae_prob"], expected, tolerance = 0.1) + +}) From 53a1f902cbc02ae62768ccbc88c10177c5b529d1 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 15:30:24 +0000 Subject: [PATCH 4/8] [skip style] [skip vbump] Restyle files --- tests/testthat/test-generate_data.R | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/testthat/test-generate_data.R b/tests/testthat/test-generate_data.R index 70aaea2..4485815 100644 --- a/tests/testthat/test-generate_data.R +++ b/tests/testthat/test-generate_data.R @@ -25,5 +25,4 @@ test_that("show bug in v1 of generate_data", { result <- inc_prop(data = df, tau = 4) expected <- c(ae_prob = 0.2) expect_equal(result["ae_prob"], expected, tolerance = 0.1) - }) From 65cec4f4bce53877017aab486c5e71d5b9f32ac3 Mon Sep 17 00:00:00 2001 From: kuenzelt <122105979+kuenzelt@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:08:46 +0200 Subject: [PATCH 5/8] Update tests/testthat/test-generate_data.R Co-authored-by: Daniel Sabanes Bove --- tests/testthat/test-generate_data.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-generate_data.R b/tests/testthat/test-generate_data.R index 4485815..9bbed67 100644 --- a/tests/testthat/test-generate_data.R +++ b/tests/testthat/test-generate_data.R @@ -13,7 +13,7 @@ test_that("generate_data works as expected", { expect_integer(result$type_of_event, lower = 0, upper = 3, any.missing = FALSE) }) -test_that("show bug in v1 of generate_data", { +test_that("generate_data correctly ... ", { set.seed(123) df <- generate_data( n = 10^6, From a12a9396424855e59ddf9dbcd38bef20129a1051 Mon Sep 17 00:00:00 2001 From: Kuenzel Date: Wed, 5 Jun 2024 15:25:59 +0200 Subject: [PATCH 6/8] updated NEWS.md --- NEWS.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/NEWS.md b/NEWS.md index 405c792..196a701 100644 --- a/NEWS.md +++ b/NEWS.md @@ -7,3 +7,14 @@ - Estimators that do not account for competing events (incidence proportion, incidence density, Inverse Kaplan Meier). - Estimators accounting for competing events (incidence proportion accounting for competing events and Aalen-Johansen, both first with death only as hard competing event, or using all competing events). + + +### bug fixes + +- changed the way data is generated in function generate_data: + + result$type_of_event <- 1L + stats::rbinom(n = n, size = 2, prob = haz/haz_all) + + was replaced with + + result$type_of_event <- sample(1:3, size = n, prob = haz / haz_all, replace = TRUE). From cd36249620dba79015cfa83d1696ba157e36e466 Mon Sep 17 00:00:00 2001 From: Kuenzel Date: Wed, 5 Jun 2024 15:25:59 +0200 Subject: [PATCH 7/8] updated NEWS.md --- NEWS.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/NEWS.md b/NEWS.md index 405c792..efb5ef9 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,12 @@ # savvyr 0.1.0 +### Bug Fixes + +- changed the way data is generated in function "generate_data": + variable "type_event" is now generated using the sample function which accurately + reflects the specified hazard for AE, death and soft competing events. + + - First CRAN version of the package. - The package provides functions to easily conduct the improved AE analyses proposed by the SAVVY framework. @@ -7,3 +14,6 @@ - Estimators that do not account for competing events (incidence proportion, incidence density, Inverse Kaplan Meier). - Estimators accounting for competing events (incidence proportion accounting for competing events and Aalen-Johansen, both first with death only as hard competing event, or using all competing events). + + + From b8b9db05a9e28bde86b2ff4a879e05933b064098 Mon Sep 17 00:00:00 2001 From: Daniel Sabanes Bove Date: Thu, 6 Jun 2024 11:28:12 +0200 Subject: [PATCH 8/8] bump up version, polish NEWS file --- DESCRIPTION | 4 ++-- NEWS.md | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 8606c5c..8fc2adb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Type: Package Package: savvyr Title: Survival Analysis for AdVerse Events with VarYing Follow-Up Times -Version: 0.1.0 -Date: 2024-02-20 +Version: 0.1.1 +Date: 2024-06-06 Authors@R: c( person("Thomas", "Kuenzel", email = "thomas.kuenzel@roche.com", role = c("aut", "cre")), person("Kaspar", "Rufibach", email = "kaspar.rufibach@roche.com", role = "aut"), diff --git a/NEWS.md b/NEWS.md index efb5ef9..9c33d1f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,11 +1,10 @@ -# savvyr 0.1.0 +# savvyr 0.1.1 ### Bug Fixes -- changed the way data is generated in function "generate_data": - variable "type_event" is now generated using the sample function which accurately - reflects the specified hazard for AE, death and soft competing events. - +- Changed the way data is generated in function 'generate_data': The variable 'type_event' is now generated such that it accurately reflects the specified hazards for AE, death and soft competing events. + +# savvyr 0.1.0 - First CRAN version of the package. - The package provides functions to easily conduct the improved AE analyses proposed by the SAVVY framework.