Parametric and Bayesian one-way and two-way contingency table analyses.

## Usage

``````contingency_table(
data,
x,
y = NULL,
paired = FALSE,
type = "parametric",
counts = NULL,
ratio = NULL,
alternative = "two.sided",
digits = 2L,
conf.level = 0.95,
sampling.plan = "indepMulti",
fixed.margin = "rows",
prior.concentration = 1,
...
)``````

## Arguments

data

A data frame (or a tibble) from which variables specified are to be taken. Other data types (e.g., matrix,table, array, etc.) will not be accepted. Additionally, grouped data frames from `{dplyr}` should be ungrouped before they are entered as `data`.

x

The variable to use as the rows in the contingency table.

y

The variable to use as the columns in the contingency table. Default is `NULL`. If `NULL`, one-sample proportion test (a goodness of fit test) will be run for the `x` variable.

paired

Logical indicating whether data came from a within-subjects or repeated measures design study (Default: `FALSE`).

type

A character specifying the type of statistical approach:

• `"parametric"`

• `"nonparametric"`

• `"robust"`

• `"bayes"`

You can specify just the initial letter.

counts

The variable in data containing counts, or `NULL` if each row represents a single observation.

ratio

A vector of proportions: the expected proportions for the proportion test (should sum to `1`). Default is `NULL`, which means the null is equal theoretical proportions across the levels of the nominal variable. E.g., `ratio = c(0.5, 0.5)` for two levels, `ratio = c(0.25, 0.25, 0.25, 0.25)` for four levels, etc.

alternative

A character string specifying the alternative hypothesis; Controls the type of CI returned: `"two.sided"` (default, two-sided CI), `"greater"` or `"less"` (one-sided CI). Partial matching is allowed (e.g., `"g"`, `"l"`, `"two"`...). See section One-Sided CIs in the effectsize_CIs vignette.

digits

Number of digits for rounding or significant figures. May also be `"signif"` to return significant figures or `"scientific"` to return scientific notation. Control the number of digits by adding the value as suffix, e.g. `digits = "scientific4"` to have scientific notation with 4 decimal places, or `digits = "signif5"` for 5 significant figures (see also `signif()`).

conf.level

Scalar between `0` and `1` (default: `95%` confidence/credible intervals, `0.95`). If `NULL`, no confidence intervals will be computed.

sampling.plan

Character describing the sampling plan. Possible options are `"indepMulti"` (independent multinomial; default), `"poisson"`, `"jointMulti"` (joint multinomial), `"hypergeom"` (hypergeometric). For more, see `?BayesFactor::contingencyTableBF()`.

fixed.margin

For the independent multinomial sampling plan, which margin is fixed (`"rows"` or `"cols"`). Defaults to `"rows"`.

prior.concentration

Specifies the prior concentration parameter, set to `1` by default. It indexes the expected deviation from the null hypothesis under the alternative, and corresponds to Gunel and Dickey's (1974) `"a"` parameter.

...

Additional arguments (currently ignored).

## Value

The returned tibble data frame can contain some or all of the following columns (the exact columns will depend on the statistical test):

• `statistic`: the numeric value of a statistic

• `df`: the numeric value of a parameter being modeled (often degrees of freedom for the test)

• `df.error` and `df`: relevant only if the statistic in question has two degrees of freedom (e.g. anova)

• `p.value`: the two-sided p-value associated with the observed statistic

• `method`: the name of the inferential statistical test

• `estimate`: estimated value of the effect size

• `conf.low`: lower bound for the effect size estimate

• `conf.high`: upper bound for the effect size estimate

• `conf.level`: width of the confidence interval

• `conf.method`: method used to compute confidence interval

• `conf.distribution`: statistical distribution for the effect

• `effectsize`: the name of the effect size

• `n.obs`: number of observations

• `expression`: pre-formatted expression containing statistical details

For examples, see data frame output vignette.

## Contingency table analyses

The table below provides summary about:

• statistical test carried out for inferential statistics

• type of effect size estimate and a measure of uncertainty for this estimate

• functions used internally to compute these details

### two-way table

Hypothesis testing

 Type Design Test Function used Parametric/Non-parametric Unpaired Pearson's chi-squared test `stats::chisq.test()` Bayesian Unpaired Bayesian Pearson's chi-squared test `BayesFactor::contingencyTableBF()` Parametric/Non-parametric Paired McNemar's chi-squared test `stats::mcnemar.test()` Bayesian Paired No No

Effect size estimation

 Type Design Effect size CI available? Function used Parametric/Non-parametric Unpaired Cramer's V Yes `effectsize::cramers_v()` Bayesian Unpaired Cramer's V Yes `effectsize::cramers_v()` Parametric/Non-parametric Paired Cohen's g Yes `effectsize::cohens_g()` Bayesian Paired No No No

### one-way table

Hypothesis testing

 Type Test Function used Parametric/Non-parametric Goodness of fit chi-squared test `stats::chisq.test()` Bayesian Bayesian Goodness of fit chi-squared test (custom)

Effect size estimation

 Type Effect size CI available? Function used Parametric/Non-parametric Pearson's C Yes `effectsize::pearsons_c()` Bayesian No No No

## Examples

``````if (identical(Sys.getenv("NOT_CRAN"), "true")) {
#### -------------------- association test ------------------------ ####

# ------------------------ frequentist ---------------------------------

# unpaired

set.seed(123)
contingency_table(
data   = mtcars,
x      = am,
y      = vs,
paired = FALSE
)

# paired

paired_data <- tibble(
response_before = structure(c(1L, 2L, 1L, 2L), levels = c("no", "yes"), class = "factor"),
response_after = structure(c(1L, 1L, 2L, 2L), levels = c("no", "yes"), class = "factor"),
Freq = c(65L, 25L, 5L, 5L)
)

set.seed(123)
contingency_table(
data   = paired_data,
x      = response_before,
y      = response_after,
paired = TRUE,
counts = Freq
)

# ------------------------ Bayesian -------------------------------------

# unpaired

set.seed(123)
contingency_table(
data = mtcars,
x = am,
y = vs,
paired = FALSE,
type = "bayes"
)

# paired

set.seed(123)
contingency_table(
data = paired_data,
x = response_before,
y = response_after,
paired = TRUE,
counts = Freq,
type = "bayes"
)

#### -------------------- goodness-of-fit test -------------------- ####

# ------------------------ frequentist ---------------------------------

set.seed(123)
contingency_table(
data   = as.data.frame(HairEyeColor),
x      = Eye,
counts = Freq
)

# ------------------------ Bayesian -------------------------------------

set.seed(123)
contingency_table(
data   = as.data.frame(HairEyeColor),
x      = Eye,
counts = Freq,
ratio  = c(0.2, 0.2, 0.3, 0.3),
type   = "bayes"
)
}
#> # A tibble: 1 × 4
#>      bf10 prior.scale method                                      expression
#>     <dbl>       <dbl> <chr>                                       <list>
#> 1 4.17e55           1 Bayesian one-way contingency table analysis <language>
``````