Skip to contents

gsDesign (development version)

New features

  • Added testUpper, testLower, and testHarm parameters to gsDesign(), gsSurv(), and gsSurvCalendar() for selective bound testing at interim analyses. Each accepts a logical scalar or vector of length k specifying which analyses should include that boundary. Inactive bounds are set to extreme values (±20 on Z-scale) and displayed as NA in print() and gsBoundSummary() output. This enables designs such as futility-only at early interims, deferred efficacy testing, or selective harm monitoring (@keaven, #141).
  • Added test.type = 7 (binding futility and binding harm bounds) and test.type = 8 (non-binding futility and non-binding harm bounds) to gsDesign(), gsSurv(), and gsSurvCalendar(). These three-boundary designs support monitoring for efficacy, futility, and potential harm simultaneously, motivated by FDA guidance on overall survival monitoring in oncology trials (@keaven, #237).
  • New sfharm and sfharmparam parameters control the spending function for the harm bound independently from efficacy and futility spending (@keaven, #237).
  • All six plot() types, gsBoundSummary(), print(), summary(), and xtable() methods support the new three-boundary designs (@keaven, #237).
  • Added HarmBound vignette demonstrating harm bound design and interpretation (@keaven, #237).
  • Survival design functions (nEvents(), nSurv(), gsSurv(), gsSurvCalendar()) now support hr > hr0 for time-to-event designs where a larger hazard ratio is the alternative hypothesis. This enables direct specification of designs for time-to-response, safety endpoints, or reversed HR conventions. All sample size methods (Lachin-Foulkes, Schoenfeld, Freedman, Bernstein-Lagakos) and plotting functions handle both directions symmetrically (@keaven, #251).
  • New gsSurvPower() function computes power for a group sequential survival design with specified enrollment, dropout, treatment effect, and analysis timing. Unlike gsSurv() and gsSurvCalendar() which solve for sample size, gsSurvPower() takes fixed assumptions and computes power. Supports calendar-time and event-driven timing, stratified designs, all test types (1–8 including harm bounds), and flexible analysis timing criteria (targetEvents, plannedCalendarTime, maxExtension, minTimeFromPreviousAnalysis, minN, minFollowUp). When an existing gsSurv design is provided via x, parameters can be selectively overridden for “what-if” sensitivity analyses. Changing alpha preserves original futility bounds (following gsBoundSummary() convention) while recomputing efficacy bounds (@keaven, #109).
  • gsSurvPower() now supports informationRates to cap spending at planned versus realized information fractions and fullSpendingAtFinal to force the final spending fraction to 1 when desired. This makes it easier to evaluate delayed event accrual while keeping spending tied to a planned information schedule. It also preserves the original one-sided versus two-sided design convention when inheriting defaults from an existing gsSurv object.
  • New vignette “Power Computation for Group Sequential Survival Designs” (vignette("gsSurvPower")) with worked examples for sensitivity analysis, alpha reallocation, biomarker subgroup to stratified design, and event-driven timing (@keaven, #109).

Bug fixes

  • Fixed sign inconsistency in hrn2z() which used sign(hr0 - hr1) while zn2hr() used sign(hr1 - hr0), preventing correct round-trip conversion. Both now use sign(hr1 - hr0) (@keaven, #251).

Documentation

  • Documented test.type restriction in toBinomialExact(): only test.type = 1 and 4 are supported; other types (including 7 and 8) produce an error (@keaven, #109).
  • Consolidated shared roxygen2 @param documentation using @inheritParams so that test.type, spending function parameters, and other shared arguments are defined once in gsDesign() or nSurv() and inherited by gsSurv() and gsSurvCalendar() (@keaven, #237).
  • New vignette “Selective bound testing at interim analyses” (vignette("SelectiveBoundTesting")) with worked examples for all supported scenarios (@keaven, #255).
  • Expanded gsSurvPower() documentation and vignette guidance for informationRates, calendar spending, and fullSpendingAtFinal, including a corrected worked example of the spending fractions used at the final analysis.

Testing

  • Added focused gsSurvPower() regression tests for informationRates, fullSpendingAtFinal, and inherited sidedness behavior from existing time-to-event designs.

gsDesign 3.9.0 (February 2026)

CRAN release: 2026-02-15

Breaking changes

  • The R native pipe operator |> is now used throughout the code and documentation, so R >= 4.1.0 is now required (@nanxstats, #236).

New features

  • nSurv() and gsSurv() now incorporate Schoenfeld and Freedman methods for sample size and power for time-to-event studies with proportional hazards. This allows matching versus other software (@keaven, #243).

Improvements

  • Corrected weighting for stratified time-to-event studies with proportional hazards. This was done for Lachin-Foulkes method, but we also added Bernstein and Lagakos method (@keaven, #243).
  • print.nSurv() and print.gsSurv() now use refreshed output formatting (@keaven, #243).
  • C code under src/ is now consistently formatted with clang-format, and C function comments now use Doxygen blocks with clearer parameter and return documentation (@nanxstats, #238).
  • C normal density calculations now use a shared gs_inv_sqrt_2pi constant from src/gsDesign.h, which now also has include guards, replacing duplicated magic numbers and repeated division (@nanxstats, #241).
  • Time-to-event design code is now split into focused R/gsSurv-*.R files, improving maintainability and future extension without changing user-facing behavior (@nanxstats, #240).

Bug fixes

  • gsBound() now prints the last two lower boundary values correctly in an internal diagnostic message (atem and atem2) when printerr is enabled (@nanxstats, #238).

Testing

gsDesign 3.8.0 (December 2025)

CRAN release: 2025-12-07

New features

Improvements

  • plotgsPower() now uses linewidth instead of deprecated size aesthetic for geom_line() calls, avoiding ggplot2 (>= 3.4.0) warnings (@nanxstats, #217).

Bug fixes

  • sfXG3() now correctly reports its name as “Xi-Gallo, method 3” instead of “Xi-Gallo, method 1” (@DMuriuki, #223).
  • Fixed base plotting for conditional power (plottype = 4) so labels passed to text() match the plotted points. This prevents r-devel (R 4.6.0) truncation warnings and keeps vdiffr snapshots bitwise reproducible across R versions (@nanxstats, #231).

Testing

Documentation

Maintenance

  • Added workflow_dispatch trigger to R CMD check workflow for easier testing on forks (@jdblischak, #225).

gsDesign 3.7.0 (August 2025)

CRAN release: 2025-08-25

Breaking changes

  • hGraph() has been formally removed from gsDesign (@nanxstats, #215). It was soft-deprecated in gsDesign 3.4.0 and moved to gMCPLite. Use gMCPLite::hGraph() instead.

    This change also preemptively fixes an R CMD check issue with ggplot2 (>= 4.0.0) that would otherwise require declaring MASS as an explicit dependency (tidyverse/ggplot2#6578).

Testing

gsDesign 3.6.9 (June 2025)

CRAN release: 2025-06-25

Documentation

  • Added new vignette vignette("binomialTwoSample") for binomial two-arm trial design and analysis (@keaven, #202). Covers superiority, non-inferiority, and super-superiority designs using risk-difference methods. Includes sample size calculations, power analysis, and protocol wording with both asymptotic approximations and simulation approaches.

New features

  • New function binomialPowerTable() generates power tables across control rates and treatment effects. Supports both analytical calculations and fast simulation for exact results.

gsDesign 3.6.8 (May 2025)

CRAN release: 2025-05-21

Bug fixes

  • gsBoundSummary() (as updated in gsDesign 3.6.6) did not consider spending time for alternate alpha levels when the alpha argument was specified. This issue has been resolved; lsTime and usTime are now correctly used for updated bounds with these alternate alpha levels (@keaven, #203).

Testing

Documentation

  • Switched the pkgdown math renderer from KaTeX to MathJaX for improved compatibility, as the MathJaX support was improved in pkgdown 2.1.2 (@nanxstats, #200).
  • Added Research Organization Registry (ROR) ID to DESCRIPTION (@jdblischak, #201).

gsDesign 3.6.7 (March 2025)

CRAN release: 2025-03-03

Improvements

  • All plots in vignettes are now generated by the native SVG device for sharper appearance and fewer package dependencies (@nanxstats, #188).

Testing

gsDesign 3.6.6 (February 2025)

CRAN release: 2025-02-11

New features

Testing

Documentation

  • Add more details to the parameter r for controlling numerical integration grid points (@nanxstats, #181).

gsDesign 3.6.5 (November 2024)

CRAN release: 2024-11-14

Improvements

  • toInteger() (introduced in gsDesign 3.5.0) is updated to match broader, non-gsDesign conventions for deriving integer sample size and event counts (@keaven, #172).

    This update may result in different outputs compared to previous versions. Users who use this function should review the updated function documentation (?toInteger) and vignette("toInteger") for details.

Testing

Documentation

  • Add the cph role to the Authors@R field following best practices (@nanxstats, #166).

gsDesign 3.6.4 (July 2024)

CRAN release: 2024-07-26

Improvements

We have made the spending function summary output more readable and informative.

  • Text summaries for spending functions with multiple parameters are now properly formatted. For instance, a b = 0.5 1.5 is now displayed as a = 0.5, b = 1.5 (@jdblischak, #162).
  • The summary() method for sfLDOF() no longer includes the redundant none = 1 in its output (@jdblischak, #159).

Documentation

  • Added a note about using a positive scalar for sfupar in sfLDOF() to create a generalized O’Brien-Fleming spending function (@keaven, 52cc711, 99996b).
  • Improved math rendering in our pkgdown site vignettes by switching to KaTeX, which is now supported in pkgdown 2.1.0 (@nanxstats, #161).
  • Standardized vignette titles and headings by using h2 as the base level and adopting sentence case throughout (@nanxstats, #158).

gsDesign 3.6.3 (July 2024)

CRAN release: 2024-07-09

New features

Improvements

Testing

gsDesign 3.6.2 (April 2024)

CRAN release: 2024-04-09

Documentation

Testing

  • Move independently programmed functions for validation as standard test helper files (#130).

gsDesign 3.6.1 (February 2024)

CRAN release: 2024-02-13

New features

Improvements

  • The plotting functions now use dplyr::reframe() to replace dplyr::summarize() when performing grouped cumsum() (@jdblischak, #114).
  • The plotting functions are updated to use the .data pronoun from rlang with ggplot2::aes(). This simplifies the code and follows the recommended practice when using ggplot2 in packages (@jdblischak, #124).
  • hGraph() now uses named guide argument in the scale_fill_manual() call to be compatible with ggplot2 3.5.0 (@teunbrand, #115). Note: this function has been deprecated and moved to gMCPLite since gsDesign 3.4.0. It will be removed from gsDesign in a future version. Please use gMCPLite::hGraph() instead.

Documentation

  • vignettes("SurvivalOverview") is updated with more details and minor corrections (@keaven, #126).
  • Fix equation syntax in plotting function documentation to render math symbols properly (@keaven, #118).

gsDesign 3.6.0 (November 2023)

CRAN release: 2023-11-12

Breaking changes

  • gsSurv() and nSurv() have updated default values for T and minfup so that function calls with no arguments will run. Legacy code with T or minfup not explicitly specified could break (#105).

New features

  • gsSurvCalendar() function added to enable group sequential design for time-to-event outcomes using calendar timing of interim analysis specification (#105).
  • as_rtf() method for gsBinomialExact() objects added, enable RTF table outputs for standard word processing software (#102).

Improvements

  • toBinomialExact() and gsBinomialExact(): fix error checking in bound computations, improve documentation and error messages (#105).
  • print.gsSurv(): Improve the display of targeted events (very minor). The boundary crossing probability computations did not change. The need is made evident by the addition of the toInteger() function (#105).
  • toInteger(): Fix the documentation and execution based on the ratio argument (#105).
  • Update the vaccine efficacy, Poisson mixture model, and toInteger vignettes (#105).
  • Standardize and improve roxygen2 documentation (#104).

gsDesign 3.5.0 (July 2023)

CRAN release: 2023-07-19

  • sfPower() now allows a wider parameter range (0, 15].
  • toInteger() function added to convert gsDesign or gsSurv classes to integer sample size and event counts.
  • toBinomialExact() function added to convert time-to-event bounds to exact binomial for low event rate studies.
  • Added “A Gentle Introduction to Group Sequential Design” vignette for an introduction to asymptotics for group sequential design.
  • as_table() and as_gt() methods for gsBinomialExact objects added, as described in the new “Binomial SPRT” vignette.
  • In plot.ssrCP(), the hat syntax in the mathematical expression is revised, resolving labeling issues.
  • ggplot2::qplot() usage replaced due to its deprecation in ggplot2 3.4.0.
  • Link update for the gsDesign manual in the documentation, now directly pointing to the gsDesign technical manual bookdown project.
  • Introduced a new hex sticker logo.

gsDesign 3.4.0 (October 2022)

CRAN release: 2022-10-12

  • Removed restriction on gsCP() interim test statistic zi (#63).
  • Removed gMCP dependency. Updated vignettes and linked to vignettes in gMCPLite (#69).
  • Added deprecation warning to hGraph() and suggested using gMCPLite::hGraph() instead (#70).
  • Moved ggplot2 from Depends to Imports (#56).

gsDesign 3.3.0 (May 2022)

CRAN release: 2022-05-27

  • Addition of vignettes
    • Demonstrate cure model and calendar-based analysis timing for time-to-event endpoint design
    • Vaccine efficacy design using spending bounds and exact binomial boundary crossing probabilities
  • Minor fix to labeling in print.gsProbability
  • Fixed error in sfStep
  • Updates to reduce R CMD check and other minor issues

gsDesign 3.2.2 (January 2022)

CRAN release: 2022-02-02

  • Use inherits() instead of is() to determine if an object is an instance of a class, when appropriate
  • Correctly close graphics device in unit tests to avoid plot output file not found issues
  • Minor fixes to hGraph() for multiplicity graphs
  • Minor fix to nBinomial() when odds-ratio scale specified to resolve user issue
  • Minor changes to vignettes

gsDesign 3.2.1 (July 2021)

CRAN release: 2021-07-12

  • Changed gt package usage in a vignette due to deprecated gt function
  • Replied to minor comments from CRAN reviewer (no functionality impact)
  • Minor update to DESCRIPTION citing Jennison and Turnbull reference

gsDesign 3.2.0 (January 2021)

CRAN release: 2021-03-13

  • Substantially updated unit testing to increase code coverage above 80%
  • Updated error checking messages to print function where check fails
  • Removed dependencies on plyr packages
  • Updated github actions

gsDesign 3.1.1 (May 2020)

CRAN release: 2020-05-07

  • Vignettes updated
  • Added hGraph() to support ggplot2 versions of multiplicity graphs
  • Eliminated unnecessary check from sequentialPValue
  • Targeted release to CRAN
  • Removed dependencies on reshape2, plyr
  • Updated continuous integration
  • Updated license

gsDesign 3.1.0 (April 2019)

  • Addition of pkgdown web site
  • Updated unit testing to from RUnit to testthat
  • Converted to roxygen2 generation of help files
  • Converted vignettes to R Markdown
  • Added Travis-CI and Appveyor support
  • Added sequentialPValue function
  • Backwards compatible addition of spending time capabilities to gsDesign and gsSurv

gsDesign 3.0-5 (January 2018)

  • Registered C routines
  • Fixed “gsbound”
  • Replaced “array” by “rep” calls to avoid R CMD check warnings

gsDesign 3.0-4 (September 2017)

  • First Github-based release
  • Cleaned up documentation for nBinomial1Sample()
  • Updated documentation and code (including one default value for an argument) for nBinomial1Sample() to improve error handling and clarity
  • Updated sfLDOF() to generalize with rho parameter; still backwards compatible for Lan-DeMets O’Brien-Fleming

gsDesign 3.0-3

  • Introduced spending time as a separate concept from information time to enable concepts such as calendar-based spending functions. The only user function changed is the gsDesign() function and the change is the addition of the parameters usTime and lsTime; default behavior is backwards compatible.

gsDesign 3.0-2 (February 2016)

  • Simplified conditional power section of gsDesignManual.pdf in doc directory
  • Corrected basic calculation in gsCP()
  • Eliminated deprecated ggplot2 function opts()

gsDesign 3.0-1 (January 2016)

CRAN release: 2016-02-01

  • More changes to comply with R standards (in NAMESPACE - importFrom statements - and DESCRIPTION - adding plyr to imports) ensuring appropriate references.
  • Deleted link in documentation that no longer exists (gsBinomialExact.Rd).
  • Last planned RForge-based release; moving to Github.

gsDesign 3.0-0 (December 2015)

  • Updated xtable extension to meet R standards for extensions.
  • Fixed xtable.gsSurv and print.gsSurv to work with 1-sided designs
  • Update to calls to ggplot to replace show_guide (deprecated) with show.legend arguments where used in ggplot2::geom_text calls; no user impact
  • Minor typo fixed in sfLogistic help file
  • Cleaned up “imports” and “depends” in an effort to be an R “good citizen”
  • Registered S3 methods in NAMESPACE

gsDesign 2.9-4

  • Minor edit to package description to comply with R standards

gsDesign 2.9-3 (November 2014)

CRAN release: 2014-11-10

  • Added sfTrimmed as likely preferred spending function approach to skipping early or all interim efficacy analyses; this also can adjust bound when final analysis is performed with less than maximum planned information. Updated help(sfTrimmed) to demonstrate these capabilities.
  • Added sfGapped, which is primarily intended to eliminate futility analyses later in a study; see help(sfGapped) for an example
  • Added summary.spendfn() to provide textual summary of spending functions; this simplified the print function for gsDesign objects
  • Added sfStep() which can be used to set an interim spend when the exact amount of information is unknown; an example of how this can be misused is provided in the help file
  • Fixed rounding so that gsBoundSummary, xtable.gsSurv and summary.gsDesign are consistent for gsSurv objects