                 Changes in version 0.3.0 (2026-09-24)                  

First CRAN release.

  - gce_tidy(effects = TRUE) covariate-effects table. gce_tidy() has an
    effects argument. With effects = TRUE it returns a comparison table
    that, for each covariate, juxtaposes the hazard ratio for the
    primary event, the competing event, the total (composite) event, and
    the relative hazard ratio (the omega+ ratio) from the GCE model,
    each with a confidence interval. The individual/total columns are
    estimated on the model's own scale --- cause- specific Cox for
    gcecox(), Fine-Gray subdistribution for gcefg() --- so the reader
    can see whether a covariate acts on the event of interest, the
    competing event, both, or their balance. gcecox() and gcefg() retain
    the model design matrix on the fitted object ($design) to support
    this.
  - Reported coefficients on the natural scale by default; risk score
    always normalized. gcecox(), gcefg(), and lunnmcneil() report omega+
    ratios per natural covariate unit by default; standardize = TRUE
    reports them per 1 SD instead (a reparameterization, so p-values and
    the omnibus test are identical). The GCE risk score is always the
    normalized, mean-centered linear predictor, so the average patient
    has risk score 0 and cutpoints / plots / calibration are unaffected
    by the reporting choice.
  - New gce_scaling() and gce_riskscore(). gce_scaling() returns each
    covariate's mean, SD, and per-SD omega+ ratio. gce_riskscore(fit,
    newdata) scores new subjects with the stored means/SDs and
    coefficients, returning the risk score and omegaplus_rel = the
    subject's omega+ relative to the average subject in the fitting data
    (with absolute omega+/omega for cause-specific models). $scaling,
    $center, $scale, $coef_raw, and $coef_std are stored on the fitted
    object.
  - Cutpoint selection on the log-omega+ scale (no tail chasing). The
    optimal cutpoint criterion maximizes between-group separation in log
    omega+ (the risk score / linear predictor) rather than on the
    exponential omega+ scale. Because that is the additive scale of the
    joint omega+ contrast, the search is no longer dominated by a few
    extreme high-risk subjects and returns balanced, well-separated
    groups. criterion = "cif" (joint Gray statistic across both events)
    is available as an alternative.
  - Reported test is now the omega+ group contrast. gce_cutpoints()$test
    reports the Lunn-McNeil test that the ratio of cause-specific (or
    subdistribution) hazards differs between groups, with the
    univariable omega+ ratio estimate and CI -- the GCE test that
    separate per-event Gray/log-rank tests miss. The per-event Gray
    tests are also returned ($individual_gray) so the difference is
    visible, along with a selection-adjusted permutation p-value
    ($p.perm, via nperm > 0).
  - Alligator plot (gce_alligator()). Draws the cumulative incidence of
    the event of interest and the competing event on a single panel,
    with risk groups distinguished by colour and event types by line
    type (event of interest solid, competing event dashed). By default
    it forms 2 groups at the optimal omega+ cutpoint (method =
    "optimal", log-scale; criterion selectable) and annotates the
    cutpoint value and group sizes. The x-axis is truncated at the
    readout time t with 1-unit ticks; the y-axis auto-caps at the
    smallest of 25/50/75/100% covering the peak incidence, with 5%/10%
    ticks (override with ymax), so low-incidence plots are not
    compressed; and numbers at risk are shown in an aligned panel below
    the plot (via patchwork). Groups of 2-3 are labelled Low/High or
    Low/Intermediate/High by default.
  - Two bundled example datasets (hn, prostate). Two competing-risks
    example datasets show opposite GCE regimes: hn (head and neck, n
    = 1000) is recurrence-dominant (omega+ > 1), while prostate (n
    = 1000) is competing-death-dominant (omega+ < 1). Both code status
    as 0 = censored, 1 = event of interest, 2 = competing, with time in
    years and sequential subject IDs. They are provided for illustration
    only and do not represent real patients. Categorical covariates
    (stage, site, Gleason, performance status) are factors. All examples
    and the vignette use these datasets.

                        Changes in version 0.2.0                        

Refocused the package on modeling omega+ (event of interest vs.
competing event).

Breaking changes

  - Removed the omega-ratio regression. Covariate effects on omega
    (event of interest vs. all events) are no longer modelled.
  - Per-subject omega = omega+/(1+omega+) is kept as a descriptive
    quantity ($omega) for comparing model-predicted with observed
    values.
  - gce_tidy() no longer takes which (omega+ only). gce_cutpoints() now
    targets omega+ separation rather than a log-rank split.

New features

  - Fine-Gray Lunn-McNeil. lunnmcneil() gains type = "finegray": a
    stacked, risk-set-weighted (survival::finegray) model giving omega+
    CIs and p-values on the subdistribution scale from one joint model,
    replacing the bootstrap in gcefg().
  - gce_cutpoints(method = "optimal") finds cutpoints maximizing the
    between-group omega+ separation (greedy maximum between-group sum of
    squares).
  - gce_alligator() --- cumulative incidence of the event of interest
    and the competing event within risk groups, with Gray's test.
  - gce_calibration() --- predicted vs. observed omega+ (or omega) by
    rank group, user-specified number of groups.

Robustness

  - Constant covariates are dropped up front with a warning instead of
    causing a downstream error.

                        Changes in version 0.1.0                        

First release. gcemod is a successor to gcerisk.

Changes relative to gcerisk

  - Variance for the omega ratio. Where gcerisk estimates the variance
    of log(omega ratio) by sampling independent normal deviates for the
    cause-specific and all-cause coefficients and taking the variance of
    their difference, gcemod uses a case-resampling (nonparametric)
    bootstrap that refits the models on resampled subjects. (This
    omega-ratio regression was removed in 0.2.0.)

  - Hypothesis testing added (Lunn-McNeil). The omega-plus ratio (event
    of interest vs. competing event) is estimated from a single
    stacked/augmented Cox model in the style of Lunn & McNeil (1995).
    The event-type interaction coefficient is exactly log(omega+ ratio)
    and carries a model-based (robust) standard error, a per-covariate
    Wald test, and an omnibus multivariate Wald test of no differential
    covariate effect across event types. Because omega is a monotone
    transform of omega-plus (omega = omega+/(1 + omega+)), this test
    applies to both.

  - Cumulative hazard at time t. gcerisk estimates cumulative hazards by
    regressing -log(S(t)) on time with lm() and extrapolating, which
    forces a linear cumulative hazard. gcemod reads the Nelson-Aalen
    cumulative hazard (cause-specific model) or the subdistribution
    cumulative hazard derived from the Fine-Gray CIF (-log(1 - F(t)))
    directly at the requested time via step functions.

  - Edge cases. Formula construction now uses reformulate() instead of
    manual string pasting, which failed for a single covariate (the
    1:(p-1) loop). NA handling (complete-case with a warning),
    single-covariate models, and non-convergent bootstrap replicates
    (skipped with a warning) are handled.

New features

  - lunnmcneil() exposes the stacked-model estimator and tests directly.
  - gce_cutpoints() derives risk-stratification groups from a GCE risk
    score (quantile groups, or an optimal two-group split by log-rank
    scan).
  - gce_performance() reports the cause-specific concordance (C-index)
    and a grouped calibration table for the event of interest.
  - print(), summary(), and gce_tidy() methods for compact, report-ready
    output.
