Performs a graph based multiple test procedure for a given graph and unadjusted p-values.

## Arguments

- graph
A graph of class

`graphMCP`

.- pvalues
A numeric vector specifying the p-values for the graph based MCP. Note the assumptions in the details section for the parametric tests, when a correlation is specified.

- test
Should be either

`"Bonferroni"`

,`"Simes"`

or`"parametric"`

. If not specified by default the Bonferroni-based test procedure is used if no correlation is specified or the algorithm from Bretz et al. 2011 if a correlation is specified. If`test`

is set to`"Simes"`

the weighted Simes test will be performed for each subset of hypotheses.- correlation
Optional correlation matrix. If the weighted Simes test is performed, it is checked whether type I error rate can be ensured and a warning is given if this is not the case. For parametric tests the p-values must arise from one-sided tests with multivariate normal distributed test statistics for which the correlation is (partially) known. In that case a weighted parametric closed test is performed (also see

`generatePvals`

). Unknown values can be set to NA. (See details for more information)- alpha
A numeric specifying the maximal allowed type one error rate.

- approxEps
A boolean specifying whether epsilon values should be substituted with the value given in the parameter

`eps`

.- eps
A numeric scalar specifying a value for epsilon edges.

- ...
Test specific arguments can be given here.

- upscale
Logical. If

`upscale=FALSE`

then for each intersection of hypotheses (i.e. each subgraph) a weighted test is performed at the possibly reduced level alpha of sum(w)*alpha, where sum(w) is the sum of all node weights in this subset. If`upscale=TRUE`

all weights are upscaled, so that sum(w)=1.For backward compatibility the default value is TRUE if a the parameter

`test`

is missing, but parameter`correlation`

is specified or if`test=="Bretz2011"`

.- useC
Logical scalar. If

`TRUE`

neither adjusted p-values nor intermediate graphs are returned, but the calculation is sped up by using code written in C. THIS CODE IS NOT FOR PRODUCTIVE USE YET! If approxEps is`FALSE`

and the graph contains epsilon edges, a warning is thrown and`useC`

will be ignored.- verbose
Logical scalar. If

`TRUE`

verbose output is generated.- keepWeights
Logical scalar. If

`FALSE`

the weight of a node without outgoing edges is set to 0 if it is removed. Otherwise it keeps its weight.- adjPValues
Logical scalar. If

`FALSE`

no adjusted p-values will be calculated. Especially for the weighted Simes test this will result in significantly less calculations in most cases.

## Value

An object of class `gMCPResult`

, more specifically a list with
elements

`graphs`

list of graphs

`pvalues`

p-values

`rejected`

logical whether hypotheses could be rejected

`adjPValues`

adjusted p-values

## Details

For the Bonferroni procedure the p-values can arise from any statistical test, but if you improve the test by specifying a correlation matrix, the following assumptions apply:

It is assumed that under the global null hypothesis
\((\Phi^{-1}(1-p_1),...,\Phi^{-1}(1-p_m))\) follow a multivariate normal
distribution with correlation matrix `correlation`

where
\(\Phi^{-1}\) denotes the inverse of the standard normal distribution
function.

For example, this is the case if \(p_1,..., p_m\) are the raw p-values
from one-sided z-tests for each of the elementary hypotheses where the
correlation between z-test statistics is generated by an overlap in the
observations (e.g. comparison with a common control, group-sequential
analyses etc.). An application of the transformation \(\Phi^{-1}(1-p_i)\)
to raw p-values from a two-sided test will not in general lead to a
multivariate normal distribution. Partial knowledge of the correlation
matrix is supported. The correlation matrix has to be passed as a numeric
matrix with elements of the form: \(correlation[i,i] = 1\) for diagonal
elements, \(correlation[i,j] = \rho_{ij}\), where \(\rho_{ij}\) is the
known value of the correlation between \(\Phi^{-1}(1-p_i)\) and
\(\Phi^{-1}(1-p_j)\) or `NA`

if the corresponding correlation is
unknown. For example correlation[1,2]=0 indicates that the first and second
test statistic are uncorrelated, whereas correlation[2,3] = NA means that
the true correlation between statistics two and three is unknown and may
take values between -1 and 1. The correlation has to be specified for
complete blocks (ie.: if cor(i,j), and cor(i,j') for i!=j!=j' are specified
then cor(j,j') has to be specified as well) otherwise the corresponding
intersection null hypotheses tests are not uniquely defined and an error is
returned.

For further details see the given references.

## References

Frank Bretz, Willi Maurer, Werner Brannath, Martin Posch: A graphical approach to sequentially rejective multiple test procedures. Statistics in Medicine 2009 vol. 28 issue 4 page 586-604. https://www.meduniwien.ac.at/fwf_adaptive/papers/bretz_2009_22.pdf

Bretz F., Posch M., Glimm E., Klinglmueller F., Maurer W., Rohmeyer K. (2011): Graphical approaches for multiple endpoint problems using weighted Bonferroni, Simes or parametric tests. Biometrical Journal 53 (6), pages 894-913, Wiley. doi:10.1002/bimj.201000239

Strassburger K., Bretz F.: Compatible simultaneous lower confidence bounds for the Holm procedure and other Bonferroni based closed tests. Statistics in Medicine 2008; 27:4914-4927.

Hommel G., Bretz F., Maurer W.: Powerful short-cuts for multiple testing procedures with special reference to gatekeeping strategies. Statistics in Medicine 2007; 26:4063-4073.

Guilbaud O.: Simultaneous confidence regions corresponding to Holm's stepdown procedure and other closed-testing procedures. Biometrical Journal 2008; 50:678-692.

## See also

`graphMCP`

`multcomp::contrMat()`

## Author

Kornelius Rohmeyer rohmeyer@small-projects.de

## Examples

```
g <- BonferroniHolm(5)
gMCP(g, pvalues=c(0.01, 0.02, 0.04, 0.04, 0.7))
#> gMCP-Result
#>
#> Initial graph:
#> A graphMCP graph
#> H1 (weight=0.2)
#> H2 (weight=0.2)
#> H3 (weight=0.2)
#> H4 (weight=0.2)
#> H5 (weight=0.2)
#> Edges:
#> H1 -( 0.25 )-> H2
#> H1 -( 0.25 )-> H3
#> H1 -( 0.25 )-> H4
#> H1 -( 0.25 )-> H5
#> H2 -( 0.25 )-> H1
#> H2 -( 0.25 )-> H3
#> H2 -( 0.25 )-> H4
#> H2 -( 0.25 )-> H5
#> H3 -( 0.25 )-> H1
#> H3 -( 0.25 )-> H2
#> H3 -( 0.25 )-> H4
#> H3 -( 0.25 )-> H5
#> H4 -( 0.25 )-> H1
#> H4 -( 0.25 )-> H2
#> H4 -( 0.25 )-> H3
#> H4 -( 0.25 )-> H5
#> H5 -( 0.25 )-> H1
#> H5 -( 0.25 )-> H2
#> H5 -( 0.25 )-> H3
#> H5 -( 0.25 )-> H4
#>
#>
#> P-values:
#> H1 H2 H3 H4 H5
#> 0.01 0.02 0.04 0.04 0.70
#>
#> Adjusted p-values:
#> H1 H2 H3 H4 H5
#> 0.05 0.08 0.12 0.12 0.70
#>
#> Alpha: 0.05
#>
#> Hypothesis rejected:
#> H1 H2 H3 H4 H5
#> TRUE FALSE FALSE FALSE FALSE
#>
#> Final graph after1steps:
#> A graphMCP graph
#> H1 (rejected, weight=0)
#> H2 (weight=0.25)
#> H3 (weight=0.25)
#> H4 (weight=0.25)
#> H5 (weight=0.25)
#> Edges:
#> H2 -( 0.333333333333333 )-> H3
#> H2 -( 0.333333333333333 )-> H4
#> H2 -( 0.333333333333333 )-> H5
#> H3 -( 0.333333333333333 )-> H2
#> H3 -( 0.333333333333333 )-> H4
#> H3 -( 0.333333333333333 )-> H5
#> H4 -( 0.333333333333333 )-> H2
#> H4 -( 0.333333333333333 )-> H3
#> H4 -( 0.333333333333333 )-> H5
#> H5 -( 0.333333333333333 )-> H2
#> H5 -( 0.333333333333333 )-> H3
#> H5 -( 0.333333333333333 )-> H4
#>
# Simple Bonferroni with empty graph:
g2 <- matrix2graph(matrix(0, nrow=5, ncol=5))
gMCP(g2, pvalues=c(0.01, 0.02, 0.04, 0.04, 0.7))
#> gMCP-Result
#>
#> Initial graph:
#> A graphMCP graph
#> H1 (weight=0.2)
#> H2 (weight=0.2)
#> H3 (weight=0.2)
#> H4 (weight=0.2)
#> H5 (weight=0.2)
#> No edges.
#>
#>
#> P-values:
#> H1 H2 H3 H4 H5
#> 0.01 0.02 0.04 0.04 0.70
#>
#> Adjusted p-values:
#> H1 H2 H3 H4 H5
#> 0.05 0.10 0.20 0.20 1.00
#>
#> Alpha: 0.05
#>
#> Hypothesis rejected:
#> H1 H2 H3 H4 H5
#> TRUE FALSE FALSE FALSE FALSE
#>
#> Final graph after1steps:
#> A graphMCP graph
#> Sum of weight: 0.8
#> H1 (rejected, weight=0)
#> H2 (weight=0.2)
#> H3 (weight=0.2)
#> H4 (weight=0.2)
#> H5 (weight=0.2)
#> No edges.
#>
# With 'upscale=TRUE' equal to BonferroniHolm:
gMCP(g2, pvalues=c(0.01, 0.02, 0.04, 0.04, 0.7), upscale=TRUE)
#> gMCP-Result
#>
#> Initial graph:
#> A graphMCP graph
#> H1 (weight=0.2)
#> H2 (weight=0.2)
#> H3 (weight=0.2)
#> H4 (weight=0.2)
#> H5 (weight=0.2)
#> No edges.
#>
#>
#> P-values:
#> H1 H2 H3 H4 H5
#> 0.01 0.02 0.04 0.04 0.70
#>
#> Adjusted p-values:
#> H1 H2 H3 H4 H5
#> 0.05 0.08 0.12 0.12 0.70
#>
#> Alpha: 0.05
#>
#> Hypothesis rejected:
#> H1 H2 H3 H4 H5
#> TRUE FALSE FALSE FALSE FALSE
#>
#> Final graph after1steps:
#> A graphMCP graph
#> H1 (rejected, weight=0)
#> H2 (weight=0.25)
#> H3 (weight=0.25)
#> H4 (weight=0.25)
#> H5 (weight=0.25)
#> No edges.
#>
```