Changelog
Source:NEWS.md
OncoPath 1.0.4 (2026-08-07)
No statistical changes. Two runtime dependencies were added to Imports, and the documentation was overhauled.
Fixed
-
ggrepelandpatchworkwere used at runtime but not declared.R/waterfall.b.Rcallspatchwork::wrap_plotswhen assembling multi-panel figures andggrepel::geom_text_repelwhen labelling outliers, but neither package appeared inDESCRIPTION. jamovi installs a module’sImportsthe first time it is used and cannot fetch a missing package on demand, so a user without these already installed would have hit a failure at plot time rather than at install time. Both are now inImports(22 packages, one per line).
Note
- Apart from the dependency fix above, this is a version and date bump: 1.0.3 → 1.0.4 across
DESCRIPTION,jamovi/0000.yamland the four analysis definitions, plustemp/andbackups/added to.Rbuildignoreand.gitignore. No statistical method and no output definition changed between 1.0.3 and this release. Everything substantive from this development cycle is documented under 1.0.3 below, which was tagged without release notes.
Documentation
All 21 files under vignettes/ were audited against jamovi/0000.yaml and the generated wrapper signatures. These articles are published to https://www.serdarbalci.com/OncoPath/articles/; vignettes/ is excluded by .Rbuildignore and there is no VignetteBuilder, so none of this affects R CMD check. Every example added below was executed against the bundled datasets before being written down.
- Option coverage went from 56% to 100%. Of the 120 options across the four shipped analyses, 53 were not mentioned anywhere in the documentation; none remain.
-
ihcheterogeneityhad no documentation whatsoever — 18 of its 19 options were unmentioned and no article referred to it.ihcheterogeneity-comprehensive.Rmdis new: what the analysis is for (a biopsy score describes the core, not the tumour), the data layout, a worked run reporting ICC(2,1) 0.663 against ICC(3,1) 0.658 and why both are shown, the variance decomposition that attributes 34.2% of total variance to within-case sampling, and why the post-hoc power row should not be used for planning. -
The 447-line
diagnosticmetaarticle never calleddiagnosticmeta(). It described the bivariate and HSROC models at length without a single executable example, so the argument names and their scales appeared nowhere. It now carries a worked run against the bundleddiagnostic_studiesdata with the returned pooled sensitivity (75.5%, CI 69.1-80.9), specificity (89.8%, CI 85.7-92.8), HSROC parameters, heterogeneity and Deeks’ test. Two argument traps are called out:confidence_levelis a percentage on a 50-99 scale (passing0.95errors), andzero_cell_correctionhas nocontinuitylevel — the four accepted values arenone,constant,treatment_armandempirical. The Deeks’ result on five studies is presented as a caveat rather than a finding, since the test needs roughly ten. -
The waterfall article demonstrated nothing.
06-function-waterfall.Rmdpulled a dataset fromClinicoPathDescriptives, calledlibrary(ClinicoPath)rather thanlibrary(OncoPath), and its three code chunks printed placeholder strings withcat()instead of callingwaterfall(). It has been rewritten around the bundledwaterfall_percentage_basicandwaterfall_raw_longitudinaldatasets, with the RECIST category breakdown and clinical metrics it actually returns (ORR 35.0%, CI 15.4-59.2; DCR 80.0%, CI 56.3-94.3), the raw/spider input path, and a table of the fifteen previously-undocumented options. NotesortDirectiontakes"conventional"or"reverse", not"decreasing". -
swimmerplot’scensorVarwas undocumented, along withcustomReferenceDate,showGlossary,showCopyReadyandshowAbout.censorVarmatters more than its obscurity suggests: without it a bar that ends because follow-up ended is drawn the same as one that ends because the event occurred, which is the commonest way a swimmer plot misleads. -
Seven articles refer to analyses OncoPath does not ship, and now say so.
clinicalheatmap,ggoncoplot,recist,classification,decisiongraph,digitalvalidationandharalicktextureare all on development or test menu routes in the umbrella ClinicoPath module and reach no user today. Separately, several articles useagreement(meddecide) andsurvival(jsurvival), and now name the module to install for those steps. Nothing was deleted.
OncoPath 1.0.3 (2026-08-05)
An end-to-end pre-release review of all four shipped analyses — waterfall, swimmerplot, diagnosticmeta and ihcheterogeneity — reading each chain from the user interface through the backend to the rendered output, and checking every statistic against an independent implementation. Several of the defects below changed reported response rates, durations of response, variance components and publication-bias conclusions, so results produced with earlier versions of these analyses should be re-run.
Fixed
Treatment Response (waterfall)
-
Progression was measured from baseline instead of from the patient’s nadir. RECIST v1.1 defines progressive disease relative to the smallest tumour burden recorded so far, not relative to the first scan. A patient going 100 → 60 → 78 mm is +30% over their nadir — progression — but still −22% from baseline, so they were counted as censored and their duration of response ran on to last follow-up. Every duration-of-response summary and the Kaplan–Meier curve built from it were inflated.
.progressionTimes()now carries the runningcummin()of the burden. -
A response-category override outside CR/PR/SD/PD was silently converted to
NA.recist_categoryis a factor with levels CR/PR/SD/PD/Unknown, so assigning an unrecognised label producedNAwith only an invalid-factor-level warning. If every row was overridden the whole column wentNAand the run aborted downstream withmissing value where TRUE/FALSE needed. Unrecognised labels are now reported and rejected. - Objective response and disease control rates were computed over assessment rows, not patients, on some processing paths. The same 90-observation dataset gave ORR 100% when it held 30 patients with 3 rows each and ORR 33.3% when it held 60 patients with 3 rows each, because the row count decides which processing path runs. Every path now collapses to one row per patient before counting, and unevaluable rows no longer inflate the denominator.
-
Physical limits on tumour measurements were never enforced. The Response Value option text had always promised that shrinkage would be capped at −100%, and the code never applied the cap. Worse, a negative raw measurement flips the sign of
((current − baseline) / baseline), so a growing tumour was reported as a response. Both are now handled at a single convergence point (.enforceMeasurementLimits()), and the cap is announced in the always-visible notices panel rather than the validation panel that is cleared when validation otherwise passes. -
Patients dropped for a missing or zero baseline simply vanished from the cohort, and patients with only a baseline scan were scored SD. With a time variable, a baseline-only patient produced
((baseline − baseline) / baseline) × 100= 0% change and was categorised as stable disease, although a patient with no post-baseline assessment is not response-evaluable at all. Both groups are now reconciled against the input and reported. -
The exported response-category column was written against the wrong patients. The path without a time variable took
rownames()of a dplyr tibble — always"1"…"k", never the source row numbers — after that frame had been collapsed to one row per patient and re-sorted into patient-ID order. Rows are now matched back by patient ID. -
The ORR/DCR confidence intervals used a different denominator from the rates themselves. The interval was computed on
nrow(), which includes Unknown and unevaluable patients, while the point estimate counted only CR/PR/SD/PD — so the printed rate could fall outside its own interval, for example ORR 50.0% displayed with a 95% CI of 28.8–46.8%. The copy-ready report sentences shared the same defect and the same fix. -
The copy-ready “Main Results” paragraph rendered as nothing whenever a response category had no patients.
dplyr::count()drops unobserved factor levels, so subsetting for an absent category returnedinteger(0)— notNULL, so the%||% 0fallback never fired — andsprintf()with a zero-length argument returnscharacter(0), whichpaste0()then collapses away. -
The to-do, validation and clinical-summary panels ignored guided mode and were always on screen. A jamovi
visible:expression beginning with!fails jmvcore’s routing regex, so(!enableGuidedMode)evaluated to a raw truthy string. Rewritten as(enableGuidedMode:FALSE). -
The waterfall and spider plots did not refresh when
barAlpha,barWidth,minResponseForLabel,seed,timeVar,annotationVarsorshowCategoryLabelschanged. Those options are read when the figure is drawn but were missing fromclearWith.
Swimmer Plot (swimmerplot)
- “Relative (all start from 0)” anchored each row at zero instead of each patient. A swimmer plot is multi-row per patient by construction, so row-wise rebasing stacked every episode of a patient back onto t = 0, corrupting total person-time, mean and median duration, follow-up density and the reverse Kaplan–Meier median — in the default configuration, and invisibly in any fixture with one row per patient. Lanes, milestones and events are now all measured from the patient’s earliest start.
- Milestone markers were paired with lanes by position, so they landed on the wrong patients. Milestone columns were read from the unfiltered data while the patient table had already had rows removed; one dropped row shifted every later patient’s markers onto somebody else’s lane and discarded the last patient’s milestone, silently, in both the figure and the Milestone Event Summary. For multi-episode patients the same milestone was also handed to both rows, double-counting it and producing a negative re-based copy on the later episode. Milestones are now collapsed to one row per patient and realigned by patient ID.
- Ongoing-treatment arrows were inferred from the longest follow-up. Treating “largest end time” as evidence of still being on treatment at data cutoff is wrong in the common case — the patient with the longest follow-up is often the one who died last. Arrows are now drawn only from an explicit censoring variable, using the same helper as the median-follow-up calculation, and no arrows are drawn when there is none.
-
Every event-marker glyph was the empty string, so event markers were invisible. The symbols that once populated the glyph table were deleted rather than escaped during a non-ASCII sweep, and
ggswim::scale_marker_discrete()therefore drew nothing for every labelled event. Restored as print-safe geometric symbols (● ■ ▲ ▼ ◆ ★ ✚ ✖ ◑ ◎) that survive PDF and Word export. Glyph pattern matching was tightened at the same time so that short patterns match as whole words — a bare “ct” had been matching “Infarction” and “Reaction”. -
Adding a milestone wiped the CR/PR/SD/PD colouring from the whole figure. Mapping milestones to
coloradded a secondscale_color_manual()containing only milestone names; ggplot2 permits one colour scale per plot, so it replaced the lane scale and every response category fell through toNAgrey. Milestones are now mapped to shape only. -
A custom reference line crashed the plot on an absolute date scale. lubridate does not export
months()(monthsis a base generic), solubridate::months()threw — and months is the default time unit, so this killed the plot out of the box. The Period constructors also reject fractional amounts whilecustomReferenceTimeis an unconstrained number, so 12.5 crashed too. Now built withlubridate::duration(). - The copy-ready manuscript text asserted an objective response rate of 0.0% where the metrics table declined to make the claim. ORR and DCR are defined only for RECIST-coded responses; with codings such as “Responder”, 0/1 or “Grade 1” nothing normalises to CR/PR/SD/PD and the numerator is legitimately zero, which read as a genuine ORR of 0.0% with an exact binomial interval attached. The guard existed in one place only; both now go through one shared helper.
- The summary table could show a median follow-up outside its own range. The observed range was printed beside the reverse Kaplan–Meier median rather than the observed one. The estimator is now named, and the range stays attached to the observed median.
-
Rows excluded before validation were never disclosed.
.validateClinicalData()ran on the already-filtered frame, so its “these will be excluded” warnings could not fire for the rows an earlier filter had dropped; those patients disappeared from the figure and from every denominator with nothing said. - The plot and milestone table did not clear on
maxMilestonesor the milestone name options, and the export tables did not clear ontimeDisplayortimeUnit. -
The ggswim fallback subtitle always read “ggswim unavailable” instead of the real error. The helper signature is
(patient_data, milestone_data, event_data, opts, stats, error_message), and the error was being passed positionally intomilestone_data, where it was discarded.
Diagnostic Test Meta-Analysis (diagnosticmeta)
-
Deeks’ funnel-plot asymmetry test was specified incorrectly and could report “no asymmetry” where Deeks’ own specification finds it. The effective sample size must be
4·n1·n0/(n1+n0), the regression of log diagnostic odds ratio on1/sqrt(ESS)must be weighted by ESS, and the slope referred to a t distribution on k − 2 degrees of freedom; the code used inverse-variance weights and a normal reference. The accompanying funnel plot has been switched to log DOR against1/sqrt(ESS)so that plot and test show the same thing — it previously drew the conventional Egger-style precision axis, which Deeks et al. showed is misleading for diagnostic accuracy data because log DOR and its standard error are intrinsically correlated, so a visibly symmetric funnel could sit beside a significant asymmetry p-value (Deeks, Macaskill & Irwig 2005, J Clin Epidemiol 58:882–93). - A single missing cell count aborted the entire analysis, and negative counts were dropped in silence. The pre-exclusion study count was computed but never used, so the reported number of studies was the post-exclusion count with no indication that anything had been removed. Unusable studies — missing or negative cells, or no diseased or no non-diseased participants — are now excluded explicitly and listed.
-
The zero-cell option “None” applied a heavier correction than either option that advertises one.
mada’s defaultcorrection.control = "all"adds 0.5 to all four cells of every study as soon as one zero cell appears anywhere; “None” now setscorrection.control = "single", so only the affected studies are corrected. The disclosure block was also gated on the method not being “none”, making it the one setting that said nothing. The option is retitled “None (correct only zero-cell studies)”. -
Meta-regression was guarded on the number of studies rather than on residual degrees of freedom. A four-level covariate on five studies leaves none:
metaforsilently drops redundant predictors and the table then looks normal while describing a different model. Rows are also labelled with the user’s covariate name — the model is fitted on an internal column literally namedcovariate, so they had read “covariate”, “covariateB”, and so on. -
Warnings were written into a panel that
.run()had already hidden as soon as all five variables were chosen, so a missing cell produced a completely blank analysis with no explanation anywhere on screen. - Study-level sensitivity and specificity were shown as proportions while the pooled table showed percentages — 0.82 next to 81.59 for the same quantity on one screen. Per-study values are now percentages to one decimal place.
-
The forest and SROC plots did not clear on
method,bivariate_analysisorconfidence_level, and the SROC region legend said “95%” unconditionally, which became wrong once the ellipse started honouring the chosen confidence level. The legend now names the actual level and identifies the region as a confidence region for the summary point.
IHC Heterogeneity (ihcheterogeneity)
- The variance decomposition reported quantities that were not components of a common total. On a 20-case example the between-case row read 102.3% of total and the three percentages summed to 107.5%, under a row explicitly labelled “Sum of all variance components”. Replaced with a balanced two-way random-effects model — σ²case = (MScase − MSerror)/k, σ²method = (MSmethod − MSerror)/n, σ²error = MSerror — fitted on the cases measured by every method, with that number reported and any negative estimate truncated at zero and disclosed.
-
The intraclass correlation was not computed by the route the output claimed. The table reported ICC(2,1) absolute agreement; the calculation did not match that definition. Now computed with
psych::ICC, with the consistency form reported alongside absolute agreement — the two differ exactly when there is a systematic offset between methods, which is the case worth seeing. - Reliability rows were labelled with a statistic that had not necessarily been computed. Five fallback paths return the mean Spearman correlation, and that value was printed under the ICC heading and graded against ICC reliability cut-offs. The label now names the statistic actually used.
- The per-case coefficient of variation had two definitions on one screen. The table computed it from the regional columns alone while the interpretation folded in the reference measurement, so a single run could read “Mean CV = 23.19 / High variability”, “moderate (mean CV = 20%)” and “ADEQUATE SAMPLING” together. Excluding the reference section also made a systematic under-read invisible: a 30% under-read appeared as 1.2% variability. One definition is now shared by the table and the narrative, and it includes the reference measurement when one exists.
-
Paired t-tests aborted the analysis when the difference vector had zero variance.
t.test(paired = TRUE)errors with “data are essentially constant”, which is routine when scores are binned to whole percentages and every case shows the same offset. It was unguarded in four places. -
The correlation power calculation counted rows with a missing reference measurement. Using the length of the reference column rather than the number of complete pairs made
se_z = 1/sqrt(n − 3)too small, so every reported power was inflated and every required sample size understated.
Added
-
waterfall: three new display options.showCategoryLabelsprints the response category above each bar,showSpiderLabelsputs the patient ID at the end of each spider line, andannotationVarsdraws covariate tracks beneath the bars. The annotation-track figure design is credited in code to Jamovi-TrialPlots by highwindmx (LGPL); this is an independent implementation. -
diagnosticmeta: a prediction interval for a future study, shown as a note on the bivariate table with a matching prediction region on the SROC plot. The pooled estimate and its confidence interval describe how well the average is known and say nothing about consistency across studies; the interval is built from the same quantitymadauses for its prediction region, so note and plot agree. A heterogeneity warning accompanies it. -
ihcheterogeneity: relative bias reported alongside the per-case coefficient of variation. -
R/recist_engine.R, an internal lesion-level RECIST v1.1 assessment engine covering target lesion selection and validation, target sums, new-lesion detection, non-target assessment, overall visit response, confirmation and best overall response. All of it is internal and unexported, and no shipped analysis calls it yet; it is infrastructure for the lesion-level analyses described in thewaterfalldocumentation as coming in a future release.
Changed
-
waterfallis now titled “Treatment Response: Patient-Level Burden”, with the description rewritten to state explicitly that this is not a RECIST v1.1 implementation: because the analysis never sees individual lesions it cannot sum target lesions, detect new lesions, judge non-target progression, or apply the four-week confirmation rule. The summary table is retitled “Response Categories (threshold-based, not full RECIST v1.1)” and the menu subtitle changed from “Waterfall Plot, Spider Plot” to “One burden value per patient or visit”. -
swimmerplot: “Export Timeline Data” and “Export Summary Statistics” changed fromtype: Outputtotype: Table. AnOutputresult item writes a single computed column back into the dataset and must be bound to a matchingtype: Outputoption — there was none, and the backend calledsetState()rather thansetRowNums()/setValues(). Neither payload is a per-row column anyway: one is a multi-column frame, the other is one row per metric. -
diagnosticmeta: performance claims in the interpretation text are now qualified by the confidence interval. A pooled sensitivity of 90.4% with a 95% CI of 71–97% had been reported as “excellent … will detect 90 out of 100 patients”. The previously unlabelled p-value column on the sensitivity and specificity rows is now named for what it tests — the Wald test of the logit intercepts (H₀: sensitivity = 50%, H₀: false-positive rate = 50%), which is trivially significant for any usable test. -
ihcheterogeneity: multiplicity is disclosed for the up to five unadjusted paired comparisons, and a statistically significant sampling bias must now also exceed 5% of the reference mean before it vetoes the adequacy verdict — 5% being the “Minimal (<5%)” band the sampling-bias table already uses for clinical impact.
OncoPath 1.0.2 (2026-08-03)
Fixed
-
Analysis variables were required arguments of the R function. An option with no default in its jamovi definition compiles to a bare parameter, so calling the analysis from R without it failed with
argument "X" is missing, with no defaultbefore the analysis’s own validation could produce a usable message. Now defaulting toNULL:diagnosticmeta(study,true_positives,false_positives,true_negatives,false_negatives),ihcheterogeneity(biopsy1) andwaterfall(patientID,responseVar). Behaviour in the jamovi GUI is unchanged; no statistical method was altered.
Note
- The pre-release review pass carried out this release covered the survival-family and diagnostic-decision analyses (
jsurvival,meddecide) and a package-wideformat()namespace fix in the umbrella package. No analysis shipped here was changed — none of the affected files is distributed to this module.
Added
-
Automated GitHub release (
.github/workflows/release.yaml). A push to the default branch touchingDESCRIPTIONorjamovi/0000.yamlcross-checks the two version strings, refuses to proceed if they disagree, and — if the tag does not already exist — tagsv<version>and publishes a release whose notes are the matching section of this file.
OncoPath 1.0.0 (2026-07-13)
jamovi library readiness
- Aligned all four analysis versions and the module manifest at 1.0.0.
- Removed the unfinished clinical-preset and orphaned stage-migration code.
- Reduced references and dependencies to the analyses that actually ship.
- Replaced the misleading HSROC label with the implemented Holling proportional-hazards SROC model and corrected its parameter descriptions.
- Honored estimator and confidence-level selections in auxiliary
metaformodels, with finite-value guards for zero-cell studies. - Hardened validation/error rendering and translation-ready message assembly.
OncoPath 0.0.46 (2026-07-04)
This release rolls up all changes from 0.0.33 through 0.0.46 (intermediate versions 0.0.38.1, 0.0.43, and 0.0.45). The headline themes are a security/robustness hardening pass ahead of a jamovi-library refactor (HTML/XSS escaping of user-supplied text and error messages across every analysis, removal of an unreliable variable-name mangling helper), migration of the Swimmer Plot to a serialization-safe notices mechanism, a new suite of exported stage-migration utility functions, new bundled example datasets, and an upgrade of the module’s minimum jamovi app and tooling requirements.
Security & Robustness
HTML/XSS Hardening (all analyses)
-
Diagnostic Test Meta-Analysis (
diagnosticmeta):- Wrapped error messages with
htmltools::htmlEscape()in all fivetryCatchhandlers that write table notes: bivariate, HSROC, heterogeneity, meta-regression, and publication-bias analyses - Escaped the user-supplied meta-regression covariate label (
safe_covariate_label) before it is written into the meta-regression results table - Escaped user-supplied study names in the zero-cell-correction warning note and HTML disclosure (
safe_studies_note,safe_studies_html)
- Wrapped error messages with
-
Swimmer Plot (
swimmerplot):- Escaped the best-response category in interpretation and manuscript-summary text
- Escaped user-derived example values in the “Data Type Mismatch” and “Date Format Detected” guidance panels, and the detected date-format string
- Escaped validation and analysis error messages before HTML interpolation
-
Treatment Response Analysis (
waterfall):- Escaped missing/available column names in the data-validation message
- Escaped patient IDs lacking a baseline measurement, and the printed data-frame rows for invalid tumor-shrinkage and unusually-large-growth warnings
- Replaced a bare
stop(plain_message)withjmvcore::reject("{}", code = NULL, plain_message)
-
IHC Heterogeneity Analysis (
ihcheterogeneity):- Escaped the
spatial_idvariable name in the “not found in data” error message
- Escaped the
Variable-name Handling Bug Fix
-
diagnosticmeta: removed the.escapeVar()helper, which mangled column names containing spaces or punctuation (e.g.Study Name (2020)becameStudy_Name_2020_) and then used the mangled string as aself$data[[...]]key, silently returningNULLand breaking the analysis. Study/TP/FP/FN/TN variables now use their raw option values as lookup keys. -
diagnosticmeta: narrowed package imports from@import mada/@import metaforto@importFrom mada reitsma phmand@importFrom metafor rma, and setdontrun: trueon the analysis example.
Output Cleanup
- Removed emoji from all HTML output panels (welcome/about/interpretation/glossary/plot-explanation panels, notice icons, and the Swimmer Plot clinical-event glyph mapping) across
diagnosticmeta,swimmerplot,waterfall, andihcheterogeneity, and replaced%with the word “percent” inwaterfallandihcheterogeneityoption descriptions.
Enhanced Existing Modules
Swimmer Plot (swimmerplot) — Notices Migration
-
NEW output
notices(typePreformatted, title “Important Information”) withclearWithonpatientID,startTime,endTime,responseVar,censorVar, andtimeUnit - Added
.noticeList,.addNotice(), and.renderNotices()helpers that render plain-text notices via the Preformatted item, avoiding both thejmvcore::Noticeserialization error and HTML in notice content - Re-enabled the small-sample-size
STRONG_WARNING(n < 10 patients), which was previously commented out to avoid serialization errors - Emit an
ERRORnotice when required variables (Patient ID, Start Time, End Time) are missing - Reset the notice list at the top of
.run()to prevent accumulation across runs
New Stage Migration Utility Functions
Four new R source files add an exported stagemigration_* helper suite (with man pages and STAGEMIGRATION_CONSTANTS) supporting staging-system comparison and validation: - Discrimination: stagemigration_calculateConcordance, stagemigration_bootstrapConcordance, stagemigration_competingRisksDiscrimination - Competing risks & survival: stagemigration_competingRisksAnalysis, stagemigration_calculateRMST, stagemigration_cutpointAnalysis - Data validation & quality: stagemigration_validateData, stagemigration_validateCovariates, stagemigration_validateStagingVars, stagemigration_createEventBinary, stagemigration_convertLabelled, stagemigration_detectOutliers, stagemigration_dataQualityReport, stagemigration_checkSampleSize - Safe execution & formulas: stagemigration_safeAtomic, stagemigration_safeExecute, stagemigration_buildFormula, stagemigration_escapeVar
Shared Survival-Formula Helpers (R/utils.R)
- Added
.asSurvivalFormula(), which wrapsjmvcore::asFormulawith an extended function allow-list for survival/Cox/Fine-Gray formula paths under jamovi 2.7.27’s hardened parser - Added
.buildSurvivalFormula(),.escapeVariableNames(),load_required_package(), the%notin%/%!in%operators, and aprint.sensSpecTableS3 method
New Example Datasets
-
NEW
R/data.Rdocuments five bundled datasets:diagnostic_studies,histopathology,swimmerplot_sample,waterfall_percentage_basic, andwaterfall_raw_longitudinal -
NEW
.rdafiles:diagnostic_studies(5 studies withstudy_name,tp,fp,fn,tn),swimmerplot_sample,waterfall_percentage_basic, andwaterfall_raw_longitudinal -
NEW jamovi
.omvversions underinst/extdata/:swimmerplot_sample.omv,waterfall_percentage_basic.omv,waterfall_raw_longitudinal.omv
Dependencies
- Added
Imports:cluster,cmprsk,haven,maxstat,survRM2(supporting the new competing-risks, RMST, cutpoint, and labelled-data utilities) - Added
Depends: R (>= 3.5.0)
Package Infrastructure
- Bumped version 0.0.33 → 0.0.46 (rolling up 0.0.38.1, 0.0.43, 0.0.45)
- Raised
minAppfrom 1.6.0 to 2.7.27 to align with jamovi’s hardenedas.formulaallow-list - Migrated roxygen configuration from
RoxygenNote: 7.3.3toConfig/roxygen2/version: 8.0.0 - De-bracketed the
BugReportsURL in DESCRIPTION - Added module audit report
docs/audit/MODULE_AUDIT_REPORT_20260514-1844.md
OncoPath 0.0.32.64 (2025-12-31)
Major New Features
Stage Migration Analysis Tools
- NEW: Comprehensive suite of statistical helper functions for stage migration analysis
- Advanced discrimination and reclassification metrics for comparing staging systems
- Designed for cancer staging research and prognostic model evaluation
- Supports survival analysis with Cox proportional hazards models
Advanced Discrimination Metrics
- Concordance Index (C-index): Paired comparison of staging system discrimination
-
Bootstrap Validation: Robust C-index comparison accounting for data correlation
- Configurable bootstrap replicates (default: 200)
- Correlation-aware variance estimation for dependent staging systems
- Automatic convergence handling and error recovery
- Confidence Intervals: Both analytical and bootstrap-based 95% CI estimation
- Statistical Testing: Two-sided hypothesis testing for C-index improvement
Reclassification Metrics
-
Net Reclassification Improvement (NRI):
- Time-dependent NRI calculation at multiple time points
- Separate event and non-event reclassification statistics
- Risk category-based patient stratification (tertiles by default)
- Variance estimation with confidence intervals and p-values
-
Integrated Discrimination Improvement (IDI):
- Discrimination slope comparison between staging systems
- Bootstrap validation option for robust inference
- Separate discrimination for events and non-events
- Direct probability-based assessment
Model Comparison Statistics
- Information Criteria: AIC and BIC for both staging systems with improvement metrics
-
Likelihood Ratio Tests:
- Combined model testing for incremental value
- Individual model likelihood ratio statistics
- Chi-square test statistics with degrees of freedom and p-values
-
Linear Trend Analysis:
- Wald tests for ordinal staging progression
- Automatic handling of categorical and ordinal stage variables
- Separate trend tests for old and new staging systems
Pseudo R² Measures
-
Multiple Pseudo R² Variants:
- McFadden R²: Log-likelihood ratio measure
- Adjusted McFadden R²: Penalized for model complexity
- Cox-Snell R²: Exponential transformation approach
- Nagelkerke R²: Normalized Cox-Snell (0-1 range)
- Royston R²: Placeholder for future implementation
- All measures calculated for both staging systems with improvement deltas
- Robust handling of edge cases (zero log-likelihoods, division by zero)
Technical Improvements
Statistical Robustness
-
Correlation-Aware Variance Estimation:
- Spearman correlation coefficient for linear predictor correlation
- Covariance adjustment for paired C-index comparisons
- Conservative variance bounds (non-negative constraint)
-
Bootstrap Methods for Correlated Data:
- Stratified sampling preserving event/non-event ratios
- Percentile-based confidence intervals
- Automatic outlier detection and removal
- Progress checkpoint callbacks for long-running analyses
Error Handling and Validation
- Comprehensive try-catch blocks throughout all functions
- Graceful degradation with informative error messages
- Automatic handling of:
- Model convergence failures in bootstrap samples
- Zero cells in contingency tables
- Insufficient sample sizes
- Missing or invalid data
- Validation of minimum sample requirements for reliable inference
Flexible Staging System Support
- Categorical Staging: Nominal categories without ordering assumptions
- Ordinal Staging: Ordered stages with linear trend analysis
- Mixed Systems: Comparison between different staging paradigms
- Automatic detection of stage levels and appropriate statistical tests
- Support for varying numbers of stages between old and new systems
Internal Improvements
- Modular helper function architecture for maintainability
- Consistent naming conventions (
stagemigration_*prefix) - Progress callback support for computationally intensive operations
- Null coalescing operator (
%||%) for default parameter handling - Safe mathematical operations with bounds checking
Use Cases
These stage migration tools are designed for: - Cancer Research: Evaluating new TNM staging editions (e.g., AJCC 7th vs. 8th edition) - Prognostic Models: Comparing traditional staging with molecular or imaging-based classifiers - Clinical Guidelines: Evidence-based assessment of staging system updates - Meta-Research: Systematic evaluation of staging system performance across studies - Quality Improvement: Hospital-level assessment of staging accuracy and clinical impact
OncoPath 0.0.32 (2025-10-09)
Documentation Improvements
README.Rmd
- NEW: Created comprehensive README.Rmd with detailed module description
- Enhanced feature descriptions with emojis for better readability
- Added detailed installation instructions (3 methods)
- Included quick start examples for both swimmer and waterfall plots
- Added comprehensive use cases section (Clinical Research, Pathology Research, Publication Support)
- Expanded acknowledgements section with gratitude to package developers
- Integrated with ClinicoPath ecosystem documentation
Documentation Website
- All documentation now available at: https://www.serdarbalci.com/OncoPath/
- Direct links to swimmer plot and waterfall plot guides
- Clear integration with main ClinicoPath documentation hub
Vignette Additions
- NEW: Added 9 comprehensive vignettes for enhanced documentation
-
Clinical Heatmap:
clinicalheatmap_comprehensive.Rmd- Clinical heatmap visualization -
Digital Pathology Suite (4 files):
-
digital_pathology_chatgpt.md- AI-generated pathology analysis guide -
digital_pathology_claude.md- Comprehensive digital pathology documentation -
digital_pathology_gemini.md- Alternative AI perspective on digital pathology -
digital-pathology-analysis-suite.md- Complete digital pathology analysis overview
-
-
Texture Analysis:
HARALICK_TESTING_GUIDE.md- Haralick texture feature analysis testing -
Agreement Analysis (3 files):
-
COMBINED_USUBUTUN_GUIDE.md- Combined Usubutun plot guide -
USUBUTUN_ENHANCED_TEST_GUIDE.md- Enhanced testing procedures -
USUBUTUN_TEST_GUIDE.md- Standard testing guide for agreement visualization
-
-
Oncoplot:
ggoncoplot_documentation.md- Genomic alteration visualization documentation
OncoPath 0.0.31.84 (2025-10-03)
Major New Features
Diagnostic Test Meta-Analysis for Pathology
- NEW: Comprehensive diagnostic test accuracy meta-analysis module
- Bivariate random-effects meta-analysis using the Reitsma method
- Hierarchical Summary ROC (HSROC) curve analysis
- Meta-regression capabilities for exploring heterogeneity
- Publication bias assessment with funnel plots
- Support for multiple estimation methods (REML, ML, Fixed Effects, etc.)
- Forest plots for sensitivity and specificity
- SROC plots with confidence regions
- Designed specifically for:
- AI/ML algorithm validation in pathology
- Biomarker diagnostic accuracy synthesis
- Systematic reviews of diagnostic tests
Enhancements
Dependencies
New Package Dependencies
-
mada: Meta-analysis of diagnostic accuracy studies -
metafor: Advanced meta-analysis and meta-regression -
pROC: ROC curve analysis -
survival&survminer: Survival analysis support -
boot: Bootstrap methods -
dcurves: Decision curve analysis -
Hmisc: Statistical utilities -
rms: Regression modeling strategies -
timeROC: Time-dependent ROC curves -
tidyr: Data tidying operations