Titanic

References

Load data

## 
data(Titanic)
Titanic
## , , Age = Child, Survived = No
## 
##       Sex
## Class  Male Female
##   1st     0      0
##   2nd     0      0
##   3rd    35     17
##   Crew    0      0
## 
## , , Age = Adult, Survived = No
## 
##       Sex
## Class  Male Female
##   1st   118      4
##   2nd   154     13
##   3rd   387     89
##   Crew  670      3
## 
## , , Age = Child, Survived = Yes
## 
##       Sex
## Class  Male Female
##   1st     5      1
##   2nd    11     13
##   3rd    13     14
##   Crew    0      0
## 
## , , Age = Adult, Survived = Yes
## 
##       Sex
## Class  Male Female
##   1st    57    140
##   2nd    14     80
##   3rd    75     76
##   Crew  192     20

Direct method

## Collapse 
Titanic2 <- apply(Titanic, MARGIN = c(1,2,4), sum)

## Permutate
Titanic3 <- aperm(Titanic2, c("Sex","Survived","Class"))
Titanic3
## , , Class = 1st
## 
##         Survived
## Sex       No Yes
##   Male   118  62
##   Female   4 141
## 
## , , Class = 2nd
## 
##         Survived
## Sex       No Yes
##   Male   154  25
##   Female  13  93
## 
## , , Class = 3rd
## 
##         Survived
## Sex       No Yes
##   Male   422  88
##   Female 106  90
## 
## , , Class = Crew
## 
##         Survived
## Sex       No Yes
##   Male   670 192
##   Female   3  20
## Define an OR function for each stratum
CalcOddsRatio <- function(mat) {

    (mat["Female","Yes"]/mat["Female","No"]) / (mat["Male","Yes"]/mat["Male","No"])
}

## Apply
apply(Titanic3, MARGIN = 3, CalcOddsRatio)
##    1st    2nd    3rd   Crew 
## 67.089 44.068  4.072 23.264

Raw data creation

## Re-create the raw data
TitanicRaw <- epitools::expand.table(Titanic)
head(TitanicRaw)
##   Class  Sex   Age Survived
## 1   1st Male Child      Yes
## 2   1st Male Child      Yes
## 3   1st Male Child      Yes
## 4   1st Male Child      Yes
## 5   1st Male Child      Yes
## 6   1st Male Adult       No
## Run logistic regression within each level
lapply(levels(TitanicRaw$Class), function(classValue) {

    resGlm <- glm(formula = (Survived == "Yes") ~ (Sex == "Female"),
                  family  = binomial(link = "logit"),
                  data    = subset(TitanicRaw, Class == classValue))

    tableone::ShowRegTable(resGlm, printToggle = FALSE)
})
## [[1]]
##                     exp(beta) [confint]     p       
## (Intercept)         " 0.53 [0.38, 0.71]"    "<0.001"
## Sex == "Female"TRUE "67.09 [26.71, 225.74]" "<0.001"
## 
## [[2]]
##                     exp(beta) [confint]    p       
## (Intercept)         " 0.16 [0.10, 0.24]"   "<0.001"
## Sex == "Female"TRUE "44.07 [22.20, 93.90]" "<0.001"
## 
## [[3]]
##                     exp(beta) [confint] p       
## (Intercept)         "0.21 [0.16, 0.26]" "<0.001"
## Sex == "Female"TRUE "4.07 [2.84, 5.86]" "<0.001"
## 
## [[4]]
##                     exp(beta) [confint]   p       
## (Intercept)         " 0.29 [0.24, 0.34]"  "<0.001"
## Sex == "Female"TRUE "23.26 [7.87, 99.49]" "<0.001"