tidy(model_practice, exponentiate = TRUE, conf.int = TRUE) |>
filter(term != "(Intercept)") |>
mutate(
label = dplyr::recode(term,
"School_TypePublic" = "School: Public (ref: Private)",
"age" = "Age at survey (continuous)",
"Education_GradeGrade 8" = "Grade 8 (ref: Grade 9)",
"Education_GradeGrade 7" = "Grade 7 (ref: Grade 9)",
"Family_StructureNuclear" = "Nuclear family (ref: Joint)",
"Mothers_Education6th-12th Grade" = "Mother's edu: 6th–12th",
"Mothers_EducationPreschool-5th" = "Mother's edu: Preschool–5th",
"Mothers_EducationCan read/write" = "Mother's edu: Can read/write",
"Mothers_EducationCan't read/write" = "Mother's edu: Can't read/write",
"Occupation_CollapsedManual/Agricultural" = "Occupation: Manual/agri (ref: Homemaker)",
"Occupation_CollapsedFormal Employment" = "Occupation: Formal employment",
"Occupation_CollapsedOther" = "Occupation: Other",
"menses_start_age" = "Age at menarche (ordinal rank)"
),
significance = if_else(p.value < 0.05, "p < .05", "p ≥ .05")
) |>
ggplot(aes(x = estimate, y = reorder(label, estimate),
colour = significance, shape = significance)) +
geom_vline(xintercept = 1, linetype = "dashed", colour = "grey50") +
geom_point(size = 3) +
geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = 0.25) +
scale_x_log10(
breaks = c(0.1, 0.25, 0.5, 1, 2, 5, 10),
labels = c("0.10", "0.25", "0.50", "1.0", "2.0", "5.0", "10.0")
) +
scale_colour_manual(values = c("p < .05" = "#d62728", "p ≥ .05" = "#7f7f7f")) +
scale_shape_manual(values = c("p < .05" = 16, "p ≥ .05" = 1)) +
labs(
title = "Adjusted Odds Ratios: Predictors of Good Menstrual Hygiene Practice",
x = "Adjusted Odds Ratio (log scale)",
y = NULL, colour = NULL, shape = NULL,
caption = "Horizontal bars = 95% CI. Dashed line = AOR 1.0 (no effect)."
) +
theme_bw(base_size = 11) +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold"),
panel.grid.minor = element_blank())