MULTIPLE LOGISTIC REGRESSION ANALYSIS

Author

Dr. Muhammad Abdul Hafiz bin Kamarul Zaman, Dr Omar bin Nazmi, Dr Muhammad Za’im bin Mohd Samsuri, Dr Syuaib Aiman Amir bin Kamarudin

Published

December 31, 2024

Team picture

1 1.INTRODUCTION

This dataset is about factor associated with Catastrophic Health Expenditure (CHE) among adult cancer patients in HPUSM. CHE in this study uses the Budget share method in which it defines the CHE as out-of-pocket health expenditure above 10% from total monthly income. The study involved 209 participants with 8 variables.

1.1 Research question

Is there any associated between age, gender, ethnicity, patient education level, patient occupation,household leader occupation, GL holder and poverty income with CHE among adult cancer patient?

1.2 Variable Selection

the variables potential risk factors for CHE which are:

Sociodemographic factors : gender (categorical/nominal), race (categorical/nominal), age (continuous numerical), education level(categorical/ordinal), patient employment status(categorical/ordinal),

Household factors: head of household gender(categorical/nominal data), head of household occupation (categorical/ordinal), poverty income group and GL status (categorical/nominal data)

outcome : CHE category (binary which is experience CHE and not)

2 2. METHOD

2.1 Load libraries

Show the Code
library(haven)
Warning: package 'haven' was built under R version 4.4.2
Show the Code
library(tidyverse)
Warning: package 'tidyverse' was built under R version 4.4.2
Warning: package 'dplyr' was built under R version 4.4.2
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Show the Code
library(gtsummary)
Warning: package 'gtsummary' was built under R version 4.4.2
Show the Code
library(broom)
Warning: package 'broom' was built under R version 4.4.2
Show the Code
library(knitr)
Warning: package 'knitr' was built under R version 4.4.2
Show the Code
library(tidyr)
library(dplyr)
library(corrplot)
Warning: package 'corrplot' was built under R version 4.4.2
corrplot 0.95 loaded
Show the Code
library(readxl)
Warning: package 'readxl' was built under R version 4.4.2
Show the Code
library(janitor)
Warning: package 'janitor' was built under R version 4.4.2

Attaching package: 'janitor'

The following objects are masked from 'package:stats':

    chisq.test, fisher.test
Show the Code
library(dagitty)
Warning: package 'dagitty' was built under R version 4.4.2
Show the Code
library(rmdformats)
Warning: package 'rmdformats' was built under R version 4.4.2
Show the Code
library(rms)
Warning: package 'rms' was built under R version 4.4.2
Loading required package: Hmisc
Warning: package 'Hmisc' was built under R version 4.4.2

Attaching package: 'Hmisc'

The following objects are masked from 'package:dplyr':

    src, summarize

The following objects are masked from 'package:base':

    format.pval, units

2.2 Read Data

Show the Code
CHE_data <- read_excel("C:/Users/H P/OneDrive - The Goose and Duck/Desktop/Final mlog hafiz/CHE hafiz (2).xlsx")
View(CHE_data)

2.3 View Data

Show the Code
summary(CHE_data)
      Age          Gender              Race           Education level   
 Min.   :18.0   Length:209         Length:209         Length:209        
 1st Qu.:46.0   Class :character   Class :character   Class :character  
 Median :56.0   Mode  :character   Mode  :character   Mode  :character  
 Mean   :54.2                                                           
 3rd Qu.:63.0                                                           
 Max.   :78.0                                                           
                                                                        
 Patient occupation      GL            household leader occupation
 Length:209         Length:209         Length:209                 
 Class :character   Class :character   Class :character           
 Mode  :character   Mode  :character   Mode  :character           
                                                                  
                                                                  
                                                                  
                                                                  
 health expenditure transportation cost   food cost     
 Min.   :    0      Min.   :   0.0      Min.   :   0.0  
 1st Qu.:    0      1st Qu.: 200.0      1st Qu.: 180.0  
 Median :  255      Median : 440.0      Median : 455.0  
 Mean   : 2224      Mean   : 606.5      Mean   : 743.5  
 3rd Qu.: 1750      3rd Qu.: 836.0      3rd Qu.:1020.0  
 Max.   :52600      Max.   :6000.0      Max.   :5620.0  
                                                        
 accomodation during treatment job retrenchment  salary reduction 
 Min.   :   0.0                Min.   :    0.0   Min.   :    0.0  
 1st Qu.:   0.0                1st Qu.:    0.0   1st Qu.:    0.0  
 Median :   0.0                Median :    0.0   Median :    0.0  
 Mean   : 106.2                Mean   :  326.5   Mean   :  478.5  
 3rd Qu.:   0.0                3rd Qu.:    0.0   3rd Qu.:    0.0  
 Max.   :4800.0                Max.   :36000.0   Max.   :24000.0  
                                                                  
 monthly income  financial aids   HE/Income (%)     
 Min.   :    0   Min.   :     0   Min.   :0.000000  
 1st Qu.: 1800   1st Qu.:     0   1st Qu.:0.000000  
 Median : 3900   Median :     0   Median :0.003502  
 Mean   : 5192   Mean   :  2830   Mean   :0.049525  
 3rd Qu.: 7000   3rd Qu.:   700   3rd Qu.:0.038622  
 Max.   :28000   Max.   :103000   Max.   :0.897993  
                 NA's   :2                          
Show the Code
str(CHE_data)
tibble [209 × 16] (S3: tbl_df/tbl/data.frame)
 $ Age                          : num [1:209] 29 53 56 54 39 68 59 46 51 44 ...
 $ Gender                       : chr [1:209] "Male" "Female" "Female" "Female" ...
 $ Race                         : chr [1:209] "Malay" "Malay" "Malay" "Malay" ...
 $ Education level              : chr [1:209] "Secondary" "Tertiary" "Secondary" "Tertiary" ...
 $ Patient occupation           : chr [1:209] "Not working" "Government servant" "Not working" "Government servant" ...
 $ GL                           : chr [1:209] "No" "Yes" "No" "Yes" ...
 $ household leader occupation  : chr [1:209] "Unemployed" "Government servant/pensioner" "Government servant/pensioner" "Unemployed" ...
 $ health expenditure           : num [1:209] 550 8386 3832 0 2000 ...
 $ transportation cost          : num [1:209] 390 6000 840 48 248 2250 600 240 640 1100 ...
 $ food cost                    : num [1:209] 550 4620 1260 240 620 2250 360 720 160 0 ...
 $ accomodation during treatment: num [1:209] 0 0 0 0 0 4800 0 0 0 0 ...
 $ job retrenchment             : num [1:209] 0 0 0 0 0 0 0 0 0 0 ...
 $ salary reduction             : num [1:209] 0 0 0 0 24000 0 0 0 0 0 ...
 $ monthly income               : num [1:209] 750 11000 7083 6000 1000 ...
 $ financial aids               : num [1:209] 0 0 0 0 1200 1450 0 0 0 0 ...
 $ HE/Income (%)                : num [1:209] 0.0611 0.0635 0.0451 0 0.1515 ...
Show the Code
glimpse(CHE_data)
Rows: 209
Columns: 16
$ Age                             <dbl> 29, 53, 56, 54, 39, 68, 59, 46, 51, 44…
$ Gender                          <chr> "Male", "Female", "Female", "Female", …
$ Race                            <chr> "Malay", "Malay", "Malay", "Malay", "M…
$ `Education level`               <chr> "Secondary", "Tertiary", "Secondary", …
$ `Patient occupation`            <chr> "Not working", "Government servant", "…
$ GL                              <chr> "No", "Yes", "No", "Yes", "Yes", "Yes"…
$ `household leader occupation`   <chr> "Unemployed", "Government servant/pens…
$ `health expenditure`            <dbl> 550, 8386, 3832, 0, 2000, 4800, 24472,…
$ `transportation cost`           <dbl> 390, 6000, 840, 48, 248, 2250, 600, 24…
$ `food cost`                     <dbl> 550, 4620, 1260, 240, 620, 2250, 360, …
$ `accomodation during treatment` <dbl> 0, 0, 0, 0, 0, 4800, 0, 0, 0, 0, 0, 0,…
$ `job retrenchment`              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ `salary reduction`              <dbl> 0, 0, 0, 0, 24000, 0, 0, 0, 0, 0, 0, 0…
$ `monthly income`                <dbl> 750.0, 11000.0, 7083.3, 6000.0, 1000.0…
$ `financial aids`                <dbl> 0, 0, 0, 0, 1200, 1450, 0, 0, 0, 0, 0,…
$ `HE/Income (%)`                 <dbl> 0.061111111, 0.063530303, 0.045082565,…

2.4 Transform Data

Show the Code
CHE_data <- clean_names(CHE_data)
CHE_data$he_income_percent <- CHE_data$he_income_percent*100
CHE_data <- CHE_data %>%
  mutate(
    CHE_category = ifelse(he_income_percent > 10, "Yes", "No"),
  poverty_income = ifelse(monthly_income <= 2508, "poverty", "non-poverty"))
CHE_data$education_level <- factor(
  CHE_data$education_level,
  levels = c("Tertiary", "Secondary", "Primary", "No formal Education"))
CHE_data$household_leader_occupation <- factor(
  CHE_data$household_leader_occupation,
  levels = c("Government servant/pensioner", "Private sector worker", "Self employed", "Unemployed"))
CHE_data <- CHE_data %>% 
  mutate(across(where(is.character),as_factor))
summary(CHE_data)
      age          gender           race                education_level
 Min.   :18.0   Male  : 49   Malay    :197   Tertiary           :98    
 1st Qu.:46.0   Female:160   Non-Malay: 12   Secondary          :87    
 Median :56.0                                Primary            :15    
 Mean   :54.2                                No formal Education: 9    
 3rd Qu.:63.0                                                          
 Max.   :78.0                                                          
                                                                       
          patient_occupation   gl     
 Not working       :37       No : 71  
 Government servant:55       Yes:138  
 Pensioner         :37                
 Unemployed        :63                
 Self employed     : 8                
 Private sector    : 9                
                                      
               household_leader_occupation health_expenditure
 Government servant/pensioner:87           Min.   :    0     
 Private sector worker       :22           1st Qu.:    0     
 Self employed               :44           Median :  255     
 Unemployed                  :56           Mean   : 2224     
                                           3rd Qu.: 1750     
                                           Max.   :52600     
                                                             
 transportation_cost   food_cost      accomodation_during_treatment
 Min.   :   0.0      Min.   :   0.0   Min.   :   0.0               
 1st Qu.: 200.0      1st Qu.: 180.0   1st Qu.:   0.0               
 Median : 440.0      Median : 455.0   Median :   0.0               
 Mean   : 606.5      Mean   : 743.5   Mean   : 106.2               
 3rd Qu.: 836.0      3rd Qu.:1020.0   3rd Qu.:   0.0               
 Max.   :6000.0      Max.   :5620.0   Max.   :4800.0               
                                                                   
 job_retrenchment  salary_reduction  monthly_income  financial_aids  
 Min.   :    0.0   Min.   :    0.0   Min.   :    0   Min.   :     0  
 1st Qu.:    0.0   1st Qu.:    0.0   1st Qu.: 1800   1st Qu.:     0  
 Median :    0.0   Median :    0.0   Median : 3900   Median :     0  
 Mean   :  326.5   Mean   :  478.5   Mean   : 5192   Mean   :  2830  
 3rd Qu.:    0.0   3rd Qu.:    0.0   3rd Qu.: 7000   3rd Qu.:   700  
 Max.   :36000.0   Max.   :24000.0   Max.   :28000   Max.   :103000  
                                                     NA's   :2       
 he_income_percent CHE_category     poverty_income
 Min.   : 0.0000   No :174      poverty    : 73   
 1st Qu.: 0.0000   Yes: 35      non-poverty:136   
 Median : 0.3502                                  
 Mean   : 4.9525                                  
 3rd Qu.: 3.8622                                  
 Max.   :89.7993                                  
                                                  

2.5 Describe Data

Show the Code
CHE_outcome <- CHE_data %>% 
  tbl_summary(by= CHE_category,
    include = c(-CHE_category, -he_income_percent),
    statistic = list(all_continuous() ~ "{mean} ({sd})",
              all_categorical()~ "{n} / {N} ({p}%)"),
digits = all_continuous() ~ 2 ) %>%
  modify_caption("Characteristic (N ={N})" )

CHE_outcome %>% 
  as_gt()
Characteristic (N =209)
Characteristic No
N = 1741
Yes
N = 351
age 53.63 (11.93) 57.03 (12.44)
gender

    Male 42 / 174 (24%) 7 / 35 (20%)
    Female 132 / 174 (76%) 28 / 35 (80%)
race

    Malay 169 / 174 (97%) 28 / 35 (80%)
    Non-Malay 5 / 174 (2.9%) 7 / 35 (20%)
education_level

    Tertiary 92 / 174 (53%) 6 / 35 (17%)
    Secondary 67 / 174 (39%) 20 / 35 (57%)
    Primary 11 / 174 (6.3%) 4 / 35 (11%)
    No formal Education 4 / 174 (2.3%) 5 / 35 (14%)
patient_occupation

    Not working 28 / 174 (16%) 9 / 35 (26%)
    Government servant 52 / 174 (30%) 3 / 35 (8.6%)
    Pensioner 35 / 174 (20%) 2 / 35 (5.7%)
    Unemployed 45 / 174 (26%) 18 / 35 (51%)
    Self employed 6 / 174 (3.4%) 2 / 35 (5.7%)
    Private sector 8 / 174 (4.6%) 1 / 35 (2.9%)
gl 126 / 174 (72%) 12 / 35 (34%)
household_leader_occupation

    Government servant/pensioner 81 / 174 (47%) 6 / 35 (17%)
    Private sector worker 19 / 174 (11%) 3 / 35 (8.6%)
    Self employed 38 / 174 (22%) 6 / 35 (17%)
    Unemployed 36 / 174 (21%) 20 / 35 (57%)
health_expenditure 615.35 (1,146.76) 10,223.96 (12,136.13)
transportation_cost 574.32 (627.83) 766.51 (631.88)
food_cost 695.47 (783.80) 982.51 (1,114.83)
accomodation_during_treatment 84.64 (434.97) 213.43 (834.52)
job_retrenchment

    0 167 / 174 (96%) 34 / 35 (97%)
    900 1 / 174 (0.6%) 0 / 35 (0%)
    1000 1 / 174 (0.6%) 0 / 35 (0%)
    3640 1 / 174 (0.6%) 0 / 35 (0%)
    5600 1 / 174 (0.6%) 0 / 35 (0%)
    6000 0 / 174 (0%) 1 / 35 (2.9%)
    7000 1 / 174 (0.6%) 0 / 35 (0%)
    8100 1 / 174 (0.6%) 0 / 35 (0%)
    36000 1 / 174 (0.6%) 0 / 35 (0%)
salary_reduction 254.05 (1,924.86) 1,594.29 (5,669.68)
monthly_income 5,606.43 (4,760.15) 3,129.81 (2,803.61)
financial_aids 2,277.48 (6,704.03) 5,543.43 (18,153.22)
    Unknown 2 0
poverty_income

    poverty 54 / 174 (31%) 19 / 35 (54%)
    non-poverty 120 / 174 (69%) 16 / 35 (46%)
1 Mean (SD); n / N (%)

2.6 Explore Data

2.7 Plots

Histogram for numerical Barplots for categorical

2.7.1 age

Show the Code
CHE_data %>% 
  ggplot(aes(age)) + 
  geom_histogram() + 
  facet_grid(. ~ CHE_category)
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

2.7.2 Gender

Show the Code
CHE_data %>% 
  ggplot(aes(gender)) + 
  geom_bar() +
  facet_grid(. ~ CHE_category)

2.7.3 Race

Show the Code
CHE_data %>% 
  ggplot(aes(race)) + 
  geom_bar() +
  facet_grid(. ~ CHE_category)

2.7.4 education level

Show the Code
CHE_data %>% 
  ggplot(aes(education_level)) + 
  geom_bar() +
  facet_grid(. ~ CHE_category)

2.7.5 patient occupation

Show the Code
CHE_data %>% 
  ggplot(aes(patient_occupation)) + 
  geom_bar() +
  facet_grid(. ~ CHE_category)

2.7.6 government GL

Show the Code
CHE_data %>% 
  ggplot(aes(gl)) + 
  geom_bar() +
  facet_grid(. ~ CHE_category)

2.7.7 household leader occupation

Show the Code
CHE_data %>% 
  ggplot(aes(household_leader_occupation)) + 
  geom_bar() +
  facet_grid(. ~ CHE_category)

2.7.8 poverty income

Show the Code
CHE_data %>% 
  ggplot(aes(poverty_income)) + 
  geom_bar() +
  facet_grid(. ~ CHE_category)

2.8 Check Multicollinearity

Show the Code
Data.CHE.col <- 
  CHE_data %>% 
  select(where(is.numeric))
Show the Code
cor.Data.CHE <-
  cor(Data.CHE.col, use = "complete.obs", method = "pearson")
head(round(cor.Data.CHE,2))
                                age health_expenditure transportation_cost
age                            1.00               0.06                0.05
health_expenditure             0.06               1.00                0.02
transportation_cost            0.05               0.02                1.00
food_cost                     -0.01               0.01                0.54
accomodation_during_treatment  0.02               0.05                0.21
job_retrenchment              -0.15               0.00               -0.07
                              food_cost accomodation_during_treatment
age                               -0.01                          0.02
health_expenditure                 0.01                          0.05
transportation_cost                0.54                          0.21
food_cost                          1.00                          0.18
accomodation_during_treatment      0.18                          1.00
job_retrenchment                  -0.01                          0.00
                              job_retrenchment salary_reduction monthly_income
age                                      -0.15            -0.13          -0.10
health_expenditure                        0.00             0.09           0.03
transportation_cost                      -0.07            -0.02           0.01
food_cost                                -0.01             0.03           0.09
accomodation_during_treatment             0.00             0.24          -0.02
job_retrenchment                          1.00            -0.01           0.00
                              financial_aids he_income_percent
age                                    -0.09              0.10
health_expenditure                      0.15              0.78
transportation_cost                    -0.03              0.08
food_cost                              -0.04              0.06
accomodation_during_treatment           0.02              0.10
job_retrenchment                       -0.01             -0.01
Show the Code
corrplot(cor.Data.CHE, type = 'upper', order = 'hclust')

From the correlation plot and correlation matrix, the health expenditure and health income percentage data were highly correlated.health expenditure is the numerator for the CHE formula, which cause it to be highly correlated to it. The monthly income already represented by the categorical data of poverty income in which it is more significant to present the monthly income data. Hence, monthly income is removed from model.

the transportation cost, food cost, accomodation cost, and job rentrenchment cost were included in the study related to direct non medical cost and indirect medical cost, which is not related to CHE. thus these variables were omitted from the model.

3 3. RESULTS

3.1 Estimation

3.2 Simple Logistic Regression

Show the Code
slr.CHE <- glm(CHE_category ~ 1, data = CHE_data, family = binomial(link = "logit"))
add1(slr.CHE,scope = ~ age + race + gender + gl + education_level + patient_occupation + household_leader_occupation + poverty_income, test = "LRT")
Single term additions

Model:
CHE_category ~ 1
                            Df Deviance    AIC     LRT  Pr(>Chi)    
<none>                           188.87 190.87                      
age                          1   186.43 190.43  2.4406 0.1182309    
race                         1   177.37 181.37 11.4964 0.0006973 ***
gender                       1   188.58 192.58  0.2862 0.5926344    
gl                           1   170.97 174.97 17.8964 2.333e-05 ***
education_level              3   168.72 176.72 20.1540 0.0001577 ***
patient_occupation           5   170.56 182.56 18.3108 0.0025811 ** 
household_leader_occupation  3   169.24 177.24 19.6307 0.0002024 ***
poverty_income               1   182.23 186.23  6.6407 0.0099674 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Show the Code
summary(slr.CHE)

Call:
glm(formula = CHE_category ~ 1, family = binomial(link = "logit"), 
    data = CHE_data)

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -1.6037     0.1852  -8.657   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 188.87  on 208  degrees of freedom
Residual deviance: 188.87  on 208  degrees of freedom
AIC: 190.87

Number of Fisher Scoring iterations: 3

3.3 Summary table simple logistic regression for all the Variables

Show the Code
tbl_uvregression(
  data = CHE_data,
  method = glm,
  y = CHE_category,
  include = c(age, gender, race, education_level, patient_occupation, gl, household_leader_occupation, poverty_income), # List variables to include
  method.args = list(family = binomial),exponentiate = TRUE) %>%        
  bold_labels() %>%
  italicize_levels() %>%
  as_gt() %>%
  gt::tab_header(title = "Table 1. Simple Logistic Regression")
Table 1. Simple Logistic Regression
Characteristic N OR1 95% CI1 p-value
age 209 1.03 0.99, 1.06 0.13
gender 209


    Male

    Female
1.27 0.54, 3.35 0.6
race 209


    Malay

    Non-Malay
8.45 2.53, 30.3 <0.001
education_level 209


    Tertiary

    Secondary
4.58 1.84, 13.1 0.002
    Primary
5.58 1.27, 22.8 0.017
    No formal Education
19.2 4.13, 98.4 <0.001
patient_occupation 209


    Not working

    Government servant
0.18 0.04, 0.66 0.015
    Pensioner
0.18 0.03, 0.76 0.036
    Unemployed
1.24 0.50, 3.26 0.6
    Self employed
1.04 0.14, 5.50 >0.9
    Private sector
0.39 0.02, 2.57 0.4
gl 209


    No

    Yes
0.20 0.09, 0.42 <0.001
household_leader_occupation 209


    Government servant/pensioner

    Private sector worker
2.13 0.42, 8.88 0.3
    Self employed
2.13 0.63, 7.24 0.2
    Unemployed
7.50 2.92, 22.0 <0.001
poverty_income 209


    poverty

    non-poverty
0.38 0.18, 0.79 0.010
1 OR = Odds Ratio, CI = Confidence Interval

3.4 Multiple Logistic Regression

3.5 Model A (without interaction)

based on univariable analysis and literature review, 5 variables were included in the model, all variables are categorical data

Show the Code
mlr.CHE <- glm(CHE_category ~ race + education_level + gl + household_leader_occupation + poverty_income, family = binomial(link="logit"), data = CHE_data)
summary(mlr.CHE)

Call:
glm(formula = CHE_category ~ race + education_level + gl + household_leader_occupation + 
    poverty_income, family = binomial(link = "logit"), data = CHE_data)

Coefficients:
                                                 Estimate Std. Error z value
(Intercept)                                       -2.1573     0.8314  -2.595
raceNon-Malay                                      1.8640     0.7433   2.508
education_levelSecondary                           0.5883     0.5844   1.007
education_levelPrimary                             1.2433     0.8170   1.522
education_levelNo formal Education                 2.3107     0.9238   2.501
glYes                                             -0.9771     0.5296  -1.845
household_leader_occupationPrivate sector worker  -0.6277     0.9013  -0.696
household_leader_occupationSelf employed          -0.1760     0.7608  -0.231
household_leader_occupationUnemployed              1.0029     0.6284   1.596
poverty_incomenon-poverty                          0.1192     0.4868   0.245
                                                 Pr(>|z|)   
(Intercept)                                       0.00947 **
raceNon-Malay                                     0.01215 * 
education_levelSecondary                          0.31403   
education_levelPrimary                            0.12806   
education_levelNo formal Education                0.01238 * 
glYes                                             0.06507 . 
household_leader_occupationPrivate sector worker  0.48614   
household_leader_occupationSelf employed          0.81709   
household_leader_occupationUnemployed             0.11051   
poverty_incomenon-poverty                         0.80655   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 188.87  on 208  degrees of freedom
Residual deviance: 147.00  on 199  degrees of freedom
AIC: 167

Number of Fisher Scoring iterations: 5

3.6 Multiple Logistic Regression with interaction

Show the Code
mlr.CHE.int <- glm(CHE_category ~ race + education_level + gl + household_leader_occupation + poverty_income + + gl*race , family = binomial(link="logit"), data = CHE_data)
summary(mlr.CHE.int)

Call:
glm(formula = CHE_category ~ race + education_level + gl + household_leader_occupation + 
    poverty_income + +gl * race, family = binomial(link = "logit"), 
    data = CHE_data)

Coefficients:
                                                 Estimate Std. Error z value
(Intercept)                                       -2.1978     0.8455  -2.600
raceNon-Malay                                      1.9881     0.8825   2.253
education_levelSecondary                           0.6169     0.5926   1.041
education_levelPrimary                             1.2526     0.8192   1.529
education_levelNo formal Education                 2.3363     0.9280   2.517
glYes                                             -0.9292     0.5562  -1.671
household_leader_occupationPrivate sector worker  -0.6358     0.9077  -0.700
household_leader_occupationSelf employed          -0.1658     0.7595  -0.218
household_leader_occupationUnemployed              1.0018     0.6270   1.598
poverty_incomenon-poverty                          0.1161     0.4876   0.238
raceNon-Malay:glYes                               -0.4325     1.5914  -0.272
                                                 Pr(>|z|)   
(Intercept)                                       0.00934 **
raceNon-Malay                                     0.02428 * 
education_levelSecondary                          0.29783   
education_levelPrimary                            0.12625   
education_levelNo formal Education                0.01182 * 
glYes                                             0.09479 . 
household_leader_occupationPrivate sector worker  0.48363   
household_leader_occupationSelf employed          0.82716   
household_leader_occupationUnemployed             0.11009   
poverty_incomenon-poverty                         0.81181   
raceNon-Malay:glYes                               0.78579   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 188.87  on 208  degrees of freedom
Residual deviance: 146.93  on 198  degrees of freedom
AIC: 168.93

Number of Fisher Scoring iterations: 5

3.7 Model Selection

Show the Code
anova(mlr.CHE, mlr.CHE.int, test = 'Chisq')
Analysis of Deviance Table

Model 1: CHE_category ~ race + education_level + gl + household_leader_occupation + 
    poverty_income
Model 2: CHE_category ~ race + education_level + gl + household_leader_occupation + 
    poverty_income + +gl * race
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1       199     147.00                     
2       198     146.93  1 0.075274   0.7838
Show the Code
anova_result <- anova(mlr.CHE, mlr.CHE.int, test = "LRT")
print(anova_result)
Analysis of Deviance Table

Model 1: CHE_category ~ race + education_level + gl + household_leader_occupation + 
    poverty_income
Model 2: CHE_category ~ race + education_level + gl + household_leader_occupation + 
    poverty_income + +gl * race
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1       199     147.00                     
2       198     146.93  1 0.075274   0.7838
Show the Code
AIC(mlr.CHE, mlr.CHE.int)
            df      AIC
mlr.CHE     10 167.0006
mlr.CHE.int 11 168.9253

From the ANOVA test, it shows the p-value > 0.05 which represent no significant difference between both model. the AIC also close between both model. we choose the model without interaction for further analysis

4 4. PREDICTION

Now, our preliminary final model is (mlr.CHE)

Show the Code
prem.final.mod <- mlr.CHE
prem.final.mod

Call:  glm(formula = CHE_category ~ race + education_level + gl + household_leader_occupation + 
    poverty_income, family = binomial(link = "logit"), data = CHE_data)

Coefficients:
                                     (Intercept)  
                                         -2.1573  
                                   raceNon-Malay  
                                          1.8640  
                        education_levelSecondary  
                                          0.5883  
                          education_levelPrimary  
                                          1.2433  
              education_levelNo formal Education  
                                          2.3107  
                                           glYes  
                                         -0.9771  
household_leader_occupationPrivate sector worker  
                                         -0.6277  
        household_leader_occupationSelf employed  
                                         -0.1760  
           household_leader_occupationUnemployed  
                                          1.0029  
                       poverty_incomenon-poverty  
                                          0.1192  

Degrees of Freedom: 208 Total (i.e. Null);  199 Residual
Null Deviance:      188.9 
Residual Deviance: 147  AIC: 167

4.1 log odds

Show the Code
tidy(prem.final.mod, conf.int = TRUE)
# A tibble: 10 × 7
   term                  estimate std.error statistic p.value conf.low conf.high
   <chr>                    <dbl>     <dbl>     <dbl>   <dbl>    <dbl>     <dbl>
 1 (Intercept)             -2.16      0.831    -2.59  0.00947   -3.86    -0.574 
 2 raceNon-Malay            1.86      0.743     2.51  0.0121     0.450    3.42  
 3 education_levelSecon…    0.588     0.584     1.01  0.314     -0.546    1.78  
 4 education_levelPrima…    1.24      0.817     1.52  0.128     -0.424    2.84  
 5 education_levelNo fo…    2.31      0.924     2.50  0.0124     0.515    4.19  
 6 glYes                   -0.977     0.530    -1.84  0.0651    -2.05     0.0393
 7 household_leader_occ…   -0.628     0.901    -0.696 0.486     -2.55     1.05  
 8 household_leader_occ…   -0.176     0.761    -0.231 0.817     -1.73     1.29  
 9 household_leader_occ…    1.00      0.628     1.60  0.111     -0.226    2.27  
10 poverty_incomenon-po…    0.119     0.487     0.245 0.807     -0.829    1.09  

4.2 odds ratio

Show the Code
tidy(prem.final.mod, exponentiate = TRUE, conf.int = TRUE)
# A tibble: 10 × 7
   term                  estimate std.error statistic p.value conf.low conf.high
   <chr>                    <dbl>     <dbl>     <dbl>   <dbl>    <dbl>     <dbl>
 1 (Intercept)              0.116     0.831    -2.59  0.00947   0.0210     0.563
 2 raceNon-Malay            6.45      0.743     2.51  0.0121    1.57      30.7  
 3 education_levelSecon…    1.80      0.584     1.01  0.314     0.579      5.93 
 4 education_levelPrima…    3.47      0.817     1.52  0.128     0.654     17.1  
 5 education_levelNo fo…   10.1       0.924     2.50  0.0124    1.67      66.0  
 6 glYes                    0.376     0.530    -1.84  0.0651    0.128      1.04 
 7 household_leader_occ…    0.534     0.901    -0.696 0.486     0.0779     2.87 
 8 household_leader_occ…    0.839     0.761    -0.231 0.817     0.176      3.64 
 9 household_leader_occ…    2.73      0.628     1.60  0.111     0.798      9.68 
10 poverty_incomenon-po…    1.13      0.487     0.245 0.807     0.437      2.99 

4.3 predict probability

Then, we proceed with prediction.

Formula for odds = probability / 1 - probability Formula for probability = Odds / 1 + Odds

Show the Code
Prob.CHE <- augment(prem.final.mod, type.predict = 'response')  
Prob.CHE
# A tibble: 209 × 12
   CHE_category race      education_level gl    household_leader_occupation 
   <fct>        <fct>     <fct>           <fct> <fct>                       
 1 No           Malay     Secondary       No    Unemployed                  
 2 No           Malay     Tertiary        Yes   Government servant/pensioner
 3 No           Malay     Secondary       No    Government servant/pensioner
 4 No           Malay     Tertiary        Yes   Unemployed                  
 5 Yes          Malay     Tertiary        Yes   Self employed               
 6 Yes          Malay     Primary         Yes   Government servant/pensioner
 7 Yes          Non-Malay Secondary       No    Private sector worker       
 8 No           Malay     Secondary       Yes   Government servant/pensioner
 9 No           Malay     Tertiary        Yes   Government servant/pensioner
10 No           Malay     Tertiary        Yes   Government servant/pensioner
# ℹ 199 more rows
# ℹ 7 more variables: poverty_income <fct>, .fitted <dbl>, .resid <dbl>,
#   .hat <dbl>, .sigma <dbl>, .cooksd <dbl>, .std.resid <dbl>

To get probability, must include type.predict = ‘response’, if not, the fitted values will produce the log odds

Show the Code
head(model.matrix(prem.final.mod))
  (Intercept) raceNon-Malay education_levelSecondary education_levelPrimary
1           1             0                        1                      0
2           1             0                        0                      0
3           1             0                        1                      0
4           1             0                        0                      0
5           1             0                        0                      0
6           1             0                        0                      1
  education_levelNo formal Education glYes
1                                  0     0
2                                  0     1
3                                  0     0
4                                  0     1
5                                  0     1
6                                  0     1
  household_leader_occupationPrivate sector worker
1                                                0
2                                                0
3                                                0
4                                                0
5                                                0
6                                                0
  household_leader_occupationSelf employed
1                                        0
2                                        0
3                                        0
4                                        0
5                                        1
6                                        0
  household_leader_occupationUnemployed poverty_incomenon-poverty
1                                     1                         0
2                                     0                         1
3                                     0                         1
4                                     1                         1
5                                     0                         0
6                                     0                         0

type = ‘response’ is to predict probability , while type = ‘link’ is to predict log odds

Show the Code
head(predict(prem.final.mod, type = 'link'))
         1          2          3          4          5          6 
-0.5661572 -3.0151922 -1.4498039 -2.0123403 -3.3103712 -1.8911437 
Show the Code
head(predict(prem.final.mod, type = 'response'))
         1          2          3          4          5          6 
0.36212401 0.04674424 0.19003174 0.11791335 0.03521711 0.13111412 

These are the predicted probability and log odds for the first 6 observation.

Then, we try to manually calculate and compare with the result above:

For example, we took the first observation:

race = 0, secondary education = 1, gl holder = 0, Unemployed household leader occupation = 1, poverty income = 0

Formula for log odds = B0 + B1X1 + B2X2 …….

Predicted log odds for second observation =

Show the Code
(-2.1573)+(1.8640*0)+(0.5883*1)+(1.0029*1)
[1] -0.5661
Show the Code
exp(-0.5661)
[1] 0.5677353

Manual calculation of predicted probability:

Formula for probability: Odds / 1 + Odds

Show the Code
0.5677353/ (1+0.5677353)
[1] 0.3621372

another method

4.4 Prediction using New Data

creating new dataframe

Show the Code
newdataCHE <- expand.grid(race = c('Malay', 'Non-Malay'),
                       education_level = c('Tertiary', 'Secondary', 'Primary', 'No formal Education'),
                       household_leader_occupation = c( "Government servant/pensioner", "Private sector worker", "Self employed", "Unemployed"),
                       poverty_income = c('poverty', 'non-poverty'),
                       gl = c('Yes', 'No'))

head(newdataCHE)
       race education_level  household_leader_occupation poverty_income  gl
1     Malay        Tertiary Government servant/pensioner        poverty Yes
2 Non-Malay        Tertiary Government servant/pensioner        poverty Yes
3     Malay       Secondary Government servant/pensioner        poverty Yes
4 Non-Malay       Secondary Government servant/pensioner        poverty Yes
5     Malay         Primary Government servant/pensioner        poverty Yes
6 Non-Malay         Primary Government servant/pensioner        poverty Yes
Show the Code
tail(newdataCHE)
         race     education_level household_leader_occupation poverty_income gl
123     Malay           Secondary                  Unemployed    non-poverty No
124 Non-Malay           Secondary                  Unemployed    non-poverty No
125     Malay             Primary                  Unemployed    non-poverty No
126 Non-Malay             Primary                  Unemployed    non-poverty No
127     Malay No formal Education                  Unemployed    non-poverty No
128 Non-Malay No formal Education                  Unemployed    non-poverty No

Then, once we created new dataframe, we can predict log odds and probability using similiar approach as above.

Show the Code
predict.prob <- augment(prem.final.mod, newdata = newdataCHE, type.predict = 'response')     
head(predict.prob)
# A tibble: 6 × 6
  race      education_level household_leader_occu…¹ poverty_income gl    .fitted
  <fct>     <fct>           <fct>                   <fct>          <fct>   <dbl>
1 Malay     Tertiary        Government servant/pen… poverty        Yes    0.0417
2 Non-Malay Tertiary        Government servant/pen… poverty        Yes    0.219 
3 Malay     Secondary       Government servant/pen… poverty        Yes    0.0727
4 Non-Malay Secondary       Government servant/pen… poverty        Yes    0.336 
5 Malay     Primary         Government servant/pen… poverty        Yes    0.131 
6 Non-Malay Primary         Government servant/pen… poverty        Yes    0.493 
# ℹ abbreviated name: ¹​household_leader_occupation
Show the Code
augment(prem.final.mod, newdata = newdataCHE, type.predict = 'link')
# A tibble: 128 × 6
   race      education_level household_leader_occ…¹ poverty_income gl    .fitted
   <fct>     <fct>           <fct>                  <fct>          <fct>   <dbl>
 1 Malay     Tertiary        Government servant/pe… poverty        Yes   -3.13  
 2 Non-Malay Tertiary        Government servant/pe… poverty        Yes   -1.27  
 3 Malay     Secondary       Government servant/pe… poverty        Yes   -2.55  
 4 Non-Malay Secondary       Government servant/pe… poverty        Yes   -0.682 
 5 Malay     Primary         Government servant/pe… poverty        Yes   -1.89  
 6 Non-Malay Primary         Government servant/pe… poverty        Yes   -0.0272
 7 Malay     No formal Educ… Government servant/pe… poverty        Yes   -0.824 
 8 Non-Malay No formal Educ… Government servant/pe… poverty        Yes    1.04  
 9 Malay     Tertiary        Private sector worker  poverty        Yes   -3.76  
10 Non-Malay Tertiary        Private sector worker  poverty        Yes   -1.90  
# ℹ 118 more rows
# ℹ abbreviated name: ¹​household_leader_occupation

4.5 using the new data

Predicted log odds for first observation = malay + tertiary education + government servant/pensioner + poverty income + GL holder

Show the Code
(-2.1573)+(0.1192*1)+(-0.9771*1)
[1] -3.0152
Show the Code
exp(-3.0152)
[1] 0.04903603

4.6 Manual calculation of predicted probability:

Formula for probability: Odds / 1 + Odds

Show the Code
0.04903603/ (1+0.04903603)
[1] 0.04674389

4.7 Model checking

Show the Code
prem.final.prob <- 
  augment(prem.final.mod, type.predict = 'response') %>%
  mutate(pred.class = factor(ifelse(.fitted > 0.5, 'Yes', 'No')))
library(caret)
Warning: package 'caret' was built under R version 4.4.2
Loading required package: lattice
Warning: package 'lattice' was built under R version 4.4.2

Attaching package: 'caret'
The following object is masked from 'package:purrr':

    lift
Show the Code
levels(prem.final.prob$CHE_category)
[1] "No"  "Yes"
Show the Code
levels(prem.final.prob$pred.class)
[1] "No"  "Yes"
Show the Code
prem.final.prob$CHE_category <- as.factor(prem.final.prob$CHE_category)
prem.final.prob$pred.class <- as.factor(prem.final.prob$pred.class)
levels(prem.final.prob$pred.class) <- levels(prem.final.prob$CHE_category)
prem.final.prob$CHE_category <- droplevels(prem.final.prob$CHE_category)
prem.final.prob$pred.class <- droplevels(prem.final.prob$pred.class)
summary(prem.final.prob$CHE_category)
 No Yes 
174  35 
Show the Code
summary(prem.final.prob$pred.class)
 No Yes 
197  12 
Show the Code
prem.final.prob <- na.omit(prem.final.prob)
library(caret)

# Ensure both variables are factors with the same levels
prem.final.prob$CHE_category <- as.factor(prem.final.prob$CHE_category)
prem.final.prob$pred.class <- as.factor(prem.final.prob$pred.class)
levels(prem.final.prob$pred.class) <- levels(prem.final.prob$CHE_category)

# Calculate the confusion matrix
confusionMatrix(prem.final.prob$pred.class, prem.final.prob$CHE_category)
Confusion Matrix and Statistics

          Reference
Prediction  No Yes
       No  172  25
       Yes   2  10
                                          
               Accuracy : 0.8708          
                 95% CI : (0.8176, 0.9131)
    No Information Rate : 0.8325          
    P-Value [Acc > NIR] : 0.07904         
                                          
                  Kappa : 0.3718          
                                          
 Mcnemar's Test P-Value : 2.297e-05       
                                          
            Sensitivity : 0.9885          
            Specificity : 0.2857          
         Pos Pred Value : 0.8731          
         Neg Pred Value : 0.8333          
             Prevalence : 0.8325          
         Detection Rate : 0.8230          
   Detection Prevalence : 0.9426          
      Balanced Accuracy : 0.6371          
                                          
       'Positive' Class : No              
                                          

Accuracy : The model correctly classify 87.1%

Sensitivity: The model can predict 98.9% of occurence of CHE from sample population among those identified to have CHE.

Specificity : The model can predict 28.6% of absence CHE from sample population among those who do not have CHE.

5 5. CHECKING GOODNESS OF FIT

by using:

Area under the curve (AU-ROC curve) Hosmer-Lemeshow test Modified Hosmer-Lemeshow test Omnibus Goodness of Fit test

5.1 ROC Curve

Show the Code
library(pROC)
Warning: package 'pROC' was built under R version 4.4.2
Type 'citation("pROC")' for a citation.

Attaching package: 'pROC'
The following objects are masked from 'package:stats':

    cov, smooth, var
Show the Code
roc_curve <- roc(CHE_category ~ predict(prem.final.mod, type = "response"), data = CHE_data)
Setting levels: control = No, case = Yes
Setting direction: controls < cases
Show the Code
auc(roc_curve)
Area under the curve: 0.7931
Show the Code
plot(roc_curve)

Area under Receiver of Operating Characteristic Curve (AUC-ROC):

AUC-ROC is 79.31%, the model is considered good discriminating effect.

5.2 Omnibus goodness of fit test

Show the Code
prem.final.res <- lrm(
  CHE_category ~ race + education_level + gl + household_leader_occupation +
    poverty_income,
  data = CHE_data,
  y = TRUE,
  x = TRUE
)
residuals(prem.final.res, type = "gof")
Sum of squared errors     Expected value|H0                    SD 
           21.7771078            22.2375871             0.3463655 
                    Z                     P 
           -1.3294606             0.1836961 

5.3 Hosmer lemeshow test

Show the Code
library(generalhoslem)
Warning: package 'generalhoslem' was built under R version 4.4.2
Loading required package: reshape
Warning: package 'reshape' was built under R version 4.4.2

Attaching package: 'reshape'
The following object is masked from 'package:lubridate':

    stamp
The following object is masked from 'package:dplyr':

    rename
The following objects are masked from 'package:tidyr':

    expand, smiths
Loading required package: MASS

Attaching package: 'MASS'
The following object is masked from 'package:gtsummary':

    select
The following object is masked from 'package:dplyr':

    select
Show the Code
logitgof(CHE_data$CHE_category, fitted(prem.final.mod), g = 10)
Warning in logitgof(CHE_data$CHE_category, fitted(prem.final.mod), g = 10): At
least one cell in the expected frequencies table is < 1. Chi-square
approximation may be incorrect.
Warning in logitgof(CHE_data$CHE_category, fitted(prem.final.mod), g = 10): Not
possible to compute 10 rows. There might be too few observations.

    Hosmer and Lemeshow test (binary model)

data:  CHE_data$CHE_category, fitted(prem.final.mod)
X-squared = 3.5861, df = 7, p-value = 0.826

5.4 Diagnostic Plot

Show the Code
plot(prem.final.mod)

Hence, all of above goodness of fit test shows that our model (prem.final.mod) has good fit.

5.5 Identify influential outlier

Show the Code
# Calculate influence measures
infl <- influence.measures(prem.final.mod)

data2.pred.res <- augment(prem.final.mod)
data2.pred.res
# A tibble: 209 × 12
   CHE_category race      education_level gl    household_leader_occupation 
   <fct>        <fct>     <fct>           <fct> <fct>                       
 1 No           Malay     Secondary       No    Unemployed                  
 2 No           Malay     Tertiary        Yes   Government servant/pensioner
 3 No           Malay     Secondary       No    Government servant/pensioner
 4 No           Malay     Tertiary        Yes   Unemployed                  
 5 Yes          Malay     Tertiary        Yes   Self employed               
 6 Yes          Malay     Primary         Yes   Government servant/pensioner
 7 Yes          Non-Malay Secondary       No    Private sector worker       
 8 No           Malay     Secondary       Yes   Government servant/pensioner
 9 No           Malay     Tertiary        Yes   Government servant/pensioner
10 No           Malay     Tertiary        Yes   Government servant/pensioner
# ℹ 199 more rows
# ℹ 7 more variables: poverty_income <fct>, .fitted <dbl>, .resid <dbl>,
#   .hat <dbl>, .sigma <dbl>, .cooksd <dbl>, .std.resid <dbl>
Show the Code
non.influen.obs <- 
  data2.pred.res %>% 
  filter(.std.resid < 2 & .std.resid > -2 )

5.6 Adjusted Model

5.7 Fit the logistic regression model again using the filtered data

Show the Code
mlr.filtered.influential <- glm(CHE_category ~ race + education_level + gl + household_leader_occupation + poverty_income, family = binomial(link="logit"), data = non.influen.obs)
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Show the Code
tidy(mlr.filtered.influential, conf.int = TRUE)
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# A tibble: 10 × 7
   term                  estimate std.error statistic p.value conf.low conf.high
   <chr>                    <dbl>     <dbl>     <dbl>   <dbl>    <dbl>     <dbl>
 1 (Intercept)             -39.1   3801.     -0.0103  0.992   -1.23e+3   134.   
 2 raceNon-Malay             2.76     0.996   2.77    0.00552  9.76e-1     5.01 
 3 education_levelSecon…    18.6   2613.      0.00712 0.994   -1.40e+2    NA    
 4 education_levelPrima…    19.4   2613.      0.00742 0.994   -1.25e+2    NA    
 5 education_levelNo fo…    21.2   2613.      0.00811 0.994   -1.16e+2   579.   
 6 glYes                    -1.47     0.722  -2.03    0.0419  -3.02e+0    -0.137
 7 household_leader_occ…    17.0   2760.      0.00614 0.995   -1.19e+2   829.   
 8 household_leader_occ…    17.7   2760.      0.00642 0.995   -1.54e+2    NA    
 9 household_leader_occ…    19.6   2760.      0.00709 0.994   -1.28e+2   459.   
10 poverty_incomenon-po…     1.20     0.662   1.82    0.0692  -5.08e-2     2.58 
Show the Code
plot(mlr.filtered.influential)

5.8 reperform model checking after model adjustment

Show the Code
mlr.filtered.prob <- 
  augment(mlr.filtered.influential, type.predict = 'response') %>%
  mutate(pred.class = factor(ifelse(.fitted > 0.5, 'Yes', 'No')))
Show the Code
library(caret)
confusionMatrix(mlr.filtered.prob$CHE_category, mlr.filtered.prob$pred.class)
Confusion Matrix and Statistics

          Reference
Prediction  No Yes
       No  168   6
       Yes  12  13
                                          
               Accuracy : 0.9095          
                 95% CI : (0.8608, 0.9455)
    No Information Rate : 0.9045          
    P-Value [Acc > NIR] : 0.4649          
                                          
                  Kappa : 0.5411          
                                          
 Mcnemar's Test P-Value : 0.2386          
                                          
            Sensitivity : 0.9333          
            Specificity : 0.6842          
         Pos Pred Value : 0.9655          
         Neg Pred Value : 0.5200          
             Prevalence : 0.9045          
         Detection Rate : 0.8442          
   Detection Prevalence : 0.8744          
      Balanced Accuracy : 0.8088          
                                          
       'Positive' Class : No              
                                          

5.9 Omnibus goodness of fit test

Show the Code
install.packages("rms")
Warning: package 'rms' is in use and will not be installed
Show the Code
library("rms")
Show the Code
prem.final.inf.res <- lrm(
  CHE_category ~ race + education_level + gl + household_leader_occupation +
    poverty_income,
  data = CHE_data,
  y = TRUE,
  x = TRUE
)
residuals(prem.final.inf.res, type = "gof")
Sum of squared errors     Expected value|H0                    SD 
           21.7771078            22.2375871             0.3463655 
                    Z                     P 
           -1.3294606             0.1836961 
Show the Code
logitgof(non.influen.obs$CHE_category, fitted(mlr.filtered.influential), g = 10)
Warning in logitgof(non.influen.obs$CHE_category,
fitted(mlr.filtered.influential), : At least one cell in the expected
frequencies table is < 1. Chi-square approximation may be incorrect.
Warning in logitgof(non.influen.obs$CHE_category,
fitted(mlr.filtered.influential), : Not possible to compute 10 rows. There
might be too few observations.

    Hosmer and Lemeshow test (binary model)

data:  non.influen.obs$CHE_category, fitted(mlr.filtered.influential)
X-squared = 0.50833, df = 6, p-value = 0.9977
Show the Code
library(pROC)
roc_curve2 <- roc(CHE_category ~ predict(mlr.filtered.influential, type = "response"), data = non.influen.obs)
Setting levels: control = No, case = Yes
Setting direction: controls < cases
Show the Code
plot(roc_curve)

Show the Code
auc(roc_curve2)
Area under the curve: 0.9485

The adjusted model shows an improvement in accuracy (90.1%) compared to the preliminary final model (87.1%).

Sensitivity in the adjusted model is 93.3% compared to the preliminary final model (98.85%), indicating the proportion of true positive cases correctly identified. Specificity in the adjusted model is (68.4%) compared to the preliminary final model (28.57%), indicating the proportion of true negative cases correctly identified.

The AU-ROC value is relatively high (94.9%), indicating good discriminatory power, increasing from 79.3% of preliminary final model.

the overall Hosmer-Lemeshow GOF test(p >0.05) and Omnibus GOF test (p>0.05) for both model shows goodness of fit

We propose to present the Adjusted model - (mlr.filtered.influential) as our logistic regression model as it improve the accuracy and fulfill the criteria for goodness of fit

5.10 model summaries

Show the Code
summary(mlr.filtered.influential)

Call:
glm(formula = CHE_category ~ race + education_level + gl + household_leader_occupation + 
    poverty_income, family = binomial(link = "logit"), data = non.influen.obs)

Coefficients:
                                                  Estimate Std. Error z value
(Intercept)                                       -39.0664  3801.0086  -0.010
raceNon-Malay                                       2.7628     0.9957   2.775
education_levelSecondary                           18.6070  2613.1356   0.007
education_levelPrimary                             19.3807  2613.1357   0.007
education_levelNo formal Education                 21.1815  2613.1358   0.008
glYes                                              -1.4693     0.7222  -2.035
household_leader_occupationPrivate sector worker   16.9559  2760.2880   0.006
household_leader_occupationSelf employed           17.7076  2760.2880   0.006
household_leader_occupationUnemployed              19.5657  2760.2879   0.007
poverty_incomenon-poverty                           1.2034     0.6624   1.817
                                                 Pr(>|z|)   
(Intercept)                                       0.99180   
raceNon-Malay                                     0.00552 **
education_levelSecondary                          0.99432   
education_levelPrimary                            0.99408   
education_levelNo formal Education                0.99353   
glYes                                             0.04189 * 
household_leader_occupationPrivate sector worker  0.99510   
household_leader_occupationSelf employed          0.99488   
household_leader_occupationUnemployed             0.99434   
poverty_incomenon-poverty                         0.06925 . 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 150.440  on 198  degrees of freedom
Residual deviance:  71.416  on 189  degrees of freedom
AIC: 91.416

Number of Fisher Scoring iterations: 20

5.11 Interpretation

Show the Code
Modelfinal <- mlr.filtered.influential
tidy(Modelfinal, conf.int = TRUE)
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# A tibble: 10 × 7
   term                  estimate std.error statistic p.value conf.low conf.high
   <chr>                    <dbl>     <dbl>     <dbl>   <dbl>    <dbl>     <dbl>
 1 (Intercept)             -39.1   3801.     -0.0103  0.992   -1.23e+3   134.   
 2 raceNon-Malay             2.76     0.996   2.77    0.00552  9.76e-1     5.01 
 3 education_levelSecon…    18.6   2613.      0.00712 0.994   -1.40e+2    NA    
 4 education_levelPrima…    19.4   2613.      0.00742 0.994   -1.25e+2    NA    
 5 education_levelNo fo…    21.2   2613.      0.00811 0.994   -1.16e+2   579.   
 6 glYes                    -1.47     0.722  -2.03    0.0419  -3.02e+0    -0.137
 7 household_leader_occ…    17.0   2760.      0.00614 0.995   -1.19e+2   829.   
 8 household_leader_occ…    17.7   2760.      0.00642 0.995   -1.54e+2    NA    
 9 household_leader_occ…    19.6   2760.      0.00709 0.994   -1.28e+2   459.   
10 poverty_incomenon-po…     1.20     0.662   1.82    0.0692  -5.08e-2     2.58 
Show the Code
tidy(Modelfinal, exponentiate = TRUE, conf.int = TRUE)
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# A tibble: 10 × 7
   term                estimate std.error statistic p.value conf.low   conf.high
   <chr>                  <dbl>     <dbl>     <dbl>   <dbl>    <dbl>       <dbl>
 1 (Intercept)         1.08e-17  3801.     -0.0103  0.992   0          2.30e+ 58
 2 raceNon-Malay       1.58e+ 1     0.996   2.77    0.00552 2.65e+ 0   1.50e+  2
 3 education_levelSec… 1.20e+ 8  2613.      0.00712 0.994   1.81e-61  NA        
 4 education_levelPri… 2.61e+ 8  2613.      0.00742 0.994   7.88e-55  NA        
 5 education_levelNo … 1.58e+ 9  2613.      0.00811 0.994   3.57e-51   3.87e+251
 6 glYes               2.30e- 1     0.722  -2.03    0.0419  4.90e- 2   8.72e-  1
 7 household_leader_o… 2.31e+ 7  2760.      0.00614 0.995   2.53e-52 Inf        
 8 household_leader_o… 4.90e+ 7  2760.      0.00642 0.995   2.08e-67  NA        
 9 household_leader_o… 3.14e+ 8  2760.      0.00709 0.994   3.48e-56   2.00e+199
10 poverty_incomenon-… 3.33e+ 0     0.662   1.82    0.0692  9.50e- 1   1.32e+  1
Show the Code
tbl_regression(Modelfinal, exponentiate = TRUE) %>% bold_labels() %>% italicize_levels() %>% as_gt() %>% gt::tab_header(title = "Table 3. Multiple Logistic Regression")
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Table 3. Multiple Logistic Regression
Characteristic OR1 95% CI1 p-value
race


    Malay
    Non-Malay 15.8 2.65, 150 0.006
education_level


    Tertiary
    Secondary 120,483,512 0.00,
>0.9
    Primary 261,171,901 0.00,
>0.9
    No formal Education 1,581,263,711 0.00, 387,172,281,033,472,279,460,208,288,200,866,042,628,242,460,844,822,248,660,080,406,848,620,684,268,408,866,864,464,046,884,680,602,802,640,224,464,644,868,860,224,804,202,426,624,846,688,868,680,248,080,868,602,066,402,680,064,088,028,866,062,222,444,668,480,622,640,042,400,464,664,004,644,248,222,442,288,482,422,280,840,466,662,680 >0.9
gl


    No
    Yes 0.23 0.05, 0.87 0.042
household_leader_occupation


    Government servant/pensioner
    Private sector worker 23,113,305 0.00, Inf >0.9
    Self employed 49,012,806 0.00,
>0.9
    Unemployed 314,237,833 0.00, 20,015,510,796,914,673,374,844,240,880,204,642,660,642,206,406,668,060,480,622,682,280,240,204,682,400,800,006,442,244,888,620,024,086,862,640,060,626,828,646,228,242,422,228,204,688,406,284,028,662,428,086,480,486,422,684,680,424,862,028,284,488,444,888,204,826,664 >0.9
poverty_income


    poverty
    non-poverty 3.33 0.95, 13.2 0.069
1 OR = Odds Ratio, CI = Confidence Interval
Show the Code
tbl_regression(Modelfinal) %>% bold_labels() %>% italicize_levels() %>% as_gt() %>% gt::tab_header(title = "Table 4. Multiple Logistic Regression") 
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: algorithm did not converge
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Table 4. Multiple Logistic Regression
Characteristic log(OR)1 95% CI1 p-value
race


    Malay
    Non-Malay 2.8 0.98, 5.0 0.006
education_level


    Tertiary
    Secondary 19 -140,
>0.9
    Primary 19 -125,
>0.9
    No formal Education 21 -116, 579 >0.9
gl


    No
    Yes -1.5 -3.0, -0.14 0.042
household_leader_occupation


    Government servant/pensioner
    Private sector worker 17 -119, 829 >0.9
    Self employed 18 -154,
>0.9
    Unemployed 20 -128, 459 >0.9
poverty_income


    poverty
    non-poverty 1.2 -0.05, 2.6 0.069
1 OR = Odds Ratio, CI = Confidence Interval

6 6. LOGISTIC REGRESSION EQUATION

logit(p) = log(p/(1-p)) = β0 + β1∗RaceMalay + β2∗glYes + β3educatin_levelsecondary + β4∗education_levelprimary + β5∗education_levelnoformaleducation + β6household_leader_occupationprivate + β7∗household_leader_occupationselfemployed + β8∗household_leader_occupationunemployed + β9∗nonpoverty_income

7 7. INTERPRETATION

  1. In this study, Non malay, and GL holder is a significant predictors for CHE
  2. The log odds of CHE in Non malay is 2.8 compared to Malay (95% CI: 0.98,5.0, p-value:0.006) when adjusted to GL holder 2.Non malay has 15.8 times the odds of experiencing CHE compared to Malay (95% CI: 2.65,150, p-value: 0.012) when adjusted to GL holder
  3. The log odds of CHE in patients with GL is -1.5 compared to patient without GL (95% CI: -3.0,-0.14, p-value: 0.042) when adjusted to Non malay
  4. patients without formal education has 0.23 times the odds of experiencing CHE compared to patient without GL (95% CI: 0.05,0.87, p-value: 0.042) when adjusted to Non malay
  5. being non-malay is a risk to experience CHE while GL is a protective factor against CHE
  6. However, the 95% CI is wide, showed less precision. this might be due to high variability or inadequate data.
  7. household leader occupation, education level and poverty income is not a significant predictors for CHE for this study