From fa684a9a3bfc6ae66d39ac18471743b53b23e4d2 Mon Sep 17 00:00:00 2001 From: Dong Xi <38050865+xidongdxi@users.noreply.github.com> Date: Fri, 20 Mar 2026 22:09:16 -0400 Subject: [PATCH 1/3] fix issue 90 by changing precision --- .gitignore | 2 ++ R/graph_test_closure.R | 11 ++++++++--- tests/testthat/Rplots.pdf | Bin 9091 -> 0 bytes 3 files changed, 10 insertions(+), 3 deletions(-) delete mode 100644 tests/testthat/Rplots.pdf diff --git a/.gitignore b/.gitignore index a18da5b7..7d133ee0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ inst/doc *~$*docx *~$*xlsx *~$*pptx +Rplots.pdf +.DS_Store diff --git a/R/graph_test_closure.R b/R/graph_test_closure.R index ba59b8f0..c8cb1b50 100644 --- a/R/graph_test_closure.R +++ b/R/graph_test_closure.R @@ -306,14 +306,19 @@ graph_test_closure <- function(graph, # The adjusted p-value for an *intersection* is the smallest adjusted p-value # for the groups it contains adjusted_p_intersection <- apply(adjusted_p, 1, min) - reject_intersection <- - adjusted_p_intersection <= (alpha + .Machine$double.eps) + + # When parametric tests are used, mvtnorm::pmvnorm introduces Monte Carlo + # error (controlled by abseps, default 1e-6). A small tolerance is added to + # rejection comparisons to avoid false non-rejections at the boundary. + tol <- if (any(test_types == "parametric")) 1e-6 else .Machine$double.eps + + reject_intersection <- adjusted_p_intersection <= (alpha + tol) # The adjusted p-value for a *hypothesis* is the largest adjusted p-value for # the intersections containing that hypothesis adjusted_p_hypothesis <- apply(adjusted_p_intersection * matrix_intersections, 2, max, na.rm = TRUE) - reject_hypothesis <- adjusted_p_hypothesis <= alpha # Hypothesis test results + reject_hypothesis <- adjusted_p_hypothesis <= (alpha + tol) # Adjusted p-value details --------------------------------------------------- # Reported adjusted p-values shouldn't exceed 1 diff --git a/tests/testthat/Rplots.pdf b/tests/testthat/Rplots.pdf deleted file mode 100644 index adba4e38b42531db1adc63edca02c50d1d885aa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9091 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 M(P(HSm88)A2XRxyVE_OC From b907f0b957ff8b5d07fd3de370b1bab678ff267a Mon Sep 17 00:00:00 2001 From: Dong Xi <38050865+xidongdxi@users.noreply.github.com> Date: Fri, 20 Mar 2026 23:02:21 -0400 Subject: [PATCH 2/3] updated other files for 0.2.9 --- CRAN-SUBMISSION | 2 +- DESCRIPTION | 4 ++-- NEWS.md | 5 +++++ codemeta.json | 8 ++++---- cran-comments.md | 5 +++++ vignettes/generate-closure.Rmd | 15 ++++++++------- 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/CRAN-SUBMISSION b/CRAN-SUBMISSION index 6bb573f1..7347c74b 100644 --- a/CRAN-SUBMISSION +++ b/CRAN-SUBMISSION @@ -1,3 +1,3 @@ -Version: 0.2.8 +Version: 0.2.9 Date: 2025-05-07 03:10:43 UTC SHA: 86213d2cf7bf8a29ac608260f2fd935e7fc2fd7d diff --git a/DESCRIPTION b/DESCRIPTION index 3ebc6abb..ba31978f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: graphicalMCP Title: Graphical Multiple Comparison Procedures -Version: 0.2.8 +Version: 0.2.9 Authors@R: c( person("Dong", "Xi", , "dong.xi1@gilead.com", role = c("aut", "cre")), person("Ethan", "Brockmann", , "ethan.brockmann@atorusresearch.com", role = "aut"), @@ -48,5 +48,5 @@ Config/testthat/edition: 3 Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.2 +RoxygenNote: 7.3.3 Language: en-US diff --git a/NEWS.md b/NEWS.md index 031f2daa..2e2d7d2f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -59,3 +59,8 @@ * Corrected urls for references * Submission for CRAN release + +# graphicalMCP 0.2.9 + +* Closed Issue #90 by changing the precision for parametric tests +* Submission for CRAN release \ No newline at end of file diff --git a/codemeta.json b/codemeta.json index 594ff230..b9e12742 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,13 +7,13 @@ "codeRepository": "https://github.com/openpharma/graphicalMCP", "issueTracker": "https://github.com/openpharma/graphicalMCP/issues", "license": "Apache License 2", - "version": "0.2.8", + "version": "0.2.9", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", "url": "https://r-project.org" }, - "runtimePlatform": "R version 4.1.2 (2021-11-01)", + "runtimePlatform": "R version 4.4.3 (2025-02-28)", "provider": { "@id": "https://cran.r-project.org", "@type": "Organization", @@ -318,7 +318,7 @@ }, "SystemRequirements": null }, - "fileSize": "803.544KB", + "fileSize": "775.434KB", "citation": [ { "@type": "SoftwareSourceCode", @@ -339,7 +339,7 @@ "url": "https://CRAN.R-project.org/package=graphicalMCP" } ], - "releaseNotes": "https://github.com/openpharma/graphicalMCP/blob/master/NEWS.md", + "releaseNotes": "https://github.com/openpharma/graphicalMCP/blob/main/NEWS.md", "readme": "https://github.com/openpharma/graphicalMCP/blob/main/README.md", "developmentStatus": "https://www.repostatus.org/#active", "relatedLink": "https://CRAN.R-project.org/package=graphicalMCP" diff --git a/cran-comments.md b/cran-comments.md index 2c20cdd4..39dcbf74 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,3 +1,8 @@ +# Version 0.2.9 + +- This is the ninth submission to CRAN. +- Closed Issue #90 by changing the precision for parametric tests + # Version 0.2.8 - This is the eighth submission to CRAN. diff --git a/vignettes/generate-closure.Rmd b/vignettes/generate-closure.Rmd index 8b4e1516..bb3d6ecc 100644 --- a/vignettes/generate-closure.Rmd +++ b/vignettes/generate-closure.Rmd @@ -271,13 +271,14 @@ write.csv( ```{r power-conventional, include = FALSE, eval = FALSE} gcp_conventional <- function( - graph, - alpha = 0.025, - power_marginal = rep(alpha, length(graph$hypotheses)), - sim_n = 100, - sim_corr = diag(length(graph$hypotheses)), - sim_success = NULL, - verbose = FALSE) { + graph, + alpha = 0.025, + power_marginal = rep(alpha, length(graph$hypotheses)), + sim_n = 100, + sim_corr = diag(length(graph$hypotheses)), + sim_success = NULL, + verbose = FALSE +) { hyp_names <- names(graph$hypotheses) num_hyps <- length(graph$hypotheses) From 89e4d4d5ee1d0f436188ae47caf7927ff2f1c1f3 Mon Sep 17 00:00:00 2001 From: Dong Xi <38050865+xidongdxi@users.noreply.github.com> Date: Fri, 20 Mar 2026 23:13:02 -0400 Subject: [PATCH 3/3] Updated cran-comments.md --- cran-comments.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cran-comments.md b/cran-comments.md index 39dcbf74..e6f1192e 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -3,6 +3,10 @@ - This is the ninth submission to CRAN. - Closed Issue #90 by changing the precision for parametric tests +## R CMD check results + +0 errors | 0 warnings | 0 notes + # Version 0.2.8 - This is the eighth submission to CRAN.