Skip to Content

BARNARD_EXACT

Overview

The BARNARD_EXACT function performs Barnard’s exact test on a 2x2 contingency table. This test is a more powerful alternative to Fisher’s exact test for 2x2 tables, as it does not condition on both marginal totals but instead maximizes over a nuisance parameter. The test uses the Wald statistic with pooled or unpooled variance to test the hypothesis that two binomial proportions are equal. The calculation involves quasi-Monte Carlo sampling to compute exact p-values, which is not possible with standard Excel functions. For more details, see the scipy.stats.barnard_exact documentation.

Excel has no equivalent to Barnard’s exact test. This advanced statistical test requires sophisticated algorithms for computing exact p-values by maximizing over nuisance parameters and using quasi-Monte Carlo sampling methods. The computational complexity and specialized statistical methodology make it impossible to implement with standard Excel functions.

This example function is provided as-is without any representation of accuracy.

Usage

To use the function in Excel:

=BARNARD_EXACT(table, [alternative], [pooled])
  • table (2D list, required): 2x2 contingency table with non-negative integer entries.
  • alternative (string, optional, default=“two-sided”): Defines the alternative hypothesis. Options are "two-sided", "less", or "greater".
  • pooled (bool, optional, default=TRUE): Whether to use pooled variance (TRUE) or unpooled variance (FALSE).

The function returns a single row (2D list) with two elements: the Wald statistic and the p-value. If the input is invalid, an error message (string) is returned.

Examples

Example 1: Default two-sided test

Inputs:

tablealternativepooled
712two-sidedTRUE
83

Excel formula:

=BARNARD_EXACT({7,12;8,3})

Expected output:

StatisticP-value
-1.8940.06814

Example 2: One-sided test (less)

Inputs:

tablealternativepooled
712lessTRUE
83

Excel formula:

=BARNARD_EXACT({7,12;8,3}, "less")

Expected output:

StatisticP-value
-1.8940.03407

Example 3: One-sided test (greater)

Inputs:

tablealternativepooled
712greaterTRUE
83

Excel formula:

=BARNARD_EXACT({7,12;8,3}, "greater")

Expected output:

StatisticP-value
-1.8940.9659

Example 4: Unpooled variance

Inputs:

tablealternativepooled
712two-sidedFALSE
83

Excel formula:

=BARNARD_EXACT({7,12;8,3}, "two-sided", FALSE)

Expected output:

StatisticP-value
-2.0189321330.068153433

Python Code

from scipy.stats import barnard_exact as scipy_barnard_exact def barnard_exact(table, alternative='two-sided', pooled=True): """ Perform Barnard's exact test on a 2x2 contingency table. Args: table: 2D list (2x2) contingency table with non-negative integer entries. alternative: Defines the alternative hypothesis. Options are 'two-sided', 'less', 'greater'. pooled: Whether to use pooled variance (True) or unpooled variance (False). Returns: A 2D list containing the Wald statistic and p-value, each as a separate element in the first row. This example function is provided as-is without any representation of accuracy. """ # Validate table if not isinstance(table, list) or len(table) != 2 or not all(isinstance(row, list) and len(row) == 2 for row in table): return "Invalid input: table must be a 2x2 list of non-negative integers." try: arr = [[int(x) for x in row] for row in table] except Exception: return "Invalid input: table must contain integers." if any(x < 0 for row in arr for x in row): return "Invalid input: table must contain non-negative integers." # Validate alternative if alternative not in ['two-sided', 'less', 'greater']: return "Invalid input: alternative must be 'two-sided', 'less', or 'greater'." # Validate pooled if not (pooled is True or pooled is False): return "Invalid input: pooled must be True or False." try: res = scipy_barnard_exact(arr, alternative=alternative, pooled=pooled) stat = float(res.statistic) pval = float(res.pvalue) # Disallow nan/inf if any([s in [float('inf'), float('-inf')] or s != s for s in [stat, pval]]): return "Invalid output: statistic or p-value is not finite." return [[stat, pval]] except Exception as e: return f"scipy.stats.barnard_exact error: {e}"

Example Workbook

Link to Workbook

Last updated on