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",
...
)Vector of group sizes. Best if elements have meaningful names (see examples).
Calculation method: "goodman", "sisonglaz", "cplus1", and others.
See DescTools::MultinomCI() documentation.
Confidence level. Default: 0.95.
Column name (quoted) for group names. Default: "group".
Additional parameters for DescTools::MultinomCI().
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.
Similar to DescTools::MultinomCI(), but uses the Goodman method by default
and returns a data frame, enabling convenient plotting with ggplot2.
# 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