Mortality Outcome, Exposures and Confounding

On SARI data from Brazil National Surveillance System

true , Otavio Ranzani https://github.com/oranzani (ISGlobal)https://www.isglobal.org
2021-05-05

1. Background

Over the year of 2020 the world has seen an unprecedent severe pandemic due to the Novel Coronavirus-2 (SARS-CoV-2), this has put challenges over each and every surveillance system on how to produce and curate data about the pandemic. Brazil has one of the biggest and most well established public health system, in Portuguese, Sistema Único de Saúde (SUS).

From the national surveillance system to the influenza (SIVEP-Gripe)has coming the most of the data about severe acute respiratory syndrome cases due to the SARS-Cov-2. We compile those data and run some statistic analysis, aiming to seen basic factor that can be associated to mortality on those data. SIVEP-Gripe disposes the data of all hospitalizations with Severe Acute Respiratory Illness, due the lack of testing we consider those case as a very realistic and accurate proxy to the hospitalizations of SARS by Covid-19 cases.

2. Analysis

2.1 Odds Ratios on Mortality

We use a cut of the SIVEP-Gripe data and run epiR package functions to obtain the Odds Ratio calculated by the Cochran-Mantel-Haenszel method, firstly. We table the data in sub setting it 3 major exposure factors, Sex (Male or Female), Age (Being over or under 60’s) and by Race (White, Yellow, Black, Indigenous and Brown)

We start by loading the case by case data cut to the crude data from SIVEP-Gripe weekly query. This is a version with some filters, we filtered by those cases which were hospitalized, has a date of first symptoms after the day “2020-03-15”, when community transmission were declared in Brazil, and has to have a complete information about the outcome of the case, being an discharged from hospital or death.

Show code
dados<-read_csv(paste0("../CSV/sivep_mortality_cut_", last.date, ".csv"))
paged_table(head(dados, 10))

2.1.1 Mortality with Sex as exposure factor

In the procedures to cut the crude SIVEP-Gripe data, we classified the case by sex information, those which were complete we classified in Masculino, male in Portuguese, or Feminino, female in Portuguese. After this we table the case by the exposure factor, Sex against outcome.

Show code
# Sex
mortality_data_sexo<-dados %>% 
  filter(sexo != "Não Informado") %>% 
  mutate(outcome = case_when(evolucao == 1 ~ "Discharged",
                              evolucao == 2 ~ "Death")) %>% # Just to put deaths on the right place to 2by2 table, as outcome +
  mutate(outcome = ordered(outcome, c("Death", "Discharged")))

# Filtering those who has not information about sex

# Tableing the outcomes against exposure factors, being of each sex
mortality_table_sexo<- table(mortality_data_sexo$sexo, 
                        mortality_data_sexo$outcome, 
                        dnn = c("Sex", "Outcome"))
paged_table(data.frame((mortality_table_sexo)))

We have a count of 191155 females with the outcome of dying in hospital, a count of 422334 females which has been discharged. For males, we have 241256 who died and 491396 who was discharged.

Show code
# Computing a OR from the 2by2 table, 
# with sex as an exposure factor and death or survival as outcome
or_mortality_sexo<-epi.2by2(dat = mortality_table_sexo,
                            method = "cohort.count", 
                            conf.level = 0.95, 
                            units = 100, 
                            outcome = "as.columns")
or_mortality_sexo
             Outcome +    Outcome -      Total        Inc risk *
Exposed +       191155       422334     613489              31.2
Exposed -       241256       491396     732652              32.9
Total           432411       913730    1346141              32.1
                 Odds
Exposed +       0.453
Exposed -       0.491
Total           0.473

Point estimates and 95% CIs:
-------------------------------------------------------------------
Inc risk ratio                               0.95 (0.94, 0.95)
Odds ratio                                   0.92 (0.92, 0.93)
Attrib risk *                                -1.77 (-1.93, -1.61)
Attrib risk in population *                  -0.81 (-0.94, -0.67)
Attrib fraction in exposed (%)               -5.68 (-6.21, -5.16)
Attrib fraction in population (%)            -2.51 (-2.74, -2.29)
-------------------------------------------------------------------
 Test that OR = 1: chi2(1) = 480.019 Pr>chi2 = <0.001
 Wald confidence limits
 CI: confidence interval
 * Outcomes per 100 population units 

The odds of dying if hospitalized due to SARI for females is 0.92 (95% CI: 0.91, 0.93) times greater than the odds of dying when being hospitalized due to SARI for males. The females has an protetive effect in the association of being hospitalized and sex.

2.1.2 Mortality with Age as exposure factor

We repeat the same analysis from above but changing sex by age, we classified the case by Age information, those which were not missing, we classified in <60, less than 60 years old, or 60>=, over or equal to 60 years old. After this we table the case by the exposure factor, Age against outcome.

Show code
# Age
mortalily_data_age<-dados %>% 
  filter(!is.na(age)) %>% 
  mutate(outcome = case_when(evolucao == 1 ~ "Discharged",
                              evolucao == 2 ~ "Death")) %>% # Just to put deaths on the right place to 2by2 table, as outcome +
  mutate(outcome = ordered(outcome, c("Death", "Discharged")),
         age = ordered(age, c("<60", ">60")))


mortality_table_age<- table(mortalily_data_age$age, 
                             mortalily_data_age$outcome, 
                             dnn = c("Age", "Outcome"))
paged_table(data.frame(mortality_table_age))

We have a count of 115448 with the outcome of dying which were less than 60 years old, and a count of 529996 over than 60 years old. For survivers, we have 317027 with less than 60 years old and 384003 who are over 60 years old.

Show code
# Computing a OR from the 2by2 table, 
# with age 60>= as an exposure factor and death or survival as outcome
or_mortality_age<-epi.2by2(dat = mortality_table_age,
                            method = "cohort.count", 
                            conf.level = 0.95, 
                            units = 100, 
                            outcome = "as.columns")
or_mortality_age
             Outcome +    Outcome -      Total        Inc risk *
Exposed +       115448       529996     645444              17.9
Exposed -       317027       384003     701030              45.2
Total           432475       913999    1346474              32.1
                 Odds
Exposed +       0.218
Exposed -       0.826
Total           0.473

Point estimates and 95% CIs:
-------------------------------------------------------------------
Inc risk ratio                               0.40 (0.39, 0.40)
Odds ratio                                   0.26 (0.26, 0.27)
Attrib risk *                                -27.34 (-27.49, -27.19)
Attrib risk in population *                  -13.10 (-13.24, -12.96)
Attrib fraction in exposed (%)               -152.83 (-154.31, -151.36)
Attrib fraction in population (%)            -40.80 (-41.04, -40.56)
-------------------------------------------------------------------
 Test that OR = 1: chi2(1) = 115178.100 Pr>chi2 = <0.001
 Wald confidence limits
 CI: confidence interval
 * Outcomes per 100 population units 

The odds of dying if hospitalized due to SARI for people less than 60 years old is 0.26 (95% CI: 0.26, 0.26) times reduced than the odds of dying when being hospitalized due to SARI for people with over than 60 years old. Being less than 60 years old has a protective effect on the outcome of a hospitalization, when compared with with being over than 60 years old.

2.2 Confounding and effect modification

A very common phenom when computing Odds Ratios and Risk Ratios is that we are working with a data that has multiple factors which can contribute to an association between an outcome an exposure, so to work better and avoid those mistakes we adjust the Odds Ratio for the data stratifying it on different factor that can be confounding on the analysis.

2.2.1 Age as a confounding

Maybe the odds ratio we are computing is confounded, age is a critical factor to determine outcome, and in the Section 2.1.1 we didn’t take this into account. So to account on this, we repeat the analysis of before, but now we stratified the table by age.

Now age is a confounding of Sex as exposure factor in the odds ratio computation.

Show code
# Age as Confounding, so sex as the exposure comes first in the table
mortalily_data_sex_age<-dados %>% 
  filter(!is.na(age) & sexo != "Não Informado") %>% 
  mutate(outcome = case_when(evolucao == 1 ~ "Discharged",
                              evolucao == 2 ~ "Death")) %>% # Just to put deaths on the right place to 2by2 table, as outcome +
  mutate(outcome = ordered(outcome, c("Death", "Discharged")))

mortality_table_sex_age<- table(mortalily_data_sex_age$sexo, 
                                mortalily_data_sex_age$outcome, 
                                mortalily_data_sex_age$age, 
                                dnn = c("Sex", "Outcome", "Age"))
paged_table(data.frame(mortality_table_sex_age))

Now the table has been spitted into 2 sections, one for the sex as exposure and those case with less than 60 years old, and other with sex as exposure for the cases with 60 or more years old. At the raw data, we already can see there is a difference in outcome, dying by SARI when hospitalized, women with less than 60 years dies less than men with over than 60 years.

Computing the Odds Ratio we have:

Show code
or_mortality_sex_age<-epi.2by2(dat = mortality_table_sex_age,
                               method = "cohort.count", 
                               conf.level = 0.95, 
                               units = 100, 
                               outcome = "as.columns")
or_mortality_sex_age
             Outcome +    Outcome -      Total        Inc risk *
Exposed +       191155       422334     613489              31.2
Exposed -       241256       491396     732652              32.9
Total           432411       913730    1346141              32.1
                 Odds
Exposed +       0.453
Exposed -       0.491
Total           0.473


Point estimates and 95% CIs:
-------------------------------------------------------------------
Inc risk ratio (crude)                       0.95 (0.94, 0.95)
Inc risk ratio (M-H)                         0.91 (0.90, 0.91)
Inc risk ratio (crude:M-H)                   1.04
Odds ratio (crude)                           0.92 (0.92, 0.93)
Odds ratio (M-H)                             0.85 (0.85, 0.86)
Odds ratio (crude:M-H)                       1.08
Attrib risk (crude) *                        -1.77 (-1.93, -1.61)
Attrib risk (M-H) *                          -3.18 (-3.34, -3.03)
Attrib risk (crude:M-H)                      0.56
-------------------------------------------------------------------
 M-H test of homogeneity of RRs: chi2(1) = 16.112 Pr>chi2 = <0.001
 M-H test of homogeneity of ORs: chi2(1) = 10.716 Pr>chi2 = 0.00
 Test that M-H adjusted OR = 1:  chi2(1) = NA Pr>chi2 = NA
 Wald confidence limits
 M-H: Mantel-Haenszel; CI: confidence interval
 * Outcomes per 100 population units 

The Mantel-Haenszel test of homogeneity of the strata odds ratios is significant (chi square test statistic 5.399; and p-value = 0.02) so we do not accept the null hypothesis and conclude that the odds ratios for each strata of age are not the same. When accounting for the confounding effect of age, the odds of dying if hospitalized by SARI for males is 0.85 (95% CI 0.84, 0.86) times that of females.

2.2.2 Sex as a confounding

Another concern is that the odds ratio we are computing is again confounded, sex is too a critical factor to determine outcome, women has less prevalence of comorbidities, and in the Section 2.1.2 we didn’t take this into account. As in the last Section 2.2.1 we repeat the same analysis, now with stratified table by sex.

Sex is a confounding of Age as exposure factor in the odds ratio computation.

Show code
# Sex as Confounding
# Age first
mortalily_data_age_sex<-dados %>% 
  filter(!is.na(age) & sexo != "Não Informado") %>% 
  mutate(outcome = case_when(evolucao == 1 ~ "Discharged",
                              evolucao == 2 ~ "Death")) %>% # Just to put deaths on the right place to 2by2 table, as outcome +
  mutate(outcome = ordered(outcome, c("Death", "Discharged")))
mortality_table_age_sex<- table(mortalily_data_age_sex$age, 
                            mortalily_data_age_sex$outcome, 
                            mortalily_data_age_sex$sexo, 
                            dnn = c("Age", "Outcome", "Sex"))
paged_table(data.frame(mortality_table_age_sex))

The table is for the age as an exposure factor, and has for the confounding the sex, it is equal to the one in the Section 2.2.1, but let see if the Odds Ratios still will be the same.

Computing the Odds Ratio we have:

Show code
or_mortality_age_sex<-epi.2by2(dat = mortality_table_age_sex,
                           method = "cohort.count", 
                           conf.level = 0.95, 
                           units = 100, 
                           outcome = "as.columns")
or_mortality_age_sex
             Outcome +    Outcome -      Total        Inc risk *
Exposed +       115429       529810     645239              17.9
Exposed -       316982       383920     700902              45.2
Total           432411       913730    1346141              32.1
                 Odds
Exposed +       0.218
Exposed -       0.826
Total           0.473


Point estimates and 95% CIs:
-------------------------------------------------------------------
Inc risk ratio (crude)                       0.40 (0.39, 0.40)
Inc risk ratio (M-H)                         0.39 (0.39, 0.40)
Inc risk ratio (crude:M-H)                   1.01
Odds ratio (crude)                           0.26 (0.26, 0.27)
Odds ratio (M-H)                             0.26 (0.26, 0.26)
Odds ratio (crude:M-H)                       1.01
Attrib risk (crude) *                        -27.34 (-27.48, -27.19)
Attrib risk (M-H) *                          -27.50 (-27.66, -27.34)
Attrib risk (crude:M-H)                      0.99
-------------------------------------------------------------------
 M-H test of homogeneity of RRs: chi2(1) = 16.112 Pr>chi2 = <0.001
 M-H test of homogeneity of ORs: chi2(1) = 10.716 Pr>chi2 = 0.00
 Test that M-H adjusted OR = 1:  chi2(1) = NA Pr>chi2 = NA
 Wald confidence limits
 M-H: Mantel-Haenszel; CI: confidence interval
 * Outcomes per 100 population units 

As before the Mantel-Haenszel test of homogeneity of the strata odds ratios is significant (chi square test statistic 5.399; and p-value = 0.02) and we do not accept the null hypothesis, concluding that the odds ratios for each strata of sex are not the same. When accounting for the confounding effect of sex, the odds of dying if hospitalized by SARI for people over 60 years old is 0.26 (95% CI 0.26 to 0.26) times greater that of those with less than 60 years old. This is the same as before, when only counting the age as an exposure, this suggest sex is not a confounding for age, has no effect modification.

Normally happens to confounding are not symmetric to outcomes, it is crucial to account on each of the confounding and see how it is associated on each causal path. If we need to account on more than one confounding we have to adjust a Multinomial model or a Logistic model, and from it extract the Odds Ratio.

2.2.3 Race as a confounding

Now we take the Race of the individual as a confounding, as in the last two sections Section 2.2.1 Section 2.2.2 we will account as race as an confounding on the two different exposure risk factor, Age and Sex. Race is a very good proxy to social-economic level, controlling by it could be give more insights on how the mortality will play a more dramatic role. In Brazil, those who are not self-identified as whites White probably has lower social-economic level, accumulating more risk factors and comorbidities.

In Brazil IBGE, has an auto-declared race code of classification, being, White, Yellow, Indigenouos, Brown and Black people. The race field is mandatory in the notification form of SIVEP-Gripe, but still there are a lack of filling in, so form this analysis we used only those cases with filling in.

2.2.3.1 Race as confounding to Age as exposure

We proceed as before, tabling the cases with age exposure factor and stratifying in the 5 different levels of race factor.

Show code
# Race and Age
mortalily_data_raca_age<-dados %>% 
  filter(raca != "Não Informado" & !is.na(age)) %>% 
  mutate(raca = factor(raca, levels = unique(raca), ordered = T)) %>% 
  mutate(outcome = case_when(evolucao == 1 ~ "Discharged",
                              evolucao == 2 ~ "Death")) %>% # Just to put deaths on the right place to 2by2 table, as outcome +
  mutate(outcome = ordered(outcome, c("Death", "Discharged")))
mortality_table_race_age<- table(mortalily_data_raca_age$age, 
                                  mortalily_data_raca_age$outcome,
                                  mortalily_data_raca_age$raca,
                                  dnn = c("Age", "Outcome", "Race"))
paged_table(data.frame(mortality_table_race_age))

And the Odds Ratio is calculated:

Show code
or_mortality_raca_age<-epi.2by2(dat = mortality_table_race_age,
                                 method = "cohort.count", 
                                 conf.level = 0.95, 
                                 units = 100, 
                                 outcome = "as.columns")
or_mortality_raca_age
             Outcome +    Outcome -      Total        Inc risk *
Exposed +        96294       419632     515926              18.7
Exposed -       263008       307927     570935              46.1
Total           359302       727559    1086861              33.1
                 Odds
Exposed +       0.229
Exposed -       0.854
Total           0.494


Point estimates and 95% CIs:
-------------------------------------------------------------------
Inc risk ratio (crude)                       0.41 (0.40, 0.41)
Inc risk ratio (M-H)                         0.40 (0.40, 0.40)
Inc risk ratio (crude:M-H)                   1.01
Odds ratio (crude)                           0.27 (0.27, 0.27)
Odds ratio (M-H)                             0.26 (0.26, 0.27)
Odds ratio (crude:M-H)                       1.02
Attrib risk (crude) *                        -27.40 (-27.57, -27.23)
Attrib risk (M-H) *                          -27.71 (-27.89, -27.53)
Attrib risk (crude:M-H)                      0.99
-------------------------------------------------------------------
 M-H test of homogeneity of RRs: chi2(4) = 382.381 Pr>chi2 = <0.001
 M-H test of homogeneity of ORs: chi2(4) = 100.185 Pr>chi2 = <0.001
 Test that M-H adjusted OR = 1:  chi2(4) = NA Pr>chi2 = NA
 Wald confidence limits
 M-H: Mantel-Haenszel; CI: confidence interval
 * Outcomes per 100 population units 

So for the race as a confounding of exposure for the age, we conclude that each strata has a different odds ratios for the age as an exposure risk factor. The Mantel-Haenszel test of homogeneity is significant (\(\chi^2\) test statistics of 103.703 with p-value less than 0.001) and we do not accept the null hypothesis. If an individual is hospitalized by SARI it will have 0.26 (95% CI: 0.26, 0.26) times greater odds to die if it is over 60 years old than less, after accounting the effect of confounding of race per strata.

2.2.3.2 Race as confounding to Sex as exposure

Lastly, we table the cases with sex exposure risk factor and stratifying again in the 5 different levels of race factor.

Show code
# Race and Sex
mortalily_data_raca_sexo<-dados %>% 
  filter(raca != "Não Informado" & sexo != "Não Informado")%>% 
  mutate(raca = factor(raca, levels = unique(raca))) %>% 
  mutate(outcome = case_when(evolucao == 1 ~ "Discharged",
                              evolucao == 2 ~ "Death")) %>% # Just to put deaths on the right place to 2by2 table, as outcome +
  mutate(outcome = ordered(outcome, c("Death", "Discharged")))
mortality_table_race_sexo<- table(mortalily_data_raca_sexo$sexo, 
                             mortalily_data_raca_sexo$outcome,
                             mortalily_data_raca_sexo$raca,
                             dnn = c("Sex", "Outcome", "Race"))
paged_table(data.frame(mortality_table_race_sexo))

And the Odds Ratio is calculated:

Show code
or_mortality_raca_sexo<-epi.2by2(dat = mortality_table_race_sexo,
                            method = "cohort.count", 
                            conf.level = 0.95, 
                            units = 100, 
                            outcome = "as.columns")
or_mortality_raca_sexo
             Outcome +    Outcome -      Total        Inc risk *
Exposed +       158785       337227     496012              32.0
Exposed -       200479       390172     590651              33.9
Total           359264       727399    1086663              33.1
                 Odds
Exposed +       0.471
Exposed -       0.514
Total           0.494


Point estimates and 95% CIs:
-------------------------------------------------------------------
Inc risk ratio (crude)                       0.94 (0.94, 0.95)
Inc risk ratio (M-H)                         0.94 (0.94, 0.95)
Inc risk ratio (crude:M-H)                   1.00
Odds ratio (crude)                           0.92 (0.91, 0.92)
Odds ratio (M-H)                             0.92 (0.91, 0.93)
Odds ratio (crude:M-H)                       1.00
Attrib risk (crude) *                        -1.93 (-2.11, -1.75)
Attrib risk (M-H) *                          -1.88 (-2.06, -1.70)
Attrib risk (crude:M-H)                      1.03
-------------------------------------------------------------------
 M-H test of homogeneity of RRs: chi2(4) = 29.134 Pr>chi2 = <0.001
 M-H test of homogeneity of ORs: chi2(4) = 28.752 Pr>chi2 = <0.001
 Test that M-H adjusted OR = 1:  chi2(4) = NA Pr>chi2 = NA
 Wald confidence limits
 M-H: Mantel-Haenszel; CI: confidence interval
 * Outcomes per 100 population units 

The effect of race as a confounding of sex exposure risk factor, has for each strata a different odds ratios for the sex. The Mantel-Haenszel test of homogeneity is again significant (\(\chi^2\) test statistics of 27.303 with p-value less than 0.001) and we do not accept the null hypothesis. Individuals hospitalized by SARI it will have 0.92 (95% CI: 0.91, 0.92) times greater odds to die if it is males than females, after accounting the effect of confounding of race per strata.

2.2.4 State as confounding

Brazil is a very diverse country, with a big territory, local realities vary greatly over the Brazilian territory, one of the administrative divisions is State level. States receive different amount of budget and has their constitutions of laws on how and how much spend this budget, after the obligatory spending determined by the constitution. Particularly to the public health issues, each state can organize and determine its own way to expand and prioritize expenditures of budget, this generates a very heterogeneous scenario over the whole country, on the access to public health services.

In this part, we consider State level data for the mortality odds ratio, state can play the role of a confounding, so we do as the same for the last Section 2.2.3.

2.2.4.1 State as confounding to Age as exposure

As before, we stratify the data into each State level information, with Age as an exposure.

Show code
# State and Age
mortalily_data_state_age<-dados %>% 
  filter(!is.na(sg_uf) & !is.na(age)) %>% 
  mutate(outcome = case_when(evolucao == 1 ~ "Discharged",
                              evolucao == 2 ~ "Death")) %>% # Just to put deaths on the right place to 2by2 table, as outcome +
  mutate(outcome = ordered(outcome, c("Death", "Discharged")))
mortality_table_state_age<- table(mortalily_data_state_age$age, 
                                  mortalily_data_state_age$outcome,
                                  mortalily_data_state_age$sg_uf,
                                  dnn = c("Age", "Outcome", "State"))
paged_table(data.frame(mortality_table_state_age))

And the odds ratio stratified by state level is:

Show code
or_mortality_state_age<-epi.2by2(dat = mortality_table_state_age,
                                 method = "cohort.count", 
                                 conf.level = 0.95, 
                                 units = 100, 
                                 outcome = "as.columns")
or_mortality_state_age
             Outcome +    Outcome -      Total        Inc risk *
Exposed +       115448       529996     645444              17.9
Exposed -       317027       384003     701030              45.2
Total           432475       913999    1346474              32.1
                 Odds
Exposed +       0.218
Exposed -       0.826
Total           0.473


Point estimates and 95% CIs:
-------------------------------------------------------------------
Inc risk ratio (crude)                       0.40 (0.39, 0.40)
Inc risk ratio (M-H)                         0.40 (0.40, 0.40)
Inc risk ratio (crude:M-H)                   0.99
Odds ratio (crude)                           0.26 (0.26, 0.27)
Odds ratio (M-H)                             0.26 (0.26, 0.26)
Odds ratio (crude:M-H)                       1.02
Attrib risk (crude) *                        -27.34 (-27.49, -27.19)
Attrib risk (M-H) *                          -27.13 (-27.29, -26.98)
Attrib risk (crude:M-H)                      1.01
-------------------------------------------------------------------
 M-H test of homogeneity of RRs: chi2(26) = 1618.669 Pr>chi2 = <0.001
 M-H test of homogeneity of ORs: chi2(26) = 517.174 Pr>chi2 = <0.001
 Test that M-H adjusted OR = 1:  chi2(26) = NA Pr>chi2 = NA
 Wald confidence limits
 M-H: Mantel-Haenszel; CI: confidence interval
 * Outcomes per 100 population units 

Again, the odds ratio without account for a confounding is the same as for with the confounder, this suggest that for age as an exposure, there is little confounding effects, age is a very strong exposure to the outcome of dying when being hospitalized by SARI. The odds ratio for age as an exposure of dying by a hospitalized SARI, when counting on state as a confounding, is 0.26 (95% CI: 0.26, 0.26) reduced when below 60 years old than when over 60 years.

2.2.4.2 State as confounding to Sex as exposure

We stratify the data into each State level information, with Sex as an exposure.

Show code
# State and Age
mortalily_data_state_sex<-dados %>% 
  filter(!is.na(sg_uf) & sexo != "Não Informado") %>% 
  mutate(outcome = case_when(evolucao == 1 ~ "Discharged",
                              evolucao == 2 ~ "Death")) %>% # Just to put deaths on the right place to 2by2 table, as outcome +
  mutate(outcome = ordered(outcome, c("Death", "Discharged")))
mortality_table_state_sex<- table(mortalily_data_state_sex$sexo, 
                                  mortalily_data_state_sex$outcome,
                                  mortalily_data_state_sex$sg_uf,
                                  dnn = c("Sex", "Outcome", "State"))
paged_table(data.frame(mortality_table_state_sex))

For the odds ratio stratified by state level is:

Show code
or_mortality_state_sex<-epi.2by2(dat = mortality_table_state_sex,
                                 method = "cohort.count", 
                                 conf.level = 0.95, 
                                 units = 100, 
                                 outcome = "as.columns")
or_mortality_state_sex
             Outcome +    Outcome -      Total        Inc risk *
Exposed +       191155       422334     613489              31.2
Exposed -       241256       491396     732652              32.9
Total           432411       913730    1346141              32.1
                 Odds
Exposed +       0.453
Exposed -       0.491
Total           0.473


Point estimates and 95% CIs:
-------------------------------------------------------------------
Inc risk ratio (crude)                       0.95 (0.94, 0.95)
Inc risk ratio (M-H)                         0.95 (0.94, 0.95)
Inc risk ratio (crude:M-H)                   1.00
Odds ratio (crude)                           0.92 (0.92, 0.93)
Odds ratio (M-H)                             0.92 (0.92, 0.93)
Odds ratio (crude:M-H)                       1.00
Attrib risk (crude) *                        -1.77 (-1.93, -1.61)
Attrib risk (M-H) *                          -1.73 (-1.89, -1.57)
Attrib risk (crude:M-H)                      1.02
-------------------------------------------------------------------
 M-H test of homogeneity of RRs: chi2(26) = 227.203 Pr>chi2 = <0.001
 M-H test of homogeneity of ORs: chi2(26) = 195.584 Pr>chi2 = <0.001
 Test that M-H adjusted OR = 1:  chi2(26) = NA Pr>chi2 = NA
 Wald confidence limits
 M-H: Mantel-Haenszel; CI: confidence interval
 * Outcomes per 100 population units 

The odds ratio without accounting for a confounding is the same as for with the confounder, as in Age as an exposure, suggests that for Sex too as an exposure, is little confounding effects. Odds ratio by Mantel-Haenszel method, for Sex as an exposure of dying by a hospitalized SARI, when counting on state as a confounding, is 0.92 (95% CI: 0.91, 0.93) greater when the individual is a female than when is a male person.

3. Conclusions

We accounted the odds ratio for different tables, summarizing the possible outcomes when an individual is hospitalized by SARI in Brazil.

First, understood the effects of sex on the possible outcomes, we seen that females are little less associated to dying in this situation than males ones, the section 2.1.1 summarize the odds ratios calculated when controlling for sex, the odds of females dying if hospitalized by SARI is 0.92 (95% CI: 0.92, 0.92).

In the Section 2.1.2, we controlled by age, which we clustered the continuum variable as of, cases by being over 60 years old or younger (“<60 years | >=60 years”). The odds ratios is 0.26 (95% CI: 3.80, 3.86) times reduced of dying of SARI hospitalization when is below 60 years old compared when older than this.

Controlling for confounding on this analysis, we have to calculate the Odds Ratios by the Mantel-Haenszel method (in the output of epi.2by2, the Odds ratio (M-H)), which some up all over stratum, given the strata-specific OR.

We did 4 different ways to controlling for confounding, the first was to controlling the outcome with sex as an exposure and age as a confounding. This gave us the understanding that females have 0.92 (95% CI 1.17 to 1.18) times minor odds to dying when hospitalized by SARI. This was done in the Section 2.2.1.

The second controlling on estimating Odds Ratios, was to invert the last controlling, now age is an exposure and sex is the confounding, this is done because two confounding could act differently on the outcomes. After calculating we got that for people younger than 60 years has an 0.26 (95% CI 0.26 to 0.26) times minor odds to dying by SARI hospitalizations, when controlling for sex, or males over 60 years old are associated 3.87 (\(\frac{1}{0.26}\)) times more to death than females with less than 60 years Section 2.2.2.

The third Section 2.2.3 controlling we did was to control by race as a confounding, race plays a role of being a very stronger determinant of income and as consequences discriminate vulnerable than less vulnerable. For race as confounding, we always take the convention, Over the 5 strata of race, we saw the following, first race as a confounding for the association of age and outcome of a hospitalization Section 2.2.3.1. If an individual is hospitalized by SARI it will have 0.26 (95% CI: 0.26, 0.26) times minor odds to die if it is over 60 years old than less, after accounting the effect of confounding of race per strata. Looking in the Odds Ratio per strata, we see there is little difference between odds over and below 60 years, this suggests race is not a strong confounding. Or age is a very strong determinant to the outcome of dying or been discharged, when hospitalized.

Show code
race<-unique(dados$raca)
race<-race[race != "Não Informado"] # Excluding Não Informados

race_age_or_table<-cbind(race, or_mortality_raca_age$res$OR.strata.mle)
race_age_or_table
      race       est     lower     upper
1   Branca 0.2529246 0.2496979 0.2561690
2    Parda 0.2709183 0.2673956 0.2745350
3    Preta 0.2944133 0.2843041 0.3048761
4  Amarela 0.2839731 0.2612965 0.3084096
5 Indígena 0.2445294 0.2080591 0.2869890
Show code
race_age_or_table %>% 
  arrange(race) %>% 
ggplot(aes(y = race, x = est, xmin = lower, xmax = upper ))+
  geom_pointrangeh(aes(col=race))+
  geom_vline(xintercept = 0, linetype=2)+
  labs(title = "Age exposure with Race as Confounding", x = "Odds Ratio % (95% CI)", 
       y= "Race", col = "Race")+
  geom_errorbar(aes(xmin=lower, xmax=upper, col=race),width=0.25,cex=.15)+
  theme_minimal()+
  viridis::scale_color_viridis(discrete = T, option = "cividis")

Controlling for the sex as exposure and taking race as a confounding we find, Section 2.2.3.2, individuals hospitalized by SARI it will have 0.92 (95% CI: 0.91, 0.93) times reduced odds to die if it is females than males, after accounting the effect of confounding of race per strata.

Show code
race_sex_or_table<-cbind(race, or_mortality_raca_sexo$res$OR.strata.mle)
race_sex_or_table
      race       est     lower     upper
1   Branca 0.9220895 0.9117067 0.9326092
2    Parda 0.9111112 0.8998380 0.9224908
3    Preta 0.9627506 0.9314355 0.9951093
4  Amarela 0.8801963 0.8170297 0.9481397
5 Indígena 0.6639030 0.5684967 0.7748325
Show code
race_sex_or_table %>% 
ggplot(aes(y = race, x = est, xmin = lower, xmax = upper ))+
  geom_pointrangeh(aes(col=race))+
  geom_vline(xintercept = 0, linetype=2)+
  labs(title = "Sex exposure with Race as Confounding", x = "Odds Ratio % (95% CI)", 
       y= "Race", col = "Race")+
  geom_errorbar(aes(xmin=lower, xmax=upper, col=race),width=0.15,cex=.25)+
  theme_minimal()+
  viridis::scale_color_viridis(discrete = T, option = "cividis")

Differently, from age as an exposure, for sex as an exposure we have a reduced odds to dying in a hospitalization which significantly different by race, females from indigenous race has a 0.65 (95% CI: 0.56, 0,76) times minor odds ratio of dying from hospitalization than males from indigenous people. For the other 4 races the odds ratio is almost the same, in this 4 particular stratum, only yellow people has an odds reduced for females than males less than 0.90, being 0.88 (95% CI: 0.81, 0.94).

Lastly, in the Section 2.2.4, we did the odds by each state level as a confounding to Age and Sex, access to public health is a crucial determinant to mortality as an outcome, state level information could add up to this. Brazil has a national public health system, which attend over the 100 millions of inhabitants, but its coverage over the different 27 federated units, 26 states and a federal district, varies greatly over the whole country.

The Section 2.2.4.1 is dedicated to understand how the state level could act as a confounding to the exposure of age, we found an over all odds of 0.26 (955 CI: 0.26, 0.26), suggesting state level has not much confounding effect on mortality due to age exposure, but we need to take a look in each odds ratio by state level.

Show code
states<-data.frame(unique(mortalily_data_state_age$sg_uf))
names(states)<-"states"
states<-states %>% 
  arrange(states)

state_age_or_table<-cbind(states, or_mortality_state_age$res$OR.strata.mle)
state_age_or_table
   states       est     lower     upper
1      AC 0.2704647 0.2307970 0.3165883
2      AL 0.2988984 0.2768834 0.3226483
3      AM 0.2310342 0.2204931 0.2420646
4      AP 0.1954192 0.1673533 0.2279950
5      BA 0.2849958 0.2737127 0.2966533
6      CE 0.2559986 0.2460446 0.2663269
7      DF 0.2241683 0.2118224 0.2371659
8      ES 0.2455986 0.2259829 0.2669188
9      GO 0.2888450 0.2773208 0.3007889
10     MA 0.2818900 0.2620944 0.3031030
11     MG 0.2889066 0.2815120 0.2965093
12     MS 0.2545189 0.2389452 0.2710364
13     MT 0.2793347 0.2582445 0.3020457
14     PA 0.2241160 0.2141609 0.2344207
15     PB 0.2615120 0.2459813 0.2779874
16     PE 0.2452977 0.2350635 0.2559338
17     PI 0.2781956 0.2564747 0.3016156
18     PR 0.2901070 0.2807628 0.2997468
 [ reached 'max' / getOption("max.print") -- omitted 9 rows ]
Show code
state_age_or_table %>% 
ggplot(aes(y = states, x = est, xmin = lower, xmax = upper ))+
  geom_pointrangeh(aes(col=states))+
  geom_vline(xintercept = 0, linetype=2)+
  labs(title = "Age exposure with State as Confounding", x = "Odds Ratio % (95% CI)", 
       y= "States (initials)", col = "State")+
  geom_errorbar(aes(xmin=lower, xmax=upper, col=states),width=0.5,cex=0.5)+
  theme_minimal()+
  viridis::scale_color_viridis(option = "cividis", discrete = T)

Two conclusions emerges from the graph, first as we hypothesized the odds to die due to SARI varies greatly from state to state, this as we suggests could be an effect of the diverse access and public health organization on each state. Secondly, the amount and in consequence the CIs, varies too greatly over states, this is could be a artifact of the notification systems, each state is responsible to report their own cases, and each state has particularities on this process, moreover, each has very different density and population size. The state of São Paulo is the most populous state in the country, and has the major urban and dense area of the country, so probably will have a statistics over cases and its status, dying or being discharged, which is more credible than other states.

In the Section 2.2.4.2, we analyze the state as a confounding to sex as an exposure to die by a hospitalization of SARI, it has an over all odds ratio, accounting for state as a confounding, again, of 0.92 (95% CI: 0.92,0.92), suggesting state level is not a confounding of sex, in associating the outcome of hospitalization.

As before, we have to look on per strata odds ratio, to conclude if the over all odds ratio traduce it well.

Show code
state_sex_or_table<-cbind(states, or_mortality_state_sex$res$OR.strata.mle)
state_sex_or_table
   states       est     lower     upper
1      AC 0.8693714 0.7469155 1.0115037
2      AL 0.9547506 0.8880005 1.0264913
3      AM 0.8594666 0.8224407 0.8981533
4      AP 0.6761162 0.5844991 0.7816720
5      BA 0.9485854 0.9137356 0.9848164
6      CE 0.9739188 0.9389846 1.0101549
7      DF 0.8659538 0.8219074 0.9123259
8      ES 1.0221823 0.9456547 1.1049158
9      GO 0.8940172 0.8603474 0.9289645
10     MA 0.8842743 0.8253080 0.9474616
11     MG 0.9158468 0.8950752 0.9370595
12     MS 0.9639660 0.9090101 1.0222431
13     MT 0.7835707 0.7261128 0.8454303
14     PA 0.8234529 0.7892897 0.8590935
15     PB 0.9322103 0.8805127 0.9868962
16     PE 0.8849538 0.8510561 0.9201922
17     PI 0.8374793 0.7776482 0.9018198
18     PR 0.8659140 0.8403275 0.8922637
 [ reached 'max' / getOption("max.print") -- omitted 9 rows ]
Show code
state_sex_or_table %>% 
ggplot(aes(y = states, x = est, xmin = lower, xmax = upper ))+
  geom_pointrangeh(aes(col=states))+
  geom_vline(xintercept = 0, linetype=2)+
  labs(title = "Sex exposure with State as Confounding", x = "Odds Ratio % (95% CI)", 
       y= "States (initials)", col = "State")+
  geom_errorbar(aes(xmin=lower, xmax=upper, col=states),width=0.5,cex=0.5)+
  theme_minimal()+
  viridis::scale_color_viridis(option = "cividis", discrete = T)

Finally, by this we saw there are multiple factors of risk and multiple confounding effects on analyzing outcome due to SARI hospitalizations, sex, age, race and state. Those variables can give proxies to very different realities, as well a variety of prevalence. The sort of factors helps explaining the diversity of possible association to outcomes of being discharged or die in a hospitalization of SARI, a more complicated adding is the pandemic scenario in which the data were collected. There were situations of collapse of the public health system, but even in this case, the outcome could greatly vary over, sex, age, race and state.

The Covid-19 pandemic is a complex phenom and has pose to public health challenges never seen before. Understanding which factors contributes more to surviving or dying can give a more accurate drawing of public health policies.