Menstrual Hygiene Knowledge and Practice Among Schoolgirls in Kirtipur, Nepal

A School-Based Cross-Sectional Study (2017)

Author

Meena Maharjan

Published

August 29, 2026

Background

Menstruation is a natural physiological process, yet adolescent girls in many low- and middle-income countries face significant gaps in menstrual health knowledge and access to the resources needed for adequate management. This cross-sectional study assessed the knowledge and practice of menstrual hygiene among 312 schoolgirls in Grades 7–9 attending two public and two private schools in Kirtipur, Nepal, and identified independent sociodemographic predictors of good knowledge and good practice using binary logistic regression.

Study design School-based cross-sectional
Setting Kirtipur, Kathmandu Valley, Nepal
Period June – July 2017
Participants 312 schoolgirls, Grades 7–9
Schools 2 public, 2 private
Primary outcomes Good knowledge (≥ 60% correct) · Good practice (≥ 60% score)

Descriptive Statistics

Table 1 · Sociodemographic Characteristics

Show code
df |>
  select(School_Type, age, Education_Grade, Religion, Family_Structure,
         Mothers_Education, Occupation_Collapsed, Menarche_Age,
         K_Category, P_Category) |>
  tbl_summary(
    label = list(
      School_Type          ~ "School type",
      age                  ~ "Age at survey (years)",
      Education_Grade      ~ "Education grade",
      Religion             ~ "Religion",
      Family_Structure     ~ "Type of family",
      Mothers_Education    ~ "Mother's education",
      Occupation_Collapsed ~ "Mother's occupation (collapsed)",
      Menarche_Age         ~ "Age at menarche",
      K_Category           ~ "Knowledge category",
      P_Category           ~ "Practice category"
    ),
    statistic = list(
      all_continuous()  ~ "{mean} ± {sd}",
      all_categorical() ~ "{n} ({p}%)"
    ),
    digits = list(all_continuous() ~ 2)
  ) |>
  bold_labels() |>
  modify_caption("**Table 1.** Sociodemographic characteristics (n = 312)")
Table 1. Sociodemographic characteristics (n = 312)
Characteristic N = 3121
School type
    Private 164 (53%)
    Public 148 (47%)
Age at survey (years)
    12 37 (12%)
    13 104 (33%)
    14 129 (41%)
    15 42 (13%)
Education grade
    Grade 9 136 (44%)
    Grade 8 105 (34%)
    Grade 7 71 (23%)
Religion
    Buddhist 33 (11%)
    Christian 28 (9.0%)
    Hindu 246 (79%)
    Kirat 4 (1.3%)
    Muslim 1 (0.3%)
Type of family
    Joint 91 (29%)
    Nuclear 221 (71%)
Mother's education
    Graduation+ 36 (12%)
    6th-12th Grade 86 (28%)
    Preschool-5th 32 (10%)
    Can read/write 84 (27%)
    Can't read/write 74 (24%)
Mother's occupation (collapsed)
    Homemaker 24 (7.7%)
    Manual/Agricultural 31 (9.9%)
    Formal Employment 78 (25%)
    Other 179 (57%)
Age at menarche
    <=10 10 (3.2%)
    >=14 15 (4.8%)
    11 39 (13%)
    12 165 (53%)
    13 83 (27%)
Knowledge category
    Poor 156 (50%)
    Good 156 (50%)
Practice category
    Poor 138 (44%)
    Good 174 (56%)
1 n (%)

Table 2 · Knowledge of Menstrual Hygiene

Good knowledge of menstrual hygiene was found in 49.7% of participants. Most (86.9%) had heard about menstruation before menarche; mothers were the primary information source (65.3%), followed by friends (18.1%).

Show code
df |>
  select(menstruation_k1, normalage_k2, normalcycle_k3, cookfood_k4,
         causes_k5, bleedingoccurs_k6, infection_k7) |>
  tbl_summary(
    label = list(
      menstruation_k1   ~ "What is menstruation?",
      normalage_k2      ~ "Normal age of onset",
      normalcycle_k3    ~ "Usual duration of menstrual bleeding",
      cookfood_k4       ~ "Can girls cook during menstruation?",
      causes_k5         ~ "Cause of menstruation",
      bleedingoccurs_k6 ~ "Origin of menstrual blood",
      infection_k7      ~ "Does poor hygiene cause infection?"
    ),
    statistic = all_categorical() ~ "{n} ({p}%)"
  ) |>
  bold_labels() |>
  modify_caption("**Table 2.** Knowledge of menstrual hygiene (n = 312)")
Table 2. Knowledge of menstrual hygiene (n = 312)
Characteristic N = 3121
What is menstruation?
    1 233 (75%)
    2 16 (5.1%)
    3 3 (1.0%)
    4 60 (19%)
Normal age of onset
    1 52 (17%)
    2 165 (53%)
    3 77 (25%)
    4 18 (5.8%)
Usual duration of menstrual bleeding
    1 185 (59%)
    2 101 (32%)
    3 26 (8.3%)
Can girls cook during menstruation?
    1 189 (61%)
    2 123 (39%)
Cause of menstruation
    1 146 (47%)
    2 32 (10%)
    3 6 (1.9%)
    4 5 (1.6%)
    5 123 (39%)
Origin of menstrual blood
    1 207 (66%)
    2 12 (3.8%)
    4 4 (1.3%)
    5 89 (29%)
Does poor hygiene cause infection?
    1 265 (85%)
    2 47 (15%)
1 n (%)

Table 3 · Practice of Menstrual Hygiene

Good practice was found in 43.9% of participants. Most changed their absorbent at school (82.7%) and cleaned their genitals during menstruation (89.7%). Over half used sanitary pads (54.8%), while 34.6% used old cloth.

Show code
df |>
  select(padperday_p1, reuse_material_p2, material_p3, drycloth_skip_p4,
         dispose_p5, changepad_p6, cleangenital_p7, use_clean_skip_p8,
         eat_food_p9, pad_last_used_p10) |>
  tbl_summary(
    label = list(
      padperday_p1      ~ "Absorbents used per day",
      reuse_material_p2 ~ "Reuse absorbent",
      material_p3       ~ "Type of absorbent used",
      drycloth_skip_p4  ~ "Where cloth is dried (cloth users only)",
      dispose_p5        ~ "Disposal method (non-reusers only)‡",
      changepad_p6      ~ "Change absorbent at school",
      cleangenital_p7   ~ "Clean genitals during menstruation",
      use_clean_skip_p8 ~ "Method of genital cleaning (cleaners only)",
      eat_food_p9       ~ "Where food is eaten during menstruation",
      pad_last_used_p10 ~ "Absorbents used during last period"
    ),
    statistic = all_categorical() ~ "{n} ({p}%)"
  ) |>
  bold_labels() |>
  modify_caption("**Table 3.** Practice of menstrual hygiene (n = 312). ‡ Disposal recorded for n = 208 who did not reuse.")
Table 3. Practice of menstrual hygiene (n = 312). ‡ Disposal recorded for n = 208 who did not reuse.
Characteristic N = 3121
Absorbents used per day
    1 57 (18%)
    2 223 (71%)
    3 32 (10%)
Reuse absorbent
    1 108 (35%)
    2 204 (65%)
Type of absorbent used
    1 108 (35%)
    2 33 (11%)
    3 171 (55%)
Where cloth is dried (cloth users only)
    1 25 (24%)
    2 60 (57%)
    3 18 (17%)
    4 2 (1.9%)
    Unknown 207
Disposal method (non-reusers only)‡
    1 58 (28%)
    2 145 (70%)
    3 5 (2.4%)
    Unknown 104
Change absorbent at school
    1 258 (83%)
    2 54 (17%)
Clean genitals during menstruation
    1 280 (90%)
    2 32 (10%)
Method of genital cleaning (cleaners only)
    1 166 (59%)
    2 105 (38%)
    3 8 (2.9%)
    Unknown 33
Where food is eaten during menstruation
    1 220 (71%)
    2 92 (29%)
Absorbents used during last period
    1 143 (46%)
    2 112 (36%)
    3 57 (18%)
1 n (%)

Table 4 · Restrictions, Absenteeism, and Menstrual Experience

Most participants reported cultural restrictions: 74.7% did not attend religious functions and 59.3% did not perform normal household work during menstruation. Half (50.3%) had ever missed school due to menstruation.

Show code
df |>
  select(religious_function_R1, household_work_R2, sleep_R3,
         touch_others_R4, touch_parents_R5,
         Missed_school_S1, Reason_skip_s2,
         feeling_menses_s3, complication_s3) |>
  tbl_summary(
    label = list(
      religious_function_R1 ~ "Attend religious function during menstruation",
      household_work_R2     ~ "Perform household work as normal",
      sleep_R3              ~ "Sleep arrangement during menstruation",
      touch_others_R4       ~ "Allowed to touch others",
      touch_parents_R5      ~ "Allowed to touch parents",
      Missed_school_S1      ~ "School absenteeism due to menstruation",
      Reason_skip_s2        ~ "Reason for missing school (n = 157)†",
      feeling_menses_s3     ~ "Feeling at first menstruation",
      complication_s3       ~ "Menstrual complications†"
    ),
    statistic = all_categorical() ~ "{n} ({p}%)"
  ) |>
  bold_labels() |>
  modify_caption("**Table 4.** Restrictions, absenteeism, and menstrual experience (n = 312). † Multiple-response items.")
Table 4. Restrictions, absenteeism, and menstrual experience (n = 312). † Multiple-response items.
Characteristic N = 3121
Attend religious function during menstruation
    1 79 (25%)
    2 233 (75%)
Perform household work as normal
    1 127 (41%)
    2 185 (59%)
Sleep arrangement during menstruation
    1 245 (79%)
    2 62 (20%)
    3 5 (1.6%)
Allowed to touch others
    1 29 (9.3%)
    2 249 (80%)
    3 34 (11%)
Allowed to touch parents
    1 252 (81%)
    2 60 (19%)
School absenteeism due to menstruation
    1 10 (3.2%)
    2 147 (47%)
    3 155 (50%)
Reason for missing school (n = 157)†
    1 15 (9.6%)
    2 7 (4.5%)
    3 23 (15%)
    4 71 (45%)
    5 32 (20%)
    6 9 (5.7%)
    Unknown 155
Feeling at first menstruation
    1 176 (56%)
    2 35 (11%)
    3 55 (18%)
    4 46 (15%)
Menstrual complications†
    1 171 (55%)
    2 2 (0.6%)
    3 48 (15%)
    4 7 (2.2%)
    5 27 (8.7%)
    6 3 (1.0%)
    7 52 (17%)
    8 2 (0.6%)
1 n (%)

Bivariate Associations

Table S1 · Predictors of Good Knowledge

Show code
df |>
  select(School_Type, Education_Grade, Family_Structure,
         Mothers_Education, Occupation_Collapsed, K_Category) |>
  tbl_summary(
    by = K_Category,
    label = list(
      School_Type          ~ "School type",
      Education_Grade      ~ "Grade",
      Family_Structure     ~ "Family type",
      Mothers_Education    ~ "Mother's education",
      Occupation_Collapsed ~ "Mother's occupation"
    ),
    statistic = all_categorical() ~ "{n} ({p}%)"
  ) |>
  add_p(test = all_categorical() ~ "chisq.test") |>
  add_overall() |>
  bold_p(t = 0.05) |>
  modify_caption("**Table S1.** Bivariate associations with good knowledge")
Table S1. Bivariate associations with good knowledge
Characteristic Overall
N = 3121
Poor
N = 1561
Good
N = 1561
p-value2
School type


>0.9
    Private 164 (53%) 81 (52%) 83 (53%)
    Public 148 (47%) 75 (48%) 73 (47%)
Grade


<0.001
    Grade 9 136 (44%) 52 (33%) 84 (54%)
    Grade 8 105 (34%) 45 (29%) 60 (38%)
    Grade 7 71 (23%) 59 (38%) 12 (7.7%)
Family type


0.013
    Joint 91 (29%) 56 (36%) 35 (22%)
    Nuclear 221 (71%) 100 (64%) 121 (78%)
Mother's education


0.2
    Graduation+ 36 (12%) 14 (9.0%) 22 (14%)
    6th-12th Grade 86 (28%) 38 (24%) 48 (31%)
    Preschool-5th 32 (10%) 17 (11%) 15 (9.6%)
    Can read/write 84 (27%) 42 (27%) 42 (27%)
    Can't read/write 74 (24%) 45 (29%) 29 (19%)
Mother's occupation


0.3
    Homemaker 24 (7.7%) 15 (9.6%) 9 (5.8%)
    Manual/Agricultural 31 (9.9%) 14 (9.0%) 17 (11%)
    Formal Employment 78 (25%) 44 (28%) 34 (22%)
    Other 179 (57%) 83 (53%) 96 (62%)
1 n (%)
2 Pearson’s Chi-squared test

Table S2 · Predictors of Good Practice

Show code
df |>
  select(School_Type, Education_Grade, Family_Structure,
         Mothers_Education, Occupation_Collapsed, P_Category) |>
  tbl_summary(
    by = P_Category,
    label = list(
      School_Type          ~ "School type",
      Education_Grade      ~ "Grade",
      Family_Structure     ~ "Family type",
      Mothers_Education    ~ "Mother's education",
      Occupation_Collapsed ~ "Mother's occupation"
    ),
    statistic = all_categorical() ~ "{n} ({p}%)"
  ) |>
  add_p(test = all_categorical() ~ "chisq.test") |>
  add_overall() |>
  bold_p(t = 0.05) |>
  modify_caption("**Table S2.** Bivariate associations with good practice")
Table S2. Bivariate associations with good practice
Characteristic Overall
N = 3121
Poor
N = 1381
Good
N = 1741
p-value2
School type


<0.001
    Private 164 (53%) 51 (37%) 113 (65%)
    Public 148 (47%) 87 (63%) 61 (35%)
Grade


<0.001
    Grade 9 136 (44%) 47 (34%) 89 (51%)
    Grade 8 105 (34%) 42 (30%) 63 (36%)
    Grade 7 71 (23%) 49 (36%) 22 (13%)
Family type


0.069
    Joint 91 (29%) 48 (35%) 43 (25%)
    Nuclear 221 (71%) 90 (65%) 131 (75%)
Mother's education


0.007
    Graduation+ 36 (12%) 11 (8.0%) 25 (14%)
    6th-12th Grade 86 (28%) 31 (22%) 55 (32%)
    Preschool-5th 32 (10%) 16 (12%) 16 (9.2%)
    Can read/write 84 (27%) 35 (25%) 49 (28%)
    Can't read/write 74 (24%) 45 (33%) 29 (17%)
Mother's occupation


0.003
    Homemaker 24 (7.7%) 17 (12%) 7 (4.0%)
    Manual/Agricultural 31 (9.9%) 17 (12%) 14 (8.0%)
    Formal Employment 78 (25%) 39 (28%) 39 (22%)
    Other 179 (57%) 65 (47%) 114 (66%)
1 n (%)
2 Pearson’s Chi-squared test

Logistic Regression

Table 5 · Independent Predictors of Good Knowledge and Good Practice

All predictors entered simultaneously (Enter method). Reference categories: Private school · Grade 9 · Joint family · Graduation+ · Homemaker.

Show code
formula_predictors <- ~ School_Type + age + Education_Grade + Family_Structure +
  Mothers_Education + Occupation_Collapsed + menses_start_age

model_knowledge <- glm(
  update(formula_predictors, K_Category ~ .),
  data = df, family = binomial(link = "logit")
)

model_practice <- glm(
  update(formula_predictors, P_Category ~ .),
  data = df, family = binomial(link = "logit")
)

var_labels <- list(
  School_Type          ~ "School type (ref: Private)",
  age                  ~ "Age at survey (continuous)",
  Education_Grade      ~ "Education grade (ref: Grade 9)",
  Family_Structure     ~ "Family type (ref: Joint)",
  Mothers_Education    ~ "Mother's education (ref: Graduation+)",
  Occupation_Collapsed ~ "Mother's occupation (ref: Homemaker)",
  menses_start_age     ~ "Age at menarche (ordinal rank 1–5)"
)

tbl_k <- tbl_regression(
  model_knowledge, exponentiate = TRUE, label = var_labels,
  estimate_fun = function(x) style_ratio(x, digits = 2)
) |>
  modify_column_merge(
    pattern = "{estimate} ({conf.low}, {conf.high})",
    rows = !is.na(estimate)
  ) |>
  bold_p(t = 0.05) |>
  modify_header(estimate ~ "**AOR (95% CI)**")

tbl_p <- tbl_regression(
  model_practice, exponentiate = TRUE, label = var_labels,
  estimate_fun = function(x) style_ratio(x, digits = 2)
) |>
  modify_column_merge(
    pattern = "{estimate} ({conf.low}, {conf.high})",
    rows = !is.na(estimate)
  ) |>
  bold_p(t = 0.05) |>
  modify_header(estimate ~ "**AOR (95% CI)**")

tbl_merge(
  tbls        = list(tbl_k, tbl_p),
  tab_spanner = c("**Good Knowledge**", "**Good Practice**")
) |>
  modify_caption(
    "**Table 5.** Binary logistic regression: adjusted odds ratios (n = 312). Bold = p < .05."
  )
Table 5. Binary logistic regression: adjusted odds ratios (n = 312). Bold = p < .05.
Characteristic
Good Knowledge
Good Practice
AOR (95% CI) p-value AOR (95% CI) p-value
School type (ref: Private)



    Private —
—
    Public 1.57 (0.90, 2.77) 0.11 0.34 (0.19, 0.60) <0.001
Age at survey (continuous) 0.92 (0.66, 1.26) 0.6 0.80 (0.57, 1.10) 0.2
Education grade (ref: Grade 9)



    Grade 9 —
—
    Grade 8 0.88 (0.49, 1.57) 0.7 0.70 (0.38, 1.28) 0.2
    Grade 7 0.10 (0.04, 0.23) <0.001 0.23 (0.10, 0.50) <0.001
Family type (ref: Joint)



    Joint —
—
    Nuclear 1.40 (0.79, 2.47) 0.2 1.14 (0.64, 2.00) 0.7
Mother's education (ref: Graduation+)



    Graduation+ —
—
    6th-12th Grade 0.56 (0.22, 1.36) 0.2 0.77 (0.29, 1.94) 0.6
    Preschool-5th 0.41 (0.13, 1.29) 0.13 0.38 (0.12, 1.21) 0.11
    Can read/write 0.42 (0.16, 1.06) 0.071 0.61 (0.22, 1.61) 0.3
    Can't read/write 0.46 (0.15, 1.32) 0.2 0.61 (0.20, 1.79) 0.4
Mother's occupation (ref: Homemaker)



    Homemaker —
—
    Manual/Agricultural 2.03 (0.59, 7.26) 0.3 3.59 (1.02, 13.4) 0.050
    Formal Employment 0.65 (0.22, 1.91) 0.4 1.53 (0.50, 4.91) 0.5
    Other 1.56 (0.59, 4.24) 0.4 4.95 (1.78, 14.9) 0.003
Age at menarche (ordinal rank 1–5) 0.73 (0.53, 0.98) 0.041 1.00 (0.74, 1.36) >0.9
Abbreviations: CI = Confidence Interval, OR = Odds Ratio

Knowledge model: χ²(13) = 62.89, Nagelkerke R² ≈ 0.145

Practice model: χ²(13) = 62.60, Nagelkerke R² ≈ 0.146


Visualisations

Figure 1 · Predictors of Good Practice (Forest Plot)

Show code
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())

Figure 2 · Practice Score Distribution by School Type

Show code
ggplot(df, aes(x = Calc_Practice_Total, fill = School_Type)) +
  geom_histogram(binwidth = 1, position = "identity",
                 alpha = 0.65, colour = "white") +
  geom_vline(xintercept = 4.5, linetype = "dashed",
             colour = "black", linewidth = 0.7) +
  annotate("text", x = 5.3, y = Inf, vjust = 1.5,
           label = "≥60% threshold", size = 3) +
  facet_wrap(~School_Type, ncol = 1) +
  scale_fill_manual(values = c("Private" = "#4878cf", "Public" = "#d65f5f")) +
  labs(
    title    = "Practice Score Distribution by School Type",
    subtitle = "Dashed line = 60% threshold (score ≥ 5 = good practice)",
    x        = "Practice total score (0–7)",
    y        = "Number of participants"
  ) +
  theme_bw(base_size = 11) +
  theme(legend.position = "none",
        plot.title      = element_text(face = "bold"))


Key Findings

Finding Result
Good knowledge prevalence 49.7%
Good practice prevalence 43.9%
Dominant predictor (both outcomes) Education grade
Grade 7 vs Grade 9 — knowledge AOR ≈ 0.10, p < .001
Private school — practice AOR ≈ 1.88, p = .025
Manual/agricultural vs Homemaker — practice AOR ≈ 7.35, p = .007
School absenteeism due to menstruation 50.3%

Reproducibility

Show code
sessionInfo()
R version 4.4.1 (2024-06-14 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26200)

Matrix products: default


locale:
[1] LC_COLLATE=English_United States.utf8 
[2] LC_CTYPE=English_United States.utf8   
[3] LC_MONETARY=English_United States.utf8
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.utf8    

time zone: America/Chicago
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] here_1.0.2      broom_1.0.10    gtsummary_2.5.1 lubridate_1.9.4
 [5] forcats_1.0.0   stringr_1.5.1   dplyr_1.2.1     purrr_1.1.0    
 [9] readr_2.1.5     tidyr_1.3.1     tibble_3.2.1    ggplot2_4.0.0  
[13] tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] gt_1.1.0             sass_0.4.9           generics_0.1.3      
 [4] xml2_1.3.8           stringi_1.8.4        hms_1.1.3           
 [7] digest_0.6.37        magrittr_2.0.3       evaluate_1.0.3      
[10] grid_4.4.1           timechange_0.3.0     RColorBrewer_1.1-3  
[13] cards_0.8.1          fastmap_1.2.0        broom.helpers_1.22.0
[16] rprojroot_2.1.1      jsonlite_1.8.9       cardx_0.3.4         
[19] backports_1.5.0      scales_1.4.0         labelled_2.14.1     
[22] cli_3.6.3            rlang_1.2.0          crayon_1.5.3        
[25] litedown_0.7         commonmark_2.0.0     bit64_4.6.0-1       
[28] base64enc_0.1-3      withr_3.0.2          yaml_2.3.10         
[31] tools_4.4.1          parallel_4.4.1       tzdb_0.4.0          
[34] vctrs_0.7.3          R6_2.5.1             lifecycle_1.0.5     
[37] fs_1.6.5             htmlwidgets_1.6.4    bit_4.5.0.1         
[40] vroom_1.6.5          pkgconfig_2.0.3      pillar_1.10.1       
[43] gtable_0.3.6         glue_1.8.0           haven_2.5.5         
[46] xfun_0.53            tidyselect_1.2.1     knitr_1.50          
[49] farver_2.1.2         htmltools_0.5.8.1    labeling_0.4.3      
[52] rmarkdown_2.29       compiler_4.4.1       S7_0.2.0            
[55] markdown_2.0        

Data privacy: Individual participant data are not included in this repository. All analyses run on data produced by R/01_data_management.R from the original anonymised survey file held securely by the author.