Under_recognition and VACS

Characteristic Overall
N = 1481
Absent
N = 441
Under-recognized
N = 311
Recognized
N = 531
Unclear
N = 201
p-value2
Age (years) 59 (54, 64) 59 (54, 64) 56 (52, 59) 58 (53, 64) 63 (60, 65) 0.002
Sex




0.107
    Male 47 (31.76%) 15 (34.09%) 9 (29.03%) 21 (39.62%) 2 (10.00%)
    Female 101 (68.24%) 29 (65.91%) 22 (70.97%) 32 (60.38%) 18 (90.00%)
Occupation




0.091
    Full time 89 (64.96%) 29 (70.73%) 25 (80.65%) 28 (56.00%) 7 (46.67%)
    Retired 3 (2.19%) 1 (2.44%) 0 (0.00%) 1 (2.00%) 1 (6.67%)
    Unemployed 45 (32.85%) 11 (26.83%) 6 (19.35%) 21 (42.00%) 7 (46.67%)
    Unknown 11 3 0 3 5
Highest Level of Education





    No formal education 33 (22.45%) 13 (29.55%) 9 (29.03%) 9 (17.31%) 2 (10.00%)
    Basic education 34 (23.13%) 9 (20.45%) 6 (19.35%) 11 (21.15%) 8 (40.00%)
    Middle school leaver 58 (39.46%) 16 (36.36%) 12 (38.71%) 23 (44.23%) 7 (35.00%)
    Secondary or Technical 15 (10.20%) 4 (9.09%) 4 (12.90%) 6 (11.54%) 1 (5.00%)
    Tertiary 7 (4.76%) 2 (4.55%) 0 (0.00%) 3 (5.77%) 2 (10.00%)
    Unknown 1 0 0 1 0
marital_status





    Married 39 (26.35%) 9 (20.45%) 9 (29.03%) 15 (28.30%) 6 (30.00%)
    Single 7 (4.73%) 2 (4.55%) 2 (6.45%) 3 (5.66%) 0 (0.00%)
    Divorced/Separated 38 (25.68%) 10 (22.73%) 7 (22.58%) 16 (30.19%) 5 (25.00%)
    Widow 62 (41.89%) 23 (52.27%) 12 (38.71%) 18 (33.96%) 9 (45.00%)
    Cohabiting 2 (1.35%) 0 (0.00%) 1 (3.23%) 1 (1.89%) 0 (0.00%)
Religion




0.275
    Muslim 19 (12.93%) 8 (18.60%) 3 (9.68%) 7 (13.21%) 1 (5.00%)
    Christian 122 (82.99%) 33 (76.74%) 25 (80.65%) 45 (84.91%) 19 (95.00%)
    Traditional 1 (0.68%) 1 (2.33%) 0 (0.00%) 0 (0.00%) 0 (0.00%)
    None 4 (2.72%) 0 (0.00%) 3 (9.68%) 1 (1.89%) 0 (0.00%)
    Other 1 (0.68%) 1 (2.33%) 0 (0.00%) 0 (0.00%) 0 (0.00%)
    Unknown 1 1 0 0 0
Number of Children 4 (2, 5) 4 (2, 5) 4 (3, 6) 3 (2, 5) 3 (2, 4) 0.185
    Unknown 5 1 1 2 1
Daily Wage




0.374
    below median 30 (47.62%) 7 (35.00%) 7 (43.75%) 13 (61.90%) 3 (50.00%)
    above median 33 (52.38%) 13 (65.00%) 9 (56.25%) 8 (38.10%) 3 (50.00%)
    Unknown 85 24 15 32 14
HIV Disclosure




0.620
    1 100 (67.57%) 28 (63.64%) 21 (67.74%) 35 (66.04%) 16 (80.00%)
    2 48 (32.43%) 16 (36.36%) 10 (32.26%) 18 (33.96%) 4 (20.00%)
Duration since diagnosis (years)




0.363
    < 5 years 30 (21.28%) 8 (18.60%) 5 (18.52%) 12 (23.08%) 5 (26.32%)
    5-10 years 77 (54.61%) 27 (62.79%) 18 (66.67%) 25 (48.08%) 7 (36.84%)
    >10 years 34 (24.11%) 8 (18.60%) 4 (14.81%) 15 (28.85%) 7 (36.84%)
    Unknown 7 1 4 1 1
new_viral_load 19 (0, 22) 19 (0, 41) 0 (0, 20) 19 (0, 20) 10 (0, 21) 0.605
Exposure to polypharmacy, including HIV medications




<0.001
    Use of only HIV medications 42 (28.38%) 20 (45.45%) 15 (48.39%) 5 (9.43%) 2 (10.00%)
    Use of 1-3 medications, including medications for HIV 64 (43.24%) 23 (52.27%) 14 (45.16%) 22 (41.51%) 5 (25.00%)
    Use of 4 or more medications including medications for HIV 42 (28.38%) 1 (2.27%) 2 (6.45%) 26 (49.06%) 13 (65.00%)
Exposure to polypharmacy, excluding HIV medications





    Use of no-non-HIV medications 42 (28.38%) 20 (45.45%) 15 (48.39%) 5 (9.43%) 2 (10.00%)
    Use of 1-3 non-HIV medications 81 (54.73%) 24 (54.55%) 15 (48.39%) 31 (58.49%) 11 (55.00%)
    Use of 4 ore more non-HIV medications 25 (16.89%) 0 (0.00%) 1 (3.23%) 17 (32.08%) 7 (35.00%)
Physical Activity (<600 MET-minutes/week)




0.441
    Inactive 47 (31.76%) 10 (22.73%) 10 (32.26%) 19 (35.85%) 8 (40.00%)
    Active 101 (68.24%) 34 (77.27%) 21 (67.74%) 34 (64.15%) 12 (60.00%)
new_bmi 25.4 (22.5, 29.2) 24.8 (22.4, 28.6) 26.7 (23.2, 30.4) 25.7 (22.4, 29.2) 25.0 (22.0, 27.4) 0.444
    Unknown 1 0 0 1 0
Body Mass Index Categories





    Underweight 5 (3.40%) 2 (4.55%) 1 (3.23%) 1 (1.92%) 1 (5.00%)
    Normal Weight 64 (43.54%) 21 (47.73%) 11 (35.48%) 23 (44.23%) 9 (45.00%)
    Overweight 48 (32.65%) 14 (31.82%) 11 (35.48%) 16 (30.77%) 7 (35.00%)
    Obese 30 (20.41%) 7 (15.91%) 8 (25.81%) 12 (23.08%) 3 (15.00%)
    Unknown 1 0 0 1 0
audit_c_category_collapse




0.694
    No Alcohol 102 (68.92%) 33 (75.00%) 20 (64.52%) 35 (66.04%) 14 (70.00%)
    Low 35 (23.65%) 9 (20.45%) 10 (32.26%) 11 (20.75%) 5 (25.00%)
    Moderate 7 (4.73%) 1 (2.27%) 0 (0.00%) 5 (9.43%) 1 (5.00%)
    High/Severe 4 (2.70%) 1 (2.27%) 1 (3.23%) 2 (3.77%) 0 (0.00%)
diabetes_mellitus 10 (6.76%) 1 (2.27%) 0 (0.00%) 6 (11.32%) 3 (15.00%) 0.041
dyslipidemia




0.450
    1 7 (4.73%) 1 (2.27%) 2 (6.45%) 2 (3.77%) 2 (10.00%)
    2 141 (95.27%) 43 (97.73%) 29 (93.55%) 51 (96.23%) 18 (90.00%)
renal_disease





    Early 72 (48.65%) 24 (54.55%) 15 (48.39%) 27 (50.94%) 6 (30.00%)
    Failure 1 (0.68%) 0 (0.00%) 1 (3.23%) 0 (0.00%) 0 (0.00%)
    Moderate Disease 46 (31.08%) 13 (29.55%) 8 (25.81%) 18 (33.96%) 7 (35.00%)
    None 27 (18.24%) 6 (13.64%) 7 (22.58%) 8 (15.09%) 6 (30.00%)
    Severe 2 (1.35%) 1 (2.27%) 0 (0.00%) 0 (0.00%) 1 (5.00%)
gds_score 4.0 (2.0, 6.0) 4.0 (2.5, 5.5) 3.0 (2.0, 7.0) 3.0 (1.0, 5.0) 4.5 (2.0, 6.5) 0.660
rt_visual_impairment_category




0.836
    Normal 64 (43.54%) 16 (36.36%) 12 (38.71%) 26 (50.00%) 10 (50.00%)
    Mild 0 (0.00%) 0 (0.00%) 0 (0.00%) 0 (0.00%) 0 (0.00%)
    Moderate 66 (44.90%) 21 (47.73%) 17 (54.84%) 19 (36.54%) 9 (45.00%)
    Severe 10 (6.80%) 4 (9.09%) 1 (3.23%) 4 (7.69%) 1 (5.00%)
    Blind 7 (4.76%) 3 (6.82%) 1 (3.23%) 3 (5.77%) 0 (0.00%)
    Unknown 1 0 0 1 0
lt_visual_impairment_category




0.338
    Normal 75 (51.37%) 20 (45.45%) 14 (46.67%) 30 (57.69%) 11 (55.00%)
    Mild 5 (3.42%) 3 (6.82%) 1 (3.33%) 1 (1.92%) 0 (0.00%)
    Moderate 56 (38.36%) 18 (40.91%) 15 (50.00%) 17 (32.69%) 6 (30.00%)
    Severe 3 (2.05%) 2 (4.55%) 0 (0.00%) 0 (0.00%) 1 (5.00%)
    Blind 7 (4.79%) 1 (2.27%) 0 (0.00%) 4 (7.69%) 2 (10.00%)
    Unknown 2 0 1 1 0
lt_hearing_problem 46 (31.08%) 13 (29.55%) 8 (25.81%) 18 (33.96%) 7 (35.00%) 0.850
rt_hearing_problem 61 (41.22%) 14 (31.82%) 11 (35.48%) 22 (41.51%) 14 (70.00%) 0.031
hillbone_medication_adherence 36.00 (34.00, 36.00) 35.00 (34.00, 36.00) 36.00 (34.00, 36.00) 35.50 (34.00, 36.00) 36.00 (34.50, 36.00) 0.902
    Unknown 1 0 0 1 0
1 Median (Q1, Q3); n (%)
2 Kruskal-Wallis rank sum test; Pearson’s Chi-squared test; Fisher’s exact test; NA

Code
#|echo: false
#|message: false
#|warning: false


confounders <- c("age", 
                 "gender", 
                 "daily_wage", 
                 "diabetes_mellitus", 
                 "audit_c_category_collapse",
                 "dyslipidemia", 
                 "renal_disease", 
                 "education",
                 "lt_hearing_problem", 
                 "rt_hearing_problem", 
                 "rt_visual_impairment_category", 
                 "lt_visual_impairment_category", 
                 "gds_score"
                 )


weight_model <- df_clean %>% select(
c(all_of(confounders), htn_status)
) %>% filter(!is.na(htn_status)) %>% 
  clean_names()

weight_model <- weight_model %>%
  mutate(across(where(is.factor), ~ forcats::fct_relabel(., make.names)))

weight_mod <-  weightit(formula = htn_status ~  age + gender + daily_wage+ diabetes_mellitus+
                          audit_c_category_collapse + dyslipidemia+ education+vi_severity, 
                        data = df_clean,
                        method = "cbps", 

                        estimand = "ATE", 
        
                        stabilize = TRUE,
                       )
Warning: Missing values are present in the covariates. See
`?WeightIt::method_cbps` for information on how these are handled.
Warning: `stabilize` cannot be used with covariate balancing propensity score
weighting and will be ignored.
Code
cobalt::love.plot(weight_mod, thresholds = 0.1, abs= F)
Warning: Missing values exist in the covariates. Displayed values omit these
observations.
Warning: Standardized mean differences and raw mean differences are present in the same
plot. Use the `stars` argument to distinguish between them and appropriately
label the x-axis. See `love.plot()` for details.

Code
weight_mod <- trim(weight_mod, at = 0.99)
Trimming weights to 99%.
Code
weight_mod <- trim(weight_mod, at = 0.01)
Trimming weights to 99%.
Code
#|echo: false
#|warning: false
#|message: false

model_1 <- df_clean %>% 
  glm(
    score_v2 ~ htn_status, 
    family = gaussian(), 
    data = .
  ) %>% tbl_regression(
    pvalue_fun = label_style_pvalue(digits = 3)
  )


model_2 <- 
  df_clean %>% 
  clean_names() %>% 
  glm(
    score_v2 ~ htn_status + age + gender + daily_wage + education, 
    family = gaussian(), 
    data = .
  ) %>% tbl_regression(
    pvalue_fun = label_style_pvalue(digits = 3)
  )


df_clean %>% 
  clean_names() %>% 
  glm(
    score_v2 ~ htn_status + bmi_cat + audit_c_category_collapse, 
    family = gaussian(), 
    data = .
  ) 

Call:  glm(formula = score_v2 ~ htn_status + bmi_cat + audit_c_category_collapse, 
    family = gaussian(), data = .)

Coefficients:
                         (Intercept)            htn_statusUnder-recognized  
                             75.5613                               -4.5084  
                htn_statusRecognized                     htn_statusUnclear  
                              0.1233                                0.8652  
                bmi_catNormal Weight                     bmi_catOverweight  
                             -8.2488                              -15.4291  
                        bmi_catObese          audit_c_category_collapseLow  
                            -21.1554                               -4.1634  
   audit_c_category_collapseModerate  audit_c_category_collapseHigh/Severe  
                             -7.7503                               -6.0184  

Degrees of Freedom: 146 Total (i.e. Null);  137 Residual
  (1 observation deleted due to missingness)
Null Deviance:      23070 
Residual Deviance: 16580    AIC: 1134
Code
model_3 <- 
  df_clean %>% 
  clean_names() %>% 
  select(c(diabetes_mellitus, 
           dyslipidemia, 
           renal_disease,
           gds_score, 
           vi_severity, 
           lt_hearing_problem, 
           rt_hearing_problem,
           hillbone_medication_adherence, 
           htn_status,score_v2 )) %>% 
  glm(
    score_v2 ~ ., 
    family = gaussian(), 
    data = .
  ) %>% tbl_regression(
    pvalue_fun = label_style_pvalue(digits = 3)
  ) %>% add_vif()


tb_merged <- tbl_merge(tbls = list(model_1, model_2, model_3), tab_spanner = c("**Model 1**", "**Model 2**", "**Model 3**"))
The number rows in the tables to be merged do not match, which may result in
rows appearing out of order.
ℹ See `tbl_merge()` (`?gtsummary::tbl_merge()`) help file for details. Use
  `quiet=TRUE` to silence message.
Code
tb_merged
Characteristic
Model 1
Model 2
Model 3
Beta 95% CI p-value Beta 95% CI p-value Beta 95% CI p-value GVIF Adjusted GVIF1
htn_status








1.4 1.1
    Absent




    Under-recognized -6.5 -12, -0.81 0.027 -3.1 -11, 4.6 0.430 -6.3 -12, -0.48 0.036

    Recognized -1.6 -6.6, 3.4 0.522 -0.69 -8.4, 7.0 0.861 -0.66 -5.7, 4.3 0.796

    Unclear 0.53 -6.0, 7.1 0.875 -0.05 -11, 11 0.993 0.58 -6.4, 7.5 0.869

age


0.39 -0.15, 0.92 0.165




gender










    Male








    Female


-4.6 -12, 2.8 0.228




daily_wage










    below median








    above median


-3.2 -9.8, 3.3 0.337




education










    No formal education








    Basic education


2.9 -5.9, 12 0.519




    Middle school leaver


-2.9 -11, 5.3 0.490




    Secondary or Technical


-3.2 -13, 7.0 0.545




    Tertiary


-9.8 -25, 5.8 0.225




diabetes_mellitus





-6.3 -15, 2.1 0.146 1.2 1.1
dyslipidemia





2.9 -6.7, 12 0.553 1.1 1.0
renal_disease








1.4 1.0
    Early








    Failure





-1.8 -26, 23 0.888

    Moderate Disease





2.2 -2.7, 7.1 0.386

    None





1.3 -4.3, 7.0 0.646

    Severe





1.6 -16, 19 0.860

gds_score





-0.14 -0.83, 0.56 0.698 1.1 1.1
vi_severity








1.4 1.1
    Normal








    Mild





-0.38 -7.0, 6.2 0.910

    Moderate





4.5 -0.23, 9.3 0.065

    Severe/Blind





2.5 -4.5, 9.6 0.482

lt_hearing_problem





6.1 1.3, 11 0.013 1.3 1.1
rt_hearing_problem





2.0 -2.3, 6.4 0.365 1.2 1.1
hillbone_medication_adherence





-0.57 -1.7, 0.51 0.303 1.1 1.1
1 GVIF1
Abbreviations: CI = Confidence Interval, GVIF = Generalized Variance Inflation Factor

Footnotes

  1. 1/(2*df)↩︎