Performs an omnibus test combining Burden, SKAT, and Fisher tests using the Cauchy Combination Test (CCT). The omnibus test adapts to different genetic architectures by combining multiple test statistics, providing robust power across various scenarios.

GLOW_Omni computes:

  1. Burden test (optimal + equal weights)

  2. SKAT test (optimal + equal weights)

  3. Fisher test (optimal + equal weights)

  4. CCT of SNV-level p-values (variant-level minimum p-value combination)

  5. CCT combining all the above tests (final omnibus p-value)

The final omnibus p-value provides protection against model misspecification and is powerful across diverse genetic architectures.

GLOW_Omni(
  marg_score_stats,
  B,
  PI,
  test_specs = NULL,
  include_snv_cct = TRUE,
  return_weights = FALSE,
  ...
)

Arguments

marg_score_stats

List output from getZ_marg_score or getZ_marg_score_binary_SPA containing:

Zscores

Numeric vector of marginal score Z-scores

M_Z

Correlation matrix of Z-scores

M_s

Covariance matrix of score statistics

s0

Scalar standard deviation under null

B

Numeric vector of effect size estimates (length m).

PI

Numeric vector of variant-importance scores (length m, values in \([0,1]\)).

test_specs

List of test specification lists (default: NULL uses default_test_specs, the standard 3-family configuration). See default_test_specs for the spec format.

include_snv_cct

Logical. If TRUE (default), append SNV-level CCT and final omnibus CCT rows to the output.

return_weights

Logical (default FALSE). If TRUE, attach the internally-assembled weight matrix to the result (forwarded from run_bsf_tests). Rows: weight schemes; columns: variants.

...

Additional arguments passed to omni_SgZ_test and weight functions (e.g., method, nsim).

Value

A list with:

STAT

Matrix (n x 1) of test statistics. With default specs, n=16.

PVAL

Matrix (n x 1) of p-values. Last row is the final omnibus.

test_names

Character vector of row names.

weights

(Only when return_weights = TRUE.) Weight matrix (n_schemes x p).

Details

Algorithm:

Internally delegates to run_bsf_tests(), which:

  1. For each test family in test_specs, computes optimal and equal weights, then evaluates the weighted test statistic.

  2. Combines all individual test p-values via CCT (BSF omnibus).

  3. Computes SNV-level CCT from marginal p-values (if include_snv_cct = TRUE).

  4. Combines individual + SNV CCT for final omnibus p-value.

Transformation Details:

  • Scaled effect sizes: \(B^* = \sqrt{diag(M_s)} \times B / s_0\)

  • Burden uses g(x) = x, df = Inf

  • SKAT uses g(x) = x^2, df = 1

  • Fisher uses g(x) = g_GFisher_two(x, df=2), df = 2

Output Structure (default 3-family spec, 16 rows):

  • Rows 1-5: SKAT tests (BE_N, APR_N, BE_sparse, APR_sparse, equ)

  • Rows 6-8: Burden tests (BE, APR, equ)

  • Rows 9-13: Fisher tests (BE_N, APR_N, BE_sparse, APR_sparse, equ)

  • Row 14: BSF Omni (CCT of rows 1-13)

  • Row 15: SNV-level CCT

  • Row 16: Final omnibus CCT

With custom test_specs, the number of rows varies.

Computational Complexity: O(k * m^2) where k is number of weight schemes, m is number of variants

References

Zhang, H., Liu, M., Landers, J. E., and Wu, Z. (2026). Integrated weighted association test with application to genetic association studies. The Annals of Applied Statistics, 20(3), 2074-2097. doi:10.1214/26-AOAS2223

Liu Y, Xie J (2020). "Cauchy Combination Test: A Powerful Test With Analytic p-Value Calculation Under Arbitrary Dependency Structures." JASA, 115(529), 393-402.

See also

default_test_specs for the test specification format glow_test for the high-level test runner GLOW_Omni_byP for omnibus test from pre-computed p-values

Examples

if (FALSE) { # \dontrun{
# Simulate data
set.seed(123)
n <- 500; m <- 20
G <- matrix(rbinom(n*m, 2, 0.1), n, m)
X <- matrix(rnorm(n*2), n, 2)
Y <- rbinom(n, 1, 0.3)
marg_stats <- getZ_marg_score(G, X, Y, trait="binary")
B <- rnorm(m, mean=0, sd=0.2)
PI <- runif(m, 0.1, 0.9)

# Standard omnibus (16 rows)
result <- GLOW_Omni(marg_stats, B, PI)
result$PVAL[nrow(result$PVAL), ]

# Custom 2-family spec
my_specs <- list(
  list(family = "SKAT", g = function(x) x^2, df = 1),
  list(family = "Burden", g = function(x) x, df = Inf)
)
result2 <- GLOW_Omni(marg_stats, B, PI, test_specs = my_specs)
} # }