Papre 24: Composite Blood Pressure and LDL-Cholesterol Control

Author

Dr Solomon Gyabaah

Published

November 2, 2026


Note
  • Everyone was hypertensive at baseline so that is not included in the tables
  • Only 39 participants are current alcohol users. Should we still use that criteria?

Importing Data

Show code
df_pings2_bp <- 
    dget("Data/pings_2_data_with_bps_ready") 

df_for_outc <- 
  df_pings2_bp |>
  select(pid, eventname, sbp, ff_ldl_12) |>
  arrange(pid, eventname) |>
  group_by(pid)|>
  fill(ff_ldl_12) |>
  filter(eventname == "Month12")|>
  select(-eventname)|>
  mutate(
    outc_140_18 = case_when(
      (sbp < 140 & ff_ldl_12 < 1.8) ~ "Yes", 
      !(is.na(sbp) | is.na(ff_ldl_12)) ~ "No"),
    outc_130_14 = case_when(
      (sbp < 130 & ff_ldl_12 < 1.4) ~ "Yes", 
      !(is.na(sbp) | is.na(ff_ldl_12)) ~ "No"))
  


df_baseline <- 
    dget("Data/df_for_papers") %>%
    labelled::unlabelled() %>% 
    mutate(
        d_st_type = as.character(d_st_type),
        d_st_type = case_when(
            d_st_type == "Ischemic With Hemorrhagic Transformation" ~ 
            "Ischemic Stroke", 
            is.na(d_st_type) ~ "Untyped Stroke (no CT scan available)",
            TRUE ~ d_st_type)) |> 
    labelled::set_variable_labels(
            d_st_type = "Stroke Type")

df_antihypt <- 
    df_pings2_bp |> 
    filter(eventname == "Baseline") |> 
    select(
        pid, h_antihpt, h_ccb, h_acei, h_arb, h_bb, 
        h_alpha_md, h_diuretics, h_alpha_ab, h_antiplt, 
        h_statins)

df_drugs_temp <- 
  readxl::read_xlsx(
      "Data/drugs_data_clean_10122025.xlsx", sheet = 1) 

df_max_drug_doses_temp <- 
  readxl::read_xlsx(
      "Data/PINGS_Antihypertensive Maximum doses.xlsx", sheet = 2)

Data manipulation

Show code
df_sbp <- 
    df_pings2_bp |> # labelled::look_for("acei")
    select(sbp, dbp, pid, eventname) |> 
    mutate(
        mth = parse_number(eventname),
        mth = case_when(
            eventname == "Baseline" ~ 0, 
            TRUE ~ mth)) |> 
    pivot_wider(
        id_cols = pid, 
        values_from = sbp, 
        names_from = mth, 
        names_prefix = "sbp_m_") |> 
    drop_na()

df_dbp <- 
    df_pings2_bp |> # labelled::look_for("acei")
    select(sbp, dbp, pid, eventname) |> 
    mutate(
        mth = parse_number(eventname),
        mth = case_when(
            eventname == "Baseline" ~ 0, 
            TRUE ~ mth)) |> 
    pivot_wider(
        id_cols = pid, 
        values_from = dbp, 
        names_from = mth, 
        names_prefix = "dbp_m_") |> 
    drop_na()

df_drugs <-  
    df_drugs_temp %>% 
    left_join(df_max_drug_doses_temp, by = "drug") %>%
    mutate(
        dose_index = freq_number*dose_number/maxi,
        antihpt  = case_when(is.na(antihpt) ~ 0, TRUE ~ antihpt)) %>% 
    filter(antihpt == 1) %>% 
    group_by(pid, eventname, arm) %>% 
    summarize(
      n_hpts = sum(antihpt), 
      dose_index = sum(dose_index)) %>% 
    ungroup() |> 
    filter(eventname == "Baseline") |> 
    select(pid, dose_index)

df_paper_20 <- 
    df_pings2_bp |> # labelled::look_for("acei")
    select(sbp, dbp, pid, eventname) |> 
    mutate(
        sbp_high = sbp >= 140, 
        dbp_high = dbp >= 90, 
        hpt = sbp_high | dbp_high, 
        mth = parse_number(eventname),
        mth = case_when(
            eventname == "Baseline" ~ 0, 
            TRUE ~ mth)) |> 
    select(pid, mth, hpt) |> 
    arrange(pid, mth) |> 
    pivot_wider(
        id_cols = pid, 
        values_from = hpt, 
        names_from = mth, 
        names_prefix = "m_") |> 
    drop_na() |> 
    mutate(
        m_0 = case_when(m_0 == FALSE ~ TRUE, TRUE ~ m_0),
        total_1 = rowSums(across(c(m_0:m_12))),
        hpt_class = case_when(
             total_1 == 1 ~ "Early",
             total_1 == 6 ~ "Persistent", 
             total_1 == 5 & m_12 == FALSE ~ "Late", 
             total_1 == 5 ~ "Fluctuating", 
             total_1 == 4 & m_9 == FALSE & m_12 == FALSE~ "Late",
             m_0 & m_1 & m_3 == FALSE & m_6 == FALSE & m_9 == FALSE & 
                 m_12 == FALSE~ "Early", 
             m_0 & m_1 & m_3 & m_6 == FALSE & m_9 == FALSE & m_12 == FALSE~ "Early", 
             m_0 & m_1 & m_3 & m_6 & m_9 == FALSE & m_12 == FALSE~ "Late",
             m_0 & m_1 & m_3 & m_6 & m_9 & m_12 == FALSE~ "Late", 
             m_0 & m_1 & m_3 & m_6 == FALSE & m_9 & m_12 == FALSE~ "Fluctuating", 
             m_0 & m_1 & m_3 & m_6 == FALSE & m_9 == FALSE & m_12 ~ "Fluctuating",
             m_0 & m_1 & m_3 == FALSE & m_6 & m_9 & m_12 == FALSE~ "Fluctuating", 
             total_1 == 4 & m_9 == FALSE & m_12 ~ "Fluctuating", 
             total_1 == 4 & m_9 & m_12 == FALSE~ "Fluctuating", 
             total_1 == 4 ~ "Fluctuating", 
             total_1 == 3 ~ "Fluctuating", 
             total_1 == 2 ~ "Fluctuating")) |> 
    left_join(df_baseline) |> 
    left_join(df_antihypt) |> 
    left_join(df_sbp) |> 
    left_join(df_dbp) |>
    left_join(df_drugs) |> 
    left_join(df_for_outc) |>
    mutate(
        no_of_hpts = 
            (h_acei == "Checked") + (h_arb == "Checked") + 
            (h_bb == "Checked") + (h_ccb == "Checked") + 
            (h_diuretics  == "Checked") + (h_alpha_md  == "Checked") + 
            (h_alpha_ab == "Checked"),
        arm = case_when(
            arm == "Arm 1- Intervention Arm" ~ "Intervention", 
            arm == "Arm 2- Routine Care" ~ "Routine") |> 
          factor(levels = c("Routine", "Intervention")),
        alcohol_curr = case_when(
            g_alcohol == "Currently uses alcohol" ~ "Yes",
            g_alcohol %in% c(
                "Never used alcohol", 
                "Past 12 months", 
                "Past 30 days", 
                "Formerly used alcohol", 
                "Stopped after the stroke occured") ~ "No"))



df_ready <- 
    df_paper_20 |> 
  mutate(
    bmi_cat = case_when(
      bmi < 25 ~ "Normal", 
      bmi < 30 ~ "Overweight", 
      bmi >= 30 ~ "Obese")|> 
        factor(levels = c("Normal","Overweight", "Obese")), 
    hba1c_high = case_when(
      ff_hba1c_0 >= 6.5 ~ "Yes", 
      ff_hba1c_0 < 6.5 ~ "No"), 
    across(
      c(h_acei, h_arb, h_bb, h_ccb, h_diuretics, h_alpha_md, h_alpha_ab), 
      .fns = ~case_when(
        .x == "Checked" ~ "Yes", 
        .x == "Unchecked" ~ "No")),
    across(
      c(a_agebase, waist_hip_ratio, ff_hba1c_0), 
      .fns = as.numeric),
    across(
      c(a_gender, educ, a_domicile, a_religion, d_stroke_ct, d_st_type, dm, 
        tobacco_use, hyperlipidemia, alcohol_curr, hba1c_high, h_acei:h_statins, 
        hosp_cat, outc_140_18, outc_130_14, h_ccb, income), 
      .fns = as.factor)) |>
    select(
        a_agebase, a_gender, educ, maristat, a_domicile, income,    
        a_religion, d_stroke_ct, d_st_type, nihss_scale, ranking, 
        dm, tobacco_use, bmi_cat, waist_hip_ratio, arm,hyperlipidemia,
        alcohol_curr, ff_hba1c_0, hba1c_high,  h_acei, h_arb, h_bb, h_ccb,
        h_diuretics, h_alpha_md, h_alpha_ab,h_antiplt, h_statins, hillbone, 
        aa_hkq, eq_5d,  hosp_cat, dose_index, outc_140_18, outc_130_14)

Labelling data

Show code
df_ready <- 
    df_ready |> 
    labelled::set_variable_labels(
            h_arb = "Angiotensin Receptor Blocker",
            h_acei = "ACE-Inhibitors",
            h_alpha_md = "Alpha Methyl Dopa",
            h_bb = "Beta blockers",
            h_ccb = "Calcium Channel Blocker",
            h_diuretics = "Diuretics",
            h_alpha_ab = "Alpha Adrenergic Blockers", 
#            no_of_hpts = "No. of Antihypertensives", 
            h_antiplt = "Antiplatelet", 
            h_statins = "Statins",
            dose_index = "Antihypertensive treatment intensity",
            eq_5d = "Health Related QoL", 
            arm = "Study Arm", 
            bmi_cat = "Categorised Body Mass Index", 
            hba1c_high = "High HbA1C")

Data Exploration

Show code
my_gt_theme <- function(x) {
  x |>
    gt::opt_row_striping() |>
    gt::tab_options(
      table.font.size = gt::px(13),
      heading.title.font.size = gt::px(16),
      column_labels.font.weight = "bold")
  }


df_ready |> dlookr::diagnose() |> gt::gt() |>  my_gt_theme()
Registered S3 methods overwritten by 'dlookr':
  method          from  
  plot.transform  scales
  print.transform scales
variables types missing_count missing_percent unique_count unique_rate
a_agebase numeric 0 0.0000000 54 0.147945205
a_gender labelled 0 0.0000000 2 0.005479452
educ labelled 0 0.0000000 4 0.010958904
maristat factor 0 0.0000000 3 0.008219178
a_domicile labelled 0 0.0000000 3 0.008219178
income labelled 2 0.5479452 5 0.013698630
a_religion labelled 0 0.0000000 3 0.008219178
d_stroke_ct labelled 44 12.0547945 5 0.013698630
d_st_type factor 0 0.0000000 3 0.008219178
nihss_scale numeric 4 1.0958904 23 0.063013699
ranking numeric 0 0.0000000 6 0.016438356
dm factor 0 0.0000000 2 0.005479452
tobacco_use factor 8 2.1917808 3 0.008219178
bmi_cat factor 8 2.1917808 4 0.010958904
waist_hip_ratio numeric 8 2.1917808 297 0.813698630
arm factor 0 0.0000000 2 0.005479452
hyperlipidemia factor 0 0.0000000 2 0.005479452
alcohol_curr factor 0 0.0000000 2 0.005479452
ff_hba1c_0 numeric 69 18.9041096 74 0.202739726
hba1c_high factor 69 18.9041096 3 0.008219178
h_acei factor 0 0.0000000 2 0.005479452
h_arb factor 0 0.0000000 2 0.005479452
h_bb factor 0 0.0000000 2 0.005479452
h_ccb factor 0 0.0000000 2 0.005479452
h_diuretics factor 0 0.0000000 2 0.005479452
h_alpha_md factor 0 0.0000000 2 0.005479452
h_alpha_ab factor 0 0.0000000 2 0.005479452
h_antiplt labelled 21 5.7534247 3 0.008219178
h_statins labelled 29 7.9452055 3 0.008219178
hillbone numeric 6 1.6438356 23 0.063013699
aa_hkq integer 15 4.1095890 15 0.041095890
eq_5d numeric 144 39.4520548 11 0.030136986
hosp_cat factor 0 0.0000000 3 0.008219178
dose_index numeric 43 11.7808219 72 0.197260274
outc_140_18 factor 86 23.5616438 3 0.008219178
outc_130_14 factor 86 23.5616438 3 0.008219178
Show code
df_ready |> dlookr::diagnose_numeric() |> gt::gt() |>  my_gt_theme()
variables min Q1 mean median Q3 max zero minus outlier
a_agebase 29.00000000 50.0000000 58.043836 58.0000000 67.0000000 86.00000 0 0 0
nihss_scale 0.00000000 0.0000000 4.279778 2.0000000 7.0000000 23.00000 126 0 6
ranking 0.00000000 1.0000000 2.189041 2.0000000 3.0000000 5.00000 26 0 0
waist_hip_ratio 0.09022556 0.8859649 1.167860 0.9279279 0.9647059 88.29787 0 0 14
ff_hba1c_0 3.00000000 5.4000000 6.440541 5.8000000 6.7000000 16.10000 0 0 41
hillbone 30.00000000 50.0000000 51.373259 53.0000000 53.0000000 56.00000 0 0 28
aa_hkq 0.00000000 6.0000000 7.948571 9.0000000 10.0000000 13.00000 4 0 0
eq_5d 6.00000000 8.0000000 9.710407 10.0000000 11.0000000 15.00000 0 0 0
dose_index 0.06250000 0.8333333 1.476441 1.4375000 1.9166667 4.50000 0 0 5
Show code
df_ready |> dlookr::diagnose_outlier() |> gt::gt() |>  my_gt_theme()
variables outliers_cnt outliers_ratio outliers_mean with_mean without_mean
a_agebase 0 0.000000 NaN 58.043836 58.0438356
nihss_scale 6 1.643836 20.500000 4.279778 4.0056338
ranking 0 0.000000 NaN 2.189041 2.1890411
waist_hip_ratio 14 3.835616 7.163111 1.167860 0.9231555
ff_hba1c_0 41 11.232877 10.609756 6.440541 5.7701961
hillbone 28 7.671233 41.928571 51.373259 52.1722054
aa_hkq 0 0.000000 NaN 7.948571 7.9485714
eq_5d 0 0.000000 NaN 9.710407 9.7104072
dose_index 5 1.369863 4.216667 1.476441 1.4332194
Show code
df_ready |> 
  dlookr::plot_na_pareto(only_na = T, plot = F) |> 
  gt::gt() |>  my_gt_theme()
variable frequencies ratio grade cumulative
eq_5d 144 0.394520548 Bad 22.42991
outc_130_14 86 0.235616438 Bad 35.82555
outc_140_18 86 0.235616438 Bad 49.22118
ff_hba1c_0 69 0.189041096 NotBad 59.96885
hba1c_high 69 0.189041096 NotBad 70.71651
d_stroke_ct 44 0.120547945 NotBad 77.57009
dose_index 43 0.117808219 NotBad 84.26791
h_statins 29 0.079452055 OK 88.78505
h_antiplt 21 0.057534247 OK 92.05607
aa_hkq 15 0.041095890 Good 94.39252
bmi_cat 8 0.021917808 Good 95.63863
tobacco_use 8 0.021917808 Good 96.88474
waist_hip_ratio 8 0.021917808 Good 98.13084
hillbone 6 0.016438356 Good 99.06542
nihss_scale 4 0.010958904 Good 99.68847
income 2 0.005479452 Good 100.00000
Show code
df_ready |> dlookr::normality() |> gt::gt() |>  my_gt_theme()
vars statistic p_value sample
a_agebase 0.98987061 1.268049e-02 365
nihss_scale 0.83402509 5.070838e-19 365
ranking 0.91334780 1.225981e-13 365
waist_hip_ratio 0.03348375 8.430421e-39 365
ff_hba1c_0 0.77100844 4.889789e-20 365
hillbone 0.82025058 1.046884e-19 365
aa_hkq 0.92930077 8.061125e-12 365
eq_5d 0.94701132 3.138782e-07 365
dose_index 0.95874123 6.914028e-08 365

Table 0

Show code
gtsummary::theme_gtsummary_compact()
Setting theme "Compact"
Show code
gtsummary::theme_gtsummary_eda()
Setting theme "Exploratory Data Analysis"
Show code
df_ready |> # labelled::look_for("alc")
    gtsummary::tbl_summary(missing_text = "Missing") |> 
    gtsummary::bold_labels()
Characteristic N = 3651
a_agebase
    Median (Q1, Q3) 58 (50, 67)
    Mean (SD) 58 (11)
    Min, Max 29, 86
Gender
    Male 207 (56.7%)
    Female 158 (43.3%)
Educational Status
    None 31 (8.49%)
    Primary 152 (41.6%)
    Secondary 117 (32.1%)
    Tertiary 65 (17.8%)
Marital Status
    Currently Married 244 (66.8%)
    Previously Married 101 (27.7%)
    Never Married 20 (5.48%)
Domicile
    Rural 24 (6.58%)
    Semi-Urban 124 (34.0%)
    Urban 217 (59.5%)
Income in GHC
    0-100 130 (35.8%)
    101-250 113 (31.1%)
    251-500 81 (22.3%)
    >500 39 (10.7%)
    Missing 2
Religion
    Christianity 332 (91.0%)
    Islam 31 (8.49%)
    Other 2 (0.55%)
Stroke Subtype ( with results of Brain CT scan)
    Ischaemic 237 (73.8%)
    Haemorrhage infarct 10 (3.12%)
    Haemorrhagic 66 (20.6%)
    Ischaemic and Haemorrhagic 8 (2.49%)
    Missing 44
d_st_type
    Intracerebral Hemorrhagic Stroke 76 (20.8%)
    Ischemic Stroke 260 (71.2%)
    Untyped Stroke (no CT scan available) 29 (7.95%)
NIH Stroke Scale
    Median (Q1, Q3) 2.0 (0.0, 7.0)
    Mean (SD) 4.3 (4.9)
    Min, Max 0.0, 23.0
    Missing 4
Modified Ranking Score
    0 26 (7.12%)
    1 84 (23.0%)
    2 117 (32.1%)
    3 72 (19.7%)
    4 65 (17.8%)
    5 1 (0.27%)
dm 123 (33.7%)
tobacco_use 25 (7.00%)
    Missing 8
Categorised Body Mass Index
    Normal 151 (42.3%)
    Overweight 117 (32.8%)
    Obese 89 (24.9%)
    Missing 8
waist_hip_ratio
    Median (Q1, Q3) 0.93 (0.89, 0.96)
    Mean (SD) 1.17 (4.63)
    Min, Max 0.09, 88.30
    Missing 8
Study Arm
    Routine 184 (50.4%)
    Intervention 181 (49.6%)
hyperlipidemia 120 (32.9%)
alcohol_curr 39 (10.7%)
ff_hba1c_0
    Median (Q1, Q3) 5.80 (5.40, 6.70)
    Mean (SD) 6.44 (2.03)
    Min, Max 3.00, 16.10
    Missing 69
High HbA1C 85 (28.7%)
    Missing 69
ACE-Inhibitors 29 (7.95%)
Angiotensin Receptor Blocker 33 (9.04%)
Beta blockers 14 (3.84%)
Calcium Channel Blocker 162 (44.4%)
Diuretics 15 (4.11%)
Alpha Methyl Dopa 17 (4.66%)
Alpha Adrenergic Blockers 5 (1.37%)
Antiplatelet 48 (14.0%)
    Missing 21
Statins 35 (10.4%)
    Missing 29
Total Hillbone Score
    Median (Q1, Q3) 53.0 (50.0, 53.0)
    Mean (SD) 51.4 (3.7)
    Min, Max 30.0, 56.0
    Missing 6
Total HKQ Score
    Median (Q1, Q3) 9 (6, 10)
    Mean (SD) 8 (3)
    Min, Max 0, 13
    Missing 15
Health Related QoL
    Median (Q1, Q3) 10.00 (8.00, 11.00)
    Mean (SD) 9.71 (1.94)
    Min, Max 6.00, 15.00
    Missing 144
hosp_cat
    Primary 112 (30.7%)
    Secondary 81 (22.2%)
    Tertiary 172 (47.1%)
Antihypertensive treatment intensity
    Median (Q1, Q3) 1.44 (0.83, 1.92)
    Mean (SD) 1.48 (0.79)
    Min, Max 0.06, 4.50
    Missing 43
outc_140_18 50 (17.9%)
    Missing 86
outc_130_14 18 (6.45%)
    Missing 86
1 n (%)

Table 1A - Composite score (140mmHg, 1.8mmol/L)

Show code
gtsummary::reset_gtsummary_theme()
gtsummary::theme_gtsummary_compact()
Setting theme "Compact"
Show code
df_ready |>
  select(-c(outc_130_14, hyperlipidemia))|>
  gtsummary::tbl_summary(by = outc_140_18) |> 
  gtsummary::modify_spanning_header(
        gtsummary::all_stat_cols() ~ "**SBP < 140, LDL < 1.8 mmol/L**") %>% 
  gtsummary::add_overall(last = T) |>
  gtsummary::add_p()|>
  gtsummary::bold_p()|>
  gtsummary::bold_labels() |>
  gtsummary::modify_caption(
      "**Table 1A**: DEMOGRAPHIC & CLINICAL CHARACTERISTICS OF STUDY PARTICIPANTS**") 
86 missing rows in the "outc_140_18" column have been removed.
Table 1A: DEMOGRAPHIC & CLINICAL CHARACTERISTICS OF STUDY PARTICIPANTS**
Characteristic
SBP < 140, LDL < 1.8 mmol/L
Overall
N = 2791
p-value2
No
N = 2291
Yes
N = 501
a_agebase 57 (50, 65) 61 (53, 70) 58 (51, 66) 0.072
Gender


0.8
    Male 132 (58%) 30 (60%) 162 (58%)
    Female 97 (42%) 20 (40%) 117 (42%)
Educational Status


0.4
    None 17 (7.4%) 6 (12%) 23 (8.2%)
    Primary 97 (42%) 18 (36%) 115 (41%)
    Secondary 74 (32%) 20 (40%) 94 (34%)
    Tertiary 41 (18%) 6 (12%) 47 (17%)
Marital Status


0.9
    Currently Married 150 (66%) 35 (70%) 185 (66%)
    Previously Married 69 (30%) 13 (26%) 82 (29%)
    Never Married 10 (4.4%) 2 (4.0%) 12 (4.3%)
Domicile


0.6
    Rural 12 (5.2%) 4 (8.0%) 16 (5.7%)
    Semi-Urban 78 (34%) 14 (28%) 92 (33%)
    Urban 139 (61%) 32 (64%) 171 (61%)
Income in GHC


>0.9
    0-100 84 (37%) 20 (40%) 104 (38%)
    101-250 67 (30%) 15 (30%) 82 (30%)
    251-500 51 (22%) 10 (20%) 61 (22%)
    >500 25 (11%) 5 (10%) 30 (11%)
    Unknown 2 0 2
Religion


0.2
    Christianity 214 (93%) 44 (88%) 258 (92%)
    Islam 13 (5.7%) 6 (12%) 19 (6.8%)
    Other 2 (0.9%) 0 (0%) 2 (0.7%)
Stroke Subtype ( with results of Brain CT scan)


0.4
    Ischaemic 148 (71%) 33 (79%) 181 (72%)
    Haemorrhage infarct 10 (4.8%) 0 (0%) 10 (4.0%)
    Haemorrhagic 43 (21%) 9 (21%) 52 (21%)
    Ischaemic and Haemorrhagic 7 (3.4%) 0 (0%) 7 (2.8%)
    Unknown 21 8 29
d_st_type


0.6
    Intracerebral Hemorrhagic Stroke 54 (24%) 9 (18%) 63 (23%)
    Ischemic Stroke 160 (70%) 37 (74%) 197 (71%)
    Untyped Stroke (no CT scan available) 15 (6.6%) 4 (8.0%) 19 (6.8%)
NIH Stroke Scale 3.0 (0.0, 7.0) 2.0 (0.0, 9.0) 2.0 (0.0, 7.0) 0.7
    Unknown 2 0 2
Modified Ranking Score


0.5
    0 20 (8.7%) 1 (2.0%) 21 (7.5%)
    1 51 (22%) 12 (24%) 63 (23%)
    2 69 (30%) 20 (40%) 89 (32%)
    3 44 (19%) 8 (16%) 52 (19%)
    4 44 (19%) 9 (18%) 53 (19%)
    5 1 (0.4%) 0 (0%) 1 (0.4%)
dm 65 (28%) 25 (50%) 90 (32%) 0.003
tobacco_use 18 (8.1%) 5 (10%) 23 (8.5%) 0.6
    Unknown 7 0 7
Categorised Body Mass Index


0.052
    Normal 103 (46%) 13 (27%) 116 (43%)
    Overweight 67 (30%) 19 (40%) 86 (32%)
    Obese 53 (24%) 16 (33%) 69 (25%)
    Unknown 6 2 8
waist_hip_ratio 0.93 (0.88, 0.96) 0.93 (0.89, 0.97) 0.93 (0.89, 0.96) 0.5
    Unknown 6 0 6
Study Arm


0.012
    Routine 123 (54%) 17 (34%) 140 (50%)
    Intervention 106 (46%) 33 (66%) 139 (50%)
alcohol_curr 23 (10%) 9 (18%) 32 (11%) 0.11
ff_hba1c_0 5.70 (5.30, 6.40) 5.85 (5.40, 7.10) 5.80 (5.40, 6.70) 0.10
    Unknown 31 4 35
High HbA1C 48 (24%) 19 (41%) 67 (27%) 0.020
    Unknown 31 4 35
ACE-Inhibitors 12 (5.2%) 7 (14%) 19 (6.8%) 0.055
Angiotensin Receptor Blocker 22 (9.6%) 4 (8.0%) 26 (9.3%) >0.9
Beta blockers 9 (3.9%) 1 (2.0%) 10 (3.6%) >0.9
Calcium Channel Blocker 92 (40%) 23 (46%) 115 (41%) 0.4
Diuretics 7 (3.1%) 2 (4.0%) 9 (3.2%) 0.7
Alpha Methyl Dopa 8 (3.5%) 1 (2.0%) 9 (3.2%) >0.9
Alpha Adrenergic Blockers 2 (0.9%) 1 (2.0%) 3 (1.1%) 0.4
Antiplatelet 28 (13%) 6 (13%) 34 (13%) >0.9
    Unknown 10 5 15
Statins 22 (10%) 3 (7.0%) 25 (9.6%) 0.8
    Unknown 12 7 19
Total Hillbone Score 52.0 (51.0, 53.0) 52.0 (50.0, 53.0) 52.0 (50.0, 53.0) 0.2
    Unknown 4 0 4
Total HKQ Score 9 (7, 10) 8 (5, 10) 9 (7, 10) 0.2
    Unknown 10 2 12
Health Related QoL 10.00 (8.00, 11.00) 10.00 (9.00, 10.00) 10.00 (8.00, 11.00) 0.4
    Unknown 90 19 109
hosp_cat


>0.9
    Primary 73 (32%) 15 (30%) 88 (32%)
    Secondary 41 (18%) 9 (18%) 50 (18%)
    Tertiary 115 (50%) 26 (52%) 141 (51%)
Antihypertensive treatment intensity 1.50 (0.83, 1.83) 1.44 (1.00, 1.92) 1.46 (0.92, 1.83) 0.9
    Unknown 32 8 40
1 Median (Q1, Q3); n (%)
2 Wilcoxon rank sum test; Pearson’s Chi-squared test; Fisher’s exact test

Table 2 - Composite score (130mmHg, 1.4mm/L)

Show code
gtsummary::reset_gtsummary_theme()
gtsummary::theme_gtsummary_compact()
Setting theme "Compact"
Show code
df_ready |>
  select(-c(outc_140_18, hyperlipidemia))|>
  gtsummary::tbl_summary(by = outc_130_14) |> 
  gtsummary::modify_spanning_header(
        gtsummary::all_stat_cols() ~ "**SBP < 130, LDL < 1.4 mmol/L**") %>% 
  gtsummary::add_overall(last = T) |>
  gtsummary::add_p()|>
  gtsummary::bold_p()|>
  gtsummary::bold_labels() |>
  gtsummary::modify_caption(
      "**Table 1B**: DEMOGRAPHIC & CLINICAL CHARACTERISTICS OF STUDY PARTICIPANTS") 
86 missing rows in the "outc_130_14" column have been removed.
Table 1B: DEMOGRAPHIC & CLINICAL CHARACTERISTICS OF STUDY PARTICIPANTS
Characteristic
SBP < 130, LDL < 1.4 mmol/L
Overall
N = 2791
p-value2
No
N = 2611
Yes
N = 181
a_agebase 58 (50, 66) 58 (52, 67) 58 (51, 66) >0.9
Gender


0.2
    Male 149 (57%) 13 (72%) 162 (58%)
    Female 112 (43%) 5 (28%) 117 (42%)
Educational Status


0.3
    None 21 (8.0%) 2 (11%) 23 (8.2%)
    Primary 111 (43%) 4 (22%) 115 (41%)
    Secondary 86 (33%) 8 (44%) 94 (34%)
    Tertiary 43 (16%) 4 (22%) 47 (17%)
Marital Status


0.7
    Currently Married 171 (66%) 14 (78%) 185 (66%)
    Previously Married 78 (30%) 4 (22%) 82 (29%)
    Never Married 12 (4.6%) 0 (0%) 12 (4.3%)
Domicile


>0.9
    Rural 15 (5.7%) 1 (5.6%) 16 (5.7%)
    Semi-Urban 86 (33%) 6 (33%) 92 (33%)
    Urban 160 (61%) 11 (61%) 171 (61%)
Income in GHC


0.7
    0-100 98 (38%) 6 (33%) 104 (38%)
    101-250 76 (29%) 6 (33%) 82 (30%)
    251-500 58 (22%) 3 (17%) 61 (22%)
    >500 27 (10%) 3 (17%) 30 (11%)
    Unknown 2 0 2
Religion


0.2
    Christianity 243 (93%) 15 (83%) 258 (92%)
    Islam 16 (6.1%) 3 (17%) 19 (6.8%)
    Other 2 (0.8%) 0 (0%) 2 (0.7%)
Stroke Subtype ( with results of Brain CT scan)


>0.9
    Ischaemic 169 (72%) 12 (75%) 181 (72%)
    Haemorrhage infarct 10 (4.3%) 0 (0%) 10 (4.0%)
    Haemorrhagic 48 (21%) 4 (25%) 52 (21%)
    Ischaemic and Haemorrhagic 7 (3.0%) 0 (0%) 7 (2.8%)
    Unknown 27 2 29
d_st_type


>0.9
    Intracerebral Hemorrhagic Stroke 59 (23%) 4 (22%) 63 (23%)
    Ischemic Stroke 184 (70%) 13 (72%) 197 (71%)
    Untyped Stroke (no CT scan available) 18 (6.9%) 1 (5.6%) 19 (6.8%)
NIH Stroke Scale 3.0 (0.0, 7.0) 1.5 (0.0, 8.0) 2.0 (0.0, 7.0) 0.8
    Unknown 2 0 2
Modified Ranking Score


0.8
    0 20 (7.7%) 1 (5.6%) 21 (7.5%)
    1 57 (22%) 6 (33%) 63 (23%)
    2 83 (32%) 6 (33%) 89 (32%)
    3 50 (19%) 2 (11%) 52 (19%)
    4 50 (19%) 3 (17%) 53 (19%)
    5 1 (0.4%) 0 (0%) 1 (0.4%)
dm 82 (31%) 8 (44%) 90 (32%) 0.3
tobacco_use 22 (8.7%) 1 (5.6%) 23 (8.5%) >0.9
    Unknown 7 0 7
Categorised Body Mass Index


0.5
    Normal 111 (44%) 5 (31%) 116 (43%)
    Overweight 79 (31%) 7 (44%) 86 (32%)
    Obese 65 (25%) 4 (25%) 69 (25%)
    Unknown 6 2 8
waist_hip_ratio 0.93 (0.88, 0.96) 0.93 (0.89, 0.98) 0.93 (0.89, 0.96) 0.8
    Unknown 6 0 6
Study Arm


0.6
    Routine 130 (50%) 10 (56%) 140 (50%)
    Intervention 131 (50%) 8 (44%) 139 (50%)
alcohol_curr 30 (11%) 2 (11%) 32 (11%) >0.9
ff_hba1c_0 5.80 (5.40, 6.70) 5.70 (5.40, 6.70) 5.80 (5.40, 6.70) 0.7
    Unknown 34 1 35
High HbA1C 62 (27%) 5 (29%) 67 (27%) 0.8
    Unknown 34 1 35
ACE-Inhibitors 15 (5.7%) 4 (22%) 19 (6.8%) 0.026
Angiotensin Receptor Blocker 25 (9.6%) 1 (5.6%) 26 (9.3%) >0.9
Beta blockers 9 (3.4%) 1 (5.6%) 10 (3.6%) 0.5
Calcium Channel Blocker 105 (40%) 10 (56%) 115 (41%) 0.2
Diuretics 8 (3.1%) 1 (5.6%) 9 (3.2%) 0.5
Alpha Methyl Dopa 9 (3.4%) 0 (0%) 9 (3.2%) >0.9
Alpha Adrenergic Blockers 3 (1.1%) 0 (0%) 3 (1.1%) >0.9
Antiplatelet 31 (13%) 3 (19%) 34 (13%) 0.4
    Unknown 13 2 15
Statins 24 (9.8%) 1 (6.3%) 25 (9.6%) >0.9
    Unknown 17 2 19
Total Hillbone Score 52.0 (51.0, 53.0) 51.5 (48.0, 53.0) 52.0 (50.0, 53.0) 0.12
    Unknown 4 0 4
Total HKQ Score 9 (7, 10) 8 (5, 11) 9 (7, 10) 0.6
    Unknown 12 0 12
Health Related QoL 10.00 (8.00, 10.00) 11.00 (9.00, 13.00) 10.00 (8.00, 11.00) 0.2
    Unknown 99 10 109
hosp_cat


0.5
    Primary 83 (32%) 5 (28%) 88 (32%)
    Secondary 45 (17%) 5 (28%) 50 (18%)
    Tertiary 133 (51%) 8 (44%) 141 (51%)
Antihypertensive treatment intensity 1.46 (0.92, 1.83) 1.42 (0.96, 2.00) 1.46 (0.92, 1.83) 0.9
    Unknown 36 4 40
1 Median (Q1, Q3); n (%)
2 Wilcoxon rank sum test; Pearson’s Chi-squared test; Fisher’s exact test

Regression - Composite score (140mmHg, 1.8mmol/L)

Show code
df_ready |>
  select(-c(outc_130_14, hyperlipidemia)) |>
  mutate(outc_140_18 = factor(outc_140_18))|>
  drop_na(outc_140_18)|>
  gtsummary::tbl_uvregression(
        y = outc_140_18, 
        method = glm,
        method.args = list(family = binomial),
        exponentiate = TRUE,
        pvalue_fun = function(x) gtsummary::style_pvalue(x, digits = 3)) |>
  gtsummary::bold_p()|>
  gtsummary::bold_labels()|>
  gtsummary::modify_caption(
      "**Table 2A**: Univariate regression for predictors of composite score (140mmHg, & 1.8mm/L)") 
Table 2A: Univariate regression for predictors of composite score (140mmHg, & 1.8mm/L)
Characteristic N OR 95% CI p-value
a_agebase 279 1.02 1.00, 1.05 0.089
Gender 279


    Male
— —
    Female
0.91 0.48, 1.68 0.760
Educational Status 279


    None
— —
    Primary
0.53 0.19, 1.62 0.234
    Secondary
0.77 0.28, 2.35 0.620
    Tertiary
0.41 0.11, 1.50 0.173
Marital Status 279


    Currently Married
— —
    Previously Married
0.81 0.39, 1.59 0.548
    Never Married
0.86 0.13, 3.44 0.847
Domicile 279


    Rural
— —
    Semi-Urban
0.54 0.16, 2.14 0.338
    Urban
0.69 0.22, 2.60 0.544
Income in GHC 277


    0-100
— —
    101-250
0.94 0.44, 1.97 0.871
    251-500
0.82 0.35, 1.86 0.649
    >500
0.84 0.26, 2.33 0.751
Religion 279


    Christianity
— —
    Islam
2.24 0.75, 6.02 0.120
    Other
0.00
0.989
Stroke Subtype ( with results of Brain CT scan) 250


    Ischaemic
— —
    Haemorrhage infarct
0.00
0.990
    Haemorrhagic
0.94 0.40, 2.04 0.879
    Ischaemic and Haemorrhagic
0.00
0.991
d_st_type 279


    Intracerebral Hemorrhagic Stroke
— —
    Ischemic Stroke
1.39 0.65, 3.23 0.417
    Untyped Stroke (no CT scan available)
1.60 0.39, 5.69 0.482
NIH Stroke Scale 277 1.02 0.96, 1.08 0.566
Modified Ranking Score 279 1.03 0.80, 1.33 0.800
dm 279


    No
— —
    Yes
2.52 1.35, 4.73 0.004
tobacco_use 272


    No
— —
    Yes
1.26 0.40, 3.35 0.665
Categorised Body Mass Index 271


    Normal
— —
    Overweight
2.25 1.05, 4.95 0.039
    Obese
2.39 1.07, 5.42 0.033
waist_hip_ratio 273 0.96
0.790
Study Arm 279


    Routine
— —
    Intervention
2.25 1.20, 4.35 0.013
alcohol_curr 279


    No
— —
    Yes
1.97 0.81, 4.44 0.115
ff_hba1c_0 244 1.10 0.95, 1.27 0.190
High HbA1C 244


    No
— —
    Yes
2.20 1.11, 4.29 0.021
ACE-Inhibitors 279


    No
— —
    Yes
2.94 1.04, 7.76 0.032
Angiotensin Receptor Blocker 279


    No
— —
    Yes
0.82 0.23, 2.26 0.724
Beta blockers 279


    No
— —
    Yes
0.50 0.03, 2.75 0.514
Calcium Channel Blocker 279


    No
— —
    Yes
1.27 0.68, 2.35 0.449
Diuretics 279


    No
— —
    Yes
1.32 0.19, 5.67 0.733
Alpha Methyl Dopa 279


    No
— —
    Yes
0.56 0.03, 3.18 0.593
Alpha Adrenergic Blockers 279


    No
— —
    Yes
2.32 0.11, 24.6 0.496
Antiplatelet 264


    Yes
— —
    No
0.95 0.39, 2.68 0.920
Statins 260


    Yes
— —
    No
1.50 0.49, 6.57 0.523
Total Hillbone Score 275 0.96 0.89, 1.05 0.358
Total HKQ Score 267 0.91 0.83, 1.01 0.084
Health Related QoL 170 1.10 0.90, 1.35 0.331
hosp_cat 279


    Primary
— —
    Secondary
1.07 0.42, 2.62 0.887
    Tertiary
1.10 0.55, 2.26 0.789
Antihypertensive treatment intensity 239 1.03 0.64, 1.64 0.905
Abbreviations: CI = Confidence Interval, OR = Odds Ratio

Regression - Composite score (130mmHg, 1.4mmol/L)

Show code
df_ready |>
  select(-c(outc_140_18, hyperlipidemia)) |>
  mutate(outc_130_14 = factor(outc_130_14))|>
  drop_na(outc_130_14)|>
  gtsummary::tbl_uvregression(
        y = outc_130_14, 
        method = glm,
        method.args = list(family = binomial),
        exponentiate = TRUE,
        pvalue_fun = function(x) gtsummary::style_pvalue(x, digits = 3)) |>
  gtsummary::bold_p()|>
  gtsummary::bold_labels() |>
  gtsummary::modify_caption(
      "**Table 2A**: Univariate regression for predictors of composite score (130mmHg, & 1.4mm/L)") 
Table 2A: Univariate regression for predictors of composite score (130mmHg, & 1.4mm/L)
Characteristic N OR 95% CI p-value
a_agebase 279 1.00 0.96, 1.04 0.883
Gender 279


    Male
— —
    Female
0.51 0.16, 1.40 0.215
Educational Status 279


    None
— —
    Primary
0.38 0.07, 2.85 0.279
    Secondary
0.98 0.22, 6.79 0.977
    Tertiary
0.98 0.18, 7.45 0.979
Marital Status 279


    Currently Married
— —
    Previously Married
0.63 0.17, 1.81 0.422
    Never Married
0.00
0.989
Domicile 279


    Rural
— —
    Semi-Urban
1.05 0.16, 20.5 0.967
    Urban
1.03 0.18, 19.5 0.977
Income in GHC 277


    0-100
— —
    101-250
1.29 0.39, 4.27 0.670
    251-500
0.84 0.17, 3.33 0.816
    >500
1.81 0.36, 7.37 0.420
Religion 279


    Christianity
— —
    Islam
3.04 0.66, 10.4 0.104
    Other
0.00
0.990
Stroke Subtype ( with results of Brain CT scan) 250


    Ischaemic
— —
    Haemorrhage infarct
0.00
0.994
    Haemorrhagic
1.17 0.32, 3.54 0.790
    Ischaemic and Haemorrhagic
0.00
0.995
d_st_type 279


    Intracerebral Hemorrhagic Stroke
— —
    Ischemic Stroke
1.04 0.35, 3.81 0.944
    Untyped Stroke (no CT scan available)
0.82 0.04, 5.99 0.863
NIH Stroke Scale 277 1.00 0.90, 1.09 0.986
Modified Ranking Score 279 0.86 0.57, 1.28 0.468
dm 279


    No
— —
    Yes
1.75 0.65, 4.59 0.258
tobacco_use 272


    No
— —
    Yes
0.62 0.03, 3.25 0.650
Categorised Body Mass Index 271


    Normal
— —
    Overweight
1.97 0.61, 6.86 0.262
    Obese
1.37 0.33, 5.34 0.651
waist_hip_ratio 273 0.95
0.897
Study Arm 279


    Routine
— —
    Intervention
0.79 0.29, 2.08 0.638
alcohol_curr 279


    No
— —
    Yes
0.96 0.15, 3.61 0.961
ff_hba1c_0 244 1.04 0.80, 1.27 0.754
High HbA1C 244


    No
— —
    Yes
1.11 0.34, 3.12 0.852
ACE-Inhibitors 279


    No
— —
    Yes
4.69 1.22, 15.0 0.014
Angiotensin Receptor Blocker 279


    No
— —
    Yes
0.56 0.03, 2.89 0.575
Beta blockers 279


    No
— —
    Yes
1.65 0.09, 9.55 0.645
Calcium Channel Blocker 279


    No
— —
    Yes
1.86 0.71, 5.01 0.207
Diuretics 279


    No
— —
    Yes
1.86 0.10, 11.0 0.569
Alpha Methyl Dopa 279


    No
— —
    Yes
0.00
0.991
Alpha Adrenergic Blockers 279


    No
— —
    Yes
0.00
0.992
Antiplatelet 264


    Yes
— —
    No
0.62 0.19, 2.81 0.473
Statins 260


    Yes
— —
    No
1.64 0.31, 30.2 0.641
Total Hillbone Score 275 0.92 0.84, 1.03 0.119
Total HKQ Score 267 0.94 0.81, 1.11 0.449
Health Related QoL 170 1.37 0.97, 1.96 0.075
hosp_cat 279


    Primary
— —
    Secondary
1.84 0.49, 6.96 0.353
    Tertiary
1.00 0.32, 3.40 0.998
Antihypertensive treatment intensity 239 1.08 0.49, 2.24 0.846
Abbreviations: CI = Confidence Interval, OR = Odds Ratio

Multivariate rgresssion - Composite score (140mmHg, 1.8mmol/L)

Show code
df_temp <- 
  df_ready |>
  select(outc_140_18, a_agebase, dm, bmi_cat, arm, h_acei)

model_1 <- 
  glm(outc_140_18 ~ . , data = df_temp, family = binomial)

model_1 |> 
  gtsummary::tbl_regression(exponentiate = TRUE) |>
  gtsummary::bold_p()|>
  gtsummary::bold_labels() |>
  gtsummary::modify_caption(
      "**Table 3**: Multivariable  regression for predictors of composite score (130mmHg, & 1.4mm/L)") 
Table 3: Multivariable regression for predictors of composite score (130mmHg, & 1.4mm/L)
Characteristic OR 95% CI p-value
a_agebase 1.03 1.00, 1.06 0.076
dm


    No — —
    Yes 1.97 1.00, 3.88 0.050
Categorised Body Mass Index


    Normal — —
    Overweight 1.98 0.88, 4.54 0.10
    Obese 2.49 1.09, 5.82 0.032
Study Arm


    Routine — —
    Intervention 2.09 1.06, 4.25 0.036
ACE-Inhibitors


    No — —
    Yes 2.66 0.89, 7.51 0.068
Abbreviations: CI = Confidence Interval, OR = Odds Ratio

Sernsitivity analysis

Show code
df_for_sens <- 
  df_paper_20 |> 
  mutate(
    age_less_60 = case_when(
      a_agebase < 60 ~ "Yes", 
      a_agebase  >= 60 ~ "No") |>  factor(),
    obese = case_when(
      bmi < 30 ~ "No", 
      bmi >= 30 ~ "Yes")|> factor(), 
    egfr_less_60 = case_when(
      ff_egfr_0 < 60 ~ "Yes", ff_egfr_0 >= 60 ~ "No" ) |> factor(), 
    tertiary_hosp = case_when(
      hosp_cat == "Tertiary" ~ "Yes", 
      hosp_cat %in% c("Secondary", "Primary") ~ "No") |> factor(), 
    income_less_100 = case_when(
      income == "0-100" ~ "Yes", 
      income %in% c("101-250", "251-500", ">500") ~ "No") |> factor(), 
    outc_140_18 = factor(outc_140_18)) |>
  select(
    outc_140_18, age_less_60, dm, obese, egfr_less_60, tertiary_hosp, 
    income_less_100, arm)

df_for_sens <- 
  df_for_sens |>
  labelled::set_variable_labels(
            outc_140_18  = "Composite outcome", 
            age_less_60 = "Age < 60 years", 
            obese = "Obesity",
            egfr_less_60 = "eGFR < 60", 
            tertiary_hosp =  "Tertiary Hospital", 
            income_less_100 = "Income < GHS 100")

Table 4

Show code
tbl_intervention <- 
  df_for_sens |>
  filter(arm == "Intervention") |>
  drop_na(outc_140_18)|>
  select(-arm) |>
  gtsummary::tbl_uvregression(
        y = outc_140_18, 
        method = glm,
        method.args = list(family = binomial),
        exponentiate = TRUE,
        pvalue_fun = function(x) gtsummary::style_pvalue(x, digits = 3)) |>
  gtsummary::bold_p()|>
  gtsummary::bold_labels()

tbl_routine <- 
  df_for_sens |>
  filter(arm == "Routine") |>
  drop_na(outc_140_18)|>
  select(-arm) |>
  gtsummary::tbl_uvregression(
        y = outc_140_18, 
        method = glm,
        method.args = list(family = binomial),
        exponentiate = TRUE,
        pvalue_fun = function(x) gtsummary::style_pvalue(x, digits = 3)) |>
  gtsummary::bold_p()|>
  gtsummary::bold_labels()

gtsummary::tbl_merge(
  tab_spanner = c("**Routine**", "**Intervention**"),
  tbls = list(tbl_routine, tbl_intervention)) |>
  gtsummary::modify_caption(
      "**Table 4**: Comparative univariate predictors of composite score") 
Table 4: Comparative univariate predictors of composite score
Characteristic
Routine
Intervention
N OR 95% CI p-value N OR 95% CI p-value
Age < 60 years 140


139


    No
— —

— —
    Yes
1.32 0.47, 3.84 0.600
0.45 0.20, 0.98 0.047
Diabetes Mellitus 140


139


    No
— —

— —
    Yes
6.21 2.16, 18.8 <0.001
1.27 0.57, 2.79 0.552
Obesity 137


134


    No
— —

— —
    Yes
1.06 0.28, 3.31 0.928
1.95 0.82, 4.54 0.123
eGFR < 60 140


139


    No
— —

— —
    Yes
0.54 0.18, 1.50 0.248
0.87 0.39, 1.89 0.718
Tertiary Hospital 140


139


    No
— —

— —
    Yes
0.87 0.31, 2.43 0.796
1.20 0.55, 2.66 0.648
Income < GHS 100 140


137


    No
— —

— —
    Yes
0.74 0.24, 2.09 0.585
1.66 0.73, 3.71 0.219
Abbreviations: CI = Confidence Interval, OR = Odds Ratio