SMRbyStrata

When stratifying a cohort, it is generally desirable to calculate SMRs for different levels of a strata (such as a time-dependent exposure).

LTASR provides options to stratify a cohort by a fixed strata defined within the person file, or by a time-dependent exposure variable with information found in a separate history file.

For example, below will strata the example person and history file, included in LTASR, by a cumulative exposure variable exposure_level:

#Define exposure cutpoints
exp <- exp_strata(var = 'exposure_level',
                   cutpt = c(-Inf, 0, 10000, 20000, Inf),
                   lag = 10)

#Read in and format person file
person <- person_example %>%
  mutate(dob = as.Date(dob, format='%m/%d/%Y'),
         pybegin = as.Date(pybegin, format='%m/%d/%Y'),
         dlo = as.Date(dlo, format='%m/%d/%Y'))

#Read in and format history file
history <- history_example %>%
  mutate(begin_dt = as.Date(begin_dt, format='%m/%d/%Y'),
         end_dt = as.Date(end_dt, format='%m/%d/%Y')) 

#Stratify cohort
py_table <- get_table_history(persondf = person,
                              rateobj = us_119ucod_19602021,
                              historydf = history,
                              exps = list(exp))

This creates the following table (top 6 rows):

ageCat CPCat gender race exposure_levelCat pdays _o55 _o52
[15,20) [1970,1975) F W (-Inf,0] 746 1 0
[25,30) [1970,1975) M N (-Inf,0] 55 0 0
[25,30) [1970,1975) M W (-Inf,0] 1472 0 0
[25,30) [1975,1980) M W (-Inf,0] 323 0 0
[30,35) [1970,1975) M N (-Inf,0] 1023 0 0
[30,35) [1975,1980) M N (-Inf,0] 803 0 0

smr_minor and smr_major will calculate SMRs for the entire cohort that is read in.

To calculate SMRs separately for each strata of exposure_levelCat, one option would be to create separate person-year tables for each level:

#Subset py_table to the highest exposed group
py_table_high <- py_table %>%
  filter(exposure_levelCat == '(2e+04, Inf]')

smr_minor_table_high <- smr_minor(py_table_high, us_119ucod_19602021)
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
smr_major_table_high <- smr_major(smr_minor_table_high, us_119ucod_19602021)
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced

#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::ppois((.x - 1), x): NaNs produced
#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(1 - stats::ppois((.x - 1), x) - : one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly

#> Warning in stats::optim(.x, function(x) abs(stats::ppois(.x, x) - 0.05/2)): one-dimensional optimization by Nelder-Mead is unreliable:
#> use "Brent" or optimize() directly
minor Description observed expected smr lower upper
52 Other diseases of the nervous system and sense org 0 0.01 0 0 368.89
55 Ischemic heart disease 0 0.06 0 0 61.48
major Description observed expected smr lower upper
16 Diseases of the heart (Major) 0 0.06 0 0 61.48

These results can be saved through repeated calls to write_csv(). This can be tedious for strata with many levels.

Alternatively, the below code will loop through each level of the a variable (defined by var) and outputs results into an excel file (using the writexl library) with a separate tab for each strata level:

#Define the name of the person year table (py_table)
#and the variable to calcualte SMRs accross
pyt <- py_table
var <- 'exposure_levelCat'

#Loop through levels of the above variable
lvls <- unique(pyt[var][[1]])
smr_minors <- 
  map(lvls,
    ~ {
      pyt %>%
        filter(!!sym(var) == .x) %>%
        smr_minor(us_119ucod_19602021)
    }) %>%
  setNames(lvls)

smr_majors <- 
  map(smr_minors,
      ~ smr_major(., us_119ucod_19602021))%>%
  setNames(names(smr_minors))

#Adjust names of sheets
names(smr_minors) <- str_replace_all(names(smr_minors), "\\[|\\]", "_")
names(smr_majors) <- str_replace_all(names(smr_majors), "\\[|\\]", "_")

#Save results 
library(writexl)
write_xlsx(smr_minors, 'C:/SMR_Minors_by_exp.xlsx')
write_xlsx(smr_majors, 'C:/SMR_Majors_by_exp.xlsx')