Skip to content

1475: Add unconditional exact CI for proportion differences#1476

Merged
danielinteractive merged 20 commits into
mainfrom
1475_uncond_exact_prop_diff_ci
May 21, 2026
Merged

1475: Add unconditional exact CI for proportion differences#1476
danielinteractive merged 20 commits into
mainfrom
1475_uncond_exact_prop_diff_ci

Conversation

@danielinteractive
Copy link
Copy Markdown
Collaborator

closes #1475

I did not commit a full roxygen run because my installed 8.0.0 version seems to change a lot of unrelated stuff.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 17, 2026

badge

Code Coverage Summary

Filename                                   Stmts    Miss  Cover    Missing
---------------------------------------  -------  ------  -------  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
R/abnormal_by_baseline.R                     101       3  97.03%   242, 244-245
R/abnormal_by_marked.R                        88       8  90.91%   94-98, 281, 283-284
R/abnormal_by_worst_grade.R                   94       3  96.81%   215, 217-218
R/abnormal_lab_worsen_by_baseline.R          159      10  93.71%   205-208, 213, 215-216, 459-461
R/abnormal.R                                  78       2  97.44%   222, 224
R/analyze_variables.R                        320      11  96.56%   593-596, 818-823, 831
R/analyze_vars_in_cols.R                     178      14  92.13%   178, 221, 235-236, 238, 246-254
R/bland_altman.R                              92       1  98.91%   46
R/combination_function.R                       9       0  100.00%
R/compare_variables.R                         35       0  100.00%
R/control_incidence_rate.R                    10       0  100.00%
R/control_logistic.R                           7       0  100.00%
R/control_step.R                              23       1  95.65%   58
R/control_survival.R                          16       0  100.00%
R/count_cumulative.R                         115       4  96.52%   74, 270-271, 273
R/count_missed_doses.R                        89       4  95.51%   206-209
R/count_occurrences_by_grade.R               169       8  95.27%   178, 386, 388, 465, 467, 469, 473-474
R/count_occurrences.R                        137      10  92.70%   119, 262-264, 330-332, 334, 338-339
R/count_patients_events_in_cols.R             67       1  98.51%   60
R/count_patients_with_event.R                 73       2  97.26%   220, 223
R/count_patients_with_flags.R                 93       2  97.85%   234, 236
R/count_values.R                              61       2  96.72%   193, 196
R/cox_regression_inter.R                     154       0  100.00%
R/cox_regression.R                           161       0  100.00%
R/coxph.R                                    167       7  95.81%   191-195, 238, 253, 261, 267-268
R/d_pkparam.R                                406       0  100.00%
R/decorate_grob.R                            116       0  100.00%
R/desctools_binom_diff.R                     621      64  89.69%   53, 88-89, 125-126, 129, 199, 223-232, 264, 266, 286, 290, 294, 298, 353, 356, 359, 362, 422, 430, 439, 444-447, 454, 457, 466, 469, 516-517, 519-520, 522-523, 525-526, 593, 604-616, 620, 663, 676, 680
R/df_explicit_na.R                            30       0  100.00%
R/estimate_multinomial_rsp.R                  86       4  95.35%   65, 212, 214-215
R/estimate_proportion.R                      240       7  97.08%   88, 99, 255, 257-258, 389, 553
R/fit_rsp_step.R                              36       0  100.00%
R/fit_survival_step.R                         36       0  100.00%
R/formatting_functions.R                     183       2  98.91%   141, 276
R/g_forest.R                                 585      60  89.74%   240, 252-255, 260-261, 275, 277, 287-290, 335-338, 345, 414, 501, 514, 518-519, 524-525, 538, 554, 601, 630, 705, 714, 720, 739, 794-814, 817, 828, 847, 902, 905, 1040-1045
R/g_ipp.R                                    133       0  100.00%
R/g_km.R                                     350      57  83.71%   285-288, 307-309, 363-366, 400, 428, 432-475, 482-486
R/g_lineplot.R                               261      22  91.57%   222, 397-404, 443-453, 562, 570
R/g_step.R                                    68       1  98.53%   108
R/g_waterfall.R                               47       0  100.00%
R/h_adsl_adlb_merge_using_worst_flag.R        73       0  100.00%
R/h_biomarkers_subgroups.R                    91      23  74.73%   40-42, 84-103
R/h_cox_regression.R                         110       0  100.00%
R/h_incidence_rate.R                          45       0  100.00%
R/h_km.R                                     509      41  91.94%   137, 189-194, 287, 378, 380-381, 392-394, 413, 420-421, 423-425, 433-435, 460, 465-468, 651-654, 1108-1119
R/h_logistic_regression.R                    468       3  99.36%   203-204, 273
R/h_map_for_count_abnormal.R                  54       0  100.00%
R/h_pkparam_sort.R                            15       0  100.00%
R/h_response_biomarkers_subgroups.R           77      12  84.42%   50-55, 107-112
R/h_response_subgroups.R                     178      18  89.89%   257-270, 329-334
R/h_stack_by_baskets.R                        64       1  98.44%   89
R/h_step.R                                   180       0  100.00%
R/h_survival_biomarkers_subgroups.R           73       6  91.78%   111-116
R/h_survival_duration_subgroups.R            207      18  91.30%   259-271, 336-341
R/imputation_rule.R                           17       0  100.00%
R/incidence_rate.R                           103       7  93.20%   68-73, 242
R/logistic_regression.R                      102       0  100.00%
R/missing_data.R                              26       5  80.77%   39, 62-63, 96, 106
R/odds_ratio.R                               157       4  97.45%   270-273
R/prop_diff_test.R                           174       2  98.85%   264, 266
R/prop_diff.R                                495      21  95.76%   95-99, 136, 332, 334, 420-427, 576, 849, 1021, 1025, 1028
R/prune_occurrences.R                         57       0  100.00%
R/response_biomarkers_subgroups.R            124      10  91.94%   88-91, 270-275
R/response_subgroups.R                       252      16  93.65%   100-105, 271-275, 280, 282-283, 310-311
R/riskdiff.R                                  65       4  93.85%   94-97
R/rtables_access.R                            38       0  100.00%
R/score_occurrences.R                         20       1  95.00%   124
R/split_cols_by_groups.R                      49       0  100.00%
R/stat.R                                      59       0  100.00%
R/summarize_ancova.R                         150       2  98.67%   327-328
R/summarize_change.R                          72       3  95.83%   175, 177-178
R/summarize_colvars.R                         13       1  92.31%   75
R/summarize_coxreg.R                         172       0  100.00%
R/summarize_glm_count.R                      269      10  96.28%   129-130, 202-203, 459-463, 596
R/summarize_num_patients.R                   121      10  91.74%   122-124, 244, 248, 252-253, 337-338, 340
R/summarize_patients_exposure_in_cols.R      155       7  95.48%   58, 232-233, 237, 357-358, 362
R/survival_biomarkers_subgroups.R            136      10  92.65%   117-122, 228-231
R/survival_coxph_pairwise.R                  154       9  94.16%   55-56, 124, 138, 145, 149, 288, 290-291
R/survival_duration_subgroups.R              250      15  94.00%   124-129, 268-273, 286, 288-289
R/survival_time.R                            120       1  99.17%   251
R/survival_timepoint.R                       153       2  98.69%   320, 322
R/utils_checkmate.R                           68       0  100.00%
R/utils_default_stats_formats_labels.R       201       0  100.00%
R/utils_factor.R                              87       1  98.85%   99
R/utils_ggplot.R                             110       0  100.00%
R/utils_grid.R                               126       5  96.03%   164, 279-286
R/utils_rtables.R                            125       9  92.80%   39, 46, 414-415, 537-541
R/utils_split_funs.R                          52       2  96.15%   82, 94
R/utils.R                                    141       7  95.04%   131, 134, 137, 141, 150-151, 345
TOTAL                                      12251     596  95.14%

Diff against main

Filename                       Stmts    Miss  Cover
---------------------------  -------  ------  --------
R/control_survival.R              +1       0  +100.00%
R/prop_diff.R                   +113      +3  +0.47%
R/survival_coxph_pairwise.R      +30      +4  -1.81%
TOTAL                           +144      +7  +0.00%

Results for commit: 96ec5ff

Minimum allowed coverage is 80%

♻️ This comment has been updated with latest results

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 17, 2026

Unit Tests Summary

    1 files     85 suites   1m 41s ⏱️
  908 tests   899 ✅   9 💤 0 ❌
2 262 runs  1 551 ✅ 711 💤 0 ❌

Results for commit 96ec5ff.

♻️ This comment has been updated with latest results.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 17, 2026

Unit Test Performance Difference

Additional test case details
Test Suite $Status$ Time on main $±Time$ Test Case
prop_diff 👶 $+0.23$ _prop_diff_uncond_exact_matches_reference_values_and_works_with_edge_cases
prop_diff 👶 $+0.01$ h_find_ci_bound_uniroot_finds_expected_roots
prop_diff 👶 $+0.01$ h_find_ci_bound_uniroot_handles_boundary_case
prop_diff 👶 $+0.01$ h_worst_case_tail_probability_handles_degenerate_p2_interval
prop_diff 👶 $+0.02$ h_worst_case_tail_probability_returns_valid_tail_probabilities
prop_diff 👶 $+0.01$ s_proportion_diff_rejects_uncond_exact_diff_with_strata
prop_diff 👶 $+0.12$ s_proportion_diff_works_with_uncond_exact_diff

Results for commit 8b7bc83

♻️ This comment has been updated with latest results.

@Melkiades
Copy link
Copy Markdown
Contributor

@danielinteractive lets merge first #1477 so we get rid of the roxygen update

Comment thread inst/REFERENCES.bib Outdated
Comment thread NEWS.md Outdated
Comment thread inst/WORDLIST
Copy link
Copy Markdown
Contributor

@Melkiades Melkiades left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey Daniel! this is a great addition :) — the Santner & Snell tail method is exactly the right approach for unconditional exact CIs, and the implementation reads very cleanly.

Added a couple of comments

Comment thread tests/testthat/test-prop_diff.R
Comment thread R/prop_diff.R
@llrs-roche
Copy link
Copy Markdown

For roxygen2 at 8.0.0 there is a different PR: #1477. Not sure which one should go first

Signed-off-by: Davide Garolini <davide.garolini@roche.com>
@Melkiades
Copy link
Copy Markdown
Contributor

For roxygen2 at 8.0.0 there is a different PR: #1477. Not sure which one should go first

merged the roxygen2 PR

Signed-off-by: Davide Garolini <davide.garolini@roche.com>
Copy link
Copy Markdown
Contributor

@Melkiades Melkiades left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey Daniel, this is looking really good after the updates! The tests are thorough — I especially like the SAS reference values and the edge cases (all successes, all failures, zero observations).

Thank you so much for the update. Ready to go for me

@danielinteractive danielinteractive enabled auto-merge (squash) May 21, 2026 00:56
@danielinteractive danielinteractive merged commit 7eebf19 into main May 21, 2026
29 checks passed
@danielinteractive danielinteractive deleted the 1475_uncond_exact_prop_diff_ci branch May 21, 2026 01:00
@github-actions github-actions Bot locked and limited conversation to collaborators May 21, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature Request]: Add unconditional exact confidence-intervals for proportion differences

3 participants