Calculates simultaneous confidence intervals (CI) for proportions in multinomial variables (k >= 3). This enhanced version of DescTools::MultinomCI() returns a data frame.

ci_multinom(
  x,
  method = "goodman",
  conf.level = 0.95,
  gr_colname = "group",
  ...
)

Arguments

x

Vector of group sizes. Best if elements have meaningful names (see examples).

method

Calculation method: "goodman", "sisonglaz", "cplus1", and others. See DescTools::MultinomCI() documentation.

conf.level

Confidence level. Default: 0.95.

gr_colname

Column name (quoted) for group names. Default: "group".

...

Additional parameters for DescTools::MultinomCI().

Value

A data frame with columns:

  • group or user-specified name (<fct>) – group names;

  • est (<dbl>) – proportion estimate;

  • lwr.ci, upr.ci (<dbl>) – lower and upper CI bounds;

  • x (<int>) – group size;

  • n (<int>) – total number of events.

Details

Similar to DescTools::MultinomCI(), but uses the Goodman method by default and returns a data frame, enabling convenient plotting with ggplot2.

Examples

# Example 1: Student grade distribution
# A: 20 students, B: 35 students, C: 25 students, D/F: 15 students
grades <- c("A" = 20, "B" = 35, "C" = 25, "D/F" = 15)
ci_multinom(grades)
#> # A tibble: 4 × 6
#>   group   est lwr.ci upr.ci     x     n
#>   <fct> <dbl>  <dbl>  <dbl> <int> <int>
#> 1 A     0.211 0.126   0.331    20    95
#> 2 B     0.368 0.257   0.497    35    95
#> 3 C     0.263 0.167   0.388    25    95
#> 4 D/F   0.158 0.0860  0.272    15    95
# Each row shows the CI for that grade's proportion

# Example 2: Transportation preferences
transport <- c("Car" = 45, "Bus" = 30, "Bike" = 15, "Walk" = 20)
ci_multinom(transport)
#> # A tibble: 4 × 6
#>   group   est lwr.ci upr.ci     x     n
#>   <fct> <dbl>  <dbl>  <dbl> <int> <int>
#> 1 Car   0.409 0.300   0.528    45   110
#> 2 Bus   0.273 0.181   0.389    30   110
#> 3 Bike  0.136 0.0740  0.238    15   110
#> 4 Walk  0.182 0.108   0.290    20   110

# Example 3: Blood type distribution
blood_types <- c("O" = 156, "A" = 134, "B" = 38, "AB" = 22)
ci_multinom(blood_types)
#> # A tibble: 4 × 6
#>   group    est lwr.ci upr.ci     x     n
#>   <fct>  <dbl>  <dbl>  <dbl> <int> <int>
#> 1 O     0.446  0.381   0.512   156   350
#> 2 A     0.383  0.321   0.449   134   350
#> 3 B     0.109  0.0737  0.157    38   350
#> 4 AB    0.0629 0.0375  0.104    22   350

# Example 4: Political party preference
parties <- c("Party A" = 380, "Party B" = 420, "Party C" = 200)
ci_multinom(parties)
#> # A tibble: 3 × 6
#>   group     est lwr.ci upr.ci     x     n
#>   <fct>   <dbl>  <dbl>  <dbl> <int> <int>
#> 1 Party A  0.38  0.344  0.417   380  1000
#> 2 Party B  0.42  0.383  0.458   420  1000
#> 3 Party C  0.2   0.171  0.232   200  1000

# Unnamed frequencies (groups will be numbered)
ci_multinom(c(20, 35, 54))
#> # A tibble: 3 × 6
#>   group   est lwr.ci upr.ci     x     n
#>   <fct> <dbl>  <dbl>  <dbl> <int> <int>
#> 1 1     0.183  0.111  0.287    20   109
#> 2 2     0.321  0.225  0.435    35   109
#> 3 3     0.495  0.384  0.607    54   109

# Using pipe operator
c("Small" = 20, "Medium" = 35, "Large" = 54) |>
  ci_multinom()
#> # A tibble: 3 × 6
#>   group    est lwr.ci upr.ci     x     n
#>   <fct>  <dbl>  <dbl>  <dbl> <int> <int>
#> 1 Small  0.183  0.111  0.287    20   109
#> 2 Medium 0.321  0.225  0.435    35   109
#> 3 Large  0.495  0.384  0.607    54   109

# Different method for simultaneous intervals
c("Small" = 33, "Medium" = 35, "Large" = 30) |>
  ci_multinom(method = "sisonglaz")
#> # A tibble: 3 × 6
#>   group    est lwr.ci upr.ci     x     n
#>   <fct>  <dbl>  <dbl>  <dbl> <int> <int>
#> 1 Small  0.337  0.235  0.447    33    98
#> 2 Medium 0.357  0.255  0.468    35    98
#> 3 Large  0.306  0.204  0.417    30    98

# Custom column name for groups
c("Dog" = 65, "Cat" = 48, "Bird" = 22, "Other" = 15) |>
  ci_multinom(gr_colname = "pet_type")
#> # A tibble: 4 × 6
#>   pet_type   est lwr.ci upr.ci     x     n
#>   <fct>    <dbl>  <dbl>  <dbl> <int> <int>
#> 1 Dog      0.433 0.337   0.535    65   150
#> 2 Cat      0.32  0.234   0.421    48   150
#> 3 Bird     0.147 0.0887  0.233    22   150
#> 4 Other    0.1   0.0539  0.178    15   150

# Example 5: Teaching method effectiveness
# Outcome categories: Poor, Fair, Good, Excellent
outcomes <- c("Poor" = 8, "Fair" = 22, "Good" = 45, "Excellent" = 35)
ci_multinom(outcomes)
#> # A tibble: 4 × 6
#>   group        est lwr.ci upr.ci     x     n
#>   <fct>      <dbl>  <dbl>  <dbl> <int> <int>
#> 1 Poor      0.0727 0.0313  0.160     8   110
#> 2 Fair      0.2    0.122   0.310    22   110
#> 3 Good      0.409  0.300   0.528    45   110
#> 4 Excellent 0.318  0.220   0.436    35   110
# Look for non-overlapping CIs to identify categories that differ significantly