Executive Summary

This report documents the end-to-end analytical workflow implemented in R for a cross-sectional study assessing community knowledge of Mpox in five provinces of Zambia. The analysis formed the basis of a manuscript currently under peer review; however, this document focuses specifically on demonstrating intermediate-level competencies in data management, statistical analysis, visualization, and reproducible reporting using R.

The project involved importing raw survey data from Excel, performing structured data cleaning, recoding categorical variables, engineering derived variables (including age categories, income groups, and occupation classifications), and constructing a composite knowledge score using Bloom’s cut-off criteria. Analysis was restricted to participants who had heard of Mpox, and a binary outcome variable was created to classify knowledge as good or poor.

Exploratory data analysis was conducted using the tidyverse framework, including summary statistics, frequency distributions, and graphical visualizations to assess distributions and identify outliers. Categorical associations were evaluated using Chi-square tests, with formatted summary tables generated using the gtsummary package and exported programmatically to Word.

To assess factors associated with good knowledge, univariable and multivariable logistic regression models were fitted using generalized linear models with a binomial link function. Odds ratios and 95% confidence intervals were obtained through coefficient exponentiation. Model selection and refinement were guided by theoretical relevance and comparison of Akaike and Bayesian Information Criteria (AIC and BIC), demonstrating structured model evaluation and parsimony.

All analyses were conducted within an R Markdown environment to ensure full reproducibility of outputs, including tables, figures, and model results.

This project demonstrates applied proficiency in data wrangling, variable engineering, regression modeling, model comparison, spatial analysis, and reproducible reporting — reflecting intermediate-level competence in R for public health data analysis.

Analytical Environment Setup and Package Management

The analytical environment was configured by loading packages required for data import, manipulation, visualization, statistical modeling, and reproducible reporting. The tidyverse framework was used for data wrangling and graphical analysis, while additional packages supported regression diagnostics, formatted table generation, and automated export of results. Organizing package loading at the beginning of the document enhances reproducibility and transparency.

library(tidyverse)      # Includes dplyr, ggplot2, tidyr, forcats, etc.
library(readxl)         # Reading Excel files
library(gtsummary)      # Summary tables
library(flextable)      # Table formatting for Word
library(officer)        # Export to Word
library(scales)         # Percent formatting, axis scaling
library(janitor)        # Cleaning column names
library(gt)             # Table formatting
library(sjPlot)         # Data visualization of tables
library(sjmisc)         # Data manipulation utilities
library(pROC)           # ROC curves (if used)
library(elrm)           # Exact logistic regression (if used)
library(logistf)        # Firth logistic regression
library(knitr)          # Printing tables in RMarkdown
library(car)            # Recoding, regression utilities
library(DiagrammeR)     # Diagrams/flowcharts
library(DiagrammeRsvg)  # Export DiagrammeR to SVG
library(rsvg)           # Render SVG images
library(sf)             # Spatial data handling
library(ggspatial)      # Spatial visualization in ggplot2

Data Import and Initial Cleaning

Raw survey data exported from the electronic data collection platform contained system-generated metadata and label-heavy column names. These were programmatically cleaned to ensure analysis-ready variable names and improve reproducibility.

# Suppress warnings and messages when reading Excel file
# Corrected version
Mpox <- suppressWarnings(
  suppressMessages(
    readxl::read_excel("Data/KAP_Mpox_2025_-_all_versions_-_labels_-_2025-10-08-18-00-59.xlsx")
  )
)

Remove some columns

Purpose: This step identifies all survey and metadata columns that are not needed for analysis. By defining cols_to_remove, we prepare the dataset for cleaner, focused analysis.

cols_to_remove <- c( "start" ,"end","deviceid","Do you agree to participate in this survey?","A5.", "Interviewer  Name", "k_d1","k_d2","k_d3","k_d4","k_d5","k_d6","k_d7","k_d8a","k_d8a","k_d8b","k_d9", "k_d10","k_d11","k_d12","k_d13","k_d14","k_d16","knowledge_score","knowledge_total_max","knowledge_pct","knowledge_good","attitude_score","attitude_total_max","attitude_pct","attitude_positive","p_f1","p_f2","p_f3","p_f4","p_f5","p_f6","p_f7","p_f8","p_f9","p_f11","practice_score","practice_total_max","practice_pct","practice_good","End of questionnaire. Thank you for your time.","A1. Interview ID","_submission_time","_validation_status","_notes","_status","_submitted_by","__version__","_tags","_index","Introduction: We are conducting this survey to understand community members’ knowledge, attitudes, and practices regarding Mpox. Your participation is voluntary, your responses will be confidential, and you may stop at any time. You must be 18 years or older and have lived in this area for at least 6 months to participate.","Respondent did not consent. End the interview and thank them.", "_GPS coordinate_altitude", "_GPS coordinate_precision","A5. Interviewer  Name","GPS coordinate","B0. How many months have you lived in this area?","eligible","Not eligible (must be ≥18 years and resident ≥6 months). End interview.")
  Mpox<- Mpox[, !names(Mpox) %in% cols_to_remove]

Renaming Columns

Purpose: This step standardizes and simplifies column names in the Mpox dataset for readability and consistency.

Mpox <- Mpox %>% 
  rename(
    Province = `A3a. Province`, 
    District = `A3b. District`, 
    Facility = `A4. Facility`, 
    Latitude = `_GPS coordinate_latitude`, 
    Longitude = `_GPS coordinate_longitude`,
    Sex=`B1. Sex`,Age=`B2. Age in years`,
    Marital_status=`B3. Marital status`,
    Residence=`B4. Residence`,
    Education_level=`B5. Education level`,
    Occupation=`B6. Occupation`,
    Religion=`B7. Religion`,
    Monthly_income=`B8. Monthly household income (ZMW)...26`)

Renaming Columns for Mpox Awareness Sources

Purpose: This step further cleans and standardizes column names, focusing specifically on Mpox awareness and information sources.

Mpox<- Mpox %>% 
  rename(
    heard_of_mpox = `C1. Have you heard of Mpox before today?`,
    mpox_info_radio_tv = `C2. Where did you hear about Mpox? (multiple)/Radio/TV`,
    mpox_info_newspaper = `C2. Where did you hear about Mpox? (multiple)/Newspaper`,
    mpox_info_internet = `C2. Where did you hear about Mpox? (multiple)/Internet/social media`,
    mpox_info_health_worker = `C2. Where did you hear about Mpox? (multiple)/Health worker`,
    mpox_info_friends_family = `C2. Where did you hear about Mpox? (multiple)/Friends/family`,
    mpox_info_posters_meetings = `C2. Where did you hear about Mpox? (multiple)/Posters/community meetings`,
    mpox_info_other = `C2. Where did you hear about Mpox? (multiple)/Other (specify)`)

Renaming Columns for Mpox Knowledge, Transmission, and Symptoms

This chunk is focused on renaming survey columns that cover knowledge about Mpox causes, transmission routes, symptoms, and prevention. It takes the original long survey questions and converts them into short, clear, analysis-ready variable names.

Mpox<- Mpox %>% 
  rename(freq_mpox_info=`C4. How frequently do you receive information about Mpox?`,mpox_cause=`D1. What causes the disease Mpox?`,mpox_transmitted_animal=`D2. How is Mpox transmitted? (multiple)/From animals (such as monkeys, rodents)`,mpox_transmitted_person=`D2. How is Mpox transmitted? (multiple)/From person-to-person through close contact`,mpox_transmitted_sexual=`D2. How is Mpox transmitted? (multiple)/Through sexual contact`,mpox_transmitted_droplets=`D2. How is Mpox transmitted? (multiple)/Through respiratory droplets`,mpox_transmitted_materials=`D2. How is Mpox transmitted? (multiple)/From contaminated materials (clothes, beddings)`,mpox_transmission_Dont_know=`D2. How is Mpox transmitted? (multiple)/Don't know`,mpox_transsmission_direct=`D3. Mpox can be transmitted through… (multiple)/Direct contact with rash/lesions`,mpox_transsmission_respiratory=`D3. Mpox can be transmitted through… (multiple)/Respiratory droplets during close contact`,mpox_transsmission_contact=`D3. Mpox can be transmitted through… (multiple)/Contact with contaminated objects (bedding, clothing)`,mpox_transsmission_bite=`D3. Mpox can be transmitted through… (multiple)/Bite from infected animals`, mpox_transsmission_sex_contact=`D3. Mpox can be transmitted through… (multiple)/Sexual contact`,signs_symptoms=`D4. Common symptoms of Mpox (Yes/No/Don't know)`,
Fever=Fever,Headache=Headache,Swollen_lymph_nodes=`Swollen lymph nodes`,Skin_rash=`Skin rash/lesions`,Back_pain=`Back pain`, Muscle_aches=`Muscle aches`,
Mpox_resemble_chickenpox=`D5. Mpox symptoms can resemble chickenpox`, mpox_vaccine_available=`D6. There is a vaccine that can protect against Mpox.`,vax_mpox_protection=`D7. Being vaccinated  provides some protection against Mpox.`,mpox_seek_care=`D8a. Should someone with suspected Mpox seek care at a health facility?`,mpox_isolate=`D8b. Should someone with suspected Mpox isolate from others?`,handwahsing_prevent=`D9. Does handwashing and cleaning surfaces help prevent Mpox?`,avoiding_contact=`D10. Mpox can be prevented by avoiding contact with wild animals.`,pregant_women=`D11. Pregnant women can transmit Mpox to their unborn child.`,mpox_severe_children=`D12. Mpox can cause serious illness in children and immunocompromised people.`,mpox_incubation=`D13. Mpox incubation period is 5–21 days.`,mpox_spread_surfaces=`D14. Mpox can be spread via contaminated surfaces.`,maternal_foetal=`D16. Maternal-to-foetal transmission is possible.`)

Renaming Columns for Attitudes Toward Mpox

This chunk focuses on renaming survey columns that capture respondents’ attitudes and perceptions about Mpox and public health response.

Mpox<- Mpox %>% 
  rename(community_HCWs=`E1. Community members can work with health workers to reduce Mpox spread.`,awareness_pox=`E2. Awareness programs about Mpox are needed in my district.`,trust_HCWs=`E3. I trust health authorities to manage an Mpox outbreak.`,mpox_vaccination=`E4. I would take an Mpox vaccine if recommended.`,public_health_threat=`E5. Mpox is a serious public health threat.`,concerned=`E6. I am concerned about Mpox affecting my family.`)

Renaming Columns for Practices Toward Mpox

Purpose: This chunk renames survey columns that capture respondents’ actual or intended behaviors (practices) related to Mpox prevention.

Mpox<- Mpox %>% 
  rename(discussed_Mpox_last_30_days=`F1. In the last 30 days, have you discussed Mpox prevention with others?`,visit_clinic_fever_rash=`F2. If you had fever and rash, would you seek care at a health facility immediately?`,avoid_close_contact=`F3. Would you avoid close contact with a person with Mpox symptoms?`,avoid_sharing_contaminated_materials=`F4. Would you avoid sharing bedding/utensils with someone suspected of Mpox?`,avoided_crowded_gatherings=`F5. Have you avoided crowded gatherings during an outbreak?`,get_mpox_vaccine=`F6. Would you accept Mpox vaccination if available?`)

Recoding Occupational Status & Marital Status

This chunk simplifies categorical variables to make analysis and reporting easier, particularly for KAP tables or mentor-ready summaries.

#Occupatonal status 
Mpox <- Mpox %>%
  mutate(
    Occupation = case_when(
      Occupation %in% c("Business/vendor",
                         "Civil servant/professional",
                         "Farmer/manual") ~ "Employed",
      Occupation == "Student" ~ "Student",
      Occupation == "Unemployed" ~ "Unemployed",
      Occupation == "Other" ~ "Unemployed",
      TRUE ~ NA_character_))

#marital stautus 

Mpox<- Mpox%>%
  mutate(
    Marital_status= case_when(
      Marital_status == "Married" ~ "Married",
      TRUE ~ "Unmarried"
    ))

Adding Variable Labels- table 1

This chunk uses the labelled package to assign descriptive labels to variables. These labels help make tables, summaries, and outputs more readable for mentors or reports.

pacman::p_load(labelled)

var_label(Mpox) <- list(Province= "Provinces",District="Districts",Facility="Facilities",Sex="Sex",Age="Age (years)",Marital_status="Marital status",Residence="Residence",Education_level="Education level", Occupation="Occupation",Religion="Religion") 

Labeling Mpox Awareness Variables

This chunk continues adding descriptive labels to your Mpox dataset, now focusing on awareness and information sources.

pacman::p_load(labelled)

var_label(Mpox) <- list(heard_of_mpox="Heard of Mpox before",
  mpox_info_radio_tv = "Radio/TV",
  mpox_info_newspaper = "Newspaper",
  mpox_info_internet = "Internet/social media",
  mpox_info_health_worker = "Health care worker",
  mpox_info_friends_family = "Family/friends",
  mpox_info_posters_meetings = "Posters/Meetings",
  mpox_info_other = "Other"
)

Labeling Knowledge Variables

You are assigning descriptive labels to all variables related to knowledge of Mpox, including causes, transmission, symptoms, prevention, and vaccination.

pacman::p_load(labelled)

var_label(Mpox) <- list(freq_mpox_info="How frequently do you receive information about Mpox?",mpox_cause="What causes the disease Mpox?",mpox_transmitted_animal="How is Mpox transmitted:From animals (such as monkeys, rodents)?", mpox_transmitted_person= "How is Mpox transmitted:From person-to-person through close contact?",mpox_transmitted_sexual="How is Mpox transmitted:Through sexual contact?", mpox_transmitted_droplets="How is Mpox transmitted:Through respiratory droplets?", mpox_transmitted_materials="How is Mpox transmitted:From contaminated materials (clothes, beddings)?",mpox_transmission_Dont_know="How is Mpox transmitted:Don't know? ",mpox_transsmission_direct="Mpox can be transmitted through: Direct contact with rash/lesions?",mpox_transsmission_respiratory="Mpox can be transmitted through:Respiratory droplets during close contact",mpox_transsmission_contact="Mpox can be transmitted through: Contact with contaminated objects (bedding, clothing)",mpox_transsmission_bite="Mpox can be transmitted through:Bite from infected animals",mpox_transsmission_sex_contact="Mpox can be transmitted through:Sexual contact",Fever="Fever",Headache="Headache",Swollen_lymph_nodes="Swollen lymph nodes",Skin_rash="Skin rash/lesions",Back_pain="Back pain", Muscle_aches="Muscle aches", Mpox_resemble_chickenpox="Mpox symptoms can resemble chickenpox?",mpox_vaccine_available="There is a vaccine that can protect against Mpox?",vax_mpox_protection="Being vaccinated  provides some protection against Mpox?",mpox_seek_care="Should someone with suspected Mpox seek care at a health facility?",mpox_isolate="Should someone with suspected Mpox isolate from others?",handwahsing_prevent="Does handwashing and cleaning surfaces help prevent Mpox?",avoiding_contact="Mpox can be prevented by avoiding contact with wild animals?", pregant_women="Pregnant women can transmit Mpox to their unborn child?", mpox_severe_children="Mpox can cause serious illness in children and immunocompromised people?",mpox_incubation="Mpox incubation period is 5–21 days?",mpox_spread_surfaces="Mpox can be spread via contaminated surfaces?",maternal_foetal="Maternal-to-foetal transmission is possible?")

Labeling of variables-attitude questions

pacman::p_load(labelled)

var_label(Mpox) <- list(community_HCWs= "Community members can work with health workers to reduce Mpox spread?",awareness_pox= "Awareness programs about Mpox are needed in my district?",trust_HCWs= "I trust health authorities to manage an Mpox outbreak?",mpox_vaccination= "I would take an Mpox vaccine if recommended?",public_health_threat= "Mpox is a serious public health threat?",concerned= "I am concerned about Mpox affecting my family?")

Labeling of variables-practices questions

pacman::p_load(labelled)

var_label(Mpox) <- list(discussed_Mpox_last_30_days= "Have you discussed Mpox prevention with others in the last 30 days?",visit_clinic_fever_rash= "seek care at a health facility immediately if fever or rash?",avoid_close_contact="avoid close contact with a person with Mpox symptoms?",avoid_sharing_contaminated_materials= "avoid sharing bedding/utensils with someone suspected of Mpox?",avoided_crowded_gatherings= "avoided crowded gatherings during an outbreak?",get_mpox_vaccine=" accept Mpox vaccination if available?")

Assessing the distribution of age and monthly household income

summary(Mpox$Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   18.00   27.00   34.00   37.93   47.25   90.00       3

Filter the NAs for age. these where entered during the practice sessions

Mpox <- Mpox %>% filter(!is.na(Age))

Categorizing age

  • Age was categorized into three groups: 18–34, 35–54, and 55+ years to reflect young, middle-aged, and older adults.
# updated age categories 
Mpox$Age_categories <- cut(
  Mpox$Age,
  breaks = c(18, 35, 55, 85),   # updated boundaries
  labels = c("18–34", "35–54", "55+"),  # new categories
  right = FALSE, include.lowest = TRUE)
Mpox <- Mpox %>% filter(!is.na(Age_categories))
ggplot(Mpox, aes(x = Age)) +
  geom_histogram(aes(y = ..density..), bins = 30, color = "black", fill = "lightblue") +
  stat_function(fun = dnorm, args = list(mean = mean(Mpox$Age, na.rm = TRUE), sd = sd(Mpox$Age, na.rm = TRUE)), color = "red") +
  labs(title = "Age distribution", x = "Age (Years)", y = "Density") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5))
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# save as an image
ggsave("age_distribution.png", width = 10, height = 6, dpi = 300)
summary(Mpox$Monthly_income)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0     700    1650    2876    3000  400000

Remove some out liers

Mpox <- Mpox[Mpox$Monthly_income != 400000, ]
  • incase of income being reported as continous, check its distribution below
ggplot(Mpox, aes(x =Monthly_income)) +
  geom_histogram(aes(y = ..density..), bins = 30, color = "black", fill = "lightblue") +
  stat_function(fun = dnorm, args = list(mean = mean(Mpox$Monthly_income, na.rm = TRUE), sd = sd(Mpox$Monthly_income, na.rm = TRUE)), color = "red") +
  labs(title = "Income distribution", x = "Monthly_income(kwacha)", y = "Density") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5))

# save as an image
ggsave("Monthly_income_distribution.png", width = 10, height = 6, dpi = 300)
  • I decided to report as categorical and therefore i changed below
  • Monthly income was dichotomized as < 3000 and ≥ 3000 to reflect lower- and higher-income respondents.
Mpox$Income_category<- ifelse(
  Mpox$Monthly_income < 3000, 
  "< 3000", 
  "≥ 3000")

Descriptive analysis

This section is building a descriptive summary table of your survey population and stratifying it by whether respondents have heard of Mpox. The goal is to show the distribution of key demographics and compare groups.

# Step 1: Recode outcome with desired order
Mpox <- Mpox %>% 
  mutate(heard_of_mpox = factor(heard_of_mpox, levels = c("Yes", "No"))) # Yes first, No second

# Step 2: Build stratified table (categorical only)
t1 <- Mpox %>% 
  select(heard_of_mpox, Province, Age_categories, Sex, Marital_status, Residence, Education_level, Occupation, Income_category) %>% 
  tbl_summary(
    by = heard_of_mpox,
    percent = "row",
    missing_text = "Missing",
    label = list(
      Province ~ "Province",
      Age_categories ~ "Age group",
      Sex ~ "Sex",
      Marital_status ~ "Marital status",
      Residence ~ "Residence (Urban/Rural)",
      Education_level  ~ "Education level",
      Occupation ~ "Occupation",
      Income_category ~ "Income category"
    ),
    digits = list(all_categorical() ~ c(0, 1)) # format counts to 0 decimal points and percentages to 1 decimal point
  ) %>% 
  add_overall(last = FALSE) %>% 
  add_p(
    test = list(all_categorical() ~ "chisq.test"),
    pvalue_fun = function(x) style_pvalue(x, digits = 3)
  ) %>% 
  bold_labels() %>% 
  modify_header(label ~ "**Population Characteristics**") %>% 
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Heard of Mpox**")

print(t1)
## <div id="isqzkrdijw" style="padding-left:0px;padding-right:0px;padding-top:10px;padding-bottom:10px;overflow-x:auto;overflow-y:auto;width:auto;height:auto;">
##   <style>#isqzkrdijw table {
##   font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
##   -webkit-font-smoothing: antialiased;
##   -moz-osx-font-smoothing: grayscale;
## }
## 
## #isqzkrdijw thead, #isqzkrdijw tbody, #isqzkrdijw tfoot, #isqzkrdijw tr, #isqzkrdijw td, #isqzkrdijw th {
##   border-style: none;
## }
## 
## #isqzkrdijw p {
##   margin: 0;
##   padding: 0;
## }
## 
## #isqzkrdijw .gt_table {
##   display: table;
##   border-collapse: collapse;
##   line-height: normal;
##   margin-left: auto;
##   margin-right: auto;
##   color: #333333;
##   font-size: 16px;
##   font-weight: normal;
##   font-style: normal;
##   background-color: #FFFFFF;
##   width: auto;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #A8A8A8;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #A8A8A8;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_caption {
##   padding-top: 4px;
##   padding-bottom: 4px;
## }
## 
## #isqzkrdijw .gt_title {
##   color: #333333;
##   font-size: 125%;
##   font-weight: initial;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-color: #FFFFFF;
##   border-bottom-width: 0;
## }
## 
## #isqzkrdijw .gt_subtitle {
##   color: #333333;
##   font-size: 85%;
##   font-weight: initial;
##   padding-top: 3px;
##   padding-bottom: 5px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-color: #FFFFFF;
##   border-top-width: 0;
## }
## 
## #isqzkrdijw .gt_heading {
##   background-color: #FFFFFF;
##   text-align: center;
##   border-bottom-color: #FFFFFF;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_bottom_border {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_col_headings {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_col_heading {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 6px;
##   padding-left: 5px;
##   padding-right: 5px;
##   overflow-x: hidden;
## }
## 
## #isqzkrdijw .gt_column_spanner_outer {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   padding-top: 0;
##   padding-bottom: 0;
##   padding-left: 4px;
##   padding-right: 4px;
## }
## 
## #isqzkrdijw .gt_column_spanner_outer:first-child {
##   padding-left: 0;
## }
## 
## #isqzkrdijw .gt_column_spanner_outer:last-child {
##   padding-right: 0;
## }
## 
## #isqzkrdijw .gt_column_spanner {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 5px;
##   overflow-x: hidden;
##   display: inline-block;
##   width: 100%;
## }
## 
## #isqzkrdijw .gt_spanner_row {
##   border-bottom-style: hidden;
## }
## 
## #isqzkrdijw .gt_group_heading {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   text-align: left;
## }
## 
## #isqzkrdijw .gt_empty_group_heading {
##   padding: 0.5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: middle;
## }
## 
## #isqzkrdijw .gt_from_md > :first-child {
##   margin-top: 0;
## }
## 
## #isqzkrdijw .gt_from_md > :last-child {
##   margin-bottom: 0;
## }
## 
## #isqzkrdijw .gt_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   margin: 10px;
##   border-top-style: solid;
##   border-top-width: 1px;
##   border-top-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   overflow-x: hidden;
## }
## 
## #isqzkrdijw .gt_stub {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #isqzkrdijw .gt_stub_row_group {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
##   vertical-align: top;
## }
## 
## #isqzkrdijw .gt_row_group_first td {
##   border-top-width: 2px;
## }
## 
## #isqzkrdijw .gt_row_group_first th {
##   border-top-width: 2px;
## }
## 
## #isqzkrdijw .gt_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #isqzkrdijw .gt_first_summary_row {
##   border-top-style: solid;
##   border-top-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_first_summary_row.thick {
##   border-top-width: 2px;
## }
## 
## #isqzkrdijw .gt_last_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_grand_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #isqzkrdijw .gt_first_grand_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-style: double;
##   border-top-width: 6px;
##   border-top-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_last_grand_summary_row_top {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: double;
##   border-bottom-width: 6px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_striped {
##   background-color: rgba(128, 128, 128, 0.05);
## }
## 
## #isqzkrdijw .gt_table_body {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_footnotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_footnote {
##   margin: 0px;
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #isqzkrdijw .gt_sourcenotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #isqzkrdijw .gt_sourcenote {
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #isqzkrdijw .gt_left {
##   text-align: left;
## }
## 
## #isqzkrdijw .gt_center {
##   text-align: center;
## }
## 
## #isqzkrdijw .gt_right {
##   text-align: right;
##   font-variant-numeric: tabular-nums;
## }
## 
## #isqzkrdijw .gt_font_normal {
##   font-weight: normal;
## }
## 
## #isqzkrdijw .gt_font_bold {
##   font-weight: bold;
## }
## 
## #isqzkrdijw .gt_font_italic {
##   font-style: italic;
## }
## 
## #isqzkrdijw .gt_super {
##   font-size: 65%;
## }
## 
## #isqzkrdijw .gt_footnote_marks {
##   font-size: 75%;
##   vertical-align: 0.4em;
##   position: initial;
## }
## 
## #isqzkrdijw .gt_asterisk {
##   font-size: 100%;
##   vertical-align: 0;
## }
## 
## #isqzkrdijw .gt_indent_1 {
##   text-indent: 5px;
## }
## 
## #isqzkrdijw .gt_indent_2 {
##   text-indent: 10px;
## }
## 
## #isqzkrdijw .gt_indent_3 {
##   text-indent: 15px;
## }
## 
## #isqzkrdijw .gt_indent_4 {
##   text-indent: 20px;
## }
## 
## #isqzkrdijw .gt_indent_5 {
##   text-indent: 25px;
## }
## 
## #isqzkrdijw .katex-display {
##   display: inline-flex !important;
##   margin-bottom: 0.75em !important;
## }
## 
## #isqzkrdijw div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt-tr-group-header > div.rt-th-group:after {
##   height: 0px !important;
## }
## </style>
##   <table class="gt_table" data-quarto-disable-processing="false" data-quarto-bootstrap="false">
##   <thead>
##     <tr class="gt_col_headings gt_spanner_row">
##       <th class="gt_col_heading gt_columns_bottom_border gt_left" rowspan="2" colspan="1" scope="col" id="label"><span class='gt_from_md'><strong>Population Characteristics</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="2" colspan="1" scope="col" id="stat_0"><span class='gt_from_md'><strong>Overall</strong><br />
## N = 809</span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span></th>
##       <th class="gt_center gt_columns_top_border gt_column_spanner_outer" rowspan="1" colspan="2" scope="colgroup" id="level 1; stat_1">
##         <div class="gt_column_spanner"><span class='gt_from_md'><strong>Heard of Mpox</strong></span></div>
##       </th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="2" colspan="1" scope="col" id="p.value"><span class='gt_from_md'><strong>p-value</strong></span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>2</sup></span></th>
##     </tr>
##     <tr class="gt_col_headings">
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="stat_1"><span class='gt_from_md'><strong>Yes</strong><br />
## N = 372</span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="stat_2"><span class='gt_from_md'><strong>No</strong><br />
## N = 437</span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span></th>
##     </tr>
##   </thead>
##   <tbody class="gt_table_body">
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Province</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center"><0.001</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Central</td>
## <td headers="stat_0" class="gt_row gt_center">120 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">71 (59.2%)</td>
## <td headers="stat_2" class="gt_row gt_center">49 (40.8%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Copperbelt</td>
## <td headers="stat_0" class="gt_row gt_center">120 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">58 (48.3%)</td>
## <td headers="stat_2" class="gt_row gt_center">62 (51.7%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Lusaka</td>
## <td headers="stat_0" class="gt_row gt_center">444 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">151 (34.0%)</td>
## <td headers="stat_2" class="gt_row gt_center">293 (66.0%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Muchinga</td>
## <td headers="stat_0" class="gt_row gt_center">32 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">25 (78.1%)</td>
## <td headers="stat_2" class="gt_row gt_center">7 (21.9%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Western</td>
## <td headers="stat_0" class="gt_row gt_center">93 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">67 (72.0%)</td>
## <td headers="stat_2" class="gt_row gt_center">26 (28.0%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Age group</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.335</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    18–34</td>
## <td headers="stat_0" class="gt_row gt_center">415 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">181 (43.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">234 (56.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    35–54</td>
## <td headers="stat_0" class="gt_row gt_center">282 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">139 (49.3%)</td>
## <td headers="stat_2" class="gt_row gt_center">143 (50.7%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    55+</td>
## <td headers="stat_0" class="gt_row gt_center">112 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">52 (46.4%)</td>
## <td headers="stat_2" class="gt_row gt_center">60 (53.6%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Sex</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center"><0.001</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Female</td>
## <td headers="stat_0" class="gt_row gt_center">457 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">236 (51.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">221 (48.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Male</td>
## <td headers="stat_0" class="gt_row gt_center">352 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">136 (38.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">216 (61.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Marital status</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.089</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Married</td>
## <td headers="stat_0" class="gt_row gt_center">462 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">200 (43.3%)</td>
## <td headers="stat_2" class="gt_row gt_center">262 (56.7%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Unmarried</td>
## <td headers="stat_0" class="gt_row gt_center">347 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">172 (49.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">175 (50.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Residence (Urban/Rural)</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.422</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Rural</td>
## <td headers="stat_0" class="gt_row gt_center">64 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">33 (51.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">31 (48.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Urban</td>
## <td headers="stat_0" class="gt_row gt_center">745 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">339 (45.5%)</td>
## <td headers="stat_2" class="gt_row gt_center">406 (54.5%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Education level</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center"><0.001</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    None</td>
## <td headers="stat_0" class="gt_row gt_center">51 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">20 (39.2%)</td>
## <td headers="stat_2" class="gt_row gt_center">31 (60.8%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Primary</td>
## <td headers="stat_0" class="gt_row gt_center">260 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">89 (34.2%)</td>
## <td headers="stat_2" class="gt_row gt_center">171 (65.8%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Secondary</td>
## <td headers="stat_0" class="gt_row gt_center">395 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">191 (48.4%)</td>
## <td headers="stat_2" class="gt_row gt_center">204 (51.6%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Tertiary</td>
## <td headers="stat_0" class="gt_row gt_center">103 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">72 (69.9%)</td>
## <td headers="stat_2" class="gt_row gt_center">31 (30.1%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Occupation</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.021</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Employed</td>
## <td headers="stat_0" class="gt_row gt_center">564 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">257 (45.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">307 (54.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Student</td>
## <td headers="stat_0" class="gt_row gt_center">28 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">20 (71.4%)</td>
## <td headers="stat_2" class="gt_row gt_center">8 (28.6%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Unemployed</td>
## <td headers="stat_0" class="gt_row gt_center">217 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">95 (43.8%)</td>
## <td headers="stat_2" class="gt_row gt_center">122 (56.2%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Income category</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.008</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    &lt; 3000</td>
## <td headers="stat_0" class="gt_row gt_center">542 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">231 (42.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">311 (57.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    ≥ 3000</td>
## <td headers="stat_0" class="gt_row gt_center">267 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">141 (52.8%)</td>
## <td headers="stat_2" class="gt_row gt_center">126 (47.2%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##   </tbody>
##   <tfoot>
##     <tr class="gt_footnotes">
##       <td class="gt_footnote" colspan="5"><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span> <span class='gt_from_md'>n (%)</span></td>
##     </tr>
##     <tr class="gt_footnotes">
##       <td class="gt_footnote" colspan="5"><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>2</sup></span> <span class='gt_from_md'>Pearson’s Chi-squared test</span></td>
##     </tr>
##   </tfoot>
## </table>
## </div>
# Convert gtsummary object to flextable
ft <- as_flex_table(t1)

# Export to Word
doc <- read_docx() %>%
  body_add_flextable(ft)

print(doc, target = "table1.docx")

Ever heard of Mpox

This section creates a pie chart showing the proportion of respondents who have or have not heard of Mpox. It also saves the plot as a PNG for use in reports or presentations.

# Prepare data
heard_df <- as.data.frame(table(Mpox$heard_of_mpox))
colnames(heard_df) <- c("Response", "Count")

# Add percentage and formatted label with 1 decimal place
heard_df$Percent <- heard_df$Count / sum(heard_df$Count) * 100
heard_df$Label <- sprintf("%s\n%d (%.1f%%)", heard_df$Response, heard_df$Count, heard_df$Percent)

# Plot
library(ggplot2)
ggplot(heard_df, aes(x = "", y = Count, fill = Response)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y") +
  theme_void() +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
  labs(title = "") +
  scale_fill_manual(values = c("#F8766D", "#00BFC4"))

# Save the last plot as a PNG
ggsave("heard_of_mpox_pie.png", width = 6, height = 6, dpi = 300)

Sub analysis

I filtered the dataset to include only participants who reported having heard of Mpox, so that subsequent analyses focus on this subgroup with prior awareness.

sub_set <- Mpox %>% filter(heard_of_mpox == "Yes")
sub_set$Age_categories <- cut(
  sub_set$Age,
  breaks = c(18, 35, 55, 85),   # updated boundaries
  labels = c("18–34", "35–54", "55+"),  # new categories
  right = FALSE, include.lowest = TRUE)
sub_set$Income_category<- ifelse(
  sub_set$Monthly_income < 3000, 
  "< 3000", 
  "≥ 3000")

Source of Information on Mpox

I created a new variable, Sources_of_information_on_Mpox, to categorize where participants who had heard of Mpox obtained their information. I grouped responses into main channels such as ‘Health care worker’, ‘Radio/TV’, ‘Internet/social media’, ‘Family/friends’, and a combined ‘Print/community sources’ category for newspapers, posters, meetings, or other sources. This simplification allowed for easier interpretation and comparison of information sources.

sub_set <- sub_set %>%
  mutate(
    Sources_of_information_on_Mpox = case_when(
      mpox_info_health_worker == 1 ~ "Health care worker",
      mpox_info_radio_tv == 1 ~ "Radio/TV",
      mpox_info_internet == 1 ~ "Internet/social media",
      mpox_info_friends_family == 1 ~ "Family/friends",
      
      # Collapsed category
      mpox_info_newspaper == 1 ~ "Print/community sources",
      mpox_info_posters_meetings == 1 ~ "Print/community sources",
      mpox_info_other == 1 ~ "Print/community sources",
      
      TRUE ~ NA_character_
    )
  )

Analyze Sources of Mpox Information by Province

I corrected a minor typo in the Sources_of_information_on_Mpox variable and then organized the data to improve readability. I ordered provinces by the proportion of respondents and information sources by their frequency. Using this ordering, I created a horizontal stacked bar chart showing the distribution of Mpox information sources across provinces. This visualization allowed me to quickly identify which channels were most commonly used. Finally, I exported the chart and embedded it in a Word document for reporting purposes.

# Fix typo in source categories
sub_set <- sub_set %>%
  mutate(Sources_of_information_on_Mpox = case_when(
    Sources_of_information_on_Mpox == "Family/freinds" ~ "Family/friends",
    TRUE ~ Sources_of_information_on_Mpox
  ))

# Order provinces by overall respondent percentage
province_order <- sub_set %>%
  count(Province) %>%
  mutate(prop = n / sum(n)) %>%
  arrange(desc(prop)) %>%
  pull(Province)

sub_set$Province <- factor(sub_set$Province, levels = province_order)

# Order sources by frequency
source_order <- sub_set %>%
  count(Sources_of_information_on_Mpox) %>%
  arrange(desc(n)) %>%
  pull(Sources_of_information_on_Mpox)

# Plot chart (provinces only, no "Overall")
chart <- ggplot(sub_set, aes(y = Province, fill = Sources_of_information_on_Mpox)) + 
  geom_bar(position = "fill", color = "white") +
  scale_x_continuous(labels = scales::percent_format(accuracy = 1)) +
  scale_fill_manual(
    values = c(
      "Health care worker" = "#808000",
      "Radio/TV" = "#FF00FF",
      "Internet/social media" = "#008080",
      "Family/friends" = "#FFC0CB",
      "Others" = "#0000FF"
    ),
    limits = source_order
  ) +
  labs(
    x = "Proportion of respondents",
    y = "Province",
    fill = "Source category"
  ) +
  theme_classic(base_size = 14) +
  theme(
    legend.position = "right",
    legend.title = element_text(size = 12),
    legend.text = element_text(size = 11),
    axis.text.y = element_text(size = 12),
    axis.text.x = element_text(size = 11)
  )

# print
print(chart)

# Save the chart
ggsave("mpox_info_sources.png", plot = chart, width = 8, height = 6, dpi = 300)

# Create Word document and embed the image
doc <- read_docx() %>% 
  body_add_par("Figure: Sources of Mpox Information Among Participants", style = "heading 2") %>% 
  body_add_img(src = "mpox_info_sources.png", width = 6, height = 4)

print(doc, target = "Mpox_Info_Sources.docx")

Create Table of Mpox Information Sources by Province

I summarized the number and proportion of respondents reporting each source of Mpox information, stratified by province. Percentages were calculated for each source within a province and formatted alongside counts for clarity (e.g., n (x%)). Using pivot_wider, I transformed the data into a table format suitable for reporting. Finally, I created a flextable for a polished table layout and exported it to a Word document for inclusion in the report

# Step 1: Summarise counts and percentages
mpox_table <- sub_set %>%
  group_by(Province, Sources_of_information_on_Mpox) %>%
  summarise(n = n(), .groups = "drop") %>%
  group_by(Province) %>%
  mutate(
    total = sum(n),
    percent = round((n / total) * 100, 1),
    label = paste0(n, " (", percent, "%)")
  ) %>%
  select(Province, Sources_of_information_on_Mpox, label, total) %>%
  pivot_wider(
    names_from = Sources_of_information_on_Mpox,
    values_from = label,
    values_fill = list(label = "0 (0%)")   # <-- ensures zeros are shown
  ) %>%
  relocate(total, .after = last_col())     # put totals at the end

# Step 2: Create flextable for Word
ft <- flextable(mpox_table) %>%
  autofit() %>%
  set_header_labels(
    Province = "Province",
    `Health care worker` = "Health care worker",
    `Radio/TV` = "Radio/TV",
    `Internet/social media` = "Internet/social media",
    `Family/friends` = "Family/friends",
    Others = "Others",
    total = "Total (n)"
  )
ft

Province

Family/friends

Health care worker

Internet/social media

Print/community sources

Radio/TV

Total (n)

Lusaka

18 (11.9%)

45 (29.8%)

40 (26.5%)

10 (6.6%)

38 (25.2%)

151

Central

6 (8.5%)

35 (49.3%)

4 (5.6%)

7 (9.9%)

19 (26.8%)

71

Western

7 (10.4%)

39 (58.2%)

6 (9%)

1 (1.5%)

14 (20.9%)

67

Copperbelt

2 (3.4%)

30 (51.7%)

7 (12.1%)

7 (12.1%)

12 (20.7%)

58

Muchinga

0 (0%)

19 (76%)

0 (0%)

2 (8%)

4 (16%)

25

# Step 3: Save as Word document
doc <- read_docx() %>%
  body_add_par("Table: Sources of Mpox information by province", style = "heading 1") %>%
  body_add_flextable(ft)

print(doc, target = "mpox_info_sources_by_province.docx")

Summarize Knowledge of Mpox Transmission

I recoded the transmission variables so that 0 = No and 1 = Yes, ensuring consistency across the dataset. I then selected the key transmission modes—animal-to-human, person-to-person, sexual, droplet, and contaminated materials—and labeled them clearly. Using tbl_summary, I calculated counts and percentages of respondents aware of each mode of Mpox transmission. The resulting summary table was exported as a Word document for reporting purposes.

# Step 1: Recode correctly (0 = No, 1 = Yes)
sub_set <- sub_set %>%
  mutate(
    mpox_transmitted_animal    = factor(mpox_transmitted_animal,    levels = c(0,1), labels = c("No","Yes")),
    mpox_transmitted_person    = factor(mpox_transmitted_person,    levels = c(0,1), labels = c("No","Yes")),
    mpox_transmitted_sexual    = factor(mpox_transmitted_sexual,    levels = c(0,1), labels = c("No","Yes")),
    mpox_transmitted_droplets  = factor(mpox_transmitted_droplets,  levels = c(0,1), labels = c("No","Yes")),
    mpox_transmitted_materials = factor(mpox_transmitted_materials, levels = c(0,1), labels = c("No","Yes"))
  )

# Step 2: Define variable list and labels
transmission <- c(
  "mpox_transmitted_animal",
  "mpox_transmitted_person",
  "mpox_transmitted_sexual",
  "mpox_transmitted_droplets",
  "mpox_transmitted_materials"
)

transmission_labels <- list(
  mpox_transmitted_animal    = "Animal-to-human",
  mpox_transmitted_person    = "Person-to-person",
  mpox_transmitted_sexual    = "Sexual transmission",
  mpox_transmitted_droplets  = "Droplet transmission",
  mpox_transmitted_materials = "Contaminated materials"
)

# Step 3: Create summary table
kap_table <- sub_set %>%
  select(all_of(transmission)) %>%
  tbl_summary(
    type      = all_categorical() ~ "categorical",
    label     = transmission_labels,
    statistic = all_categorical() ~ "{n} ({p}%)",
    digits    = all_categorical() ~ c(0, 1),
    missing   = "no"   # ensures 0 (0%) is shown instead of blank
  )

# Step 4: Print inline in R Markdown
kap_table
Characteristic N = 3721
Animal-to-human
    No 183 (49.2%)
    Yes 189 (50.8%)
Person-to-person
    No 152 (40.9%)
    Yes 220 (59.1%)
Sexual transmission
    No 251 (67.5%)
    Yes 121 (32.5%)
Droplet transmission
    No 264 (71.0%)
    Yes 108 (29.0%)
Contaminated materials
    No 252 (67.7%)
    Yes 120 (32.3%)
1 n (%)
# Step 5: Export to Word (optional)
ft <- as_flex_table(kap_table)
doc <- read_docx() %>%
  body_add_par("Table: Knowledge of Mpox Transmission Modes", style = "heading 2") %>%
  body_add_flextable(ft)
print(doc, target = "Mpox_Transmission_Table.docx")

Define Transmission Variables and Labels

I created a vector transmission_vars containing the key Mpox transmission variables to streamline subsequent analysis. I also defined transmission_labels to assign clear, descriptive labels to each transmission mode (e.g., Animal-to-human, Person-to-person, Sexual transmission, Droplet transmission, Contaminated materials). This ensures that tables and plots are easily interpretable for stakeholders

transmission_vars <- c(
  "mpox_transmitted_animal",
  "mpox_transmitted_person",
  "mpox_transmitted_sexual",
  "mpox_transmitted_droplets",
  "mpox_transmitted_materials"
)

transmission_labels <- c(
  mpox_transmitted_animal = "Animal-to-human",
  mpox_transmitted_person = "Person-to-person",
  mpox_transmitted_sexual = "Sexual transmission",
  mpox_transmitted_droplets = "Droplet transmission",
  mpox_transmitted_materials = "Contaminated materials"
)

Prepare Data for Knowledge of Transmission Plot

I reshaped the Mpox transmission data into a long format suitable for plotting. For each transmission mode, I calculated the count and percentage of respondents reporting ‘Yes’ or ‘No’. I then created a variable label using our descriptive transmission labels and reordered them by the percentage of respondents answering ‘Yes’, so the plot will display the most recognized transmission modes first.

# Step 1: Build the full dataset
kap_plot_data <- sub_set %>%
  select(all_of(transmission_vars)) %>%
  pivot_longer(cols = everything(), names_to = "variable", values_to = "response") %>%
  group_by(variable, response) %>%
  summarise(n = n(), .groups = "drop") %>%
  group_by(variable) %>%
  mutate(percent = round(n / sum(n) * 100, 1)) %>%
  ungroup() %>%
  mutate(label = transmission_labels[variable])

# Step 2: Calculate Yes percentages for ordering
yes_order <- kap_plot_data %>%
  filter(response == "Yes") %>%
  group_by(label) %>%
  summarise(yes_percent = sum(percent), .groups = "drop")

# Step 3: Join back and reorder labels
kap_plot_data <- kap_plot_data %>%
  left_join(yes_order, by = "label") %>%
  mutate(label = fct_reorder(label, yes_percent, .desc = TRUE))

Visualize Knowledge of Mpox Transmission Modes

I created a horizontal stacked bar chart showing the proportion of respondents who answered ‘Yes’ or ‘No’ for each mode of Mpox transmission. The y-axis lists the transmission modes, ordered by the percentage of respondents who correctly recognized them. The bars are color-coded to distinguish ‘Yes’ from ‘No’, and percentages are displayed on the x-axis for clarity

ggplot(kap_plot_data, aes(x = percent, y = label, fill = response)) +
  geom_bar(stat = "identity", position = "stack", color = "white", width = 0.8) +
  scale_fill_manual(values = c("Yes" = "#1f77b4", "No" = "#ff7f0e")) +
  labs(
    title = "",
    x = "Percentage",
    y = "Modes of transmission",   # ← updated axis label
    fill = "Response"
  ) +
  scale_x_continuous(labels = function(x) paste0(x, "%")) +
  theme_classic(base_size = 14) +
  theme(
    plot.title   = element_text(face = "bold", hjust = 0.5),
    axis.text.y  = element_text(face = "bold"),
    legend.position = "right",
    panel.grid = element_blank()
  )

ggsave("mpox_transmission_chart.png", dpi = 300, width = 8, height = 5)

Summarize Knowledge of Mpox Signs and Symptoms

I recoded respondents’ answers for common Mpox symptoms into ‘Yes’ or ‘No’ categories, treating ‘Don’t know’ as ‘No’. Then, I created a summary table showing counts and percentages of respondents recognizing each symptom. This table helps identify which symptoms are well-known and which may require additional awareness efforts. Finally, I exported the table to Word for reporting.

# Define symptom variables (removed Mpox_resemble_chickenpox)
symptoms <- c("Fever", "Headache", "Swollen_lymph_nodes",
              "Skin_rash", "Back_pain", "Muscle_aches")

# Recode variables
sub_set <- sub_set %>%
  mutate(across(all_of(symptoms),
                ~ factor(ifelse(.x %in% c("Don't know", "No"), "No", "Yes"),
                         levels = c("No", "Yes"))))

# Create the summary table with a caption
symptoms_tbl <- sub_set %>%
  select(all_of(symptoms)) %>%
  tbl_summary(
    type = all_categorical() ~ "categorical",
    statistic = all_categorical() ~ "{n} ({p}%)",
    digits = all_categorical() ~ c(0, 1),
    label = list(
      Fever = "Fever",
      Headache = "Headache",
      Swollen_lymph_nodes = "Swollen lymph nodes",
      Skin_rash = "Skin rash/lesions",
      Back_pain = "Back pain",
      Muscle_aches = "Muscle aches"
    ),
    missing = "no"
  ) %>%
  modify_caption("**Knowledge of Mpox Signs and Symptoms**")

print(symptoms_tbl)
## <div id="jrvtmihlpo" style="padding-left:0px;padding-right:0px;padding-top:10px;padding-bottom:10px;overflow-x:auto;overflow-y:auto;width:auto;height:auto;">
##   <style>#jrvtmihlpo table {
##   font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
##   -webkit-font-smoothing: antialiased;
##   -moz-osx-font-smoothing: grayscale;
## }
## 
## #jrvtmihlpo thead, #jrvtmihlpo tbody, #jrvtmihlpo tfoot, #jrvtmihlpo tr, #jrvtmihlpo td, #jrvtmihlpo th {
##   border-style: none;
## }
## 
## #jrvtmihlpo p {
##   margin: 0;
##   padding: 0;
## }
## 
## #jrvtmihlpo .gt_table {
##   display: table;
##   border-collapse: collapse;
##   line-height: normal;
##   margin-left: auto;
##   margin-right: auto;
##   color: #333333;
##   font-size: 16px;
##   font-weight: normal;
##   font-style: normal;
##   background-color: #FFFFFF;
##   width: auto;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #A8A8A8;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #A8A8A8;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_caption {
##   padding-top: 4px;
##   padding-bottom: 4px;
## }
## 
## #jrvtmihlpo .gt_title {
##   color: #333333;
##   font-size: 125%;
##   font-weight: initial;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-color: #FFFFFF;
##   border-bottom-width: 0;
## }
## 
## #jrvtmihlpo .gt_subtitle {
##   color: #333333;
##   font-size: 85%;
##   font-weight: initial;
##   padding-top: 3px;
##   padding-bottom: 5px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-color: #FFFFFF;
##   border-top-width: 0;
## }
## 
## #jrvtmihlpo .gt_heading {
##   background-color: #FFFFFF;
##   text-align: center;
##   border-bottom-color: #FFFFFF;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_bottom_border {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_col_headings {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_col_heading {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 6px;
##   padding-left: 5px;
##   padding-right: 5px;
##   overflow-x: hidden;
## }
## 
## #jrvtmihlpo .gt_column_spanner_outer {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   padding-top: 0;
##   padding-bottom: 0;
##   padding-left: 4px;
##   padding-right: 4px;
## }
## 
## #jrvtmihlpo .gt_column_spanner_outer:first-child {
##   padding-left: 0;
## }
## 
## #jrvtmihlpo .gt_column_spanner_outer:last-child {
##   padding-right: 0;
## }
## 
## #jrvtmihlpo .gt_column_spanner {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 5px;
##   overflow-x: hidden;
##   display: inline-block;
##   width: 100%;
## }
## 
## #jrvtmihlpo .gt_spanner_row {
##   border-bottom-style: hidden;
## }
## 
## #jrvtmihlpo .gt_group_heading {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   text-align: left;
## }
## 
## #jrvtmihlpo .gt_empty_group_heading {
##   padding: 0.5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: middle;
## }
## 
## #jrvtmihlpo .gt_from_md > :first-child {
##   margin-top: 0;
## }
## 
## #jrvtmihlpo .gt_from_md > :last-child {
##   margin-bottom: 0;
## }
## 
## #jrvtmihlpo .gt_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   margin: 10px;
##   border-top-style: solid;
##   border-top-width: 1px;
##   border-top-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   overflow-x: hidden;
## }
## 
## #jrvtmihlpo .gt_stub {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jrvtmihlpo .gt_stub_row_group {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
##   vertical-align: top;
## }
## 
## #jrvtmihlpo .gt_row_group_first td {
##   border-top-width: 2px;
## }
## 
## #jrvtmihlpo .gt_row_group_first th {
##   border-top-width: 2px;
## }
## 
## #jrvtmihlpo .gt_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jrvtmihlpo .gt_first_summary_row {
##   border-top-style: solid;
##   border-top-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_first_summary_row.thick {
##   border-top-width: 2px;
## }
## 
## #jrvtmihlpo .gt_last_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_grand_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jrvtmihlpo .gt_first_grand_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-style: double;
##   border-top-width: 6px;
##   border-top-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_last_grand_summary_row_top {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: double;
##   border-bottom-width: 6px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_striped {
##   background-color: rgba(128, 128, 128, 0.05);
## }
## 
## #jrvtmihlpo .gt_table_body {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_footnotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_footnote {
##   margin: 0px;
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jrvtmihlpo .gt_sourcenotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #jrvtmihlpo .gt_sourcenote {
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jrvtmihlpo .gt_left {
##   text-align: left;
## }
## 
## #jrvtmihlpo .gt_center {
##   text-align: center;
## }
## 
## #jrvtmihlpo .gt_right {
##   text-align: right;
##   font-variant-numeric: tabular-nums;
## }
## 
## #jrvtmihlpo .gt_font_normal {
##   font-weight: normal;
## }
## 
## #jrvtmihlpo .gt_font_bold {
##   font-weight: bold;
## }
## 
## #jrvtmihlpo .gt_font_italic {
##   font-style: italic;
## }
## 
## #jrvtmihlpo .gt_super {
##   font-size: 65%;
## }
## 
## #jrvtmihlpo .gt_footnote_marks {
##   font-size: 75%;
##   vertical-align: 0.4em;
##   position: initial;
## }
## 
## #jrvtmihlpo .gt_asterisk {
##   font-size: 100%;
##   vertical-align: 0;
## }
## 
## #jrvtmihlpo .gt_indent_1 {
##   text-indent: 5px;
## }
## 
## #jrvtmihlpo .gt_indent_2 {
##   text-indent: 10px;
## }
## 
## #jrvtmihlpo .gt_indent_3 {
##   text-indent: 15px;
## }
## 
## #jrvtmihlpo .gt_indent_4 {
##   text-indent: 20px;
## }
## 
## #jrvtmihlpo .gt_indent_5 {
##   text-indent: 25px;
## }
## 
## #jrvtmihlpo .katex-display {
##   display: inline-flex !important;
##   margin-bottom: 0.75em !important;
## }
## 
## #jrvtmihlpo div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt-tr-group-header > div.rt-th-group:after {
##   height: 0px !important;
## }
## </style>
##   <table class="gt_table" data-quarto-disable-processing="false" data-quarto-bootstrap="false">
##   <caption><span class='gt_from_md'><strong>Knowledge of Mpox Signs and Symptoms</strong></span></caption>
##   <thead>
##     <tr class="gt_col_headings">
##       <th class="gt_col_heading gt_columns_bottom_border gt_left" rowspan="1" colspan="1" scope="col" id="label"><span class='gt_from_md'><strong>Characteristic</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="stat_0"><span class='gt_from_md'><strong>N = 372</strong></span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span></th>
##     </tr>
##   </thead>
##   <tbody class="gt_table_body">
##     <tr><td headers="label" class="gt_row gt_left">Fever</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No</td>
## <td headers="stat_0" class="gt_row gt_center">119 (32.0%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">253 (68.0%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Headache</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No</td>
## <td headers="stat_0" class="gt_row gt_center">147 (39.5%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">225 (60.5%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Swollen lymph nodes</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No</td>
## <td headers="stat_0" class="gt_row gt_center">195 (52.4%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">177 (47.6%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Skin rash/lesions</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No</td>
## <td headers="stat_0" class="gt_row gt_center">71 (19.1%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">301 (80.9%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Back pain</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No</td>
## <td headers="stat_0" class="gt_row gt_center">243 (65.3%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">129 (34.7%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Muscle aches</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No</td>
## <td headers="stat_0" class="gt_row gt_center">203 (54.6%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">169 (45.4%)</td></tr>
##   </tbody>
##   <tfoot>
##     <tr class="gt_footnotes">
##       <td class="gt_footnote" colspan="2"><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span> <span class='gt_from_md'>n (%)</span></td>
##     </tr>
##   </tfoot>
## </table>
## </div>
# Save to Word
doc <- read_docx() %>%
  body_add_par("Table 1. Knowledge of Mpox Signs and Symptoms", style = "heading 2") %>%
  body_add_flextable(value = as_flex_table(symptoms_tbl))

print(doc, target = "symptoms.docx")

Visualize Knowledge of Mpox Symptoms

I created a bar chart showing the percentage of respondents who correctly recognized each Mpox symptom. Responses of ‘No’ and ‘Don’t know’ were combined to simplify interpretation. The symptoms were ordered from most to least recognized based on the proportion of ‘Yes’ responses. This visual highlights which symptoms are widely known and where awareness campaigns may need to focus.

# Define the six symptoms
symptoms <- c("Fever", "Headache", "Swollen_lymph_nodes",
              "Skin_rash", "Back_pain", "Muscle_aches")

# Clean labels for plotting
symptom_labels <- c(
  Fever = "Fever",
  Headache = "Headache",
  Swollen_lymph_nodes = "Swollen lymph nodes",
  Skin_rash = "Skin rash/lesions",
  Back_pain = "Back pain",
  Muscle_aches = "Muscle aches"
)

# Recode Yes/No responses (combine No + Don't know)
sub_set <- sub_set %>%
  mutate(across(
    all_of(symptoms),
    ~ factor(
        ifelse(.x %in% c("Don't know", "No"), "No / Don't know", "Yes"),
        levels = c("No / Don't know", "Yes")
      )
  ))



# new and ordered by percentage of yes

symptom_plot_data <- sub_set %>%
  select(all_of(symptoms)) %>%
  pivot_longer(cols = everything(),
               names_to = "variable",
               values_to = "response") %>%
  group_by(variable, response) %>%
  summarise(n = n(), .groups = "drop") %>%
  group_by(variable) %>%
  mutate(percent = round(n / sum(n) * 100, 1)) %>%
  ungroup() %>%
  mutate(label = symptom_labels[variable]) %>%
  # calculate Yes percentage per symptom
  group_by(label) %>%
  mutate(yes_percent = ifelse(response == "Yes", percent, 0)) %>%
  summarise(yes_percent = sum(yes_percent), .groups = "drop") %>%
  right_join(
    sub_set %>%
      select(all_of(symptoms)) %>%
      pivot_longer(cols = everything(),
                   names_to = "variable",
                   values_to = "response") %>%
      group_by(variable, response) %>%
      summarise(n = n(), .groups = "drop") %>%
      group_by(variable) %>%
      mutate(percent = round(n / sum(n) * 100, 1)) %>%
      ungroup() %>%
      mutate(label = symptom_labels[variable]),
    by = "label"
  ) %>%
  mutate(label = fct_reorder(label, yes_percent, .desc = TRUE))


# Plot
ggplot(symptom_plot_data, aes(x = percent, y = label, fill = response)) +
  geom_bar(stat = "identity", position = "stack", color = "white") +
  scale_fill_manual(
    values = c("Yes" = "#1f77b4", "No / Don't know" = "#ff7f0e")
  ) +
  labs(
    title = "",
    x = "Percentage",
    y = NULL,
    fill = "Response"
  ) +
  scale_x_continuous(labels = function(x) paste0(x, "%")) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.y = element_text(face = "bold"),
    legend.position = "right",
    legend.justification = c(1, 1),
    panel.grid = element_blank(),
    axis.line = element_line(color = "black", size = 0.6)
  )
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

`

ggsave("mpox_symptoms_chart_selected.png", dpi = 300, width = 8, height = 5)

Summarize Knowledge on Mpox Prevention

I focused on prevention-related variables, including awareness of the Mpox vaccine, protective behaviors (e.g., handwashing, isolation), and knowledge of transmission risks. Responses of ‘No’ and ‘Don’t know’ were combined to simplify interpretation. I then created a summary table showing the counts and percentages of participants who correctly recognized each preventive measure. This highlights areas where community knowledge is strong versus where targeted education may be needed

# Define prevention-focused variables
prevention_vars <- c(
  "mpox_vaccine_available",
  "vax_mpox_protection",
  "mpox_seek_care",
  "mpox_isolate",
  "handwahsing_prevent",   # spelling check
  "avoiding_contact",
  "pregant_women",         # spelling check
  "mpox_severe_children",
  "mpox_spread_surfaces"
)

# Recode Yes/No responses
sub_set <- sub_set %>%
  mutate(across(all_of(prevention_vars),
                ~ factor(ifelse(.x %in% c("Don't know", "No"), "No / Don't know", "Yes"),
                         levels = c("No / Don't know", "Yes"))))

# Create the summary table
prevention_tbl <- sub_set %>%
  select(all_of(prevention_vars)) %>%
  tbl_summary(
    type = all_categorical() ~ "categorical",
    statistic = all_categorical() ~ "{n} ({p}%)",
    digits = all_categorical() ~ c(0, 1),
    label = list(
      mpox_vaccine_available = "Vaccine available for Mpox?",
      vax_mpox_protection    = "Vaccination protects against Mpox?",
      mpox_seek_care         = "Suspected Mpox: seek health care?",
      mpox_isolate           = "Suspected Mpox: isolate from others?",
      handwahsing_prevent    = "Handwashing/surface cleaning prevents Mpox?",
      avoiding_contact       = "Avoiding wild animals prevents Mpox?",
      pregant_women          = "Pregnant women can transmit Mpox to unborn child?",
      mpox_severe_children   = "Mpox is severe in children/immunocompromised?",
      mpox_spread_surfaces   = "Mpox spreads via contaminated surfaces?"
    ),
    missing = "no"
  ) %>%
  modify_caption("**Knowledge of Mpox Prevention**")

print(prevention_tbl)
## <div id="jmnfvfzfdn" style="padding-left:0px;padding-right:0px;padding-top:10px;padding-bottom:10px;overflow-x:auto;overflow-y:auto;width:auto;height:auto;">
##   <style>#jmnfvfzfdn table {
##   font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
##   -webkit-font-smoothing: antialiased;
##   -moz-osx-font-smoothing: grayscale;
## }
## 
## #jmnfvfzfdn thead, #jmnfvfzfdn tbody, #jmnfvfzfdn tfoot, #jmnfvfzfdn tr, #jmnfvfzfdn td, #jmnfvfzfdn th {
##   border-style: none;
## }
## 
## #jmnfvfzfdn p {
##   margin: 0;
##   padding: 0;
## }
## 
## #jmnfvfzfdn .gt_table {
##   display: table;
##   border-collapse: collapse;
##   line-height: normal;
##   margin-left: auto;
##   margin-right: auto;
##   color: #333333;
##   font-size: 16px;
##   font-weight: normal;
##   font-style: normal;
##   background-color: #FFFFFF;
##   width: auto;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #A8A8A8;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #A8A8A8;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_caption {
##   padding-top: 4px;
##   padding-bottom: 4px;
## }
## 
## #jmnfvfzfdn .gt_title {
##   color: #333333;
##   font-size: 125%;
##   font-weight: initial;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-color: #FFFFFF;
##   border-bottom-width: 0;
## }
## 
## #jmnfvfzfdn .gt_subtitle {
##   color: #333333;
##   font-size: 85%;
##   font-weight: initial;
##   padding-top: 3px;
##   padding-bottom: 5px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-color: #FFFFFF;
##   border-top-width: 0;
## }
## 
## #jmnfvfzfdn .gt_heading {
##   background-color: #FFFFFF;
##   text-align: center;
##   border-bottom-color: #FFFFFF;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_bottom_border {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_col_headings {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_col_heading {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 6px;
##   padding-left: 5px;
##   padding-right: 5px;
##   overflow-x: hidden;
## }
## 
## #jmnfvfzfdn .gt_column_spanner_outer {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   padding-top: 0;
##   padding-bottom: 0;
##   padding-left: 4px;
##   padding-right: 4px;
## }
## 
## #jmnfvfzfdn .gt_column_spanner_outer:first-child {
##   padding-left: 0;
## }
## 
## #jmnfvfzfdn .gt_column_spanner_outer:last-child {
##   padding-right: 0;
## }
## 
## #jmnfvfzfdn .gt_column_spanner {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 5px;
##   overflow-x: hidden;
##   display: inline-block;
##   width: 100%;
## }
## 
## #jmnfvfzfdn .gt_spanner_row {
##   border-bottom-style: hidden;
## }
## 
## #jmnfvfzfdn .gt_group_heading {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   text-align: left;
## }
## 
## #jmnfvfzfdn .gt_empty_group_heading {
##   padding: 0.5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: middle;
## }
## 
## #jmnfvfzfdn .gt_from_md > :first-child {
##   margin-top: 0;
## }
## 
## #jmnfvfzfdn .gt_from_md > :last-child {
##   margin-bottom: 0;
## }
## 
## #jmnfvfzfdn .gt_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   margin: 10px;
##   border-top-style: solid;
##   border-top-width: 1px;
##   border-top-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   overflow-x: hidden;
## }
## 
## #jmnfvfzfdn .gt_stub {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jmnfvfzfdn .gt_stub_row_group {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
##   vertical-align: top;
## }
## 
## #jmnfvfzfdn .gt_row_group_first td {
##   border-top-width: 2px;
## }
## 
## #jmnfvfzfdn .gt_row_group_first th {
##   border-top-width: 2px;
## }
## 
## #jmnfvfzfdn .gt_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jmnfvfzfdn .gt_first_summary_row {
##   border-top-style: solid;
##   border-top-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_first_summary_row.thick {
##   border-top-width: 2px;
## }
## 
## #jmnfvfzfdn .gt_last_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_grand_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jmnfvfzfdn .gt_first_grand_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-style: double;
##   border-top-width: 6px;
##   border-top-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_last_grand_summary_row_top {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: double;
##   border-bottom-width: 6px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_striped {
##   background-color: rgba(128, 128, 128, 0.05);
## }
## 
## #jmnfvfzfdn .gt_table_body {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_footnotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_footnote {
##   margin: 0px;
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jmnfvfzfdn .gt_sourcenotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #jmnfvfzfdn .gt_sourcenote {
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #jmnfvfzfdn .gt_left {
##   text-align: left;
## }
## 
## #jmnfvfzfdn .gt_center {
##   text-align: center;
## }
## 
## #jmnfvfzfdn .gt_right {
##   text-align: right;
##   font-variant-numeric: tabular-nums;
## }
## 
## #jmnfvfzfdn .gt_font_normal {
##   font-weight: normal;
## }
## 
## #jmnfvfzfdn .gt_font_bold {
##   font-weight: bold;
## }
## 
## #jmnfvfzfdn .gt_font_italic {
##   font-style: italic;
## }
## 
## #jmnfvfzfdn .gt_super {
##   font-size: 65%;
## }
## 
## #jmnfvfzfdn .gt_footnote_marks {
##   font-size: 75%;
##   vertical-align: 0.4em;
##   position: initial;
## }
## 
## #jmnfvfzfdn .gt_asterisk {
##   font-size: 100%;
##   vertical-align: 0;
## }
## 
## #jmnfvfzfdn .gt_indent_1 {
##   text-indent: 5px;
## }
## 
## #jmnfvfzfdn .gt_indent_2 {
##   text-indent: 10px;
## }
## 
## #jmnfvfzfdn .gt_indent_3 {
##   text-indent: 15px;
## }
## 
## #jmnfvfzfdn .gt_indent_4 {
##   text-indent: 20px;
## }
## 
## #jmnfvfzfdn .gt_indent_5 {
##   text-indent: 25px;
## }
## 
## #jmnfvfzfdn .katex-display {
##   display: inline-flex !important;
##   margin-bottom: 0.75em !important;
## }
## 
## #jmnfvfzfdn div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt-tr-group-header > div.rt-th-group:after {
##   height: 0px !important;
## }
## </style>
##   <table class="gt_table" data-quarto-disable-processing="false" data-quarto-bootstrap="false">
##   <caption><span class='gt_from_md'><strong>Knowledge of Mpox Prevention</strong></span></caption>
##   <thead>
##     <tr class="gt_col_headings">
##       <th class="gt_col_heading gt_columns_bottom_border gt_left" rowspan="1" colspan="1" scope="col" id="label"><span class='gt_from_md'><strong>Characteristic</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="stat_0"><span class='gt_from_md'><strong>N = 372</strong></span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span></th>
##     </tr>
##   </thead>
##   <tbody class="gt_table_body">
##     <tr><td headers="label" class="gt_row gt_left">Vaccine available for Mpox?</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No / Don't know</td>
## <td headers="stat_0" class="gt_row gt_center">210 (56.5%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">162 (43.5%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Vaccination protects against Mpox?</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No / Don't know</td>
## <td headers="stat_0" class="gt_row gt_center">127 (34.1%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">245 (65.9%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Suspected Mpox: seek health care?</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No / Don't know</td>
## <td headers="stat_0" class="gt_row gt_center">38 (10.2%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">334 (89.8%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Suspected Mpox: isolate from others?</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No / Don't know</td>
## <td headers="stat_0" class="gt_row gt_center">75 (20.2%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">297 (79.8%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Handwashing/surface cleaning prevents Mpox?</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No / Don't know</td>
## <td headers="stat_0" class="gt_row gt_center">110 (29.6%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">262 (70.4%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Avoiding wild animals prevents Mpox?</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No / Don't know</td>
## <td headers="stat_0" class="gt_row gt_center">108 (29.0%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">264 (71.0%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Pregnant women can transmit Mpox to unborn child?</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No / Don't know</td>
## <td headers="stat_0" class="gt_row gt_center">221 (59.4%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">151 (40.6%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Mpox is severe in children/immunocompromised?</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No / Don't know</td>
## <td headers="stat_0" class="gt_row gt_center">123 (33.1%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">249 (66.9%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">Mpox spreads via contaminated surfaces?</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    No / Don't know</td>
## <td headers="stat_0" class="gt_row gt_center">133 (35.8%)</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Yes</td>
## <td headers="stat_0" class="gt_row gt_center">239 (64.2%)</td></tr>
##   </tbody>
##   <tfoot>
##     <tr class="gt_footnotes">
##       <td class="gt_footnote" colspan="2"><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span> <span class='gt_from_md'>n (%)</span></td>
##     </tr>
##   </tfoot>
## </table>
## </div>
# Save to Word
doc <- read_docx() %>%
  body_add_par("Table 2. Knowledge of Mpox Prevention", style = "heading 2") %>%
  body_add_flextable(value = as_flex_table(prevention_tbl))

print(doc, target = "prevention.docx")

Visualizing Knowledge of Mpox Prevention

I created a stacked bar chart to show participants’ knowledge of Mpox prevention. First, I cleaned the variable labels for clarity. Then, I reshaped the dataset to calculate the percentage of respondents answering ‘Yes’ versus ‘No / Don’t know’ for each prevention measure. Finally, I ordered the prevention measures by the proportion of ‘Yes’ responses and plotted them as horizontal stacked bars with percentages labeled, allowing a clear visual comparison of awareness across different preventive actions

# Clean labels for plotting
prevention_labels <- c(
  mpox_vaccine_available = "Vaccine available for Mpox?",
  vax_mpox_protection    = "Vaccination protects against Mpox?",
  mpox_seek_care         = "Suspected Mpox: seek health care?",
  mpox_isolate           = "Suspected Mpox: isolate from others?",
  handwahsing_prevent    = "Handwashing/surface cleaning prevents Mpox?",
  avoiding_contact       = "Avoiding wild animals prevents Mpox?",
  pregant_women          = "Pregnant women can transmit Mpox to unborn child?",
  mpox_severe_children   = "Mpox is severe in children/immunocompromised?",
  mpox_spread_surfaces   = "Mpox spreads via contaminated surfaces?"
)

# Build dataset
prevention_plot_data <- sub_set %>%
  select(all_of(prevention_vars)) %>%
  pivot_longer(cols = everything(),
               names_to = "variable",
               values_to = "response") %>%
  group_by(variable, response) %>%
  summarise(n = n(), .groups = "drop") %>%
  group_by(variable) %>%
  mutate(percent = round(n / sum(n) * 100, 1)) %>%
  ungroup() %>%
  mutate(label = prevention_labels[variable]) %>%
  # calculate Yes percentage per variable
  group_by(label) %>%
  mutate(yes_percent = ifelse(response == "Yes", percent, 0)) %>%
  summarise(yes_percent = sum(yes_percent), .groups = "drop") %>%
  right_join(
    sub_set %>%
      select(all_of(prevention_vars)) %>%
      pivot_longer(cols = everything(),
                   names_to = "variable",
                   values_to = "response") %>%
      group_by(variable, response) %>%
      summarise(n = n(), .groups = "drop") %>%
      group_by(variable) %>%
      mutate(percent = round(n / sum(n) * 100, 1)) %>%
      ungroup() %>%
      mutate(label = prevention_labels[variable]),
    by = "label"
  ) %>%
  mutate(label = fct_reorder(label, yes_percent, .desc = TRUE))

# Plot stacked bars
ggplot(prevention_plot_data, aes(x = percent, y = label, fill = response)) +
  geom_bar(stat = "identity", position = "stack", color = "white") +
  geom_text(aes(label = paste0(percent, "%")),
            position = position_stack(vjust = 0.5),
            color = "white", size = 4, fontface = "bold") +
  scale_fill_manual(values = c("Yes" = "#1f77b4", "No / Don't know" = "#ff7f0e")) +
  labs(x = "Percentage", y = NULL, fill = "Response") +
  scale_x_continuous(labels = function(x) paste0(x, "%")) +
  theme_minimal(base_size = 14) +
  theme(axis.text.y = element_text(face = "bold"),
        legend.position = "right",
        panel.grid = element_blank(),
        axis.line = element_line(color = "black", size = 0.6))

# Save prevention chart to file
ggsave("prevention_chart.png",
       width = 8, height = 6, dpi = 300)   # high resolution for manuscripts

Calculating Overall Knowledge of Mpox

I combined all knowledge-related variables—including symptoms, transmission, and prevention—into a single dataset. Responses were recoded to 0/1 (No = 0, Yes = 1), and a total knowledge score was calculated for each participant. Participants scoring ≥80% of the total possible points were classified as having ‘Good knowledge,’ and others as ‘Poor knowledge.’ I summarized the overall knowledge with counts and percentages, then visualized it as a bar chart showing the proportion of participants with good versus poor knowledge, with labels for clarity.

# --- Step 1: Combine all knowledge variables ---
knowledge_vars <- c(symptoms, transmission, prevention_vars)

# --- Step 2: Recode responses into 0/1 ---
sub_set <- sub_set %>%
  mutate(across(all_of(knowledge_vars),
                ~ ifelse(. == "Yes", 1, 0)))

# --- Step 3: Calculate total score per participant ---
sub_set <- sub_set %>%
  rowwise() %>%
  mutate(total_score = sum(c_across(all_of(knowledge_vars)), na.rm = TRUE)) %>%
  ungroup()

# --- Step 4: Classify knowledge level (≥80% = Good knowledge) ---
sub_set <- sub_set %>%
  mutate(knowledge_level = ifelse(total_score >= 16, "Good knowledge", "Poor knowledge"))

# --- Step 5: Summarize overall knowledge with numerators + percentages ---
overall_knowledge <- sub_set %>%
  count(knowledge_level) %>%
  mutate(percent = round(n / sum(n) * 100, 1),
         label = paste0(n, " (", percent, "%)"))

print(overall_knowledge)
## # A tibble: 2 × 4
##   knowledge_level     n percent label      
##   <chr>           <int>   <dbl> <chr>      
## 1 Good knowledge     95    25.5 95 (25.5%) 
## 2 Poor knowledge    277    74.5 277 (74.5%)
# --- Step 6: Plot bar chart with labels ---
ggplot(overall_knowledge, aes(x = knowledge_level, y = percent, fill = knowledge_level)) +
  geom_bar(stat = "identity", width = 0.6, color = "white") +
  geom_text(aes(label = label), vjust = -0.5, size = 5, fontface = "bold") +
  scale_fill_manual(values = c("Good knowledge" = "#1f77b4", "Poor knowledge" = "#ff7f0e")) +
  labs(
    title = "",
    x = NULL,
    y = "Percentage of participants"
  ) +
  scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.1))) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.x = element_text(face = "bold"),
    legend.position = "none",
    panel.grid = element_blank(),
    axis.line = element_line(color = "black", size = 0.6)
  )

chart without percentage labels

ggplot(overall_knowledge, aes(x = knowledge_level, y = percent, fill = knowledge_level)) +
  geom_bar(stat = "identity", width = 0.6, color = "white") +
  scale_fill_manual(values = c("Good knowledge" = "#1f77b4", "Poor knowledge" = "#ff7f0e")) +
  labs(
    title = "",
    x = NULL,
    y = "Percentage of participants"
  ) +
  scale_y_continuous(labels = function(x) paste0(x, "%"), 
                     expand = expansion(mult = c(0, 0.1))) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.x = element_text(face = "bold"),
    legend.position = "none",
    panel.grid = element_blank(),
    axis.line = element_line(color = "black", size = 0.6)
  )

# Pie chart of overall knowledge (no labels)
ggplot(overall_knowledge, aes(x = "", y = percent, fill = knowledge_level)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  scale_fill_manual(values = c("Good knowledge" = "#1f77b4",
                               "Poor knowledge" = "#ff7f0e")) +
  labs(title = "",
       x = NULL, y = NULL, fill = "Knowledge Level") +
  theme_void(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.position = "right"
  )

# Save the overall knowledge chart with labels
ggsave("overall_knowledge_chart.png",
       width = 8, height = 6, dpi = 300)
# Save the overall knowledge chart with labels
ggsave("overall_knowledge_pie_chart.png",
       width = 8, height = 6, dpi = 300)

creating a column for the outcome

# Create binary variable for regression
sub_set <- sub_set %>%
  mutate(knowledge_binary = ifelse(knowledge_level == "Good knowledge", 1, 0))

# Check distribution
table(sub_set$knowledge_binary)
## 
##   0   1 
## 277  95

Stratified Summary of Participant Characteristics by Knowledge Level

I generated a stratified summary table showing participant demographic characteristics (Province, Age group, Sex, Marital status, Residence, Education level, Occupation, and Income category) by knowledge level (‘Good knowledge’ vs. ‘Poor knowledge’). Counts and row percentages were displayed, with chi-square tests for association and p-values formatted to three decimal places. Labels were bolded, headers clarified, and the resulting table was converted to a Word-friendly flextable for reporting

# Step 2: Build stratified table (categorical only)
t2 <- sub_set %>% 
  select(knowledge_level, Province, Age_categories, Sex, Marital_status, Residence, Education_level, Occupation, Income_category) %>% 
  tbl_summary(
    by = knowledge_level,
    percent = "row",
    missing_text = "Missing",
    label = list(
      Province ~ "Province",
      Age_categories ~ "Age group",
      Sex ~ "Sex",
      Marital_status ~ "Marital status",
      Residence ~ "Residence (Urban/Rural)",
      Education_level ~ "Education level",
      Occupation ~ "Occupation",
      Income_category ~ "Income category"
    ),
    digits = list(all_categorical() ~ c(0, 1)) # format counts to 0 decimal points and percentages to 1 decimal point
  ) %>% 
  add_overall(last = FALSE) %>% 
  add_p(
    test = list(all_categorical() ~ "chisq.test"),
    pvalue_fun = function(x) style_pvalue(x, digits = 3)
  ) %>% 
  bold_labels() %>% 
  modify_header(label ~ "**Population Characteristics**") %>% 
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Heard of Mpox**")

print(t2)
## <div id="fkfrmvzsry" style="padding-left:0px;padding-right:0px;padding-top:10px;padding-bottom:10px;overflow-x:auto;overflow-y:auto;width:auto;height:auto;">
##   <style>#fkfrmvzsry table {
##   font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
##   -webkit-font-smoothing: antialiased;
##   -moz-osx-font-smoothing: grayscale;
## }
## 
## #fkfrmvzsry thead, #fkfrmvzsry tbody, #fkfrmvzsry tfoot, #fkfrmvzsry tr, #fkfrmvzsry td, #fkfrmvzsry th {
##   border-style: none;
## }
## 
## #fkfrmvzsry p {
##   margin: 0;
##   padding: 0;
## }
## 
## #fkfrmvzsry .gt_table {
##   display: table;
##   border-collapse: collapse;
##   line-height: normal;
##   margin-left: auto;
##   margin-right: auto;
##   color: #333333;
##   font-size: 16px;
##   font-weight: normal;
##   font-style: normal;
##   background-color: #FFFFFF;
##   width: auto;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #A8A8A8;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #A8A8A8;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_caption {
##   padding-top: 4px;
##   padding-bottom: 4px;
## }
## 
## #fkfrmvzsry .gt_title {
##   color: #333333;
##   font-size: 125%;
##   font-weight: initial;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-color: #FFFFFF;
##   border-bottom-width: 0;
## }
## 
## #fkfrmvzsry .gt_subtitle {
##   color: #333333;
##   font-size: 85%;
##   font-weight: initial;
##   padding-top: 3px;
##   padding-bottom: 5px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-color: #FFFFFF;
##   border-top-width: 0;
## }
## 
## #fkfrmvzsry .gt_heading {
##   background-color: #FFFFFF;
##   text-align: center;
##   border-bottom-color: #FFFFFF;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_bottom_border {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_col_headings {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_col_heading {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 6px;
##   padding-left: 5px;
##   padding-right: 5px;
##   overflow-x: hidden;
## }
## 
## #fkfrmvzsry .gt_column_spanner_outer {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   padding-top: 0;
##   padding-bottom: 0;
##   padding-left: 4px;
##   padding-right: 4px;
## }
## 
## #fkfrmvzsry .gt_column_spanner_outer:first-child {
##   padding-left: 0;
## }
## 
## #fkfrmvzsry .gt_column_spanner_outer:last-child {
##   padding-right: 0;
## }
## 
## #fkfrmvzsry .gt_column_spanner {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 5px;
##   overflow-x: hidden;
##   display: inline-block;
##   width: 100%;
## }
## 
## #fkfrmvzsry .gt_spanner_row {
##   border-bottom-style: hidden;
## }
## 
## #fkfrmvzsry .gt_group_heading {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   text-align: left;
## }
## 
## #fkfrmvzsry .gt_empty_group_heading {
##   padding: 0.5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: middle;
## }
## 
## #fkfrmvzsry .gt_from_md > :first-child {
##   margin-top: 0;
## }
## 
## #fkfrmvzsry .gt_from_md > :last-child {
##   margin-bottom: 0;
## }
## 
## #fkfrmvzsry .gt_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   margin: 10px;
##   border-top-style: solid;
##   border-top-width: 1px;
##   border-top-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   overflow-x: hidden;
## }
## 
## #fkfrmvzsry .gt_stub {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #fkfrmvzsry .gt_stub_row_group {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
##   vertical-align: top;
## }
## 
## #fkfrmvzsry .gt_row_group_first td {
##   border-top-width: 2px;
## }
## 
## #fkfrmvzsry .gt_row_group_first th {
##   border-top-width: 2px;
## }
## 
## #fkfrmvzsry .gt_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #fkfrmvzsry .gt_first_summary_row {
##   border-top-style: solid;
##   border-top-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_first_summary_row.thick {
##   border-top-width: 2px;
## }
## 
## #fkfrmvzsry .gt_last_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_grand_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #fkfrmvzsry .gt_first_grand_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-style: double;
##   border-top-width: 6px;
##   border-top-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_last_grand_summary_row_top {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: double;
##   border-bottom-width: 6px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_striped {
##   background-color: rgba(128, 128, 128, 0.05);
## }
## 
## #fkfrmvzsry .gt_table_body {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_footnotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_footnote {
##   margin: 0px;
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #fkfrmvzsry .gt_sourcenotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #fkfrmvzsry .gt_sourcenote {
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #fkfrmvzsry .gt_left {
##   text-align: left;
## }
## 
## #fkfrmvzsry .gt_center {
##   text-align: center;
## }
## 
## #fkfrmvzsry .gt_right {
##   text-align: right;
##   font-variant-numeric: tabular-nums;
## }
## 
## #fkfrmvzsry .gt_font_normal {
##   font-weight: normal;
## }
## 
## #fkfrmvzsry .gt_font_bold {
##   font-weight: bold;
## }
## 
## #fkfrmvzsry .gt_font_italic {
##   font-style: italic;
## }
## 
## #fkfrmvzsry .gt_super {
##   font-size: 65%;
## }
## 
## #fkfrmvzsry .gt_footnote_marks {
##   font-size: 75%;
##   vertical-align: 0.4em;
##   position: initial;
## }
## 
## #fkfrmvzsry .gt_asterisk {
##   font-size: 100%;
##   vertical-align: 0;
## }
## 
## #fkfrmvzsry .gt_indent_1 {
##   text-indent: 5px;
## }
## 
## #fkfrmvzsry .gt_indent_2 {
##   text-indent: 10px;
## }
## 
## #fkfrmvzsry .gt_indent_3 {
##   text-indent: 15px;
## }
## 
## #fkfrmvzsry .gt_indent_4 {
##   text-indent: 20px;
## }
## 
## #fkfrmvzsry .gt_indent_5 {
##   text-indent: 25px;
## }
## 
## #fkfrmvzsry .katex-display {
##   display: inline-flex !important;
##   margin-bottom: 0.75em !important;
## }
## 
## #fkfrmvzsry div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt-tr-group-header > div.rt-th-group:after {
##   height: 0px !important;
## }
## </style>
##   <table class="gt_table" data-quarto-disable-processing="false" data-quarto-bootstrap="false">
##   <thead>
##     <tr class="gt_col_headings gt_spanner_row">
##       <th class="gt_col_heading gt_columns_bottom_border gt_left" rowspan="2" colspan="1" scope="col" id="label"><span class='gt_from_md'><strong>Population Characteristics</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="2" colspan="1" scope="col" id="stat_0"><span class='gt_from_md'><strong>Overall</strong><br />
## N = 372</span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span></th>
##       <th class="gt_center gt_columns_top_border gt_column_spanner_outer" rowspan="1" colspan="2" scope="colgroup" id="level 1; stat_1">
##         <div class="gt_column_spanner"><span class='gt_from_md'><strong>Heard of Mpox</strong></span></div>
##       </th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="2" colspan="1" scope="col" id="p.value"><span class='gt_from_md'><strong>p-value</strong></span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>2</sup></span></th>
##     </tr>
##     <tr class="gt_col_headings">
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="stat_1"><span class='gt_from_md'><strong>Good knowledge</strong><br />
## N = 95</span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="stat_2"><span class='gt_from_md'><strong>Poor knowledge</strong><br />
## N = 277</span><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span></th>
##     </tr>
##   </thead>
##   <tbody class="gt_table_body">
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Province</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center"><0.001</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Lusaka</td>
## <td headers="stat_0" class="gt_row gt_center">151 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">22 (14.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">129 (85.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Central</td>
## <td headers="stat_0" class="gt_row gt_center">71 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">13 (18.3%)</td>
## <td headers="stat_2" class="gt_row gt_center">58 (81.7%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Western</td>
## <td headers="stat_0" class="gt_row gt_center">67 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">45 (67.2%)</td>
## <td headers="stat_2" class="gt_row gt_center">22 (32.8%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Copperbelt</td>
## <td headers="stat_0" class="gt_row gt_center">58 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">9 (15.5%)</td>
## <td headers="stat_2" class="gt_row gt_center">49 (84.5%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Muchinga</td>
## <td headers="stat_0" class="gt_row gt_center">25 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">6 (24.0%)</td>
## <td headers="stat_2" class="gt_row gt_center">19 (76.0%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Age group</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.107</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    18–34</td>
## <td headers="stat_0" class="gt_row gt_center">181 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">45 (24.9%)</td>
## <td headers="stat_2" class="gt_row gt_center">136 (75.1%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    35–54</td>
## <td headers="stat_0" class="gt_row gt_center">139 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">42 (30.2%)</td>
## <td headers="stat_2" class="gt_row gt_center">97 (69.8%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    55+</td>
## <td headers="stat_0" class="gt_row gt_center">52 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">8 (15.4%)</td>
## <td headers="stat_2" class="gt_row gt_center">44 (84.6%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Sex</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.662</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Female</td>
## <td headers="stat_0" class="gt_row gt_center">236 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">58 (24.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">178 (75.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Male</td>
## <td headers="stat_0" class="gt_row gt_center">136 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">37 (27.2%)</td>
## <td headers="stat_2" class="gt_row gt_center">99 (72.8%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Marital status</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.117</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Married</td>
## <td headers="stat_0" class="gt_row gt_center">200 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">44 (22.0%)</td>
## <td headers="stat_2" class="gt_row gt_center">156 (78.0%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Unmarried</td>
## <td headers="stat_0" class="gt_row gt_center">172 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">51 (29.7%)</td>
## <td headers="stat_2" class="gt_row gt_center">121 (70.3%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Residence (Urban/Rural)</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.698</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Rural</td>
## <td headers="stat_0" class="gt_row gt_center">33 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">7 (21.2%)</td>
## <td headers="stat_2" class="gt_row gt_center">26 (78.8%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Urban</td>
## <td headers="stat_0" class="gt_row gt_center">339 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">88 (26.0%)</td>
## <td headers="stat_2" class="gt_row gt_center">251 (74.0%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Education level</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.945</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    None</td>
## <td headers="stat_0" class="gt_row gt_center">20 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">4 (20.0%)</td>
## <td headers="stat_2" class="gt_row gt_center">16 (80.0%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Primary</td>
## <td headers="stat_0" class="gt_row gt_center">89 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">23 (25.8%)</td>
## <td headers="stat_2" class="gt_row gt_center">66 (74.2%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Secondary</td>
## <td headers="stat_0" class="gt_row gt_center">191 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">50 (26.2%)</td>
## <td headers="stat_2" class="gt_row gt_center">141 (73.8%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Tertiary</td>
## <td headers="stat_0" class="gt_row gt_center">72 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">18 (25.0%)</td>
## <td headers="stat_2" class="gt_row gt_center">54 (75.0%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Occupation</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center"><0.001</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Employed</td>
## <td headers="stat_0" class="gt_row gt_center">257 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">80 (31.1%)</td>
## <td headers="stat_2" class="gt_row gt_center">177 (68.9%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Student</td>
## <td headers="stat_0" class="gt_row gt_center">20 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">4 (20.0%)</td>
## <td headers="stat_2" class="gt_row gt_center">16 (80.0%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Unemployed</td>
## <td headers="stat_0" class="gt_row gt_center">95 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">11 (11.6%)</td>
## <td headers="stat_2" class="gt_row gt_center">84 (88.4%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Income category</td>
## <td headers="stat_0" class="gt_row gt_center"><br /></td>
## <td headers="stat_1" class="gt_row gt_center"><br /></td>
## <td headers="stat_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value" class="gt_row gt_center">0.005</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    &lt; 3000</td>
## <td headers="stat_0" class="gt_row gt_center">231 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">47 (20.3%)</td>
## <td headers="stat_2" class="gt_row gt_center">184 (79.7%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    ≥ 3000</td>
## <td headers="stat_0" class="gt_row gt_center">141 (100.0%)</td>
## <td headers="stat_1" class="gt_row gt_center">48 (34.0%)</td>
## <td headers="stat_2" class="gt_row gt_center">93 (66.0%)</td>
## <td headers="p.value" class="gt_row gt_center"><br /></td></tr>
##   </tbody>
##   <tfoot>
##     <tr class="gt_footnotes">
##       <td class="gt_footnote" colspan="5"><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>1</sup></span> <span class='gt_from_md'>n (%)</span></td>
##     </tr>
##     <tr class="gt_footnotes">
##       <td class="gt_footnote" colspan="5"><span class="gt_footnote_marks" style="white-space:nowrap;font-style:italic;font-weight:normal;line-height:0;"><sup>2</sup></span> <span class='gt_from_md'>Pearson’s Chi-squared test</span></td>
##     </tr>
##   </tfoot>
## </table>
## </div>
# Convert gtsummary object to flextable
ft <- as_flex_table(t2)

# Export to Word
doc <- read_docx() %>%
  body_add_flextable(ft)

print(doc, target = "table1.docx")

merging the outputs

# Multivariable model
mv_model <- glm(
  knowledge_binary ~ Province + Age_categories + Sex + Marital_status + Residence +Education_level  + Occupation + Income_category+Sources_of_information_on_Mpox,
  data = sub_set,
  family = binomial
) %>%
  tbl_regression(
    exponentiate = TRUE,
    pvalue_fun = ~ style_pvalue(.x, digits = 3)
  ) %>%
  bold_p(t = 0.05)

# Merge univariable and multivariable models
merged_table <- tbl_merge(
  tbls = list(uv_model, mv_model),
  tab_spanner = c("**Crude Odds Ratio**", "**Adjusted Odds Ratio**")
)

print(merged_table)
## <div id="rrxxgtanjy" style="padding-left:0px;padding-right:0px;padding-top:10px;padding-bottom:10px;overflow-x:auto;overflow-y:auto;width:auto;height:auto;">
##   <style>#rrxxgtanjy table {
##   font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
##   -webkit-font-smoothing: antialiased;
##   -moz-osx-font-smoothing: grayscale;
## }
## 
## #rrxxgtanjy thead, #rrxxgtanjy tbody, #rrxxgtanjy tfoot, #rrxxgtanjy tr, #rrxxgtanjy td, #rrxxgtanjy th {
##   border-style: none;
## }
## 
## #rrxxgtanjy p {
##   margin: 0;
##   padding: 0;
## }
## 
## #rrxxgtanjy .gt_table {
##   display: table;
##   border-collapse: collapse;
##   line-height: normal;
##   margin-left: auto;
##   margin-right: auto;
##   color: #333333;
##   font-size: 16px;
##   font-weight: normal;
##   font-style: normal;
##   background-color: #FFFFFF;
##   width: auto;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #A8A8A8;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #A8A8A8;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_caption {
##   padding-top: 4px;
##   padding-bottom: 4px;
## }
## 
## #rrxxgtanjy .gt_title {
##   color: #333333;
##   font-size: 125%;
##   font-weight: initial;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-color: #FFFFFF;
##   border-bottom-width: 0;
## }
## 
## #rrxxgtanjy .gt_subtitle {
##   color: #333333;
##   font-size: 85%;
##   font-weight: initial;
##   padding-top: 3px;
##   padding-bottom: 5px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-color: #FFFFFF;
##   border-top-width: 0;
## }
## 
## #rrxxgtanjy .gt_heading {
##   background-color: #FFFFFF;
##   text-align: center;
##   border-bottom-color: #FFFFFF;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_bottom_border {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_col_headings {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_col_heading {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 6px;
##   padding-left: 5px;
##   padding-right: 5px;
##   overflow-x: hidden;
## }
## 
## #rrxxgtanjy .gt_column_spanner_outer {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: normal;
##   text-transform: inherit;
##   padding-top: 0;
##   padding-bottom: 0;
##   padding-left: 4px;
##   padding-right: 4px;
## }
## 
## #rrxxgtanjy .gt_column_spanner_outer:first-child {
##   padding-left: 0;
## }
## 
## #rrxxgtanjy .gt_column_spanner_outer:last-child {
##   padding-right: 0;
## }
## 
## #rrxxgtanjy .gt_column_spanner {
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: bottom;
##   padding-top: 5px;
##   padding-bottom: 5px;
##   overflow-x: hidden;
##   display: inline-block;
##   width: 100%;
## }
## 
## #rrxxgtanjy .gt_spanner_row {
##   border-bottom-style: hidden;
## }
## 
## #rrxxgtanjy .gt_group_heading {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   text-align: left;
## }
## 
## #rrxxgtanjy .gt_empty_group_heading {
##   padding: 0.5px;
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   vertical-align: middle;
## }
## 
## #rrxxgtanjy .gt_from_md > :first-child {
##   margin-top: 0;
## }
## 
## #rrxxgtanjy .gt_from_md > :last-child {
##   margin-bottom: 0;
## }
## 
## #rrxxgtanjy .gt_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   margin: 10px;
##   border-top-style: solid;
##   border-top-width: 1px;
##   border-top-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 1px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 1px;
##   border-right-color: #D3D3D3;
##   vertical-align: middle;
##   overflow-x: hidden;
## }
## 
## #rrxxgtanjy .gt_stub {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #rrxxgtanjy .gt_stub_row_group {
##   color: #333333;
##   background-color: #FFFFFF;
##   font-size: 100%;
##   font-weight: initial;
##   text-transform: inherit;
##   border-right-style: solid;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
##   padding-left: 5px;
##   padding-right: 5px;
##   vertical-align: top;
## }
## 
## #rrxxgtanjy .gt_row_group_first td {
##   border-top-width: 2px;
## }
## 
## #rrxxgtanjy .gt_row_group_first th {
##   border-top-width: 2px;
## }
## 
## #rrxxgtanjy .gt_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #rrxxgtanjy .gt_first_summary_row {
##   border-top-style: solid;
##   border-top-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_first_summary_row.thick {
##   border-top-width: 2px;
## }
## 
## #rrxxgtanjy .gt_last_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_grand_summary_row {
##   color: #333333;
##   background-color: #FFFFFF;
##   text-transform: inherit;
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #rrxxgtanjy .gt_first_grand_summary_row {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-top-style: double;
##   border-top-width: 6px;
##   border-top-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_last_grand_summary_row_top {
##   padding-top: 8px;
##   padding-bottom: 8px;
##   padding-left: 5px;
##   padding-right: 5px;
##   border-bottom-style: double;
##   border-bottom-width: 6px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_striped {
##   background-color: rgba(128, 128, 128, 0.05);
## }
## 
## #rrxxgtanjy .gt_table_body {
##   border-top-style: solid;
##   border-top-width: 2px;
##   border-top-color: #D3D3D3;
##   border-bottom-style: solid;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_footnotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_footnote {
##   margin: 0px;
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #rrxxgtanjy .gt_sourcenotes {
##   color: #333333;
##   background-color: #FFFFFF;
##   border-bottom-style: none;
##   border-bottom-width: 2px;
##   border-bottom-color: #D3D3D3;
##   border-left-style: none;
##   border-left-width: 2px;
##   border-left-color: #D3D3D3;
##   border-right-style: none;
##   border-right-width: 2px;
##   border-right-color: #D3D3D3;
## }
## 
## #rrxxgtanjy .gt_sourcenote {
##   font-size: 90%;
##   padding-top: 4px;
##   padding-bottom: 4px;
##   padding-left: 5px;
##   padding-right: 5px;
## }
## 
## #rrxxgtanjy .gt_left {
##   text-align: left;
## }
## 
## #rrxxgtanjy .gt_center {
##   text-align: center;
## }
## 
## #rrxxgtanjy .gt_right {
##   text-align: right;
##   font-variant-numeric: tabular-nums;
## }
## 
## #rrxxgtanjy .gt_font_normal {
##   font-weight: normal;
## }
## 
## #rrxxgtanjy .gt_font_bold {
##   font-weight: bold;
## }
## 
## #rrxxgtanjy .gt_font_italic {
##   font-style: italic;
## }
## 
## #rrxxgtanjy .gt_super {
##   font-size: 65%;
## }
## 
## #rrxxgtanjy .gt_footnote_marks {
##   font-size: 75%;
##   vertical-align: 0.4em;
##   position: initial;
## }
## 
## #rrxxgtanjy .gt_asterisk {
##   font-size: 100%;
##   vertical-align: 0;
## }
## 
## #rrxxgtanjy .gt_indent_1 {
##   text-indent: 5px;
## }
## 
## #rrxxgtanjy .gt_indent_2 {
##   text-indent: 10px;
## }
## 
## #rrxxgtanjy .gt_indent_3 {
##   text-indent: 15px;
## }
## 
## #rrxxgtanjy .gt_indent_4 {
##   text-indent: 20px;
## }
## 
## #rrxxgtanjy .gt_indent_5 {
##   text-indent: 25px;
## }
## 
## #rrxxgtanjy .katex-display {
##   display: inline-flex !important;
##   margin-bottom: 0.75em !important;
## }
## 
## #rrxxgtanjy div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt-tr-group-header > div.rt-th-group:after {
##   height: 0px !important;
## }
## </style>
##   <table class="gt_table" data-quarto-disable-processing="false" data-quarto-bootstrap="false">
##   <thead>
##     <tr class="gt_col_headings gt_spanner_row">
##       <th class="gt_col_heading gt_columns_bottom_border gt_left" rowspan="2" colspan="1" scope="col" id="label"><span class='gt_from_md'><strong>Characteristic</strong></span></th>
##       <th class="gt_center gt_columns_top_border gt_column_spanner_outer" rowspan="1" colspan="4" scope="colgroup" id="level 1; stat_n_1">
##         <div class="gt_column_spanner"><span class='gt_from_md'><strong>Crude Odds Ratio</strong></span></div>
##       </th>
##       <th class="gt_center gt_columns_top_border gt_column_spanner_outer" rowspan="1" colspan="3" scope="colgroup" id="level 1; estimate_2">
##         <div class="gt_column_spanner"><span class='gt_from_md'><strong>Adjusted Odds Ratio</strong></span></div>
##       </th>
##     </tr>
##     <tr class="gt_col_headings">
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="stat_n_1"><span class='gt_from_md'><strong>N</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="estimate_1"><span class='gt_from_md'><strong>Odds Ratio</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="conf.low_1"><span class='gt_from_md'><strong>95% CI</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="p.value_1"><span class='gt_from_md'><strong>P-value</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="estimate_2"><span class='gt_from_md'><strong>OR</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="conf.low_2"><span class='gt_from_md'><strong>95% CI</strong></span></th>
##       <th class="gt_col_heading gt_columns_bottom_border gt_center" rowspan="1" colspan="1" scope="col" id="p.value_2"><span class='gt_from_md'><strong>p-value</strong></span></th>
##     </tr>
##   </thead>
##   <tbody class="gt_table_body">
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Province</td>
## <td headers="stat_n_1" class="gt_row gt_center">372</td>
## <td headers="estimate_1" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_1" class="gt_row gt_center"><br /></td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Lusaka</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">—</td>
## <td headers="conf.low_1" class="gt_row gt_center">—</td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center">—</td>
## <td headers="conf.low_2" class="gt_row gt_center">—</td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Central</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">1.31</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.61, 2.76</td>
## <td headers="p.value_1" class="gt_row gt_center">0.477</td>
## <td headers="estimate_2" class="gt_row gt_center">1.25</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.53, 2.90</td>
## <td headers="p.value_2" class="gt_row gt_center">0.609</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Western</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">12.0</td>
## <td headers="conf.low_1" class="gt_row gt_center">6.17, 24.2</td>
## <td headers="p.value_1" class="gt_row gt_center" style="font-weight: bold;"><0.001</td>
## <td headers="estimate_2" class="gt_row gt_center">13.5</td>
## <td headers="conf.low_2" class="gt_row gt_center">5.84, 33.2</td>
## <td headers="p.value_2" class="gt_row gt_center" style="font-weight: bold;"><0.001</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Copperbelt</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">1.08</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.44, 2.44</td>
## <td headers="p.value_1" class="gt_row gt_center">0.863</td>
## <td headers="estimate_2" class="gt_row gt_center">0.83</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.31, 2.05</td>
## <td headers="p.value_2" class="gt_row gt_center">0.689</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Muchinga</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">1.85</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.62, 4.95</td>
## <td headers="p.value_1" class="gt_row gt_center">0.238</td>
## <td headers="estimate_2" class="gt_row gt_center">1.45</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.37, 5.37</td>
## <td headers="p.value_2" class="gt_row gt_center">0.586</td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Age_categories</td>
## <td headers="stat_n_1" class="gt_row gt_center">372</td>
## <td headers="estimate_1" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_1" class="gt_row gt_center"><br /></td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    55+</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">—</td>
## <td headers="conf.low_1" class="gt_row gt_center">—</td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center">—</td>
## <td headers="conf.low_2" class="gt_row gt_center">—</td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    35–54</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">2.38</td>
## <td headers="conf.low_1" class="gt_row gt_center">1.08, 5.85</td>
## <td headers="p.value_1" class="gt_row gt_center" style="font-weight: bold;">0.042</td>
## <td headers="estimate_2" class="gt_row gt_center">3.25</td>
## <td headers="conf.low_2" class="gt_row gt_center">1.15, 10.2</td>
## <td headers="p.value_2" class="gt_row gt_center" style="font-weight: bold;">0.033</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    18–34</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">1.82</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.83, 4.43</td>
## <td headers="p.value_1" class="gt_row gt_center">0.155</td>
## <td headers="estimate_2" class="gt_row gt_center">1.95</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.70, 6.00</td>
## <td headers="p.value_2" class="gt_row gt_center">0.220</td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Sex</td>
## <td headers="stat_n_1" class="gt_row gt_center">372</td>
## <td headers="estimate_1" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_1" class="gt_row gt_center"><br /></td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Female</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">—</td>
## <td headers="conf.low_1" class="gt_row gt_center">—</td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center">—</td>
## <td headers="conf.low_2" class="gt_row gt_center">—</td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Male</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">1.15</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.71, 1.85</td>
## <td headers="p.value_1" class="gt_row gt_center">0.576</td>
## <td headers="estimate_2" class="gt_row gt_center">1.58</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.83, 2.99</td>
## <td headers="p.value_2" class="gt_row gt_center">0.161</td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Marital status</td>
## <td headers="stat_n_1" class="gt_row gt_center">372</td>
## <td headers="estimate_1" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_1" class="gt_row gt_center"><br /></td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Married</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">—</td>
## <td headers="conf.low_1" class="gt_row gt_center">—</td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center">—</td>
## <td headers="conf.low_2" class="gt_row gt_center">—</td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Unmarried</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">1.49</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.94, 2.39</td>
## <td headers="p.value_1" class="gt_row gt_center">0.092</td>
## <td headers="estimate_2" class="gt_row gt_center">1.53</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.80, 2.93</td>
## <td headers="p.value_2" class="gt_row gt_center">0.193</td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Residence</td>
## <td headers="stat_n_1" class="gt_row gt_center">372</td>
## <td headers="estimate_1" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_1" class="gt_row gt_center"><br /></td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Urban</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">—</td>
## <td headers="conf.low_1" class="gt_row gt_center">—</td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center">—</td>
## <td headers="conf.low_2" class="gt_row gt_center">—</td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Rural</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">0.77</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.30, 1.74</td>
## <td headers="p.value_1" class="gt_row gt_center">0.552</td>
## <td headers="estimate_2" class="gt_row gt_center">0.40</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.12, 1.19</td>
## <td headers="p.value_2" class="gt_row gt_center">0.111</td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Education level</td>
## <td headers="stat_n_1" class="gt_row gt_center">372</td>
## <td headers="estimate_1" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_1" class="gt_row gt_center"><br /></td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    None</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">—</td>
## <td headers="conf.low_1" class="gt_row gt_center">—</td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center">—</td>
## <td headers="conf.low_2" class="gt_row gt_center">—</td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Primary</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">1.39</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.45, 5.24</td>
## <td headers="p.value_1" class="gt_row gt_center">0.586</td>
## <td headers="estimate_2" class="gt_row gt_center">0.92</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.25, 3.97</td>
## <td headers="p.value_2" class="gt_row gt_center">0.903</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Secondary</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">1.42</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.49, 5.13</td>
## <td headers="p.value_1" class="gt_row gt_center">0.549</td>
## <td headers="estimate_2" class="gt_row gt_center">0.78</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.22, 3.28</td>
## <td headers="p.value_2" class="gt_row gt_center">0.716</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Tertiary</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">1.33</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.42, 5.11</td>
## <td headers="p.value_1" class="gt_row gt_center">0.644</td>
## <td headers="estimate_2" class="gt_row gt_center">0.85</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.21, 3.89</td>
## <td headers="p.value_2" class="gt_row gt_center">0.829</td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Occupation</td>
## <td headers="stat_n_1" class="gt_row gt_center">372</td>
## <td headers="estimate_1" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_1" class="gt_row gt_center"><br /></td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Employed</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">—</td>
## <td headers="conf.low_1" class="gt_row gt_center">—</td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center">—</td>
## <td headers="conf.low_2" class="gt_row gt_center">—</td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Student</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">0.55</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.15, 1.56</td>
## <td headers="p.value_1" class="gt_row gt_center">0.303</td>
## <td headers="estimate_2" class="gt_row gt_center">0.65</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.16, 2.29</td>
## <td headers="p.value_2" class="gt_row gt_center">0.522</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Unemployed</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">0.29</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.14, 0.55</td>
## <td headers="p.value_1" class="gt_row gt_center" style="font-weight: bold;"><0.001</td>
## <td headers="estimate_2" class="gt_row gt_center">0.42</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.18, 0.92</td>
## <td headers="p.value_2" class="gt_row gt_center" style="font-weight: bold;">0.038</td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Income_category</td>
## <td headers="stat_n_1" class="gt_row gt_center">372</td>
## <td headers="estimate_1" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_1" class="gt_row gt_center"><br /></td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    &lt; 3000</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">—</td>
## <td headers="conf.low_1" class="gt_row gt_center">—</td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center">—</td>
## <td headers="conf.low_2" class="gt_row gt_center">—</td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    ≥ 3000</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">2.02</td>
## <td headers="conf.low_1" class="gt_row gt_center">1.26, 3.25</td>
## <td headers="p.value_1" class="gt_row gt_center" style="font-weight: bold;">0.004</td>
## <td headers="estimate_2" class="gt_row gt_center">1.21</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.62, 2.33</td>
## <td headers="p.value_2" class="gt_row gt_center">0.567</td></tr>
##     <tr><td headers="label" class="gt_row gt_left" style="font-weight: bold;">Sources_of_information_on_Mpox</td>
## <td headers="stat_n_1" class="gt_row gt_center">372</td>
## <td headers="estimate_1" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_1" class="gt_row gt_center"><br /></td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center"><br /></td>
## <td headers="conf.low_2" class="gt_row gt_center"><br /></td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Health care worker</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">—</td>
## <td headers="conf.low_1" class="gt_row gt_center">—</td>
## <td headers="p.value_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_2" class="gt_row gt_center">—</td>
## <td headers="conf.low_2" class="gt_row gt_center">—</td>
## <td headers="p.value_2" class="gt_row gt_center"><br /></td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Family/friends</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">0.33</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.12, 0.79</td>
## <td headers="p.value_1" class="gt_row gt_center" style="font-weight: bold;">0.019</td>
## <td headers="estimate_2" class="gt_row gt_center">0.23</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.07, 0.66</td>
## <td headers="p.value_2" class="gt_row gt_center" style="font-weight: bold;">0.010</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Internet/social media</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">0.35</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.16, 0.71</td>
## <td headers="p.value_1" class="gt_row gt_center" style="font-weight: bold;">0.005</td>
## <td headers="estimate_2" class="gt_row gt_center">0.37</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.15, 0.87</td>
## <td headers="p.value_2" class="gt_row gt_center" style="font-weight: bold;">0.027</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Print/community sources</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">0.06</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.00, 0.28</td>
## <td headers="p.value_1" class="gt_row gt_center" style="font-weight: bold;">0.005</td>
## <td headers="estimate_2" class="gt_row gt_center">0.08</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.00, 0.42</td>
## <td headers="p.value_2" class="gt_row gt_center" style="font-weight: bold;">0.017</td></tr>
##     <tr><td headers="label" class="gt_row gt_left">    Radio/TV</td>
## <td headers="stat_n_1" class="gt_row gt_center"><br /></td>
## <td headers="estimate_1" class="gt_row gt_center">0.17</td>
## <td headers="conf.low_1" class="gt_row gt_center">0.07, 0.35</td>
## <td headers="p.value_1" class="gt_row gt_center" style="font-weight: bold;"><0.001</td>
## <td headers="estimate_2" class="gt_row gt_center">0.13</td>
## <td headers="conf.low_2" class="gt_row gt_center">0.05, 0.30</td>
## <td headers="p.value_2" class="gt_row gt_center" style="font-weight: bold;"><0.001</td></tr>
##   </tbody>
##   <tfoot>
##     <tr class="gt_sourcenotes">
##       <td class="gt_sourcenote" colspan="8"><span class='gt_from_md'>Abbreviations: CI = Confidence Interval, OR = Odds Ratio</span></td>
##     </tr>
##   </tfoot>
## </table>
## </div>
# Convert to flextable using gtsummary's method
ft <- as_flex_table(merged_table)

# Create and save Word document
doc <- read_docx() %>%
  body_add_flextable(value = ft) %>%
  body_add_par("", style = "Normal")  # optional spacing

print(doc, target = "regression_table.docx")

investigator led step wise regression

In this study, i only kept variables that were stattistically significant at p < 0.05

I removed variables following this order

  1. education

  2. income

  3. marital status

  4. sex

  5. age

  6. residence

mv_model <- glm(
  knowledge_binary ~ 
    Province+ 
    Occupation+Sources_of_information_on_Mpox,
  data = sub_set,
  family = binomial
)

tbl_regression(
  mv_model, 
  exponentiate = TRUE,  # show odds ratios instead of log-odds
  pvalue_fun = ~style_pvalue(.x, digits = 3)
) %>%
  bold_p(t = 0.05)
Characteristic OR 95% CI p-value
Province


    Lusaka
    Central 1.08 0.47, 2.42 0.857
    Western 10.3 4.88, 22.7 <0.001
    Copperbelt 0.80 0.31, 1.93 0.623
    Muchinga 1.06 0.33, 3.13 0.916
Occupation


    Employed
    Student 0.62 0.16, 2.00 0.455
    Unemployed 0.33 0.15, 0.68 0.004
Sources_of_information_on_Mpox


    Health care worker
    Family/friends 0.25 0.08, 0.68 0.011
    Internet/social media 0.38 0.16, 0.87 0.027
    Print/community sources 0.08 0.00, 0.41 0.016
    Radio/TV 0.13 0.05, 0.29 <0.001
Abbreviations: CI = Confidence Interval, OR = Odds Ratio

Compare a full model with a model with Residence

# full model 
model1  <- glm(
  knowledge_binary ~ 
    Province+ 
    Occupation+Sources_of_information_on_Mpox+Residence,
  data = sub_set,
  family = binomial
)

tbl_regression(
  mv_model, 
  exponentiate = TRUE,  # show odds ratios instead of log-odds
  pvalue_fun = ~style_pvalue(.x, digits = 3)
) %>%
  bold_p(t = 0.05)
Characteristic OR 95% CI p-value
Province


    Lusaka
    Central 1.08 0.47, 2.42 0.857
    Western 10.3 4.88, 22.7 <0.001
    Copperbelt 0.80 0.31, 1.93 0.623
    Muchinga 1.06 0.33, 3.13 0.916
Occupation


    Employed
    Student 0.62 0.16, 2.00 0.455
    Unemployed 0.33 0.15, 0.68 0.004
Sources_of_information_on_Mpox


    Health care worker
    Family/friends 0.25 0.08, 0.68 0.011
    Internet/social media 0.38 0.16, 0.87 0.027
    Print/community sources 0.08 0.00, 0.41 0.016
    Radio/TV 0.13 0.05, 0.29 <0.001
Abbreviations: CI = Confidence Interval, OR = Odds Ratio
model1
## 
## Call:  glm(formula = knowledge_binary ~ Province + Occupation + Sources_of_information_on_Mpox + 
##     Residence, family = binomial, data = sub_set)
## 
## Coefficients:
##                                           (Intercept)  
##                                              -0.60079  
##                                       ProvinceCentral  
##                                               0.02556  
##                                       ProvinceWestern  
##                                               2.47543  
##                                    ProvinceCopperbelt  
##                                              -0.27043  
##                                      ProvinceMuchinga  
##                                               0.57964  
##                                     OccupationStudent  
##                                              -0.40658  
##                                  OccupationUnemployed  
##                                              -1.04250  
##          Sources_of_information_on_MpoxFamily/friends  
##                                              -1.33189  
##   Sources_of_information_on_MpoxInternet/social media  
##                                              -0.97572  
## Sources_of_information_on_MpoxPrint/community sources  
##                                              -2.60987  
##                Sources_of_information_on_MpoxRadio/TV  
##                                              -1.97892  
##                                        ResidenceRural  
##                                              -1.00895  
## 
## Degrees of Freedom: 371 Total (i.e. Null);  360 Residual
## Null Deviance:       422.7 
## Residual Deviance: 306.6     AIC: 330.6
# without residence  
model2 <- glm(
  knowledge_binary ~ 
    Province+ 
    Occupation+Sources_of_information_on_Mpox,
  data = sub_set,
  family = binomial
)

tbl_regression(
  mv_model, 
  exponentiate = TRUE,  # show odds ratios instead of log-odds
  pvalue_fun = ~style_pvalue(.x, digits = 3)
) %>%
  bold_p(t = 0.05)
Characteristic OR 95% CI p-value
Province


    Lusaka
    Central 1.08 0.47, 2.42 0.857
    Western 10.3 4.88, 22.7 <0.001
    Copperbelt 0.80 0.31, 1.93 0.623
    Muchinga 1.06 0.33, 3.13 0.916
Occupation


    Employed
    Student 0.62 0.16, 2.00 0.455
    Unemployed 0.33 0.15, 0.68 0.004
Sources_of_information_on_Mpox


    Health care worker
    Family/friends 0.25 0.08, 0.68 0.011
    Internet/social media 0.38 0.16, 0.87 0.027
    Print/community sources 0.08 0.00, 0.41 0.016
    Radio/TV 0.13 0.05, 0.29 <0.001
Abbreviations: CI = Confidence Interval, OR = Odds Ratio
model2
## 
## Call:  glm(formula = knowledge_binary ~ Province + Occupation + Sources_of_information_on_Mpox, 
##     family = binomial, data = sub_set)
## 
## Coefficients:
##                                           (Intercept)  
##                                              -0.62299  
##                                       ProvinceCentral  
##                                               0.07552  
##                                       ProvinceWestern  
##                                               2.33071  
##                                    ProvinceCopperbelt  
##                                              -0.22756  
##                                      ProvinceMuchinga  
##                                               0.05972  
##                                     OccupationStudent  
##                                              -0.47158  
##                                  OccupationUnemployed  
##                                              -1.11892  
##          Sources_of_information_on_MpoxFamily/friends  
##                                              -1.40486  
##   Sources_of_information_on_MpoxInternet/social media  
##                                              -0.96022  
## Sources_of_information_on_MpoxPrint/community sources  
##                                              -2.58732  
##                Sources_of_information_on_MpoxRadio/TV  
##                                              -2.03969  
## 
## Degrees of Freedom: 371 Total (i.e. Null);  361 Residual
## Null Deviance:       422.7 
## Residual Deviance: 310.1     AIC: 332.1

model selection

# --- Full model (with residence) ---
model1 <- glm(
  knowledge_binary ~ 
    Province+ 
    Occupation+Sources_of_information_on_Mpox+Residence,
  data = sub_set,
  family = binomial)

# Create formatted regression table
model1_tbl <- tbl_regression(
  model1,
  exponentiate = TRUE,   # show Odds Ratios
  pvalue_fun = ~ style_pvalue(.x, digits = 3)
) %>%
  bold_p(t = 0.05)


# --- Reduced model (without residence) ---
model2 <- glm(
  knowledge_binary ~ 
    Province+ 
    Occupation+Sources_of_information_on_Mpox,
  data = sub_set,
  family = binomial)

# Create formatted regression table
model2_tbl <- tbl_regression(
  model2,
  exponentiate = TRUE,
  pvalue_fun = ~ style_pvalue(.x, digits = 3)
) %>%
  bold_p(t = 0.05)


# --- Model comparison using AIC ---
AIC(model1, model2)
##        df      AIC
## model1 12 330.6191
## model2 11 332.1266
# --- Display regression tables ---
model1_tbl
Characteristic OR 95% CI p-value
Province


    Lusaka
    Central 1.03 0.44, 2.30 0.951
    Western 11.9 5.49, 27.2 <0.001
    Copperbelt 0.76 0.30, 1.84 0.559
    Muchinga 1.79 0.49, 6.18 0.364
Occupation


    Employed
    Student 0.67 0.17, 2.11 0.517
    Unemployed 0.35 0.16, 0.74 0.008
Sources_of_information_on_Mpox


    Health care worker
    Family/friends 0.26 0.08, 0.74 0.016
    Internet/social media 0.38 0.15, 0.86 0.025
    Print/community sources 0.07 0.00, 0.41 0.016
    Radio/TV 0.14 0.06, 0.31 <0.001
Residence


    Urban
    Rural 0.36 0.12, 1.05 0.070
Abbreviations: CI = Confidence Interval, OR = Odds Ratio
model2_tbl
Characteristic OR 95% CI p-value
Province


    Lusaka
    Central 1.08 0.47, 2.42 0.857
    Western 10.3 4.88, 22.7 <0.001
    Copperbelt 0.80 0.31, 1.93 0.623
    Muchinga 1.06 0.33, 3.13 0.916
Occupation


    Employed
    Student 0.62 0.16, 2.00 0.455
    Unemployed 0.33 0.15, 0.68 0.004
Sources_of_information_on_Mpox


    Health care worker
    Family/friends 0.25 0.08, 0.68 0.011
    Internet/social media 0.38 0.16, 0.87 0.027
    Print/community sources 0.08 0.00, 0.41 0.016
    Radio/TV 0.13 0.05, 0.29 <0.001
Abbreviations: CI = Confidence Interval, OR = Odds Ratio
# --- Model comparison using BIC ---
BIC(model1, model2)
##        df      BIC
## model1 12 377.6458
## model2 11 375.2344
# Collect AIC and BIC values
model_comp <- data.frame(
  Model = c("Model 1: Full (with residence)", "Model 2: Reduced (without residence)"),
  df    = c(12, 11),
  AIC   = c(330.6191, 332.1266  ),
  BIC   = c(377.6458, 375.2344)
)

# Option 1: Simple table for manuscript (inline in R Markdown/console)
knitr::kable(model_comp, caption = "Comparison of AIC and BIC for Logistic Regression Models")
Comparison of AIC and BIC for Logistic Regression Models
Model df AIC BIC
Model 1: Full (with residence) 12 330.6191 377.6458
Model 2: Reduced (without residence) 11 332.1266 375.2344
# Option 2: Polished table with gt (for HTML/PDF output)
model_comp %>%
  gt() %>%
  tab_header(
    title = "Comparison of Model Fit Statistics",
    subtitle = "Logistic regression predicting overall Mpox knowledge"
  ) %>%
  fmt_number(columns = c(AIC, BIC), decimals = 3)
Comparison of Model Fit Statistics
Logistic regression predicting overall Mpox knowledge
Model df AIC BIC
Model 1: Full (with residence) 12 330.619 377.646
Model 2: Reduced (without residence) 11 332.127 375.234
# --- Export to Word using flextable ---
ft <- flextable(model_comp) %>%
  autofit() %>%
  set_header_labels(
    Model = "Model",
    df    = "Degrees of freedom",
    AIC   = "AIC",
    BIC   = "BIC"
  )

doc <- read_docx() %>%
  body_add_par("Table 4. Comparison of Model Fit Statistics", style = "heading 2") %>%
  body_add_flextable(ft)

print(doc, target = "Model_Fit_Comparison.docx")

merged

# Univariable model
uv_model <- tbl_uvregression(
  data = sub_set,
  y =  knowledge_binary,
  method = glm,
  method.args = list(family = binomial),
  include = c("Province","Occupation", "Sources_of_information_on_Mpox"),
  exponentiate = TRUE
) %>%
  bold_p(t = 0.05) %>%
  modify_header(
    estimate ~ "**UOR**",  # Unadjusted Odds Ratio
    p.value ~ "**P-value**"
  ) %>%
  modify_fmt_fun(p.value ~ function(x) style_pvalue(x, digits = 3)) %>%
  bold_labels()

# Multivariable model
model2 <- glm(
   knowledge_binary ~ Province+ 
    Occupation+Sources_of_information_on_Mpox,
  data = sub_set,
  family = binomial
)

mv_model <- tbl_regression(
  model2,
  exponentiate = TRUE,
  pvalue_fun = ~style_pvalue(.x, digits = 3)
) %>%
  bold_p(t = 0.05) %>%
  modify_header(estimate ~ "**AOR**") %>%
  bold_labels()

# Merge both models
final_model <- tbl_merge(
  tbls = list(uv_model, mv_model),
  tab_spanner = c("**Univariable Model**", "**Multivariable Model**")
) %>%
  modify_caption("**Factors Associated with Mpox Knowledge (Binary Outcome)**")

# Export to Word
doc <- read_docx() %>%
  body_add_flextable(value = as_flex_table(final_model)) %>%
  body_add_par(" ", style = "Normal")

print(doc, target = "Final_Knowledge_Model.docx")

# Display the table
final_model
Factors Associated with Mpox Knowledge (Binary Outcome)
Characteristic
Univariable Model
Multivariable Model
N UOR 95% CI P-value AOR 95% CI p-value
Province 372





    Lusaka


    Central
1.31 0.61, 2.76 0.477 1.08 0.47, 2.42 0.857
    Western
12.0 6.17, 24.2 <0.001 10.3 4.88, 22.7 <0.001
    Copperbelt
1.08 0.44, 2.44 0.863 0.80 0.31, 1.93 0.623
    Muchinga
1.85 0.62, 4.95 0.238 1.06 0.33, 3.13 0.916
Occupation 372





    Employed


    Student
0.55 0.15, 1.56 0.303 0.62 0.16, 2.00 0.455
    Unemployed
0.29 0.14, 0.55 <0.001 0.33 0.15, 0.68 0.004
Sources_of_information_on_Mpox 372





    Health care worker


    Family/friends
0.33 0.12, 0.79 0.019 0.25 0.08, 0.68 0.011
    Internet/social media
0.35 0.16, 0.71 0.005 0.38 0.16, 0.87 0.027
    Print/community sources
0.06 0.00, 0.28 0.005 0.08 0.00, 0.41 0.016
    Radio/TV
0.17 0.07, 0.35 <0.001 0.13 0.05, 0.29 <0.001
Abbreviations: CI = Confidence Interval, OR = Odds Ratio

Analysis flow diagram

# Build the flow diagram
diagram <- grViz("
digraph flow {
  graph [rankdir = TB, fontsize = 12]
  node [shape = box, style = filled, fillcolor = white, fontname = Helvetica]

  A [label = 'Individuals enrolled and interviewed\\n n = 815']
  B [label = 'Records removed during data cleaning\\n n = 6\\n - Missing critical data (consent/filter question)']
  C [label = 'Final analytic sample for AWARENESS analysis\\n N = 809']
  D [label = 'All participants answered filter question:\\n Have you ever heard of Mpox?']
  E [label = 'YES\\n n = 372']
  F [label = 'NO\\n n = 437']
  G [label = 'Completed full knowledge questionnaire']
  H [label = 'Included only in analyses of\\n awareness prevalence and its correlates']
  I [label = 'Primary analytic sample for KNOWLEDGE analysis\\n n = 372\\n (Assessed for knowledge level, sources of info, and associated factors)']

  A -> B -> C -> D
  D -> E
  D -> F
  E -> G -> I
  F -> H
}
")

print(diagram)
# Export as SVG
svg <- export_svg(diagram)

# Convert to high-resolution PNG (journal-friendly, ~300 dpi)
rsvg_png(charToRaw(svg), "flow_diagram.png", width = 2400, height = 3200)

# Convert to PDF (vector, sharp at any zoom)
rsvg_pdf(charToRaw(svg), "flow_diagram.pdf", width = 8.5, height = 11)

Mapping the sources of Mpox information among study participants

# Step 1: Summarise counts and percentages
mpox_map <- sub_set %>%
  group_by(Province, Sources_of_information_on_Mpox) %>%
  summarise(n = n(), .groups = "drop") %>%
  group_by(Province) %>%
  mutate(total = sum(n),
         percent = round((n / total) * 100, 1)) %>%
  ungroup()

# Step 2: Read shapefile
provinces <- st_read("C:/Users/USER1/OneDrive/Documents/Office Work_ ZNPHI/Daliso_Mpox/Data/Shapefiles. Admin boundaries/zmb_admbnda_adm1_dmmu_20201124.shp")
## Reading layer `zmb_admbnda_adm1_dmmu_20201124' from data source 
##   `C:\Users\USER1\OneDrive\Documents\Office Work_ ZNPHI\Daliso_Mpox\Data\Shapefiles. Admin boundaries\zmb_admbnda_adm1_dmmu_20201124.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 10 features and 12 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 21.98004 ymin: -18.07918 xmax: 33.71244 ymax: -8.271976
## Geodetic CRS:  WGS 84
# Step 3: Join shapefile with source data
map_radio <- provinces %>%
  left_join(filter(mpox_map, Sources_of_information_on_Mpox == "Radio/TV"),
            by = c("ADM1_EN" = "Province")) %>%
  mutate(percent = ifelse(is.na(percent), 0, percent))

# Step 4: Plot full Zambia map with proportions shaded
ggplot() +
  geom_sf(data = provinces, fill = "grey95", color = "black") +   # base map
  geom_sf(data = map_radio, aes(fill = percent), color = "black") +
  geom_sf_text(data = filter(map_radio, percent > 0),
               aes(label = paste0(percent, "%")), size = 3) +
  scale_fill_gradient(low = "#FFE5B4", high = "#FF8C00", na.value = "grey95") +
  annotation_scale(location = "bl", width_hint = 0.3) +
  annotation_north_arrow(location = "tl", which_north = "true",
                         style = north_arrow_fancy_orienteering) +
  theme_minimal() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank()) +
  labs(fill = "Proportion (%)",
       title = "Proportion of Mpox Information from Radio/TV")
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

map_internet <- provinces %>%
  left_join(filter(mpox_map, Sources_of_information_on_Mpox == "Internet/social media"),
            by = c("ADM1_EN" = "Province")) %>%
  mutate(percent = ifelse(is.na(percent), 0, percent))

ggplot() +
  geom_sf(data = provinces, fill = "grey95", color = "black") +
  geom_sf(data = map_internet, aes(fill = percent), color = "black") +
  geom_sf_text(data = filter(map_internet, percent > 0),
               aes(label = paste0(percent, "%")), size = 3) +
  scale_fill_gradient(low = "#D0E6FF", high = "#0073E6", na.value = "grey95") +
  annotation_scale(location = "bl", width_hint = 0.3) +
  annotation_north_arrow(location = "tl", which_north = "true",
                         style = north_arrow_fancy_orienteering) +
  theme_minimal() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank()) +
  labs(fill = "Proportion (%)",
       title = "Proportion of Mpox Information from Internet/Social Media")
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

  map_family <- provinces %>%
    right_join(filter(mpox_map, Sources_of_information_on_Mpox == "Family/friends"),
               by = c("ADM1_EN" = "Province")) %>%
    mutate(percent = ifelse(is.na(percent), 0, percent))
  
  ggplot() +
    geom_sf(data = provinces, fill = "grey95", color = "black") +
    geom_sf(data = map_family, aes(fill = percent), color = "black") +
    geom_sf_text(data = filter(map_family, percent > 0),
                 aes(label = paste0(percent, "%")), size = 3) +
    scale_fill_gradient(low = "#FAD0E6", high = "#E7298A", na.value = "grey95") +
    annotation_scale(location = "bl", width_hint = 0.3) +
    annotation_north_arrow(location = "tl", which_north = "true",
                           style = north_arrow_fancy_orienteering) +
    theme_minimal() +
    theme(panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(),
          axis.text = element_blank(),
          axis.ticks = element_blank(),
          axis.title = element_blank()) +
    labs(fill = "Proportion (%)",
         title = "Proportion of Mpox Information from Family/Friends")
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

# Example for Health care worker
map_health <- provinces %>%
  left_join(filter(mpox_map, Sources_of_information_on_Mpox == "Health care worker"),
            by = c("ADM1_EN" = "Province")) %>%
  mutate(percent = ifelse(is.na(percent), 0, percent))

ggplot() +
  geom_sf(data = provinces, fill = "grey95", color = "black") +
  geom_sf(data = map_health, aes(fill = percent), color = "black") +
  geom_sf_text(data = filter(map_health, percent > 0),
               aes(label = paste0(percent, "%")), size = 3) +
  scale_fill_gradient(low = "#E0F8E0", high = "#00B050", na.value = "grey95") +
  annotation_scale(location = "bl", width_hint = 0.3) +
  annotation_north_arrow(location = "tl", which_north = "true",
                         style = north_arrow_fancy_orienteering) +
  theme_minimal() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank()) +
  labs(fill = "Proportion (%)",
       title = "Proportion of Mpox Information from Health Care Workers")
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data