Determinants of Quality Of Life of recent Ghanaian stroke survivors

Author

Dr. Ayisi-Boateng

Published

December 17, 2025

Import data

Show the code
df_paper_02 <- 
    dget("df_for_papers") %>% 
    mutate(
        d_st_type = as.character(d_st_type),
        d_st_type = case_when(
            d_st_type == "Ischemic With Hemorrhagic Transformation" ~ 
            "Ischemic Stroke", 
            TRUE ~ d_st_type), 
        d_st_type = factor(
            d_st_type, 
            levels = c(
                "Ischemic Stroke", 
                "Intracerebral Hemorrhagic Stroke", 
                "Untyped Stroke (no CT scan available)")))

Summary table: All data

Show the code
gtsummary::theme_gtsummary_compact()
Setting theme "Compact"
Show the code
table_0 <- 
    df_paper_02 %>%
    gtsummary::tbl_summary(
        include = c(
            a_agebase, a_gender, maristat, educ, a_livingsit, a_religion, 
            a_domicile, income, d_st_type, d_stroke_ct,d_stroke_loc, bmi,
            mobility, selfcare,  usual_act, pain_disc, anxiety, vas, vas_cat, 
            barthels_index),
        digits = gtsummary::all_categorical()~ c(0,1),
        statistic = gtsummary::all_categorical() ~ "{n} ({p})",
        missing_text = "Missing"
    ) %>% 
    gtsummary::bold_labels() %>% 
    gtsummary::modify_caption("**Table 1**: ") %>% 
    gtsummary::modify_spanning_header(
        gtsummary::all_stat_cols() ~ "****") 

Tables

Table1

Show the code
gtsummary::reset_gtsummary_theme()
gtsummary::theme_gtsummary_compact()
Setting theme "Compact"
Show the code
df_paper_02 %>%
    mutate(a_livingsit = droplevels(a_livingsit)) %>% 
    gtsummary::tbl_summary(
        include = c(
            a_agebase, a_gender, maristat, educ, a_livingsit, 
            a_religion, a_domicile, income, d_st_type, 
            d_stroke_ct,d_stroke_loc, bmi, nihss_scale),
        digits = gtsummary::all_categorical()~ c(0,1),
        statistic = list(
            gtsummary::all_categorical() ~ "{n} ({p})",
            gtsummary::all_continuous() ~ "{mean} ({sd})", 
            nihss_scale ~ "{median} ({p25}, {p75})"
            ),
        missing = "no",
        by = a_gender,
        label = list(
            a_livingsit ~ "Living Status",
            d_st_type ~ "Stroke Type")) %>% 
    gtsummary::bold_labels() %>% 
    gtsummary::modify_caption(
        "**Table 1**: Socio-demographic and clinical characteristics of the study participants"
        ) %>% 
    gtsummary::modify_spanning_header(
        gtsummary::all_stat_cols() ~ "**Sex of study participant**") %>% 
    gtsummary::add_overall(last = TRUE)%>% 
    gtsummary::add_p(
        pvalue_fun = function(x) style_pvalue(x, digits = 3)) %>%
    gtsummary::bold_p()
Table 1: Socio-demographic and clinical characteristics of the study participants
Characteristic
Sex of study participant
Overall
N = 5001
p-value2
Male
N = 2811
Female
N = 2191
Age in years 58 (11) 59 (11) 58 (11) 0.083
Marital Status


<0.001
    Currently Married 235 (83.6) 98 (44.7) 333 (66.6)
    Previously Married 32 (11.4) 112 (51.1) 144 (28.8)
    Never Married 14 (5.0) 9 (4.1) 23 (4.6)
Educational Status


<0.001
    None 11 (3.9) 38 (17.4) 49 (9.8)
    Primary 89 (31.7) 114 (52.1) 203 (40.6)
    Secondary 114 (40.6) 51 (23.3) 165 (33.0)
    Tertiary 67 (23.8) 16 (7.3) 83 (16.6)
Living Status


<0.001
    Lives Alone 16 (5.7) 13 (5.9) 29 (5.8)
    Lives With Spouse and Children 199 (70.8) 74 (33.8) 273 (54.6)
    Lives With Spouse 18 (6.4) 12 (5.5) 30 (6.0)
    Lives With Extended Family 30 (10.7) 42 (19.2) 72 (14.4)
    Lives With Children 18 (6.4) 78 (35.6) 96 (19.2)
Religion


0.901
    Christianity 250 (89.0) 198 (90.4) 448 (89.6)
    Islam 29 (10.3) 20 (9.1) 49 (9.8)
    Other 2 (0.7) 1 (0.5) 3 (0.6)
Domicile


0.421
    Rural 16 (5.7) 17 (7.8) 33 (6.6)
    Semi-Urban 99 (35.2) 67 (30.6) 166 (33.2)
    Urban 166 (59.1) 135 (61.6) 301 (60.2)
Income in GHC


0.026
    0-100 83 (29.5) 91 (42.1) 174 (35.0)
    101-250 89 (31.7) 61 (28.2) 150 (30.2)
    251-500 67 (23.8) 42 (19.4) 109 (21.9)
    >500 42 (14.9) 22 (10.2) 64 (12.9)
Stroke Type


0.006
    Ischemic Stroke 178 (70.6) 164 (82.8) 342 (76.0)
    Intracerebral Hemorrhagic Stroke 71 (28.2) 32 (16.2) 103 (22.9)
    Untyped Stroke (no CT scan available) 3 (1.2) 2 (1.0) 5 (1.1)
Stroke Subtype ( with results of Brain CT scan)


0.004
    Ischaemic 161 (67.4) 152 (81.7) 313 (73.6)
    Haemorrhage infarct 13 (5.4) 3 (1.6) 16 (3.8)
    Haemorrhagic 55 (23.0) 29 (15.6) 84 (19.8)
    Ischaemic and Haemorrhagic 10 (4.2) 2 (1.1) 12 (2.8)
Stroke Location


0.041
    Anterior Circulation 149 (71.3) 132 (80.5) 281 (75.3)
    Posterior Circulation 60 (28.7) 32 (19.5) 92 (24.7)
Body Mass Index 25.5 (4.8) 28.0 (6.1) 26.6 (5.5) <0.001
NIH Stroke Scale 3.0 (0.0, 8.0) 3.0 (0.0, 7.5) 3.0 (0.0, 8.0) 0.757
1 Mean (SD); n (%); Median (Q1, Q3)
2 Wilcoxon rank sum test; Pearson’s Chi-squared test; Fisher’s exact test

Table 2

Show the code
# gtsummary::reset_gtsummary_theme()
# gtsummary::theme_gtsummary_compact()
df_paper_02 %>%
    gtsummary::tbl_summary(
        include = c(
            a_gender, mobility, selfcare,  usual_act, pain_disc, 
            anxiety, vas, 
            vas_cat, barthels_index),
        digits = gtsummary::all_categorical()~ c(0,1),
        statistic = list(
            gtsummary::all_categorical() ~ "{n} ({p})",
            gtsummary::all_continuous() ~ "{mean} ({sd})"
            ),
        type = list(
            c(mobility, selfcare,  usual_act, pain_disc, anxiety)~ 
                "continuous"),
        missing = "no",
        by = a_gender
    ) %>% 
    gtsummary::bold_labels() %>% 
    gtsummary::modify_caption(
        "**Table 2**: Descriptive statistics of EQ-5D, VAS and Barthel index scales"
        ) %>% 
    gtsummary::modify_spanning_header(
        gtsummary::all_stat_cols() ~ "**Sex of study participant**") %>% 
    gtsummary::add_overall(last = TRUE) %>% 
    gtsummary::add_p(pvalue_fun = function(x) style_pvalue(x, digits = 3)) %>%
    gtsummary::bold_p()
Table 2: Descriptive statistics of EQ-5D, VAS and Barthel index scales
Characteristic
Sex of study participant
Overall
N = 5001
p-value2
Male
N = 2811
Female
N = 2191
Mobility 1.71 (0.67) 1.80 (0.66) 1.75 (0.66) 0.131
Self Care 1.67 (0.72) 1.70 (0.76) 1.69 (0.74) 0.734
Usual Activity 1.84 (0.72) 1.90 (0.68) 1.87 (0.71) 0.306
Pain Discomfort 1.59 (0.60) 1.71 (0.61) 1.64 (0.61) 0.024
Anxiety 1.44 (0.60) 1.44 (0.57) 1.44 (0.58) 0.787
Your Health Today 64 (23) 68 (22) 65 (23) 0.040
Categorised VAS


0.076
    Below Median 132 (47.1) 85 (39.2) 217 (43.7)
    Median & above 148 (52.9) 132 (60.8) 280 (56.3)
Barthels Index 68 (26) 65 (29) 66 (27) 0.458
1 Mean (SD); n (%)
2 Wilcoxon rank sum test; Pearson’s Chi-squared test

Table 3: Logistic regression

Show the code
table_vas_crude <- 
    df_paper_02 %>%
    filter(!is.na(vas_cat)) %>% 
    mutate(vas_cat = factor(vas_cat)) %>% 
    select(
        a_agebase, a_gender, maristat, educ, a_livingsit, a_religion, 
        a_domicile, income, d_st_type, bmi, barthels_index, vas_cat) %>% 
     tbl_uvregression(
        y = vas_cat, 
        method = glm,
        method.args = family(binomial),
        pvalue_fun = ~ gtsummary::style_pvalue(.x, digits = 3),
        exponentiate = T) %>% 
    gtsummary::bold_labels() %>% 
    gtsummary::bold_p()

table_vas_adj <- 
    df_paper_02 %>% 
    select(
        vas_cat, a_agebase, a_gender, a_livingsit, a_domicile, 
        income, bmi, barthels_index) %>% 
    mutate(vas_cat = factor(vas_cat), a_livingsit = a_livingsit) %>%
    glm(vas_cat ~ ., data = ., family = "binomial") %>%
    tbl_regression(
        pvalue_fun = function(x) style_pvalue(x, digits = 3),
        exponentiate = T, 
        label = list(a_livingsit ~ "Living Status")) %>% 
    bold_labels() %>% 
    bold_p() 

tbl_merge(
    list(table_vas_crude, table_vas_adj),
    tab_spanner = c("**Univariate**", "**Multivariate**")) %>%    
    modify_caption(
        caption = "**Table 3a**:Univartiate and multivariate logistic 
        regression for Quality of Life of study participants") 
Table 3a:Univartiate and multivariate logistic regression for Quality of Life of study participants
Characteristic
Univariate
Multivariate
N OR 95% CI p-value OR 95% CI p-value
Age in years 497 0.97 0.96, 0.99 0.002 0.99 0.97, 1.00 0.121
Gender 497





    Male


    Female
1.39 0.97, 1.99 0.076 2.31 1.43, 3.78 <0.001
Marital Status 497





    Currently Married




    Previously Married
0.83 0.56, 1.24 0.368


    Never Married
0.55 0.23, 1.29 0.170


Educational Status 497





    None




    Primary
1.63 0.87, 3.08 0.132


    Secondary
1.71 0.90, 3.29 0.104


    Tertiary
1.33 0.65, 2.74 0.429


Living Status 497





    Lives Alone


    Lives With Spouse and Children
0.67 0.28, 1.48 0.338 0.95 0.36, 2.33 0.907
    Lives With Spouse
0.34 0.11, 0.98 0.050 0.57 0.17, 1.85 0.360
    Lives With Extended Family
0.58 0.22, 1.42 0.245 0.70 0.24, 1.94 0.498
    Lives With Children
0.40 0.16, 0.94 0.040 0.41 0.14, 1.10 0.084
Religion 497





    Christianity




    Islam
0.65 0.36, 1.18 0.158


    Other
0.37 0.02, 3.88 0.417


Domicile 497





    Rural


    Semi-Urban
2.40 1.12, 5.34 0.026 3.42 1.46, 8.38 0.005
    Urban
2.39 1.15, 5.18 0.022 3.67 1.61, 8.76 0.002
Income in GHC 494





    0-100


    101-250
2.50 1.60, 3.95 <0.001 2.50 1.50, 4.22 <0.001
    251-500
2.69 1.64, 4.48 <0.001 2.48 1.41, 4.40 0.002
    >500
1.21 0.67, 2.16 0.522 0.94 0.47, 1.89 0.858
d_st_type 448





    Ischemic Stroke




    Intracerebral Hemorrhagic Stroke
1.43 0.91, 2.27 0.120


    Untyped Stroke (no CT scan available)
0.00
0.981


Body Mass Index 478 1.05 1.01, 1.08 0.011 1.03 0.99, 1.07 0.214
Barthels Index 483 1.02 1.01, 1.03 <0.001 1.02 1.01, 1.03 <0.001
Abbreviations: CI = Confidence Interval, OR = Odds Ratio

Table 3 - Linear regression version

Show the code
table_vas_crude <- 
    df_paper_02 %>%
    filter(!is.na(vas)) %>% 
    select(
        a_agebase, a_gender, maristat, educ, a_livingsit, a_religion,
        a_domicile, income, d_st_type, bmi,
        barthels_index, vas) %>% 
    tbl_uvregression(
        y = vas, 
        method = lm,
        pvalue_fun = ~ gtsummary::style_pvalue(.x, digits = 3)) %>% 
    modify_header(
        update = list(estimate ~ "**Estimate**", label ~ "**Variable**")) %>% 
    gtsummary::bold_labels() %>% 
#    gtsummary::add_global_p() %>% 
    gtsummary::bold_p()

table_vas_adj <- 
    df_paper_02 %>% 
    select(
        vas, a_agebase, a_gender, a_domicile, d_st_type, income,
        barthels_index, bmi,  a_livingsit) %>% 
    lm(vas ~ ., data = .) %>%
    tbl_regression(
        pvalue_fun = function(x) style_pvalue(x, digits = 3)) %>% 
    bold_labels() %>% 
    bold_p() 

tbl_merge(
    list(table_vas_crude, table_vas_adj),
    tab_spanner = c("**Univariate**", "**Multivariate**")) %>%    
    modify_caption(
        caption = "**Table 3b**:Univartiate and multivariate linear 
        regression for quality of life of study participants") 
Table 3b:Univartiate and multivariate linear regression for quality of life of study participants
Variable
Univariate
Multivariate
N Estimate 95% CI p-value Beta 95% CI p-value
Age in years 497 -0.26 -0.44, -0.09 0.003 -0.17 -0.35, 0.02 0.074
Gender 497





    Male


    Female
3.9 -0.09, 8.0 0.056 8.9 4.3, 14 <0.001
Marital Status 497





    Currently Married




    Previously Married
-2.5 -7.0, 1.9 0.264


    Never Married
-5.3 -15, 4.3 0.279


Educational Status 497





    None




    Primary
3.6 -3.6, 11 0.324


    Secondary
5.1 -2.2, 12 0.173


    Tertiary
4.8 -3.3, 13 0.244


Living Status 497





    Lives Alone




    Lives With Spouse and Children
-5.8 -14, 2.9 0.191


    Lives With Spouse
-11 -23, 0.16 0.053


    Lives With Extended Family
-8.3 -18, 1.5 0.097


    Lives With Children
-11 -20, -1.4 0.024


Religion 497





    Christianity




    Islam
-4.6 -11, 2.1 0.179


    Other
-2.6 -28, 23 0.846


Domicile 497





    Rural


    Semi-Urban
11 2.4, 19 0.012 11 3.0, 19 0.007
    Urban
12 3.4, 20 0.006 13 5.1, 21 0.001
Income in GHC 494





    0-100


    101-250
10 5.2, 15 <0.001 6.4 1.3, 11 0.014
    251-500
9.8 4.5, 15 <0.001 7.5 1.8, 13 0.010
    >500
1.4 -5.0, 7.9 0.661 0.21 -7.0, 7.4 0.955
d_st_type 448





    Ischemic Stroke


    Intracerebral Hemorrhagic Stroke
4.5 -0.45, 9.5 0.074 -0.51 -5.6, 4.5 0.842
    Untyped Stroke (no CT scan available)
-23 -43, -3.2 0.023 -18 -36, 0.28 0.054
Body Mass Index 478 0.34 -0.03, 0.71 0.073 0.05 -0.33, 0.44 0.778
Barthels Index 483 0.25 0.18, 0.32 <0.001 0.21 0.13, 0.29 <0.001
a_livingsit






    Lives Alone




    Lives With Spouse and Children



0.04 -8.9, 9.0 0.993
    Lives With Spouse



-4.5 -16, 7.0 0.443
    Lives With Extended Family



-3.6 -14, 6.5 0.484
    Lives With Children



-7.3 -17, 2.6 0.148
Abbreviation: CI = Confidence Interval

Table 4a - Linear regression for males

Show the code
table_vas_crude <- 
    df_paper_02 %>%
    filter(!is.na(vas) & a_gender == "Male") %>% 
    select(
        a_agebase, maristat, educ, a_livingsit, a_religion,
        a_domicile, income, d_st_type, bmi,
        barthels_index, vas) %>% 
    tbl_uvregression(
        y = vas, 
        method = lm,
        pvalue_fun = ~ gtsummary::style_pvalue(.x, digits = 3)) %>% 
    modify_header(
        update = list(estimate ~ "**Estimate**", label ~ "**Variable**")) %>%
    gtsummary::bold_labels() %>% 
#    gtsummary::add_global_p() %>% 
    gtsummary::bold_p(t = 0.1)

table_vas_adj <- 
    df_paper_02 %>%
    filter(!is.na(vas) & a_gender == "Male") %>% 
    select(
        vas, a_agebase, a_domicile, income, d_st_type, a_livingsit,
        barthels_index) %>% 
    lm(vas ~ ., data = .) %>%
    tbl_regression(
        pvalue_fun = function(x) style_pvalue(x, digits = 3)) %>% 
    bold_labels() %>% 
    bold_p() 

tbl_merge(
    list(table_vas_crude, table_vas_adj),
    tab_spanner = c("**Univariate**", "**Multivariate**")) %>%    
    modify_caption(
        caption = "**Table 4a**:Univartiate and multivariate linear 
        regression for quality of life of study participants (Males)") 
Table 4a:Univartiate and multivariate linear regression for quality of life of study participants (Males)
Variable
Univariate
Multivariate
N Estimate 95% CI p-value Beta 95% CI p-value
Age in years 280 -0.30 -0.53, -0.06 0.014 -0.15 -0.41, 0.10 0.229
Marital Status 280





    Currently Married




    Previously Married
-0.27 -8.8, 8.3 0.950


    Never Married
-8.8 -21, 3.7 0.166


Educational Status 280





    None




    Primary
-0.54 -15, 14 0.942


    Secondary
3.1 -11, 18 0.668


    Tertiary
2.5 -12, 17 0.742


Living Status 280





    Lives Alone




    Lives With Spouse and Children
-7.7 -19, 4.1 0.200


    Lives With Spouse
-16 -32, -0.87 0.039


    Lives With Extended Family
-9.3 -23, 4.7 0.191


    Lives With Children
-16 -31, -0.14 0.048


Religion 280





    Christianity




    Islam
-3.0 -12, 5.9 0.504


    Other
6.0 -26, 38 0.714


Domicile 280





    Rural


    Semi-Urban
20 8.2, 32 0.001 20 8.2, 32 <0.001
    Urban
16 3.8, 27 0.010 18 6.4, 29 0.002
Income in GHC 280





    0-100


    101-250
11 4.2, 18 0.002 8.2 1.2, 15 0.021
    251-500
13 5.4, 20 <0.001 10 2.4, 18 0.011
    >500
7.6 -0.92, 16 0.080 4.3 -5.0, 14 0.361
d_st_type 252





    Ischemic Stroke


    Intracerebral Hemorrhagic Stroke
5.8 -0.56, 12 0.074 1.2 -5.3, 7.6 0.725
    Untyped Stroke (no CT scan available)
-17 -43, 9.5 0.209 -8.8 -34, 16 0.491
Body Mass Index 273 -0.23 -0.81, 0.35 0.439


Barthels Index 269 0.28 0.17, 0.38 <0.001 0.21 0.09, 0.32 <0.001
a_livingsit






    Lives Alone




    Lives With Spouse and Children



1.1 -11, 13 0.849
    Lives With Spouse



-5.6 -21, 9.8 0.475
    Lives With Extended Family



6.5 -7.6, 21 0.364
    Lives With Children



-3.1 -19, 12 0.695
Abbreviation: CI = Confidence Interval

Table 4b - Linear regression for Females

Show the code
table_vas_crude <- 
    df_paper_02 %>%
    filter(!is.na(vas) & a_gender == "Female") %>% 
    select(
        a_agebase, maristat, educ, a_livingsit, a_religion,
        a_domicile, income, d_st_type, bmi,
        barthels_index, vas) %>% 
    tbl_uvregression(
        y = vas, 
        method = lm,
        pvalue_fun = ~ gtsummary::style_pvalue(.x, digits = 3)) %>% 
    modify_header(
        update = list(estimate ~ "**Estimate**", label ~ "**Variable**")) %>%
    gtsummary::bold_labels() %>% 
#    gtsummary::add_global_p() %>% 
    gtsummary::bold_p()

table_vas_adj <- 
    df_paper_02 %>%
    filter(!is.na(vas) & a_gender == "Female") %>% 
    select(
        vas, a_agebase, a_domicile, d_st_type, income,
        barthels_index,  maristat, a_livingsit, educ) %>% 
    lm(vas ~ ., data = .) %>%
    tbl_regression(
        pvalue_fun = function(x) style_pvalue(x, digits = 3),
        label = d_st_type ~ "Stroke Type (Choose One)") %>% 
    bold_labels() %>% 
    bold_p() 

tbl_merge(
    list(table_vas_crude, table_vas_adj),
    tab_spanner = c("**Univariate**", "**Multivariate**")) %>%    
    modify_caption(
        caption = "**Table 4a**:Univartiate and multivariate linear 
        regression for quality of life of study participants (Females)") 
Table 4a:Univartiate and multivariate linear regression for quality of life of study participants (Females)
Variable
Univariate
Multivariate
N Estimate 95% CI p-value Beta 95% CI p-value
Age in years 217 -0.26 -0.52, 0.00 0.052 -0.01 -0.30, 0.28 0.945
Marital Status 217





    Currently Married


    Previously Married
-7.9 -14, -1.9 0.010 -3.4 -14, 7.3 0.532
    Never Married
-1.8 -17, 13 0.817 3.7 -14, 21 0.683
Educational Status 217





    None


    Primary
6.6 -1.6, 15 0.115 7.5 -0.80, 16 0.076
    Secondary
8.4 -1.0, 18 0.080 7.2 -2.4, 17 0.139
    Tertiary
12 -0.55, 25 0.060 10 -2.8, 23 0.125
Living Status 217





    Lives Alone




    Lives With Spouse and Children
-0.18 -13, 13 0.978


    Lives With Spouse
-3.8 -21, 13 0.662


    Lives With Extended Family
-7.7 -21, 6.0 0.268


    Lives With Children
-10 -23, 2.8 0.125


Religion 217





    Christianity




    Islam
-6.5 -17, 3.7 0.210


    Other
-18 -62, 25 0.409


Domicile 217





    Rural


    Semi-Urban
1.1 -11, 13 0.859 -0.85 -12, 10 0.882
    Urban
8.8 -2.3, 20 0.119 5.8 -4.9, 16 0.285
Income in GHC 214





    0-100


    101-250
11 4.0, 18 0.002 3.8 -3.6, 11 0.310
    251-500
8.0 0.16, 16 0.046 4.9 -3.9, 14 0.277
    >500
-6.3 -16, 3.8 0.222 -9.1 -20, 1.3 0.087
d_st_type 196





    Ischemic Stroke




    Intracerebral Hemorrhagic Stroke
4.5 -3.8, 13 0.283


    Untyped Stroke (no CT scan available)
-32 -62, -1.1 0.042


Body Mass Index 205 0.65 0.16, 1.1 0.010


Barthels Index 214 0.23 0.14, 0.33 <0.001 0.22 0.12, 0.33 <0.001
Stroke Type (Choose One)






    Ischemic Stroke




    Intracerebral Hemorrhagic Stroke



-0.37 -8.5, 7.8 0.928
    Untyped Stroke (no CT scan available)



-29 -58, -0.66 0.045
a_livingsit






    Lives Alone




    Lives With Spouse and Children



-3.8 -20, 13 0.648
    Lives With Spouse



-7.0 -26, 12 0.479
    Lives With Extended Family



-12 -27, 2.0 0.092
    Lives With Children



-12 -25, 1.2 0.075
Abbreviation: CI = Confidence Interval