1. Install packages and load dataset.
## Run libraries
packages <- c(
  "haven",
  "tidyverse",
  "psych",
  "ggplot2",
  "tidySEM",
  "OpenMx",
  "gmodels",
  "mice",
  "nnet",
  "future",
  "car",
  "mlogit",
  "dfidx",
  "tidyLPA",
  "broom"
)
installed <- packages %in% rownames(installed.packages())
if (any(!installed)) {
  install.packages(packages[!installed])
}
lapply(packages, library, character.only = TRUE)

## Set working library
setwd(
  "/Users/jasonhoskin/Library/CloudStorage/OneDrive-IndianaUniversity/spring-2026/research-in-health-behavior"
)

## Import dataset
url <- "ICSUS_2025_State_18 to 25_CLN.sav"
df1 <- read_sav(url)

## Remove unnecessary variables
rm(installed, packages, url)

## Set seed
set.seed(123)
  1. Run descriptive statistics and simplify dataset.
## Sample size and number of variables
dim(df1)
## [1] 5402  257
## Prepare demographics
age <- df1 |>
  mutate(age = case_when(
    age < 5 ~ 0,
    ## < 21
    age >= 5 ~ 1 ## 21+
  )) |>
  dplyr::select(autoid, age)
ethnicity <- df1 |>
  mutate(ethnicity = case_when(
    ethnic == 2 ~ 0,
    ## Not Hispanic/Latino
    ethnic == 1 ~ 1 ## Hispanic/Latino
  )) |>
  dplyr::select(autoid, ethnicity)
race <- df1 |>
  mutate(race = case_when(
    race == 1 ~ 0,
    ## White
    race == 2 ~ 1,
    ## Black/African American
    race == 3 ~ 2,
    ## Asian
    race == 4 ~ 4,
    ## Other
    race == 5 ~ 4,
    ## Other
    race == 6 ~ 3,
    ## Multiracial
    race == 7 ~ 4,
    ## Other
  )) |>
  dplyr::select(autoid, race)
gender <- df1 |>
  mutate(
    gender = case_when(
      gender3 == 1 ~ 0,
      # Female
      gender2 == 1 ~ 1,
      # Male
      gender1 == 1 ~ 2,
      # Other
      gender4 == 1 ~ 2,
      # Other
      gender5 == 1 ~ 2,
      # Other
      gender6 == 1 ~ 2,
      # Other
      gender7 == 1 ~ 2,
      # Other
      gender8 == 1 ~ 2 # Other
    )
  ) |>
  dplyr::select(autoid, gender)
greekmem <- df1 |>
  mutate(greekmem = case_when(
    greekmem == 2 ~ 0,
    # No Greek Membership
    greekmem == 1 ~ 1 # Greek Membership
  )) |>
  dplyr::select(autoid, greekmem)
studentstatus <- df1 |>
  mutate(studentstatus = case_when(
    stustat == 1 ~ 0 ## Full-Time
    ,
    stustat == 2 ~ 1 ## Part-Time
  )) |>
  dplyr::select(autoid, studentstatus)
residence <- df1 |>
  mutate(residence = case_when(
    residenc < 4 ~ 0,
    ## Off Campus
    residenc >= 4 ~ 1
  )) |> ## On Campus
  dplyr::select(autoid, residence)
## Combine dems
dfs_to_join <- list(age, ethnicity, race, gender, studentstatus, residence, greekmem)

# Use reduce to join them all by "uid"
combined_demographics <- dfs_to_join %>%
  reduce(full_join, by = "autoid")

## Simplify dataset
df2 <- df1 |>
  dplyr::select(autoid |
                  smokmo:othmo |
                  gmpools:gmoth |
                  gcqsleep:gcqdepress)

## Combine prepared dems to new dataset

dems_to_join <- list(combined_demographics, df2)

df2 <- dems_to_join %>%
  reduce(full_join, by = "autoid")

## New sample size and number of variables
dim(df2)
## [1] 5402   45
## Calculate frequencies
freq_list <- lapply(df2[, 2:45], table, useNA = "ifany")
freq_list
## $age
## 
##    0    1 
## 3087 2315 
## 
## $ethnicity
## 
##    0    1 <NA> 
## 4419  670  313 
## 
## $race
## 
##    0    1    2    3    4 <NA> 
## 4148  280  487  245  194   48 
## 
## $gender
## 
##    0    1    2 <NA> 
## 3318 1802  255   27 
## 
## $studentstatus
## 
##    0    1 <NA> 
## 5168  216   18 
## 
## $residence
## 
##    0    1 <NA> 
## 2602 2797    3 
## 
## $greekmem
## 
##    0    1 <NA> 
## 4667  727    8 
## 
## $smokmo
## 
##    1    2    3    4    5    6    7    8 <NA> 
## 4106  869  238   86   37   33   18   12    3 
## 
## $cigarmo
## 
##    1    2    3    4    5    6    7    8 <NA> 
## 4538  683  125   21    6    9    1    3   16 
## 
## $snufmo
## 
##    1    2    3    4    5    6    7    8 <NA> 
## 4993  248   42   22   14   15   13   44   11 
## 
## $hookmo
## 
##    1    2    3    4    5    6    7    8 <NA> 
## 5027  306   31   11    9    1    2    4   11 
## 
## $ecigmo
## 
##    1    2    3    4    5    6    7    8 <NA> 
## 3445 1013  242  115   55   55   88  373   16 
## 
## $alcmo
## 
##    1    2    3    4    5    6    7    8 <NA> 
## 1424 1258  978  708  412  282  115  161   64 
## 
## $marmo
## 
##    1    2    3    4    5    6    7    8 <NA> 
## 3237 1049  321  170  126  124  161  202   12 
## 
## $cocmo
## 
##    1    2    3    4    5    6    7    8 <NA> 
## 5275   97    9    6    2    2    1    1    9 
## 
## $hallumo
## 
##    1    2    3    4    5    6    7 <NA> 
## 5074  269   34    9    3    1    2   10 
## 
## $hermo
## 
##    1    2    3    4    5 <NA> 
## 5378   11    1    1    1   10 
## 
## $methmo
## 
##    1    2    3    4    5    6    8 <NA> 
## 5367   20    1    1    1    2    1    9 
## 
## $inhmo
## 
##    1    2    3    4    5    6    7 <NA> 
## 5271   94   13    7    4    2    2    9 
## 
## $rxstmo
## 
##    1    2    3    4    5    6    7    8 <NA> 
## 5152  182   33   11    4    2    5    2   11 
## 
## $rxpkmo
## 
##    1    2    3    4    5    6    7 <NA> 
## 5259  119   10    3    1    1    2    7 
## 
## $rxsedmo
## 
##    1    2    3    4    5    6    7 <NA> 
## 5286   92    7    6    2    1    2    6 
## 
## $othmo
## 
##    1    2    3    4    5    6 <NA> 
## 5272   92   13    6    2    3   14 
## 
## $gmpools
## 
##    1    2    3    4 <NA> 
## 3887  278   77   27 1133 
## 
## $gmfant
## 
##    1    2    3    4 <NA> 
## 4013  162   53   35 1139 
## 
## $gmvideo
## 
##    1    2    3    4 <NA> 
## 3782  342  112   36 1130 
## 
## $gmonsport
## 
##    1    2    3    4 <NA> 
## 3921  167  103   78 1133 
## 
## $gmothsp
## 
##    1    2    3    4 <NA> 
## 4136   64   33   32 1137 
## 
## $gmonline
## 
##    1    2    3    4 <NA> 
## 4076  127   45   21 1133 
## 
## $gmesports
## 
##    1    2    3    4 <NA> 
## 4180   42   24   22 1134 
## 
## $gmhorse
## 
##    1    2    3    4 <NA> 
## 4175   73    8    9 1137 
## 
## $gmcards
## 
##    1    2    3    4 <NA> 
## 3885  262   93   27 1135 
## 
## $gmlott
## 
##    1    2    3    4 <NA> 
## 3274  876  100   18 1134 
## 
## $gmcasino
## 
##    1    2    3    4 <NA> 
## 3930  297   30    7 1138 
## 
## $gmcharit
## 
##    1    2    3    4 <NA> 
## 3831  393   35    8 1135 
## 
## $gmoth
## 
##    1    2    3    4 <NA> 
## 4132   62   16   13 1179 
## 
## $gcqsleep
## 
##    1    2    3 <NA> 
## 1748   32    6 3616 
## 
## $gcqhyg
## 
##    1    2    3 <NA> 
## 1770   15    1 3616 
## 
## $gcqfrnd
## 
##    1    2    3 <NA> 
## 1771   15    1 3615 
## 
## $gcqfmly
## 
##    1    2    3 <NA> 
## 1760   18    7 3617 
## 
## $gcqacad
## 
##    1    2    3 <NA> 
## 1764   15    4 3619 
## 
## $gcqmoney
## 
##    1    2    3 <NA> 
## 1705   64   15 3618 
## 
## $gcqbad
## 
##    1    2    3 <NA> 
## 1650  123   10 3619 
## 
## $gcqdepress
## 
##    1    2    3 <NA> 
## 1743   28    3 3628
  1. Assess NAs and remove all participants with no responses to the gambling behaviors items.
colSums(is.na(df2))
##        autoid           age     ethnicity          race        gender 
##             0             0           313            48            27 
## studentstatus     residence      greekmem        smokmo       cigarmo 
##            18             3             8             3            16 
##        snufmo        hookmo        ecigmo         alcmo         marmo 
##            11            11            16            64            12 
##         cocmo       hallumo         hermo        methmo         inhmo 
##             9            10            10             9             9 
##        rxstmo        rxpkmo       rxsedmo         othmo       gmpools 
##            11             7             6            14          1133 
##        gmfant       gmvideo     gmonsport       gmothsp      gmonline 
##          1139          1130          1133          1137          1133 
##     gmesports       gmhorse       gmcards        gmlott      gmcasino 
##          1134          1137          1135          1134          1138 
##      gmcharit         gmoth      gcqsleep        gcqhyg       gcqfrnd 
##          1135          1179          3616          3616          3615 
##       gcqfmly       gcqacad      gcqmoney        gcqbad    gcqdepress 
##          3617          3619          3618          3619          3628
df3 <- df2 |>
  filter(!if_all(
    c(
      gmpools,
      gmfant,
      gmvideo,
      gmonsport,
      gmothsp,
      gmonline,
      gmesports,
      gmhorse,
      gmcards,
      gmlott,
      gmcasino,
      gmcharit,
      gmoth
    ),
    is.na
  ))

## Number of participants removed from dataset:
dim(df2)[1] - dim(df3)[1]
## [1] 1124
colSums(is.na(df3))
##        autoid           age     ethnicity          race        gender 
##             0             0           235            38            24 
## studentstatus     residence      greekmem        smokmo       cigarmo 
##            11             2             5             2            14 
##        snufmo        hookmo        ecigmo         alcmo         marmo 
##             9            11            13            44             8 
##         cocmo       hallumo         hermo        methmo         inhmo 
##             6             8             9             7             6 
##        rxstmo        rxpkmo       rxsedmo         othmo       gmpools 
##            10             6             6             8             9 
##        gmfant       gmvideo     gmonsport       gmothsp      gmonline 
##            15             6             9            13             9 
##     gmesports       gmhorse       gmcards        gmlott      gmcasino 
##            10            13            11            10            14 
##      gmcharit         gmoth      gcqsleep        gcqhyg       gcqfrnd 
##            11            55          2492          2492          2491 
##       gcqfmly       gcqacad      gcqmoney        gcqbad    gcqdepress 
##          2493          2495          2494          2495          2504
  1. Discriminate skip logic NAs from missing data NAs.
## Create a gambling participation indicator
gm_vars <- names(df3)[25:37] # gmpools:gmoth

df3$any_gamble <- apply(df3[gm_vars], 1, function(x) {
  if (all(is.na(x)))
    return(NA)
  if (all(x == 1, na.rm = TRUE))
    return(0)  # never gambled
  return(1)  # gambled at least once
})

## Create a function to separate skip logic NAs from missing data NAs
classify_gcq_na <- function(data, gate_var, consequence_vars) {
  gate <- data[[gate_var]]
  
  results <- lapply(consequence_vars, function(var) {
    item <- data[[var]]
    
    skip_na <- sum(is.na(item) & gate == 0, na.rm = TRUE)
    true_na <- sum(is.na(item) & gate == 1, na.rm = TRUE)
    observed <- sum(!is.na(item))
    
    data.frame(
      variable = var,
      skip_logic_na = skip_na,
      true_missing_na = true_na,
      observed = observed
    )
  })
  
  do.call(rbind, results)
}

## Apply function to dataset
gcq_vars <- names(df3)[38:45]  # gcqsleep:gcqdepress

na_summary <- classify_gcq_na(data = df3,
                              gate_var = "any_gamble",
                              consequence_vars = gcq_vars)
na_summary
##     variable skip_logic_na true_missing_na observed
## 1   gcqsleep          2462              30     1786
## 2     gcqhyg          2462              30     1786
## 3    gcqfrnd          2462              29     1787
## 4    gcqfmly          2462              31     1785
## 5    gcqacad          2462              33     1783
## 6   gcqmoney          2462              32     1784
## 7     gcqbad          2462              33     1783
## 8 gcqdepress          2462              42     1774
  1. Make the variables dichotomous and convert to class “factor”.
df4 <- df3 |>
  mutate(across(
    .cols  = starts_with("gm"),
    .fns   = ~ case_when(.x == 1 ~ 1, .x > 1 ~ 2, .default = NA),
    .names = "{.col}_dich"
  ))

df5 <- df4 |>
  mutate(across(
    .cols  = starts_with("gcq"),
    .fns   = ~ case_when(.x == 1 ~ 1, .x > 1 ~ 2, .default = NA),
    .names = "{.col}_dich"
  ))

df6 <- df5 |>
  mutate(across(
    .cols  = ends_with("mo"),
    .fns   = ~ case_when(.x == 1 ~ 1, .x > 1 ~ 2, .default = NA),
    .names = "{.col}_dich"
  ))

## Filter out unnecessary variables
df6 <- df6 |>
  dplyr::select(autoid:greekmem | gmpools_dich:othmo_dich)

# Convert substances and gambling to factor with 1 as reference.
cols_to_factor <- colnames(df6)[9:45]
df6[cols_to_factor] <- lapply(df6[cols_to_factor], function(x) {
  x <- as.factor(x)
  x <- relevel(x, ref = "1")
  return(x)
})

## Convert demographics to class "factor"
df6$age <- factor(df6$age,
  levels = c(0, 1),
  labels = c("<21 (ref)", "21+")
)

df6$ethnicity <- factor(df6$ethnicity,
  levels = c(0, 1),
  labels = c("Not Hispanic/Latino (ref)", "Hispanic/Latino")
)

df6$race <- factor(df6$race,
  levels = c(0, 1, 2, 3, 4),
  labels = c("White (ref)", "African American/Black", "Asian", "Multiracial", "Other")
)

df6$gender <- factor(df6$gender,
  levels = c(0, 1, 2),
  labels = c("Female (ref)", "Male", "Other")
)

df6$studentstatus <- factor(df6$studentstatus,
  levels = c(0, 1),
  labels = c("Full Time (ref)", "Part Time")
)

df6$residence <- factor(df6$residence,
  levels = c(0, 1),
  labels = c("Off Campus (ref)", "On Campus")
)

df6$greekmem <- factor(df6$greekmem,
  levels = c(0, 1),
  labels = c("No Greek (ref)", "Greek")
)

# Reference group verification
demo_vars <- c("age", "ethnicity", "race", "gender",
               "studentstatus", "residence", "greekmem")

for (v in demo_vars) {
  cat(sprintf("%-16s | Reference: %-30s | Levels: %s\n",
    v,
    levels(df6[[v]])[1],
    paste(levels(df6[[v]]), collapse = " / ")
  ))
}
## age              | Reference: <21 (ref)                      | Levels: <21 (ref) / 21+
## ethnicity        | Reference: Not Hispanic/Latino (ref)      | Levels: Not Hispanic/Latino (ref) / Hispanic/Latino
## race             | Reference: White (ref)                    | Levels: White (ref) / African American/Black / Asian / Multiracial / Other
## gender           | Reference: Female (ref)                   | Levels: Female (ref) / Male / Other
## studentstatus    | Reference: Full Time (ref)                | Levels: Full Time (ref) / Part Time
## residence        | Reference: Off Campus (ref)               | Levels: Off Campus (ref) / On Campus
## greekmem         | Reference: No Greek (ref)                 | Levels: No Greek (ref) / Greek
lapply(df6[demo_vars], table, useNA = "ifany")
## $age
## 
## <21 (ref)       21+ 
##      2407      1871 
## 
## $ethnicity
## 
## Not Hispanic/Latino (ref)           Hispanic/Latino                      <NA> 
##                      3525                       518                       235 
## 
## $race
## 
##            White (ref) African American/Black                  Asian 
##                   3309                    222                    379 
##            Multiracial                  Other                   <NA> 
##                    190                    140                     38 
## 
## $gender
## 
## Female (ref)         Male        Other         <NA> 
##         2683         1346          225           24 
## 
## $studentstatus
## 
## Full Time (ref)       Part Time            <NA> 
##            4099             168              11 
## 
## $residence
## 
## Off Campus (ref)        On Campus             <NA> 
##             2045             2231                2 
## 
## $greekmem
## 
## No Greek (ref)          Greek           <NA> 
##           3741            532              5
  1. Conduct the first LCA using the tidySEM package.
## Set seed
set.seed(123)

df6_lca1 <- df6 |>
  dplyr::select(gmpools_dich:gmoth_dich) |>
  as.data.frame()

## Run first LCA (code used for knitting)
lca1 <- readRDS("lca1_results.rds")

## Run first LCA (code used for running first time)
## lca1 <- tidySEM::mx_lca(data = df6_lca1,
##  classes = 1:4,
##  missing = "fiml")

## Save LCA for future knitting
## lca1 <- saveRDS(lca1, file = "lca1_results.rds")
  1. Assess latent classes for first LCA.
fit1 <- table_fit(lca1)
fit1
##   Name Classes        LL    n Parameters      AIC      BIC    saBIC   Entropy
## 1    1       1 -13815.68 4278         13 27657.36 27740.06 27698.75 1.0000000
## 2    2       2 -12071.01 4278         27 24196.01 24367.77 24281.97 0.8538182
## 3    3       3 -11805.73 4278         41 23693.46 23954.27 23823.99 0.7098784
## 4    4       4 -11697.07 4278         55 23504.14 23854.00 23679.24 0.7785529
##    prob_min  prob_max      n_min     n_max  np_ratio   np_local
## 1 1.0000000 1.0000000 1.00000000 1.0000000 329.07692 329.076923
## 2 0.8703959 0.9827206 0.16432913 0.8356709 158.44444  54.076923
## 3 0.7706319 0.9206315 0.10402057 0.6280972 104.34146  34.230769
## 4 0.5839871 0.9831005 0.01496026 0.7515194  77.78182   4.923077
# Lo-Mendell-Rubin Adjusted Likelihood Ratio Test (LMR-ALRT)
## 1-class vs 2-class
calc_lrt(
  n = as.numeric(fit1[1, 4]),
  null_ll = as.numeric(fit1[1, 3]),
  null_param = as.numeric(fit1[1, 5]),
  null_classes = as.numeric(fit1[1, 2]),
  alt_ll = as.numeric(fit1[2, 3]),
  alt_param = as.numeric(fit1[2, 5]),
  alt_classes = as.numeric(fit1[2, 2])
)
## Lo-Mendell-Rubin ad-hoc adjusted likelihood ratio rest:
## 
## LR = 3489.348, LMR LR (df = 14) = 3355.573, p < 0.001
## 1-class vs 3-class
calc_lrt(
  n = as.numeric(fit1[1, 4]),
  null_ll = as.numeric(fit1[1, 3]),
  null_param = as.numeric(fit1[1, 5]),
  null_classes = as.numeric(fit1[1, 2]),
  alt_ll = as.numeric(fit1[3, 3]),
  alt_param = as.numeric(fit1[3, 5]),
  alt_classes = as.numeric(fit1[3, 2])
)
## Lo-Mendell-Rubin ad-hoc adjusted likelihood ratio rest:
## 
## LR = 4019.897, LMR LR (df = 28) = 3941.333, p < 0.001
## 1-class vs 4-class
calc_lrt(
  n = as.numeric(fit1[1, 4]),
  null_ll = as.numeric(fit1[1, 3]),
  null_param = as.numeric(fit1[1, 5]),
  null_classes = as.numeric(fit1[1, 2]),
  alt_ll = as.numeric(fit1[4, 3]),
  alt_param = as.numeric(fit1[4, 5]),
  alt_classes = as.numeric(fit1[4, 2])
)
## Lo-Mendell-Rubin ad-hoc adjusted likelihood ratio rest:
## 
## LR = 4237.225, LMR LR (df = 42) = 4181.656, p < 0.001
## 2-class vs 3-class
calc_lrt(
  n = as.numeric(fit1[2, 4]),
  null_ll = as.numeric(fit1[2, 3]),
  null_param = as.numeric(fit1[2, 5]),
  null_classes = as.numeric(fit1[2, 2]),
  alt_ll = as.numeric(fit1[3, 3]),
  alt_param = as.numeric(fit1[3, 5]),
  alt_classes = as.numeric(fit1[3, 2])
)
## Lo-Mendell-Rubin ad-hoc adjusted likelihood ratio rest:
## 
## LR = 530.549, LMR LR (df = 14) = 510.208, p < 0.001
## 2-class vs 4-class
calc_lrt(
  n = as.numeric(fit1[2, 4]),
  null_ll = as.numeric(fit1[2, 3]),
  null_param = as.numeric(fit1[2, 5]),
  null_classes = as.numeric(fit1[2, 2]),
  alt_ll = as.numeric(fit1[4, 3]),
  alt_param = as.numeric(fit1[4, 5]),
  alt_classes = as.numeric(fit1[4, 2])
)
## Lo-Mendell-Rubin ad-hoc adjusted likelihood ratio rest:
## 
## LR = 747.877, LMR LR (df = 28) = 733.261, p < 0.001
## 3-class vs 4-class
calc_lrt(
  n = as.numeric(fit1[3, 4]),
  null_ll = as.numeric(fit1[3, 3]),
  null_param = as.numeric(fit1[3, 5]),
  null_classes = as.numeric(fit1[3, 2]),
  alt_ll = as.numeric(fit1[4, 3]),
  alt_param = as.numeric(fit1[4, 5]),
  alt_classes = as.numeric(fit1[4, 2])
)
## Lo-Mendell-Rubin ad-hoc adjusted likelihood ratio rest:
## 
## LR = 217.328, LMR LR (df = 14) = 208.996, p < 0.001
# Visualize item probability profiles
plot_prob(lca1[[3]]) +
  theme(axis.text.x = element_text(
    angle = 45,
    hjust = 1,
    size = 7
  ))

plot_prob(lca1[[4]]) +
  theme(axis.text.x = element_text(
    angle = 45,
    hjust = 1,
    size = 7
  ))

# Minimum sample size for 3 classes
fit1[3, 4] * fit1[3, 12]
## [1] 445
# Minimum sample size for 4 classes
fit1[4, 4] * fit1[4, 12]
## [1] 64
  1. Conduct the second latent class analysis.
set.seed(123)

## Refilter dataset to only include appropriate variables
df6_lca2 <- df6 |>
  filter(if_any(gmpools_dich:gcqdepress_dich, ~ . == 2)) |>
  dplyr::select(autoid | gmpools_dich:gcqdepress_dich)

## Run second LCA (code use for knitting)
lca2 <- readRDS("lca2_results.rds")

## lca2 <- tidySEM::mx_lca(data = df6_lca2[2:22],
##                        classes = 1:4,
##                         missing = "fiml")

## Save LCA for future knitting
## lca2 <- saveRDS(lca2, file = "lca2_results.rds")
  1. Assess latent classes for second LCA.
fit2 <- table_fit(lca2)
fit2
##   Name Classes        LL    n Parameters      AIC      BIC    saBIC   Entropy
## 1    1       1 -11354.87 1816         21 22751.74 22867.34 22800.62 1.0000000
## 2    2       2 -10766.31 1816         43 21618.61 21855.30 21718.69 0.8706046
## 3    3       3 -10407.67 1816         65 20945.34 21303.12 21096.62 0.7554996
## 4    4       4 -10137.62 1816         87 20449.24 20928.12 20651.72 0.7906488
##    prob_min  prob_max      n_min     n_max np_ratio  np_local
## 1 1.0000000 1.0000000 1.00000000 1.0000000 86.47619 86.476190
## 2 0.8765436 0.9804656 0.15583700 0.8441630 42.23256 13.476190
## 3 0.8232718 0.9289432 0.18447137 0.6200441 27.93846 15.952381
## 4 0.8263384 0.9779214 0.01817181 0.4614537 20.87356  1.571429
# Lo-Mendell-Rubin Adjusted Likelihood Ratio Test (LMR-ALRT)
## 1-class vs 2-class
calc_lrt(
  n = as.numeric(fit2[1, 4]),
  null_ll = as.numeric(fit2[1, 3]),
  null_param = as.numeric(fit2[1, 5]),
  null_classes = as.numeric(fit2[1, 2]),
  alt_ll = as.numeric(fit2[2, 3]),
  alt_param = as.numeric(fit2[2, 5]),
  alt_classes = as.numeric(fit2[2, 2])
)
## Lo-Mendell-Rubin ad-hoc adjusted likelihood ratio rest:
## 
## LR = 1177.133, LMR LR (df = 22) = 1127.071, p < 0.001
## 2-class vs 3-class
calc_lrt(
  n = as.numeric(fit2[2, 4]),
  null_ll = as.numeric(fit2[2, 3]),
  null_param = as.numeric(fit2[2, 5]),
  null_classes = as.numeric(fit2[2, 2]),
  alt_ll = as.numeric(fit2[3, 3]),
  alt_param = as.numeric(fit2[3, 5]),
  alt_classes = as.numeric(fit2[3, 2])
)
## Lo-Mendell-Rubin ad-hoc adjusted likelihood ratio rest:
## 
## LR = 717.276, LMR LR (df = 22) = 686.771, p < 0.001
## 3-class vs 4-class
calc_lrt(
  n = as.numeric(fit2[3, 4]),
  null_ll = as.numeric(fit2[3, 3]),
  null_param = as.numeric(fit2[3, 5]),
  null_classes = as.numeric(fit2[3, 2]),
  alt_ll = as.numeric(fit2[4, 3]),
  alt_param = as.numeric(fit2[4, 5]),
  alt_classes = as.numeric(fit2[4, 2])
)
## Lo-Mendell-Rubin ad-hoc adjusted likelihood ratio rest:
## 
## LR = 540.100, LMR LR (df = 22) = 517.129, p < 0.001
# Visualize item probability profiles
plot_prob(lca2[[3]]) +
  theme(axis.text.x = element_text(
    angle = 45,
    hjust = 1,
    size = 7
  ))

plot_prob(lca2[[4]]) +
  theme(axis.text.x = element_text(
    angle = 45,
    hjust = 1,
    size = 7
  ))

# Minimum sample size for 3 classes
fit2[3, 4] * fit2[3, 12]
## [1] 335
# Minimum sample size for 4 classes
fit2[4, 4] * fit2[4, 12]
## [1] 33
  1. Apply latent class assignments to dataframes.
## Assign latent classes to dataframe
# Extract most likely class assignment for each participant
lca1_classes <- class_prob(lca1[[3]], type = "individual")$individual[, "predicted"]
lca2_classes <- class_prob(lca2[[3]], type = "individual")$individual[, "predicted"]

# Add LCA 1 classes to gamblers-only subset
df6$lca1_class <- lca1_classes

# Add LCA 2 classes to gamblers-only subset
df6_lca2$lca2_class <- lca2_classes

# Then merge back to full dataset by row identifier
df6 <- df6 |>
  left_join(df6_lca2 |> dplyr::select(autoid, lca2_class), by = "autoid")

## Verify that it worked
table(df6$lca1_class, useNA = "always")
## 
##    1    2    3 <NA> 
## 1146  445 2687    0
# Should show counts for classes 1, 2, 3 with no NAs

table(df6$lca2_class, useNA = "always")
## 
##    1    2    3 <NA> 
##  355  335 1126 2462
# Should show counts for classes 1, 2, 3 with 2462 NAs
  1. Prepare dataframes for regression modeling.
## Filter out any unnecessary variables
df6_model1 <- df6 |>
  dplyr::select(autoid:greekmem | smokmo_dich:lca1_class)

## Filter out non-gamblers to only include participants in 2nd LCA
df6_model2 <- df6 |>
  filter(!is.na(lca2_class)) |>
  dplyr::select(autoid:greekmem |
                  smokmo_dich:othmo_dich | lca2_class)

## Make DVs class "factor"
df6_model1 <- df6_model1 |>
  mutate(lca1_class = as.factor(lca1_class))

df6_model2 <- df6_model2 |>
  mutate(lca2_class = as.factor(lca2_class))

### 4. Relevel DVs so no gambling is the reference group
df6_model1$lca1_class <- relevel(df6_model1$lca1_class, ref = 3)

df6_model2$lca2_class <- relevel(df6_model2$lca2_class, ref = 3)
  1. Treat missing data using MICE and evaluate the imputations.
plan(multisession, workers = parallel::detectCores() - 1)

# Define variables
outcome1    <- "lca1_class"
predictors <- c(
  "age",
  "ethnicity",
  "race",
  "gender",
  "studentstatus",
  "residence",
  "greekmem",
  "smokmo_dich",
  "cigarmo_dich",
  "snufmo_dich",
  "hookmo_dich",
  "ecigmo_dich",
  "alcmo_dich",
  "marmo_dich",
  "cocmo_dich",
  "hallumo_dich",
  "hermo_dich",
  "methmo_dich",
  "inhmo_dich",
  "rxstmo_dich",
  "rxpkmo_dich",
  "rxsedmo_dich",
  "othmo_dich"
)
all_vars1 <- c(outcome1, predictors)

# Establish imputation method
meth1 <- make.method(df6_model1[, all_vars1])
meth1[] <- "cart"

# Trimmed predictor matrix
pred1 <- quickpred(df6_model1[, all_vars1], mincor = 0.1, minpuc = 0.1)

# Impute in parallel
imp1 <- futuremice(
  df6_model1[, all_vars1],
  method = meth1,
  predictorMatrix = pred1,
  m = 20,
  maxit = 10,
  parallelseed = 42
)

## Evaluate imputations
plot(imp1)

stripplot(imp1, pch = 20, cex = 1.2)

# Define variables for model 2
outcome2    <- "lca2_class"
all_vars2 <- c(outcome2, predictors)

# Create imputation method for method 2
meth2 <- make.method(df6_model2[, all_vars2])
meth2[] <- "cart"

# Trimmed predictor matrix
pred2 <- quickpred(df6_model2[, all_vars2], mincor = 0.1, minpuc = 0.1)

# Impute in parallel
imp2 <- futuremice(
  df6_model2[, all_vars2],
  method = meth2,
  predictorMatrix = pred2,
  m = 20,
  maxit = 25,
  parallelseed = 42
)

## Evaluate imputations
plot(imp2)

stripplot(imp2, pch = 20, cex = 1.2)

  1. Run multinomial logistic regression models.
# Fit model 1a: null model
fit1a <- with(imp1, multinom(lca1_class ~ 1, trace = FALSE))

# Pool model 1a
pooled1a <- pool(fit1a)
summary(pooled1a)
##          term   estimate  std.error statistic       df      p.value
## 1 (Intercept) -0.8521477 0.03528119 -24.15303 4274.001 6.31298e-121
## 2 (Intercept) -1.7981063 0.05117962 -35.13325 4274.001 8.75161e-238
## View fraction of missing information (FMI)
data.frame(
  term = summary(pooled1a)$term,
  fmi  = pooled1a$pooled$fmi,
  lambda = pooled1a$pooled$lambda
)
##          term          fmi lambda
## 1 (Intercept) 0.0004676173      0
## 2 (Intercept) 0.0004676173      0
# Fit model 1b: covariate model
fit1b <- with(
  imp1,
  multinom(
    lca1_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem,
    trace = FALSE
  )
)

# Pool model 1b
pooled1b <- pool(fit1b)
summary(pooled1b)
##                          term    estimate  std.error   statistic       df
## 1                 (Intercept) -0.90676011 0.06891914 -13.1568683 4227.598
## 2                      age21+  0.13332643 0.07610440   1.7518885 4249.725
## 3                  genderMale  0.18877788 0.08007697   2.3574554 4223.170
## 4                 genderOther -0.24874855 0.16333732  -1.5229131 4198.657
## 5  raceAfrican American/Black -0.70047632 0.18323989  -3.8227283 4176.365
## 6                   raceAsian -0.99553834 0.15127139  -6.5811409 4081.378
## 7             raceMultiracial -0.10858234 0.16961133  -0.6401833 4216.146
## 8                   raceOther -0.60957057 0.23239650  -2.6229766 4155.811
## 9    ethnicityHispanic/Latino -0.08861526 0.11457586  -0.7734200 3565.931
## 10     studentstatusPart Time  0.15063741 0.17844730   0.8441563 4233.486
## 11         residenceOn Campus  0.13054777 0.07846147   1.6638456 4240.290
## 12              greekmemGreek  0.22861437 0.11132248   2.0536226 4243.389
## 13                (Intercept) -2.65844908 0.12054919 -22.0528152 4241.146
## 14                     age21+  0.40639876 0.11370971   3.5740022 4249.840
## 15                 genderMale  1.53721204 0.11087306  13.8646130 4243.201
## 16                genderOther -0.86410415 0.42535722  -2.0314788 4250.241
## 17 raceAfrican American/Black -0.39001078 0.24831054  -1.5706573 4193.262
## 18                  raceAsian -1.43340074 0.24933573  -5.7488781 4172.402
## 19            raceMultiracial -0.70259695 0.32847623  -2.1389583 4232.548
## 20                  raceOther -0.53396175 0.35990297  -1.4836270 4195.849
## 21   ethnicityHispanic/Latino -0.34353075 0.19146648  -1.7942083 2034.473
## 22     studentstatusPart Time -0.05058380 0.28244369  -0.1790934 4169.033
## 23         residenceOn Campus  0.22379630 0.12002649   1.8645575 4246.924
## 24              greekmemGreek  0.69609817 0.14631077   4.7576687 4249.674
##          p.value
## 1   8.898142e-39
## 2   7.986511e-02
## 3   1.844604e-02
## 4   1.278557e-01
## 5   1.339057e-04
## 6   5.260185e-11
## 7   5.220882e-01
## 8   8.748361e-03
## 9   4.393251e-01
## 10  3.986298e-01
## 11  9.621719e-02
## 12  4.007338e-02
## 13 4.027352e-102
## 14  3.554702e-04
## 15  8.782323e-43
## 16  4.226855e-02
## 17  1.163377e-01
## 18  9.625515e-09
## 19  3.249611e-02
## 20  1.379830e-01
## 21  7.292835e-02
## 22  8.578731e-01
## 23  6.231239e-02
## 24  2.023408e-06
## View fraction of missing information (FMI)
data.frame(
  term = summary(pooled1b)$term,
  fmi  = pooled1b$pooled$fmi,
  lambda = pooled1b$pooled$lambda
)
##                          term          fmi       lambda
## 1                 (Intercept) 0.0037809548 0.0033097732
## 2                      age21+ 0.0009531585 0.0004830991
## 3                  genderMale 0.0041900452 0.0037185633
## 4                 genderOther 0.0060890688 0.0056157392
## 5  raceAfrican American/Black 0.0074981903 0.0070230095
## 6                   raceAsian 0.0120769156 0.0115929217
## 7             raceMultiracial 0.0047882815 0.0043162980
## 8                   raceOther 0.0086407528 0.0081637721
## 9    ethnicityHispanic/Latino 0.0276594412 0.0271142439
## 10     studentstatusPart Time 0.0031864818 0.0027156745
## 11         residenceOn Campus 0.0023975448 0.0019271207
## 12              greekmemGreek 0.0019845348 0.0015142596
## 13                (Intercept) 0.0022876462 0.0018172653
## 14                     age21+ 0.0009308272 0.0004607699
## 15                 genderMale 0.0020107628 0.0015404792
## 16                genderOther 0.0008516007 0.0003815505
## 17 raceAfrican American/Black 0.0064508229 0.0059770570
## 18                  raceAsian 0.0077282949 0.0072527731
## 19            raceMultiracial 0.0032857681 0.0028149034
## 20                  raceOther 0.0062793275 0.0058057719
## 21   ethnicityHispanic/Latino 0.0683499910 0.0674345774
## 22     studentstatusPart Time 0.0079199042 0.0074440902
## 23         residenceOn Campus 0.0014498680 0.0009797325
## 24              greekmemGreek 0.0009630307 0.0004929703
# Fit model 1c: covariates + alcohol + marijuana + electronic vapor products + smoking + cigars
fit1c <- with(
  imp1,
  nnet::multinom(
    lca1_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich,
    trace = FALSE
  )
)

# Pool model 1c
pooled1c <- pool(fit1c)
summary(pooled1c)
##                          term    estimate  std.error   statistic       df
## 1                 (Intercept) -1.09391018 0.08998732 -12.1562704 4201.510
## 2                      age21+  0.02003767 0.08137022   0.2462531 4238.042
## 3                  genderMale  0.16758606 0.08356717   2.0054055 4207.383
## 4                 genderOther -0.25667621 0.16467136  -1.5587180 4178.642
## 5  raceAfrican American/Black -0.63010436 0.18451679  -3.4148890 4163.961
## 6                   raceAsian -0.86960628 0.15351589  -5.6646010 4041.144
## 7             raceMultiracial -0.10521236 0.17059296  -0.6167450 4206.496
## 8                   raceOther -0.58998470 0.23392665  -2.5220927 4136.594
## 9    ethnicityHispanic/Latino -0.08086116 0.11504255  -0.7028804 3683.831
## 10     studentstatusPart Time  0.14695666 0.17937740   0.8192597 4223.068
## 11         residenceOn Campus  0.12134636 0.07935377   1.5291821 4231.958
## 12              greekmemGreek  0.13531343 0.11352811   1.1918936 4233.434
## 13                alcmo_dich2  0.13295256 0.09649157   1.3778671 4177.230
## 14                marmo_dich2  0.02193542 0.09431869   0.2325671 4227.380
## 15               ecigmo_dich2  0.26862104 0.10250190   2.6206445 4211.965
## 16               smokmo_dich2  0.06653760 0.11243493   0.5917877 4235.996
## 17              cigarmo_dich2  0.35080667 0.12486257   2.8095422 4221.731
## 18                (Intercept) -3.07272667 0.16247921 -18.9115064 4220.502
## 19                     age21+  0.11018085 0.12295552   0.8961033 4239.989
## 20                 genderMale  1.39385017 0.11935335  11.6783497 4227.015
## 21                genderOther -0.91366287 0.42800749  -2.1346890 4239.090
## 22 raceAfrican American/Black -0.20757871 0.25573237  -0.8117029 4192.403
## 23                  raceAsian -1.07171844 0.25603159  -4.1858836 4158.296
## 24            raceMultiracial -0.64779115 0.33237044  -1.9490035 4227.408
## 25                  raceOther -0.52073313 0.37141396  -1.4020290 4190.209
## 26   ethnicityHispanic/Latino -0.31465395 0.19601469  -1.6052570 2275.599
## 27     studentstatusPart Time -0.03086130 0.28873954  -0.1068828 4129.931
## 28         residenceOn Campus  0.17825784 0.12433378   1.4337041 4236.558
## 29              greekmemGreek  0.37317876 0.15543836   2.4008150 4240.694
## 30                alcmo_dich2  0.21236628 0.16324436   1.3009103 4187.090
## 31                marmo_dich2  0.21045493 0.14211359   1.4808923 4236.237
## 32               ecigmo_dich2  0.43809140 0.15401281   2.8445127 4239.724
## 33               smokmo_dich2  0.20439206 0.15790530   1.2943965 4235.720
## 34              cigarmo_dich2  0.90764210 0.15345361   5.9147654 4231.433
##         p.value
## 1  1.924143e-33
## 2  8.054982e-01
## 3  4.498364e-02
## 4  1.191389e-01
## 5  6.441792e-04
## 6  1.576208e-08
## 7  5.374363e-01
## 8  1.170313e-02
## 9  4.821747e-01
## 10 4.126845e-01
## 11 1.262941e-01
## 12 2.333698e-01
## 13 1.683181e-01
## 14 8.161089e-01
## 15 8.807900e-03
## 16 5.540244e-01
## 17 4.984032e-03
## 18 1.246520e-76
## 19 3.702485e-01
## 20 4.905211e-31
## 21 3.284362e-02
## 22 4.170082e-01
## 23 2.899327e-05
## 24 5.136106e-02
## 25 1.609807e-01
## 26 1.085760e-01
## 27 9.148871e-01
## 28 1.517305e-01
## 29 1.640142e-02
## 30 1.933607e-01
## 31 1.387096e-01
## 32 4.469257e-03
## 33 1.955991e-01
## 34 3.585862e-09
## View fraction of missing information (FMI)
data.frame(
  term = summary(pooled1c)$term,
  fmi  = pooled1c$pooled$fmi,
  lambda = pooled1c$pooled$lambda
)
##                          term          fmi       lambda
## 1                 (Intercept) 0.0051680500 0.0046946034
## 2                      age21+ 0.0012643350 0.0007931268
## 3                  genderMale 0.0046978703 0.0042248610
## 4                 genderOther 0.0067651621 0.0062898894
## 5  raceAfrican American/Black 0.0076565626 0.0071800427
## 6                   raceAsian 0.0133115637 0.0128233632
## 7             raceMultiracial 0.0047710319 0.0042979576
## 8                   raceOther 0.0091394334 0.0086604785
## 9    ethnicityHispanic/Latino 0.0243871350 0.0238576058
## 10     studentstatusPart Time 0.0032386493 0.0027667055
## 11         residenceOn Campus 0.0021856481 0.0017141979
## 12              greekmemGreek 0.0019828094 0.0015114278
## 13                alcmo_dich2 0.0068546313 0.0063792408
## 14                marmo_dich2 0.0027580648 0.0022863750
## 15               ecigmo_dich2 0.0043068662 0.0038341858
## 16               smokmo_dich2 0.0016021540 0.0011308777
## 17              cigarmo_dich2 0.0033787000 0.0029066732
## 18                (Intercept) 0.0035042386 0.0030321337
## 19                     age21+ 0.0009037642 0.0004326023
## 20                 genderMale 0.0028006313 0.0023289209
## 21                genderOther 0.0010759136 0.0006047331
## 22 raceAfrican American/Black 0.0058421747 0.0053680215
## 23                  raceAsian 0.0079803217 0.0075033085
## 24            raceMultiracial 0.0027548137 0.0022831254
## 25                  raceOther 0.0059963010 0.0055219730
## 26   ethnicityHispanic/Latino 0.0607014166 0.0598762397
## 27     studentstatusPart Time 0.0094736049 0.0089940392
## 28         residenceOn Campus 0.0015128570 0.0010416010
## 29              greekmemGreek 0.0007605937 0.0002894426
## 30                alcmo_dich2 0.0062104623 0.0057358835
## 31                marmo_dich2 0.0015641560 0.0010928886
## 32               ecigmo_dich2 0.0009556550 0.0004844881
## 33               smokmo_dich2 0.0016451309 0.0011738442
## 34              cigarmo_dich2 0.0022553695 0.0017838938
# Fit model 1d: model c + rx stimulants + rx painkillers + rx sedatives
fit1d <- with(
  imp1,
  nnet::multinom(
    lca1_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich + rxstmo_dich + rxpkmo_dich + rxsedmo_dich,
    trace = FALSE
  )
)

# Pool model 1d
pooled1d <- pool(fit1d)
summary(pooled1d)
##                          term     estimate  std.error    statistic       df
## 1                 (Intercept) -1.090908708 0.09002810 -12.11742516 4196.241
## 2                      age21+  0.015494403 0.08149472   0.19012770 4232.063
## 3                  genderMale  0.164376447 0.08364893   1.96507532 4203.827
## 4                 genderOther -0.266380280 0.16541511  -1.61037457 4172.674
## 5  raceAfrican American/Black -0.621954853 0.18464321  -3.36841447 4156.666
## 6                   raceAsian -0.876627763 0.15367691  -5.70435580 4036.985
## 7             raceMultiracial -0.098626851 0.17074527  -0.57762566 4202.190
## 8                   raceOther -0.573230846 0.23414445  -2.44819314 4128.876
## 9    ethnicityHispanic/Latino -0.090302150 0.11525829  -0.78347637 3702.948
## 10     studentstatusPart Time  0.165394495 0.17962248   0.92078951 4215.443
## 11         residenceOn Campus  0.121332255 0.07941679   1.52779099 4225.757
## 12              greekmemGreek  0.127828646 0.11383344   1.12294456 4226.632
## 13                alcmo_dich2  0.132115844 0.09658518   1.36786875 4173.174
## 14                marmo_dich2  0.003592934 0.09515458   0.03775892 4222.446
## 15               ecigmo_dich2  0.262486438 0.10272808   2.55515765 4205.747
## 16               smokmo_dich2  0.049901681 0.11312589   0.44111635 4229.745
## 17              cigarmo_dich2  0.332929337 0.12581169   2.64625116 4212.676
## 18               rxstmo_dich2  0.389472785 0.21716797   1.79341722 4224.035
## 19               rxpkmo_dich2  0.435981142 0.26961321   1.61706150 4232.912
## 20              rxsedmo_dich2 -0.453263070 0.32139251  -1.41031001 4233.689
## 21                (Intercept) -3.064394194 0.16251017 -18.85663055 4214.505
## 22                     age21+  0.098509807 0.12330302   0.79892453 4233.954
## 23                 genderMale  1.386777539 0.11956738  11.59829282 4220.736
## 24                genderOther -0.928943838 0.42938063  -2.16345074 4233.208
## 25 raceAfrican American/Black -0.192481202 0.25575653  -0.75259545 4185.923
## 26                  raceAsian -1.085223209 0.25710114  -4.22099722 4148.150
## 27            raceMultiracial -0.632921787 0.33229672  -1.90468865 4221.487
## 28                  raceOther -0.473650780 0.37055825  -1.27820872 4178.660
## 29   ethnicityHispanic/Latino -0.322998148 0.19650531  -1.64371207 2207.853
## 30     studentstatusPart Time  0.004254594 0.28871527   0.01473630 4109.103
## 31         residenceOn Campus  0.178678793 0.12455909   1.43449015 4230.478
## 32              greekmemGreek  0.349343150 0.15665751   2.22998020 4234.699
## 33                alcmo_dich2  0.220230031 0.16335915   1.34813404 4186.809
## 34                marmo_dich2  0.176256002 0.14366624   1.22684357 4231.507
## 35               ecigmo_dich2  0.426986634 0.15459517   2.76196619 4233.839
## 36               smokmo_dich2  0.179646721 0.15942470   1.12684371 4228.856
## 37              cigarmo_dich2  0.885643729 0.15442946   5.73494011 4225.242
## 38               rxstmo_dich2  0.594528880 0.26333122   2.25772269 4211.259
## 39               rxpkmo_dich2  0.336992361 0.36360395   0.92681161 4133.457
## 40              rxsedmo_dich2 -0.598452439 0.42436781  -1.41022108 4225.325
##         p.value
## 1  3.048289e-33
## 2  8.492182e-01
## 3  4.947127e-02
## 4  1.073917e-01
## 5  7.628971e-04
## 6  1.251496e-08
## 7  5.635478e-01
## 8  1.439880e-02
## 9  4.333975e-01
## 10 3.572130e-01
## 11 1.266393e-01
## 12 2.615248e-01
## 13 1.714268e-01
## 14 9.698817e-01
## 15 1.064887e-02
## 16 6.591513e-01
## 17 8.169200e-03
## 18 7.297775e-02
## 19 1.059395e-01
## 20 1.585216e-01
## 21 3.281104e-76
## 22 4.243790e-01
## 23 1.219729e-30
## 24 3.056231e-02
## 25 4.517354e-01
## 26 2.484300e-05
## 27 5.688845e-02
## 28 2.012468e-01
## 29 1.003781e-01
## 30 9.882433e-01
## 31 1.515064e-01
## 32 2.580098e-02
## 33 1.776882e-01
## 34 2.199496e-01
## 35 5.770230e-03
## 36 2.598725e-01
## 37 1.043588e-08
## 38 2.401395e-02
## 39 3.540785e-01
## 40 1.585480e-01
## View fraction of missing information (FMI)
data.frame(
  term = summary(pooled1d)$term,
  fmi  = pooled1d$pooled$fmi,
  lambda = pooled1d$pooled$lambda
)
##                          term          fmi       lambda
## 1                 (Intercept) 0.0051185078 0.0046444433
## 2                      age21+ 0.0012624553 0.0007905807
## 3                  genderMale 0.0044986640 0.0040251600
## 4                 genderOther 0.0067728025 0.0062968538
## 5  raceAfrican American/Black 0.0077425356 0.0072652210
## 6                   raceAsian 0.0132596845 0.0127709555
## 7             raceMultiracial 0.0046372693 0.0041636468
## 8                   raceOther 0.0092396893 0.0087598878
## 9    ethnicityHispanic/Latino 0.0237450033 0.0232178603
## 10     studentstatusPart Time 0.0034132684 0.0029405540
## 11         residenceOn Campus 0.0022156456 0.0017435180
## 12              greekmemGreek 0.0020973156 0.0016252298
## 13                alcmo_dich2 0.0067408480 0.0062649411
## 14                marmo_dich2 0.0026350314 0.0021627323
## 15               ecigmo_dich2 0.0043321602 0.0038587932
## 16               smokmo_dich2 0.0016436533 0.0011717003
## 17              cigarmo_dich2 0.0036908028 0.0032179097
## 18               rxstmo_dich2 0.0024389806 0.0019667663
## 19               rxpkmo_dich2 0.0011103901 0.0006385382
## 20              rxsedmo_dich2 0.0009638270 0.0004919925
## 21                (Intercept) 0.0035089477 0.0030361734
## 22                     age21+ 0.0009120390 0.0004402096
## 23                 genderMale 0.0028369516 0.0023645568
## 24                genderOther 0.0010553926 0.0005835477
## 25 raceAfrican American/Black 0.0058845283 0.0054096615
## 26                  raceAsian 0.0082229296 0.0077448669
## 27            raceMultiracial 0.0027494286 0.0022770763
## 28                  raceOther 0.0063827480 0.0059072944
## 29   ethnicityHispanic/Latino 0.0626920993 0.0618434163
## 30     studentstatusPart Time 0.0102022086 0.0097205673
## 31         residenceOn Campus 0.0015277999 0.0010558740
## 32              greekmemGreek 0.0007606555 0.0002888376
## 33                alcmo_dich2 0.0058216248 0.0053468284
## 34                marmo_dich2 0.0013582003 0.0008863088
## 35               ecigmo_dich2 0.0009346238 0.0004627922
## 36               smokmo_dich2 0.0017790454 0.0013070572
## 37              cigarmo_dich2 0.0022837041 0.0018115511
## 38               rxstmo_dich2 0.0038278288 0.0033548417
## 39               rxpkmo_dich2 0.0090059047 0.0085265217
## 40              rxsedmo_dich2 0.0022728234 0.0018006746
# Fit model 2a: null model
fit2a <- with(imp2, multinom(lca2_class ~ 1, trace = FALSE))

# Pool model 2a
pooled2a <- pool(fit2a)
summary(pooled2a)
##          term  estimate  std.error statistic       df      p.value
## 1 (Intercept) -1.154309 0.06086872 -18.96391 1812.003 2.663345e-73
## 2 (Intercept) -1.212296 0.06223483 -19.47939 1812.003 6.943915e-77
## View fraction of missing information (FMI)
data.frame(
  term = summary(pooled2a)$term,
  fmi  = pooled2a$pooled$fmi,
  lambda = pooled2a$pooled$lambda
)
##          term         fmi lambda
## 1 (Intercept) 0.001101926      0
## 2 (Intercept) 0.001101926      0
# Fit model 2b: covariate model
fit2b <- with(
  imp2,
  multinom(
    lca2_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem,
    trace = FALSE
  )
)

# Pool model 2b
pooled2b <- pool(fit2b)
summary(pooled2b)
##                          term    estimate std.error    statistic       df
## 1                 (Intercept) -1.69553038 0.1337449 -12.67735039 1782.421
## 2                      age21+ -0.46065146 0.1365097  -3.37449669 1789.292
## 3                  genderMale  0.93751927 0.1339963   6.99660593 1777.955
## 4                 genderOther  1.57424610 0.2564040   6.13970977 1785.308
## 5  raceAfrican American/Black  0.80407365 0.2935423   2.73920860 1775.599
## 6                   raceAsian  1.31705202 0.2281164   5.77359630 1772.676
## 7             raceMultiracial  0.36168976 0.2894691   1.24949355 1782.796
## 8                   raceOther  0.85104517 0.3770052   2.25738294 1754.645
## 9    ethnicityHispanic/Latino  0.31515295 0.2034335   1.54916958 1226.246
## 10     studentstatusPart Time  0.20969294 0.3079477   0.68093691 1789.626
## 11         residenceOn Campus  0.14385465 0.1387134   1.03706368 1785.184
## 12              greekmemGreek -0.24553465 0.2097869  -1.17040023 1785.367
## 13                (Intercept) -2.46410271 0.1606267 -15.34055497 1785.661
## 14                     age21+  0.21131531 0.1410668   1.49798063 1789.337
## 15                 genderMale  1.85355336 0.1428080  12.97933557 1789.361
## 16                genderOther  0.69285263 0.4070286   1.70222094 1789.548
## 17 raceAfrican American/Black  0.68314536 0.3143029   2.17352567 1784.085
## 18                  raceAsian  0.24900578 0.2967702   0.83905248 1767.315
## 19            raceMultiracial -0.56845650 0.4056802  -1.40124299 1787.676
## 20                  raceOther  0.08277533 0.5082090   0.16287656 1779.402
## 21   ethnicityHispanic/Latino -0.02080925 0.2338592  -0.08898196 1159.716
## 22     studentstatusPart Time -0.26025792 0.3642008  -0.71460009 1777.236
## 23         residenceOn Campus  0.16750155 0.1493371   1.12163355 1788.154
## 24              greekmemGreek  0.50500639 0.1788348   2.82387058 1789.559
##         p.value
## 1  2.516654e-35
## 2  7.553022e-04
## 3  3.700370e-12
## 4  1.016407e-09
## 5  6.220307e-03
## 6  9.142378e-09
## 7  2.116486e-01
## 8  2.410665e-02
## 9  1.215990e-01
## 10 4.959995e-01
## 11 2.998466e-01
## 12 2.419961e-01
## 13 5.460516e-50
## 14 1.343147e-01
## 15 7.004011e-37
## 16 8.888763e-02
## 17 2.987191e-02
## 18 4.015533e-01
## 19 1.613150e-01
## 20 8.706341e-01
## 21 9.291116e-01
## 22 4.749500e-01
## 23 2.621689e-01
## 24 4.797302e-03
## View fraction of missing information (FMI)
data.frame(
  term = summary(pooled2b)$term,
  fmi  = pooled2b$pooled$fmi,
  lambda = pooled2b$pooled$lambda
)
##                          term         fmi       lambda
## 1                 (Intercept) 0.004365621 0.0032490762
## 2                      age21+ 0.001498888 0.0003834264
## 3                  genderMale 0.005803563 0.0046858317
## 4                 genderOther 0.003294070 0.0021781301
## 5  raceAfrican American/Black 0.006486926 0.0053684820
## 6                   raceAsian 0.007280021 0.0061606282
## 7             raceMultiracial 0.004233731 0.0031172735
## 8                   raceOther 0.011341280 0.0102150176
## 9    ethnicityHispanic/Latino 0.065936098 0.0644138862
## 10     studentstatusPart Time 0.001322362 0.0002069111
## 11         residenceOn Campus 0.003343179 0.0022272170
## 12              greekmemGreek 0.003270892 0.0021549631
## 13                (Intercept) 0.003152515 0.0020366379
## 14                     age21+ 0.001475355 0.0003598956
## 15                 genderMale 0.001462737 0.0003472782
## 16                genderOther 0.001363929 0.0002484759
## 17 raceAfrican American/Black 0.003765182 0.0026490056
## 18                  raceAsian 0.008613834 0.0074925561
## 19            raceMultiracial 0.002286947 0.0011713588
## 20                  raceOther 0.005360528 0.0042432081
## 21   ethnicityHispanic/Latino 0.072056412 0.0704574965
## 22     studentstatusPart Time 0.006016721 0.0048987780
## 23         residenceOn Campus 0.002064044 0.0009485047
## 24              greekmemGreek 0.001358029 0.0002425761
# Fit model 2c: covariates + alcohol + marijuana + vaping + smoking + cigars
fit2c <- with(
  imp2,
  multinom(
    lca2_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich,
    trace = FALSE
  )
)

# Pool model 2c
pooled2c <- pool(fit2c)
summary(pooled2c)
##                          term     estimate std.error    statistic       df
## 1                 (Intercept) -1.552980180 0.1648584  -9.42008303 1766.883
## 2                      age21+ -0.342592416 0.1464198  -2.33979575 1776.886
## 3                  genderMale  0.984652973 0.1392662   7.07029276 1761.494
## 4                 genderOther  1.588015330 0.2595714   6.11783706 1773.903
## 5  raceAfrican American/Black  0.717451329 0.2955320   2.42766063 1764.223
## 6                   raceAsian  1.196452968 0.2329341   5.13644354 1762.144
## 7             raceMultiracial  0.349819477 0.2908594   1.20270979 1773.911
## 8                   raceOther  0.891630241 0.3811312   2.33943122 1746.207
## 9    ethnicityHispanic/Latino  0.272927560 0.2055564   1.32775011 1206.413
## 10     studentstatusPart Time  0.232145037 0.3075425   0.75483893 1779.712
## 11         residenceOn Campus  0.147941592 0.1393729   1.06148001 1775.433
## 12              greekmemGreek -0.113418788 0.2134077  -0.53146520 1776.536
## 13                alcmo_dich2 -0.126063327 0.1698746  -0.74209621 1746.022
## 14                marmo_dich2 -0.069911425 0.1695462  -0.41234432 1776.765
## 15               ecigmo_dich2  0.052653478 0.1850924   0.28447134 1751.810
## 16               smokmo_dich2 -0.271071767 0.2072913  -1.30768522 1776.358
## 17              cigarmo_dich2 -0.370148703 0.2229399  -1.66030740 1768.251
## 18                (Intercept) -2.553407637 0.2068613 -12.34357625 1765.346
## 19                     age21+  0.080813894 0.1525908   0.52961192 1777.330
## 20                 genderMale  1.728192269 0.1512220  11.42818284 1778.299
## 21                genderOther  0.660486924 0.4110541   1.60681264 1779.586
## 22 raceAfrican American/Black  0.809971527 0.3206124   2.52632595 1773.981
## 23                  raceAsian  0.487939580 0.3049762   1.59992695 1751.964
## 24            raceMultiracial -0.546955936 0.4090845  -1.33702424 1777.281
## 25                  raceOther  0.007090684 0.5124699   0.01383629 1767.246
## 26   ethnicityHispanic/Latino  0.017626355 0.2375866   0.07418918 1097.070
## 27     studentstatusPart Time -0.243019702 0.3696966  -0.65734896 1766.747
## 28         residenceOn Campus  0.094671504 0.1530654   0.61850351 1778.122
## 29              greekmemGreek  0.313165879 0.1881889   1.66410429 1779.305
## 30                alcmo_dich2 -0.176395479 0.2078345  -0.84873047 1762.447
## 31                marmo_dich2  0.072930322 0.1762710   0.41373968 1779.039
## 32               ecigmo_dich2  0.418618211 0.1910554   2.19108307 1776.885
## 33               smokmo_dich2  0.051787149 0.1921068   0.26957473 1777.289
## 34              cigarmo_dich2  0.587393115 0.1826658   3.21567165 1775.921
##         p.value
## 1  1.357579e-20
## 2  1.940449e-02
## 3  2.220369e-12
## 4  1.164374e-09
## 5  1.529603e-02
## 6  3.110150e-07
## 7  2.292491e-01
## 8  1.942532e-02
## 9  1.845118e-01
## 10 4.504455e-01
## 11 2.886162e-01
## 12 5.951629e-01
## 13 4.581289e-01
## 14 6.801368e-01
## 15 7.760828e-01
## 16 1.911493e-01
## 17 9.702993e-02
## 18 1.232567e-33
## 19 5.964472e-01
## 20 3.082899e-29
## 21 1.082729e-01
## 22 1.161261e-02
## 23 1.097951e-01
## 24 1.813858e-01
## 25 9.889621e-01
## 26 9.408734e-01
## 27 5.110422e-01
## 28 5.363227e-01
## 29 9.626767e-02
## 30 3.961465e-01
## 31 6.791146e-01
## 32 2.857524e-02
## 33 7.875187e-01
## 34 1.324795e-03
## View fraction of missing information (FMI)
data.frame(
  term = summary(pooled2c)$term,
  fmi  = pooled2c$pooled$fmi,
  lambda = pooled2c$pooled$lambda
)
##                          term         fmi       lambda
## 1                 (Intercept) 0.006154264 0.0050299300
## 2                      age21+ 0.002654251 0.0015323049
## 3                  genderMale 0.007629159 0.0065030604
## 4                 genderOther 0.003854638 0.0027321593
## 5  raceAfrican American/Black 0.006905726 0.0057805487
## 6                   raceAsian 0.007460718 0.0063348439
## 7             raceMultiracial 0.003851593 0.0027291157
## 8                   raceOther 0.011092104 0.0099601174
## 9    ethnicityHispanic/Latino 0.067300198 0.0657552417
## 10     studentstatusPart Time 0.001282998 0.0001612930
## 11         residenceOn Campus 0.003262688 0.0021405096
## 12              greekmemGreek 0.002805605 0.0016836084
## 13                alcmo_dich2 0.011129574 0.0099975100
## 14                marmo_dich2 0.002706803 0.0015848405
## 15               ecigmo_dich2 0.009914926 0.0087852147
## 16               smokmo_dich2 0.002881203 0.0017591798
## 17              cigarmo_dich2 0.005746643 0.0046227176
## 18                (Intercept) 0.006594531 0.0054697173
## 19                     age21+ 0.002457364 0.0013354764
## 20                 genderMale 0.002005945 0.0008841620
## 21                genderOther 0.001351254 0.0002295463
## 22 raceAfrican American/Black 0.003825487 0.0027030243
## 23                  raceAsian 0.009881361 0.0087517105
## 24            raceMultiracial 0.002479276 0.0013573824
## 25                  raceOther 0.006047691 0.0049234674
## 26   ethnicityHispanic/Latino 0.077623815 0.0759438200
## 27     studentstatusPart Time 0.006193953 0.0050695776
## 28         residenceOn Campus 0.002091042 0.0009692421
## 29              greekmemGreek 0.001500679 0.0003789623
## 30                alcmo_dich2 0.007381402 0.0062556312
## 31                marmo_dich2 0.001638372 0.0005166418
## 32               ecigmo_dich2 0.002654439 0.0015324927
## 33               smokmo_dich2 0.002475750 0.0013538576
## 34              cigarmo_dich2 0.003063901 0.0019418072
# Fit model 2d: model c + rx stimulants + rx painkillers + rx sedatives
fit2d <- with(
  imp2,
  nnet::multinom(
    lca2_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich + rxstmo_dich + rxpkmo_dich + rxsedmo_dich,
    trace = FALSE
  )
)

# Pool model 2d
pooled2d <- pool(fit2d)
summary(pooled2d)
##                          term     estimate std.error    statistic       df
## 1                 (Intercept) -1.550232652 0.1648570  -9.40350115 1761.103
## 2                      age21+ -0.337691880 0.1465558  -2.30418684 1770.905
## 3                  genderMale  0.983158560 0.1393331   7.05617313 1755.327
## 4                 genderOther  1.571454531 0.2595088   6.05549670 1767.706
## 5  raceAfrican American/Black  0.712204452 0.2955735   2.40956800 1758.379
## 6                   raceAsian  1.188301636 0.2347900   5.06112450 1755.630
## 7             raceMultiracial  0.329695131 0.2911105   1.13254304 1768.074
## 8                   raceOther  0.877350784 0.3806562   2.30483753 1739.390
## 9    ethnicityHispanic/Latino  0.274563733 0.2059396   1.33322443 1203.313
## 10     studentstatusPart Time  0.213572490 0.3077810   0.69391048 1773.697
## 11         residenceOn Campus  0.142557858 0.1394099   1.02258042 1769.530
## 12              greekmemGreek -0.098216421 0.2137263  -0.45954292 1770.599
## 13                alcmo_dich2 -0.129523578 0.1700773  -0.76155700 1740.775
## 14                marmo_dich2 -0.049588196 0.1709694  -0.29004139 1770.879
## 15               ecigmo_dich2  0.049101772 0.1854019   0.26483964 1746.788
## 16               smokmo_dich2 -0.276990288 0.2086662  -1.32743269 1770.681
## 17              cigarmo_dich2 -0.348541297 0.2232032  -1.56154252 1762.118
## 18               rxstmo_dich2 -0.564511233 0.4425343  -1.27563280 1773.179
## 19               rxpkmo_dich2  0.081113232 0.4323575   0.18760685 1757.426
## 20              rxsedmo_dich2  0.700750782 0.5534528   1.26614377 1772.390
## 21                (Intercept) -2.546982931 0.2069674 -12.30620203 1759.834
## 22                     age21+  0.080367911 0.1528104   0.52593205 1771.396
## 23                 genderMale  1.722360157 0.1514674  11.37116006 1772.420
## 24                genderOther  0.666576279 0.4121117   1.61746523 1773.593
## 25 raceAfrican American/Black  0.812620687 0.3202248   2.53765712 1768.310
## 26                  raceAsian  0.476600677 0.3050378   1.56243142 1744.806
## 27            raceMultiracial -0.543701671 0.4093625  -1.32816690 1770.923
## 28                  raceOther  0.016503964 0.5123685   0.03221112 1760.896
## 29   ethnicityHispanic/Latino  0.007607376 0.2385131   0.03189501 1072.391
## 30     studentstatusPart Time -0.228576926 0.3702659  -0.61733179 1760.806
## 31         residenceOn Campus  0.091558465 0.1532576   0.59741533 1772.383
## 32              greekmemGreek  0.306658472 0.1892395   1.62047771 1773.498
## 33                alcmo_dich2 -0.175858593 0.2080161  -0.84540862 1757.014
## 34                marmo_dich2  0.067878931 0.1780357   0.38126589 1772.757
## 35               ecigmo_dich2  0.413714173 0.1912927   2.16272878 1770.487
## 36               smokmo_dich2  0.047935689 0.1937949   0.24735275 1771.211
## 37              cigarmo_dich2  0.586194264 0.1836836   3.19132633 1769.846
## 38               rxstmo_dich2  0.044887378 0.3010419   0.14910674 1765.213
## 39               rxpkmo_dich2  0.234720210 0.4022244   0.58355531 1540.834
## 40              rxsedmo_dich2 -0.295769190 0.5222601  -0.56632548 1759.125
##         p.value
## 1  1.583182e-20
## 2  2.132741e-02
## 3  2.454116e-12
## 4  1.705895e-09
## 5  1.607359e-02
## 6  4.604719e-07
## 7  2.575598e-01
## 8  2.129293e-02
## 9  1.827105e-01
## 10 4.878292e-01
## 11 3.066460e-01
## 12 6.459008e-01
## 13 4.464276e-01
## 14 7.718185e-01
## 15 7.911642e-01
## 16 1.845367e-01
## 17 1.185754e-01
## 18 2.022524e-01
## 19 8.512065e-01
## 20 2.056280e-01
## 21 1.906415e-33
## 22 5.990012e-01
## 23 5.716972e-29
## 24 1.059557e-01
## 25 1.124496e-02
## 26 1.183677e-01
## 27 1.842941e-01
## 28 9.743073e-01
## 29 9.745617e-01
## 30 5.370957e-01
## 31 5.503064e-01
## 32 1.053075e-01
## 33 3.979978e-01
## 34 7.030516e-01
## 35 3.069555e-02
## 36 8.046639e-01
## 37 1.441053e-03
## 38 8.814864e-01
## 39 5.596049e-01
## 40 5.712448e-01
## View fraction of missing information (FMI)
data.frame(
  term = summary(pooled2d)$term,
  fmi  = pooled2d$pooled$fmi,
  lambda = pooled2d$pooled$lambda
)
##                          term         fmi       lambda
## 1                 (Intercept) 0.006110406 0.0049823339
## 2                      age21+ 0.002654715 0.0015289830
## 3                  genderMale 0.007698205 0.0065682311
## 4                 genderOther 0.003941110 0.0028147964
## 5  raceAfrican American/Black 0.006886230 0.0057572934
## 6                   raceAsian 0.007620050 0.0064901823
## 7             raceMultiracial 0.003803488 0.0026772531
## 8                   raceOther 0.011295210 0.0101590229
## 9    ethnicityHispanic/Latino 0.067317579 0.0657686745
## 10     studentstatusPart Time 0.001295336 0.0001698430
## 11         residenceOn Campus 0.003234398 0.0021084464
## 12              greekmemGreek 0.002787882 0.0016621059
## 13                alcmo_dich2 0.011014132 0.0098785248
## 14                marmo_dich2 0.002666277 0.0015405408
## 15               ecigmo_dich2 0.009733189 0.0086000237
## 16               smokmo_dich2 0.002752344 0.0016265795
## 17              cigarmo_dich2 0.005806542 0.0046787749
## 18               rxstmo_dich2 0.001571766 0.0004462556
## 19               rxpkmo_dich2 0.007145869 0.0060166158
## 20              rxsedmo_dich2 0.001968635 0.0008430722
## 21                (Intercept) 0.006478607 0.0053501404
## 22                     age21+ 0.002435819 0.0013101512
## 23                 genderMale 0.001953892 0.0008283309
## 24                genderOther 0.001352250 0.0002267553
## 25 raceAfrican American/Black 0.003713989 0.0025878029
## 26                  raceAsian 0.010166918 0.0090329627
## 27            raceMultiracial 0.002646666 0.0015209360
## 28                  raceOther 0.006171461 0.0050433260
## 29   ethnicityHispanic/Latino 0.079815985 0.0781014480
## 30     studentstatusPart Time 0.006197700 0.0050695366
## 31         residenceOn Campus 0.001971951 0.0008463876
## 32              greekmemGreek 0.001403018 0.0002775202
## 33                alcmo_dich2 0.007256219 0.0061268268
## 34                marmo_dich2 0.001787364 0.0006618287
## 35               ecigmo_dich2 0.002835980 0.0017101868
## 36               smokmo_dich2 0.002518926 0.0013932354
## 37              cigarmo_dich2 0.003105188 0.0019792911
## 38               rxstmo_dich2 0.004819638 0.0036927292
## 39               rxpkmo_dich2 0.036339355 0.0350893370
## 40              rxsedmo_dich2 0.006679030 0.0055503366
  1. Test for outliers.
# Check on a single imputed dataset
single_imp1 <- complete(imp1, 1)
## Null model
model_check1a <- multinom(lca1_class ~ 1, data = single_imp1, trace = FALSE)
## Covariate model
model_check1b <- multinom(
  lca1_class ~
    age + gender + race + ethnicity + studentstatus + residence + greekmem,
  data = single_imp1,
  trace = FALSE
)
## Covariate model + alcohol + marijuana + vaping + smoking + cigars
model_check1c <- multinom(
  lca1_class ~
    age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich,
  data = single_imp1,
  trace = FALSE
)
## model c + rx stimulants + rx painkillers + rx sedatives
model_check1d <- multinom(
  lca1_class ~
    age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich + rxstmo_dich + rxpkmo_dich + rxsedmo_dich,
  data = single_imp1,
  trace = FALSE
)

# Residuals and influence
plot(fitted(model_check1a))

plot(fitted(model_check1b))

plot(fitted(model_check1c))

plot(fitted(model_check1d))

# Check on a single imputed dataset
single_imp2 <- complete(imp2, 1)
## Null model
model_check2a <- multinom(lca2_class ~ 1, data = single_imp2, trace = FALSE)
## Covariate model
model_check2b <- multinom(
  lca2_class ~
    age + gender + race + gender + studentstatus + residence + greekmem,
  data = single_imp2,
  trace = FALSE
)
## Covariate model + alcohol + marijuana + vaping
model_check2c <- multinom(
  lca2_class ~
    age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich,
  data = single_imp2,
  trace = FALSE
)
## model c + rx stimulants + rx painkillers + rx sedatives
model_check2d <- multinom(
  lca2_class ~
    age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich + rxstmo_dich + rxpkmo_dich + rxsedmo_dich,
  data = single_imp2,
  trace = FALSE
)

# Residuals and influence
plot(fitted(model_check2a))

plot(fitted(model_check2b))

plot(fitted(model_check2c))

plot(fitted(model_check2d))

  1. Test for multicollinearity among predictors.
### Test for multicollinearity among predictors
# Fit a simple linear model with same predictors to extract VIF

vif_check1b <- lm(
  as.numeric(lca1_class) ~ age + gender + race + ethnicity + studentstatus + residence + greekmem,
  data = df6_model1
)
vif(vif_check1b)
##                   GVIF Df GVIF^(1/(2*Df))
## age           1.132489  1        1.064185
## gender        1.016385  2        1.004071
## race          1.174237  4        1.020280
## ethnicity     1.150410  1        1.072572
## studentstatus 1.029457  1        1.014622
## residence     1.205837  1        1.098106
## greekmem      1.069431  1        1.034133
vif_check1c <- lm(
  as.numeric(lca1_class) ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich,
  data = df6_model1
)

vif(vif_check1c)
##                   GVIF Df GVIF^(1/(2*Df))
## age           1.281054  1        1.131837
## gender        1.117460  2        1.028154
## race          1.237150  4        1.026958
## ethnicity     1.150534  1        1.072629
## studentstatus 1.031830  1        1.015791
## residence     1.227470  1        1.107913
## greekmem      1.107798  1        1.052520
## alcmo_dich    1.434667  1        1.197776
## marmo_dich    1.657801  1        1.287556
## ecigmo_dich   1.897877  1        1.377635
## smokmo_dich   1.760500  1        1.326838
## cigarmo_dich  1.451277  1        1.204690
vif_check1d <- lm(
  as.numeric(lca1_class) ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich + rxstmo_dich + rxpkmo_dich + rxsedmo_dich,
  data = df6_model1
)
vif(vif_check1d)
##                   GVIF Df GVIF^(1/(2*Df))
## age           1.281642  1        1.132096
## gender        1.122064  2        1.029211
## race          1.238655  4        1.027114
## ethnicity     1.151341  1        1.073006
## studentstatus 1.034848  1        1.017275
## residence     1.226269  1        1.107370
## greekmem      1.110929  1        1.054006
## alcmo_dich    1.435078  1        1.197947
## marmo_dich    1.683316  1        1.297427
## ecigmo_dich   1.899071  1        1.378068
## smokmo_dich   1.785934  1        1.336388
## cigarmo_dich  1.472210  1        1.213347
## rxstmo_dich   1.365110  1        1.168379
## rxpkmo_dich   1.364695  1        1.168202
## rxsedmo_dich  1.369998  1        1.170469
# Fit a simple linear model with same predictors to extract VIF
vif_check2b <- lm(
  as.numeric(lca2_class) ~ age + gender + race + ethnicity + studentstatus + residence + greekmem,
  data = df6_model2
)
vif(vif_check2b)
##                   GVIF Df GVIF^(1/(2*Df))
## age           1.113499  1        1.055225
## gender        1.019402  2        1.004816
## race          1.127217  4        1.015082
## ethnicity     1.112375  1        1.054692
## studentstatus 1.029068  1        1.014430
## residence     1.206640  1        1.098471
## greekmem      1.102474  1        1.049988
vif_check2c <- lm(
  as.numeric(lca2_class) ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich,
  data = df6_model2
)
vif(vif_check2c)
##                   GVIF Df GVIF^(1/(2*Df))
## age           1.292036  1        1.136678
## gender        1.148279  2        1.035170
## race          1.190469  4        1.022033
## ethnicity     1.117230  1        1.056991
## studentstatus 1.030227  1        1.015001
## residence     1.226182  1        1.107331
## greekmem      1.148999  1        1.071914
## alcmo_dich    1.461152  1        1.208781
## marmo_dich    1.651463  1        1.285093
## ecigmo_dich   1.954846  1        1.398158
## smokmo_dich   1.831376  1        1.353284
## cigarmo_dich  1.558880  1        1.248551
vif_check2d <- lm(
  as.numeric(lca2_class) ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich + rxstmo_dich + rxpkmo_dich + rxsedmo_dich,
  data = df6_model2
)
vif(vif_check2d)
##                   GVIF Df GVIF^(1/(2*Df))
## age           1.290361  1        1.135941
## gender        1.153041  2        1.036242
## race          1.199863  4        1.023037
## ethnicity     1.123367  1        1.059890
## studentstatus 1.034097  1        1.016905
## residence     1.225814  1        1.107165
## greekmem      1.158049  1        1.076127
## alcmo_dich    1.459840  1        1.208238
## marmo_dich    1.685732  1        1.298357
## ecigmo_dich   1.954899  1        1.398177
## smokmo_dich   1.863934  1        1.365260
## cigarmo_dich  1.576686  1        1.255662
## rxstmo_dich   1.507410  1        1.227766
## rxpkmo_dich   1.526068  1        1.235341
## rxsedmo_dich  1.531515  1        1.237544
### Absence of complete separation
## Check for separation in model 1
table(df6_model1$age, df6_model1$lca1_class)
##            
##                3    1    2
##   <21 (ref) 1570  625  212
##   21+       1117  521  233
table(df6_model1$gender, df6_model1$lca1_class)
##               
##                   3    1    2
##   Female (ref) 1780  744  159
##   Male          722  344  280
##   Other         164   55    6
table(df6_model1$race, df6_model1$lca1_class)
##                         
##                             3    1    2
##   White (ref)            1964  962  383
##   African American/Black  162   39   21
##   Asian                   303   57   19
##   Multiracial             125   54   11
##   Other                   104   26   10
table(df6_model1$ethnicity, df6_model1$lca1_class)
##                            
##                                3    1    2
##   Not Hispanic/Latino (ref) 2182  968  375
##   Hispanic/Latino            344  136   38
table(df6_model1$studentstatus, df6_model1$lca1_class)
##                  
##                      3    1    2
##   Full Time (ref) 2582 1092  425
##   Part Time         98   53   17
table(df6_model1$residence, df6_model1$lca1_class)
##                   
##                       3    1    2
##   Off Campus (ref) 1316  524  205
##   On Campus        1370  621  240
table(df6_model1$greekmem, df6_model1$lca1_class)
##                 
##                     3    1    2
##   No Greek (ref) 2396  992  353
##   Greek           287  153   92
table(df6_model1$alcmo_dich, df6_model1$lca1_class)
##    
##        3    1    2
##   1  894  283   75
##   2 1770  850  362
table(df6_model1$marmo_dich, df6_model1$lca1_class)
##    
##        3    1    2
##   1 1816  677  208
##   2  865  467  237
table(df6_model1$ecigmo_dich, df6_model1$lca1_class)
##    
##        3    1    2
##   1 1956  709  218
##   2  721  434  227
table(df6_model1$smokmo_dich, df6_model1$lca1_class)
##    
##        3    1    2
##   1 2230  861  267
##   2  456  285  177
table(df6_model1$cigarmo_dich, df6_model1$lca1_class)
##    
##        3    1    2
##   1 2453  961  271
##   2  227  180  172
table(df6_model1$rxstmo_dich, df6_model1$lca1_class)
##    
##        3    1    2
##   1 2619 1083  399
##   2   64   58   45
table(df6_model1$rxpkmo_dich, df6_model1$lca1_class)
##    
##        3    1    2
##   1 2639 1109  424
##   2   44   36   20
table(df6_model1$rxsedmo_dich, df6_model1$lca1_class)
##    
##        3    1    2
##   1 2642 1123  432
##   2   39   23   13
## Check for separation in model 2
table(df6_model2$age, df6_model2$lca2_class)
##            
##               3   1   2
##   <21 (ref) 584 223 156
##   21+       542 132 179
table(df6_model2$gender, df6_model2$lca2_class)
##               
##                  3   1   2
##   Female (ref) 762 151  88
##   Male         324 166 239
##   Other         38  35   8
table(df6_model2$race, df6_model2$lca2_class)
##                         
##                            3   1   2
##   White (ref)            966 251 282
##   African American/Black  38  20  19
##   Asian                   47  46  19
##   Multiracial             48  20   8
##   Other                   21  15   6
table(df6_model2$ethnicity, df6_model2$lca2_class)
##                            
##                               3   1   2
##   Not Hispanic/Latino (ref) 969 280 277
##   Hispanic/Latino           118  51  31
table(df6_model2$studentstatus, df6_model2$lca2_class)
##                  
##                      3    1    2
##   Full Time (ref) 1076  337  323
##   Part Time         48   17   11
table(df6_model2$residence, df6_model2$lca2_class)
##                   
##                      3   1   2
##   Off Campus (ref) 519 164 158
##   On Campus        606 191 177
table(df6_model2$greekmem, df6_model2$lca2_class)
##                 
##                    3   1   2
##   No Greek (ref) 969 318 259
##   Greek          156  35  76
table(df6_model2$alcmo_dich, df6_model2$lca2_class)
##    
##       3   1   2
##   1 248 120  59
##   2 867 231 269
table(df6_model2$marmo_dich, df6_model2$lca2_class)
##    
##       3   1   2
##   1 642 236 155
##   2 482 119 180
table(df6_model2$ecigmo_dich, df6_model2$lca2_class)
##    
##       3   1   2
##   1 681 250 157
##   2 443 103 178
table(df6_model2$smokmo_dich, df6_model2$lca2_class)
##    
##       3   1   2
##   1 822 295 196
##   2 304  60 138
table(df6_model2$cigarmo_dich, df6_model2$lca2_class)
##    
##       3   1   2
##   1 927 314 190
##   2 194  40 143
table(df6_model2$rxstmo_dich, df6_model2$lca2_class)
##    
##        3    1    2
##   1 1060  344  298
##   2   62   10   36
table(df6_model2$rxpkmo_dich, df6_model2$lca2_class)
##    
##        3    1    2
##   1 1092  342  315
##   2   34   12   18
table(df6_model2$rxsedmo_dich, df6_model2$lca2_class)
##    
##        3    1    2
##   1 1103  347  326
##   2   23    8    9
  1. Compare log-likelihoods per models.
## --- Model 1: Gambling Participation LCA  ---
pooled_lrt <- function(larger_fit, smaller_fit, label) {
  # Extract per-imputation log-likelihoods
  ll_large <- sapply(larger_fit$analyses, function(m)
    as.numeric(logLik(m)))
  ll_small <- sapply(smaller_fit$analyses, function(m)
    as.numeric(logLik(m)))
  
  # LRT statistic per imputation
  lrt_per_imp <- -2 * (ll_small - ll_large)
  
  # Degrees of freedom: difference in number of estimated parameters
  # attr(logLik(model), "df") returns total params; we want the difference
  df_large <- attr(logLik(larger_fit$analyses[[1]]), "df")
  df_small <- attr(logLik(smaller_fit$analyses[[1]]), "df")
  df_diff  <- df_large - df_small
  
  # Pool: simple mean of LRT statistics across imputations
  mean_lrt <- mean(lrt_per_imp)
  sd_lrt   <- sd(lrt_per_imp)
  
  # P-value from chi-square distribution
  p_val <- pchisq(mean_lrt, df = df_diff, lower.tail = FALSE)
  
  # Report
  cat(
    sprintf(
      "\n--- %s ---\n  Mean LRT (chi-sq): %.3f | df: %d | p: %.4f\n  SD across imputations: %.3f\n",
      label,
      mean_lrt,
      df_diff,
      p_val,
      sd_lrt
    )
  )
  
  data.frame(
    comparison    = label,
    mean_LRT_chisq = round(mean_lrt, 3),
    df            = df_diff,
    p_value       = round(p_val, 4),
    sd_across_imp = round(sd_lrt, 3)
  )
}

lrt_table <- bind_rows(
  pooled_lrt(fit1b, fit1a, "Model 1: A → B"),
  pooled_lrt(fit1c, fit1b, "Model 1: B → C"),
  pooled_lrt(fit1d, fit1c, "Model 1: C → D"),
  pooled_lrt(fit1d, fit1b, "Model 1: B → D"),
  pooled_lrt(fit1c, fit1a, "Model 1: A → C"),
  pooled_lrt(fit1d, fit1a, "Model 1: A → D"),
  pooled_lrt(fit2b, fit2a, "Model 2: A → B"),
  pooled_lrt(fit2c, fit2b, "Model 2: B → C"),
  pooled_lrt(fit2c, fit2a, "Model 2: A → C"),
  pooled_lrt(fit2d, fit2c, "Model 2: C → D"),
  pooled_lrt(fit2d, fit2b, "Model 2: B → D"),
  pooled_lrt(fit2d, fit2a, "Model 2: A → D")
)
## 
## --- Model 1: A → B ---
##   Mean LRT (chi-sq): 379.122 | df: 22 | p: 0.0000
##   SD across imputations: 2.097
## 
## --- Model 1: B → C ---
##   Mean LRT (chi-sq): 155.148 | df: 10 | p: 0.0000
##   SD across imputations: 0.827
## 
## --- Model 1: C → D ---
##   Mean LRT (chi-sq): 11.350 | df: 6 | p: 0.0781
##   SD across imputations: 0.294
## 
## --- Model 1: B → D ---
##   Mean LRT (chi-sq): 166.498 | df: 16 | p: 0.0000
##   SD across imputations: 0.874
## 
## --- Model 1: A → C ---
##   Mean LRT (chi-sq): 534.270 | df: 32 | p: 0.0000
##   SD across imputations: 2.195
## 
## --- Model 1: A → D ---
##   Mean LRT (chi-sq): 545.620 | df: 38 | p: 0.0000
##   SD across imputations: 2.190
## 
## --- Model 2: A → B ---
##   Mean LRT (chi-sq): 328.288 | df: 22 | p: 0.0000
##   SD across imputations: 1.395
## 
## --- Model 2: B → C ---
##   Mean LRT (chi-sq): 59.780 | df: 10 | p: 0.0000
##   SD across imputations: 0.694
## 
## --- Model 2: A → C ---
##   Mean LRT (chi-sq): 388.068 | df: 32 | p: 0.0000
##   SD across imputations: 1.454
## 
## --- Model 2: C → D ---
##   Mean LRT (chi-sq): 3.686 | df: 6 | p: 0.7191
##   SD across imputations: 0.207
## 
## --- Model 2: B → D ---
##   Mean LRT (chi-sq): 63.466 | df: 16 | p: 0.0000
##   SD across imputations: 0.686
## 
## --- Model 2: A → D ---
##   Mean LRT (chi-sq): 391.754 | df: 38 | p: 0.0000
##   SD across imputations: 1.424
print(lrt_table)
##        comparison mean_LRT_chisq df p_value sd_across_imp
## 1  Model 1: A → B        379.122 22  0.0000         2.097
## 2  Model 1: B → C        155.148 10  0.0000         0.827
## 3  Model 1: C → D         11.350  6  0.0781         0.294
## 4  Model 1: B → D        166.498 16  0.0000         0.874
## 5  Model 1: A → C        534.270 32  0.0000         2.195
## 6  Model 1: A → D        545.620 38  0.0000         2.190
## 7  Model 2: A → B        328.288 22  0.0000         1.395
## 8  Model 2: B → C         59.780 10  0.0000         0.694
## 9  Model 2: A → C        388.068 32  0.0000         1.454
## 10 Model 2: C → D          3.686  6  0.7191         0.207
## 11 Model 2: B → D         63.466 16  0.0000         0.686
## 12 Model 2: A → D        391.754 38  0.0000         1.424
  1. Calculate Odds Ratios.
compute_or_table <- function(pooled_model, model_label, ref_class = 3) {
  s <- summary(pooled_model)
  
  # number of rows per outcome contrast
  n_params_per_contrast <- length(unique(s$term))
  n_contrasts <- nrow(s) / n_params_per_contrast
  
  # use the actual non-reference class labels, not ref_class + 1, +2, ...
  all_classes <- seq_len(n_contrasts + 1)
  nonref_classes <- all_classes[all_classes != ref_class]
  
  if (length(nonref_classes) != n_contrasts) {
    stop("Mismatch between detected contrasts and class labels.")
  }
  
  s$contrast <- rep(paste0("Class ", nonref_classes, " vs. Class ", ref_class),
                    each = n_params_per_contrast)
  
  s |>
    dplyr::mutate(
      OR = round(exp(estimate), 3),
      CI_lower = round(exp(estimate - 1.96 * std.error), 3),
      CI_upper = round(exp(estimate + 1.96 * std.error), 3),
      p_value = round(p.value, 4),
      sig = dplyr::case_when(
        p.value < .001 ~ "***",
        p.value < .01  ~ "**",
        p.value < .05  ~ "*",
        p.value < .10  ~ ".",
        TRUE           ~ ""
      ),
      model = model_label
    ) |>
    dplyr::select(model, contrast, term, OR, CI_lower, CI_upper, p_value, sig)
}

or_1b <- compute_or_table(pooled1b, "Model 1b")
or_1c <- compute_or_table(pooled1c, "Model 1c")
or_1d <- compute_or_table(pooled1d, "Model 1d")
or_2b <- compute_or_table(pooled2b, "Model 2b")
or_2c <- compute_or_table(pooled2c, "Model 2c")
or_2d <- compute_or_table(pooled2d, "Model 2d")

print(or_1b, row.names = FALSE)
##     model            contrast                       term    OR CI_lower
##  Model 1b Class 1 vs. Class 3                (Intercept) 0.404    0.353
##  Model 1b Class 1 vs. Class 3                     age21+ 1.143    0.984
##  Model 1b Class 1 vs. Class 3                 genderMale 1.208    1.032
##  Model 1b Class 1 vs. Class 3                genderOther 0.780    0.566
##  Model 1b Class 1 vs. Class 3 raceAfrican American/Black 0.496    0.347
##  Model 1b Class 1 vs. Class 3                  raceAsian 0.370    0.275
##  Model 1b Class 1 vs. Class 3            raceMultiracial 0.897    0.643
##  Model 1b Class 1 vs. Class 3                  raceOther 0.544    0.345
##  Model 1b Class 1 vs. Class 3   ethnicityHispanic/Latino 0.915    0.731
##  Model 1b Class 1 vs. Class 3     studentstatusPart Time 1.163    0.819
##  Model 1b Class 1 vs. Class 3         residenceOn Campus 1.139    0.977
##  Model 1b Class 1 vs. Class 3              greekmemGreek 1.257    1.010
##  Model 1b Class 2 vs. Class 3                (Intercept) 0.070    0.055
##  Model 1b Class 2 vs. Class 3                     age21+ 1.501    1.201
##  Model 1b Class 2 vs. Class 3                 genderMale 4.652    3.743
##  Model 1b Class 2 vs. Class 3                genderOther 0.421    0.183
##  Model 1b Class 2 vs. Class 3 raceAfrican American/Black 0.677    0.416
##  Model 1b Class 2 vs. Class 3                  raceAsian 0.238    0.146
##  Model 1b Class 2 vs. Class 3            raceMultiracial 0.495    0.260
##  Model 1b Class 2 vs. Class 3                  raceOther 0.586    0.290
##  Model 1b Class 2 vs. Class 3   ethnicityHispanic/Latino 0.709    0.487
##  Model 1b Class 2 vs. Class 3     studentstatusPart Time 0.951    0.547
##  Model 1b Class 2 vs. Class 3         residenceOn Campus 1.251    0.989
##  Model 1b Class 2 vs. Class 3              greekmemGreek 2.006    1.506
##  CI_upper p_value sig
##     0.462  0.0000 ***
##     1.326  0.0799   .
##     1.413  0.0184   *
##     1.074  0.1279    
##     0.711  0.0001 ***
##     0.497  0.0000 ***
##     1.251  0.5221    
##     0.857  0.0087  **
##     1.146  0.4393    
##     1.649  0.3986    
##     1.329  0.0962   .
##     1.563  0.0401   *
##     0.089  0.0000 ***
##     1.876  0.0004 ***
##     5.781  0.0000 ***
##     0.970  0.0423   *
##     1.102  0.1163    
##     0.389  0.0000 ***
##     0.943  0.0325   *
##     1.187  0.1380    
##     1.032  0.0729   .
##     1.654  0.8579    
##     1.583  0.0623   .
##     2.672  0.0000 ***
print(or_1c, row.names = FALSE)
##     model            contrast                       term    OR CI_lower
##  Model 1c Class 1 vs. Class 3                (Intercept) 0.335    0.281
##  Model 1c Class 1 vs. Class 3                     age21+ 1.020    0.870
##  Model 1c Class 1 vs. Class 3                 genderMale 1.182    1.004
##  Model 1c Class 1 vs. Class 3                genderOther 0.774    0.560
##  Model 1c Class 1 vs. Class 3 raceAfrican American/Black 0.533    0.371
##  Model 1c Class 1 vs. Class 3                  raceAsian 0.419    0.310
##  Model 1c Class 1 vs. Class 3            raceMultiracial 0.900    0.644
##  Model 1c Class 1 vs. Class 3                  raceOther 0.554    0.350
##  Model 1c Class 1 vs. Class 3   ethnicityHispanic/Latino 0.922    0.736
##  Model 1c Class 1 vs. Class 3     studentstatusPart Time 1.158    0.815
##  Model 1c Class 1 vs. Class 3         residenceOn Campus 1.129    0.966
##  Model 1c Class 1 vs. Class 3              greekmemGreek 1.145    0.916
##  Model 1c Class 1 vs. Class 3                alcmo_dich2 1.142    0.945
##  Model 1c Class 1 vs. Class 3                marmo_dich2 1.022    0.850
##  Model 1c Class 1 vs. Class 3               ecigmo_dich2 1.308    1.070
##  Model 1c Class 1 vs. Class 3               smokmo_dich2 1.069    0.857
##  Model 1c Class 1 vs. Class 3              cigarmo_dich2 1.420    1.112
##  Model 1c Class 2 vs. Class 3                (Intercept) 0.046    0.034
##  Model 1c Class 2 vs. Class 3                     age21+ 1.116    0.877
##  Model 1c Class 2 vs. Class 3                 genderMale 4.030    3.190
##  Model 1c Class 2 vs. Class 3                genderOther 0.401    0.173
##  Model 1c Class 2 vs. Class 3 raceAfrican American/Black 0.813    0.492
##  Model 1c Class 2 vs. Class 3                  raceAsian 0.342    0.207
##  Model 1c Class 2 vs. Class 3            raceMultiracial 0.523    0.273
##  Model 1c Class 2 vs. Class 3                  raceOther 0.594    0.287
##  Model 1c Class 2 vs. Class 3   ethnicityHispanic/Latino 0.730    0.497
##  Model 1c Class 2 vs. Class 3     studentstatusPart Time 0.970    0.551
##  Model 1c Class 2 vs. Class 3         residenceOn Campus 1.195    0.937
##  Model 1c Class 2 vs. Class 3              greekmemGreek 1.452    1.071
##  Model 1c Class 2 vs. Class 3                alcmo_dich2 1.237    0.898
##  Model 1c Class 2 vs. Class 3                marmo_dich2 1.234    0.934
##  Model 1c Class 2 vs. Class 3               ecigmo_dich2 1.550    1.146
##  Model 1c Class 2 vs. Class 3               smokmo_dich2 1.227    0.900
##  Model 1c Class 2 vs. Class 3              cigarmo_dich2 2.478    1.835
##  CI_upper p_value sig
##     0.400  0.0000 ***
##     1.197  0.8055    
##     1.393  0.0450   *
##     1.068  0.1191    
##     0.765  0.0006 ***
##     0.566  0.0000 ***
##     1.258  0.5374    
##     0.877  0.0117   *
##     1.156  0.4822    
##     1.646  0.4127    
##     1.319  0.1263    
##     1.430  0.2334    
##     1.380  0.1683    
##     1.230  0.8161    
##     1.599  0.0088  **
##     1.332  0.5540    
##     1.814  0.0050  **
##     0.064  0.0000 ***
##     1.421  0.3702    
##     5.093  0.0000 ***
##     0.928  0.0328   *
##     1.341  0.4170    
##     0.566  0.0000 ***
##     1.004  0.0514   .
##     1.230  0.1610    
##     1.072  0.1086    
##     1.708  0.9149    
##     1.525  0.1517    
##     1.970  0.0164   *
##     1.703  0.1934    
##     1.631  0.1387    
##     2.096  0.0045  **
##     1.672  0.1956    
##     3.348  0.0000 ***
print(or_1d, row.names = FALSE)
##     model            contrast                       term    OR CI_lower
##  Model 1d Class 1 vs. Class 3                (Intercept) 0.336    0.282
##  Model 1d Class 1 vs. Class 3                     age21+ 1.016    0.866
##  Model 1d Class 1 vs. Class 3                 genderMale 1.179    1.000
##  Model 1d Class 1 vs. Class 3                genderOther 0.766    0.554
##  Model 1d Class 1 vs. Class 3 raceAfrican American/Black 0.537    0.374
##  Model 1d Class 1 vs. Class 3                  raceAsian 0.416    0.308
##  Model 1d Class 1 vs. Class 3            raceMultiracial 0.906    0.648
##  Model 1d Class 1 vs. Class 3                  raceOther 0.564    0.356
##  Model 1d Class 1 vs. Class 3   ethnicityHispanic/Latino 0.914    0.729
##  Model 1d Class 1 vs. Class 3     studentstatusPart Time 1.180    0.830
##  Model 1d Class 1 vs. Class 3         residenceOn Campus 1.129    0.966
##  Model 1d Class 1 vs. Class 3              greekmemGreek 1.136    0.909
##  Model 1d Class 1 vs. Class 3                alcmo_dich2 1.141    0.944
##  Model 1d Class 1 vs. Class 3                marmo_dich2 1.004    0.833
##  Model 1d Class 1 vs. Class 3               ecigmo_dich2 1.300    1.063
##  Model 1d Class 1 vs. Class 3               smokmo_dich2 1.051    0.842
##  Model 1d Class 1 vs. Class 3              cigarmo_dich2 1.395    1.090
##  Model 1d Class 1 vs. Class 3               rxstmo_dich2 1.476    0.964
##  Model 1d Class 1 vs. Class 3               rxpkmo_dich2 1.546    0.912
##  Model 1d Class 1 vs. Class 3              rxsedmo_dich2 0.636    0.339
##  Model 1d Class 2 vs. Class 3                (Intercept) 0.047    0.034
##  Model 1d Class 2 vs. Class 3                     age21+ 1.104    0.867
##  Model 1d Class 2 vs. Class 3                 genderMale 4.002    3.166
##  Model 1d Class 2 vs. Class 3                genderOther 0.395    0.170
##  Model 1d Class 2 vs. Class 3 raceAfrican American/Black 0.825    0.500
##  Model 1d Class 2 vs. Class 3                  raceAsian 0.338    0.204
##  Model 1d Class 2 vs. Class 3            raceMultiracial 0.531    0.277
##  Model 1d Class 2 vs. Class 3                  raceOther 0.623    0.301
##  Model 1d Class 2 vs. Class 3   ethnicityHispanic/Latino 0.724    0.493
##  Model 1d Class 2 vs. Class 3     studentstatusPart Time 1.004    0.570
##  Model 1d Class 2 vs. Class 3         residenceOn Campus 1.196    0.937
##  Model 1d Class 2 vs. Class 3              greekmemGreek 1.418    1.043
##  Model 1d Class 2 vs. Class 3                alcmo_dich2 1.246    0.905
##  Model 1d Class 2 vs. Class 3                marmo_dich2 1.193    0.900
##  Model 1d Class 2 vs. Class 3               ecigmo_dich2 1.533    1.132
##  Model 1d Class 2 vs. Class 3               smokmo_dich2 1.197    0.876
##  Model 1d Class 2 vs. Class 3              cigarmo_dich2 2.425    1.791
##  Model 1d Class 2 vs. Class 3               rxstmo_dich2 1.812    1.082
##  Model 1d Class 2 vs. Class 3               rxpkmo_dich2 1.401    0.687
##  Model 1d Class 2 vs. Class 3              rxsedmo_dich2 0.550    0.239
##  CI_upper p_value sig
##     0.401  0.0000 ***
##     1.192  0.8492    
##     1.389  0.0495   *
##     1.060  0.1074    
##     0.771  0.0008 ***
##     0.562  0.0000 ***
##     1.266  0.5635    
##     0.892  0.0144   *
##     1.145  0.4334    
##     1.678  0.3572    
##     1.319  0.1266    
##     1.420  0.2615    
##     1.379  0.1714    
##     1.209  0.9699    
##     1.590  0.0106   *
##     1.312  0.6592    
##     1.785  0.0082  **
##     2.259  0.0730   .
##     2.623  0.1059    
##     1.193  0.1585    
##     0.064  0.0000 ***
##     1.405  0.4244    
##     5.059  0.0000 ***
##     0.916  0.0306   *
##     1.362  0.4517    
##     0.559  0.0000 ***
##     1.019  0.0569   .
##     1.287  0.2012    
##     1.064  0.1004    
##     1.769  0.9882    
##     1.526  0.1515    
##     1.928  0.0258   *
##     1.717  0.1777    
##     1.581  0.2199    
##     2.075  0.0058  **
##     1.636  0.2599    
##     3.282  0.0000 ***
##     3.036  0.0240   *
##     2.857  0.3541    
##     1.263  0.1585
print(or_2b, row.names = FALSE)
##     model            contrast                       term    OR CI_lower
##  Model 2b Class 1 vs. Class 3                (Intercept) 0.184    0.141
##  Model 2b Class 1 vs. Class 3                     age21+ 0.631    0.483
##  Model 2b Class 1 vs. Class 3                 genderMale 2.554    1.964
##  Model 2b Class 1 vs. Class 3                genderOther 4.827    2.920
##  Model 2b Class 1 vs. Class 3 raceAfrican American/Black 2.235    1.257
##  Model 2b Class 1 vs. Class 3                  raceAsian 3.732    2.387
##  Model 2b Class 1 vs. Class 3            raceMultiracial 1.436    0.814
##  Model 2b Class 1 vs. Class 3                  raceOther 2.342    1.119
##  Model 2b Class 1 vs. Class 3   ethnicityHispanic/Latino 1.370    0.920
##  Model 2b Class 1 vs. Class 3     studentstatusPart Time 1.233    0.674
##  Model 2b Class 1 vs. Class 3         residenceOn Campus 1.155    0.880
##  Model 2b Class 1 vs. Class 3              greekmemGreek 0.782    0.519
##  Model 2b Class 2 vs. Class 3                (Intercept) 0.085    0.062
##  Model 2b Class 2 vs. Class 3                     age21+ 1.235    0.937
##  Model 2b Class 2 vs. Class 3                 genderMale 6.382    4.824
##  Model 2b Class 2 vs. Class 3                genderOther 1.999    0.900
##  Model 2b Class 2 vs. Class 3 raceAfrican American/Black 1.980    1.069
##  Model 2b Class 2 vs. Class 3                  raceAsian 1.283    0.717
##  Model 2b Class 2 vs. Class 3            raceMultiracial 0.566    0.256
##  Model 2b Class 2 vs. Class 3                  raceOther 1.086    0.401
##  Model 2b Class 2 vs. Class 3   ethnicityHispanic/Latino 0.979    0.619
##  Model 2b Class 2 vs. Class 3     studentstatusPart Time 0.771    0.378
##  Model 2b Class 2 vs. Class 3         residenceOn Campus 1.182    0.882
##  Model 2b Class 2 vs. Class 3              greekmemGreek 1.657    1.167
##  CI_upper p_value sig
##     0.238  0.0000 ***
##     0.824  0.0008 ***
##     3.321  0.0000 ***
##     7.979  0.0000 ***
##     3.973  0.0062  **
##     5.837  0.0000 ***
##     2.532  0.2116    
##     4.904  0.0241   *
##     2.042  0.1216    
##     2.255  0.4960    
##     1.515  0.2998    
##     1.180  0.2420    
##     0.117  0.0000 ***
##     1.629  0.1343    
##     8.444  0.0000 ***
##     4.440  0.0889   .
##     3.666  0.0299   *
##     2.295  0.4016    
##     1.254  0.1613    
##     2.941  0.8706    
##     1.549  0.9291    
##     1.574  0.4750    
##     1.584  0.2622    
##     2.353  0.0048  **
print(or_2c, row.names = FALSE)
##     model            contrast                       term    OR CI_lower
##  Model 2c Class 1 vs. Class 3                (Intercept) 0.212    0.153
##  Model 2c Class 1 vs. Class 3                     age21+ 0.710    0.533
##  Model 2c Class 1 vs. Class 3                 genderMale 2.677    2.037
##  Model 2c Class 1 vs. Class 3                genderOther 4.894    2.942
##  Model 2c Class 1 vs. Class 3 raceAfrican American/Black 2.049    1.148
##  Model 2c Class 1 vs. Class 3                  raceAsian 3.308    2.096
##  Model 2c Class 1 vs. Class 3            raceMultiracial 1.419    0.802
##  Model 2c Class 1 vs. Class 3                  raceOther 2.439    1.156
##  Model 2c Class 1 vs. Class 3   ethnicityHispanic/Latino 1.314    0.878
##  Model 2c Class 1 vs. Class 3     studentstatusPart Time 1.261    0.690
##  Model 2c Class 1 vs. Class 3         residenceOn Campus 1.159    0.882
##  Model 2c Class 1 vs. Class 3              greekmemGreek 0.893    0.588
##  Model 2c Class 1 vs. Class 3                alcmo_dich2 0.882    0.632
##  Model 2c Class 1 vs. Class 3                marmo_dich2 0.932    0.669
##  Model 2c Class 1 vs. Class 3               ecigmo_dich2 1.054    0.733
##  Model 2c Class 1 vs. Class 3               smokmo_dich2 0.763    0.508
##  Model 2c Class 1 vs. Class 3              cigarmo_dich2 0.691    0.446
##  Model 2c Class 2 vs. Class 3                (Intercept) 0.078    0.052
##  Model 2c Class 2 vs. Class 3                     age21+ 1.084    0.804
##  Model 2c Class 2 vs. Class 3                 genderMale 5.630    4.186
##  Model 2c Class 2 vs. Class 3                genderOther 1.936    0.865
##  Model 2c Class 2 vs. Class 3 raceAfrican American/Black 2.248    1.199
##  Model 2c Class 2 vs. Class 3                  raceAsian 1.629    0.896
##  Model 2c Class 2 vs. Class 3            raceMultiracial 0.579    0.260
##  Model 2c Class 2 vs. Class 3                  raceOther 1.007    0.369
##  Model 2c Class 2 vs. Class 3   ethnicityHispanic/Latino 1.018    0.639
##  Model 2c Class 2 vs. Class 3     studentstatusPart Time 0.784    0.380
##  Model 2c Class 2 vs. Class 3         residenceOn Campus 1.099    0.814
##  Model 2c Class 2 vs. Class 3              greekmemGreek 1.368    0.946
##  Model 2c Class 2 vs. Class 3                alcmo_dich2 0.838    0.558
##  Model 2c Class 2 vs. Class 3                marmo_dich2 1.076    0.761
##  Model 2c Class 2 vs. Class 3               ecigmo_dich2 1.520    1.045
##  Model 2c Class 2 vs. Class 3               smokmo_dich2 1.053    0.723
##  Model 2c Class 2 vs. Class 3              cigarmo_dich2 1.799    1.258
##  CI_upper p_value sig
##     0.292  0.0000 ***
##     0.946  0.0194   *
##     3.517  0.0000 ***
##     8.140  0.0000 ***
##     3.657  0.0153   *
##     5.223  0.0000 ***
##     2.509  0.2292    
##     5.148  0.0194   *
##     1.966  0.1845    
##     2.305  0.4504    
##     1.524  0.2886    
##     1.356  0.5952    
##     1.230  0.4581    
##     1.300  0.6801    
##     1.515  0.7761    
##     1.145  0.1911    
##     1.069  0.0970   .
##     0.117  0.0000 ***
##     1.462  0.5964    
##     7.573  0.0000 ***
##     4.333  0.1083    
##     4.214  0.0116   *
##     2.961  0.1098    
##     1.290  0.1814    
##     2.750  0.9890    
##     1.621  0.9409    
##     1.619  0.5110    
##     1.484  0.5363    
##     1.978  0.0963   .
##     1.260  0.3961    
##     1.520  0.6791    
##     2.210  0.0286   *
##     1.535  0.7875    
##     2.574  0.0013  **
print(or_2d, row.names = FALSE)
##     model            contrast                       term    OR CI_lower
##  Model 2d Class 1 vs. Class 3                (Intercept) 0.212    0.154
##  Model 2d Class 1 vs. Class 3                     age21+ 0.713    0.535
##  Model 2d Class 1 vs. Class 3                 genderMale 2.673    2.034
##  Model 2d Class 1 vs. Class 3                genderOther 4.814    2.895
##  Model 2d Class 1 vs. Class 3 raceAfrican American/Black 2.038    1.142
##  Model 2d Class 1 vs. Class 3                  raceAsian 3.282    2.071
##  Model 2d Class 1 vs. Class 3            raceMultiracial 1.391    0.786
##  Model 2d Class 1 vs. Class 3                  raceOther 2.405    1.140
##  Model 2d Class 1 vs. Class 3   ethnicityHispanic/Latino 1.316    0.879
##  Model 2d Class 1 vs. Class 3     studentstatusPart Time 1.238    0.677
##  Model 2d Class 1 vs. Class 3         residenceOn Campus 1.153    0.877
##  Model 2d Class 1 vs. Class 3              greekmemGreek 0.906    0.596
##  Model 2d Class 1 vs. Class 3                alcmo_dich2 0.879    0.629
##  Model 2d Class 1 vs. Class 3                marmo_dich2 0.952    0.681
##  Model 2d Class 1 vs. Class 3               ecigmo_dich2 1.050    0.730
##  Model 2d Class 1 vs. Class 3               smokmo_dich2 0.758    0.504
##  Model 2d Class 1 vs. Class 3              cigarmo_dich2 0.706    0.456
##  Model 2d Class 1 vs. Class 3               rxstmo_dich2 0.569    0.239
##  Model 2d Class 1 vs. Class 3               rxpkmo_dich2 1.084    0.465
##  Model 2d Class 1 vs. Class 3              rxsedmo_dich2 2.015    0.681
##  Model 2d Class 2 vs. Class 3                (Intercept) 0.078    0.052
##  Model 2d Class 2 vs. Class 3                     age21+ 1.084    0.803
##  Model 2d Class 2 vs. Class 3                 genderMale 5.598    4.160
##  Model 2d Class 2 vs. Class 3                genderOther 1.948    0.868
##  Model 2d Class 2 vs. Class 3 raceAfrican American/Black 2.254    1.203
##  Model 2d Class 2 vs. Class 3                  raceAsian 1.611    0.886
##  Model 2d Class 2 vs. Class 3            raceMultiracial 0.581    0.260
##  Model 2d Class 2 vs. Class 3                  raceOther 1.017    0.372
##  Model 2d Class 2 vs. Class 3   ethnicityHispanic/Latino 1.008    0.631
##  Model 2d Class 2 vs. Class 3     studentstatusPart Time 0.796    0.385
##  Model 2d Class 2 vs. Class 3         residenceOn Campus 1.096    0.812
##  Model 2d Class 2 vs. Class 3              greekmemGreek 1.359    0.938
##  Model 2d Class 2 vs. Class 3                alcmo_dich2 0.839    0.558
##  Model 2d Class 2 vs. Class 3                marmo_dich2 1.070    0.755
##  Model 2d Class 2 vs. Class 3               ecigmo_dich2 1.512    1.040
##  Model 2d Class 2 vs. Class 3               smokmo_dich2 1.049    0.718
##  Model 2d Class 2 vs. Class 3              cigarmo_dich2 1.797    1.254
##  Model 2d Class 2 vs. Class 3               rxstmo_dich2 1.046    0.580
##  Model 2d Class 2 vs. Class 3               rxpkmo_dich2 1.265    0.575
##  Model 2d Class 2 vs. Class 3              rxsedmo_dich2 0.744    0.267
##  CI_upper p_value sig
##     0.293  0.0000 ***
##     0.951  0.0213   *
##     3.512  0.0000 ***
##     8.005  0.0000 ***
##     3.638  0.0161   *
##     5.199  0.0000 ***
##     2.460  0.2576    
##     5.070  0.0213   *
##     1.970  0.1827    
##     2.263  0.4878    
##     1.516  0.3066    
##     1.378  0.6459    
##     1.226  0.4464    
##     1.330  0.7718    
##     1.511  0.7912    
##     1.141  0.1845    
##     1.093  0.1186    
##     1.354  0.2023    
##     2.531  0.8512    
##     5.963  0.2056    
##     0.117  0.0000 ***
##     1.462  0.5990    
##     7.533  0.0000 ***
##     4.368  0.1060    
##     4.222  0.0112   *
##     2.928  0.1184    
##     1.295  0.1843    
##     2.775  0.9743    
##     1.608  0.9746    
##     1.644  0.5371    
##     1.480  0.5503    
##     1.969  0.1053    
##     1.261  0.3980    
##     1.517  0.7031    
##     2.200  0.0307   *
##     1.534  0.8047    
##     2.576  0.0014  **
##     1.887  0.8815    
##     2.782  0.5596    
##     2.071  0.5712
  1. Evaluate approximate Pseudo-R^2 effect sizes
#   McFadden's R²   = 1 - (LL_full / LL_null)
#                     Strict; values of .2–.4 indicate excellent fit.
#                     Best for comparing models with the same outcome.
#
#   Cox & Snell R²  = 1 - exp((2/n) * (LL_null - LL_full))
#                     Analogous to OLS R² but cannot reach 1.0.
#
#   Nagelkerke R²   = Cox-Snell R² / (1 - exp((2/n) * LL_null))
#                     Rescales Cox-Snell to [0, 1].

compute_pseudo_r2 <- function(null_model, full_model, n, model_label) {
  ll_null <- as.numeric(logLik(null_model))
  ll_full <- as.numeric(logLik(full_model))
  
  mcfadden    <- round(1 - (ll_full / ll_null), 6)
  cox_snell   <- round(1 - exp((2 / n) * (ll_null - ll_full)), 4)
  nagelkerke_max <- 1 - exp((2 / n) * ll_null)
  nagelkerke  <- round(cox_snell / nagelkerke_max, 4)
  
  data.frame(
    model       = model_label,
    LL_null     = round(ll_null, 2),
    LL_full     = round(ll_full, 2),
    McFadden    = mcfadden,
    Cox_Snell   = cox_snell,
    Nagelkerke  = nagelkerke
  )
}

## Model 1 pseudo-R² (single imputation approximation)
n1 <- nrow(single_imp1)

model1a_si <- multinom(lca1_class ~ 1, data = single_imp1, trace = FALSE)
model1b_si <- multinom(
  lca1_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem,
  data = single_imp1,
  trace = FALSE
)
model1c_si <- multinom(
  lca1_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich,
  data = single_imp1,
  trace = FALSE
)
model1d_si <- multinom(
  lca1_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich + rxstmo_dich + rxpkmo_dich + rxsedmo_dich,
  data = single_imp1,
  trace = FALSE
)

## Model 2 pseudo-R² (single imputation approximation)
n2 <- nrow(single_imp2)
model2a_si <- multinom(lca2_class ~ 1, data = single_imp2, trace = FALSE)
model2b_si <- multinom(
  lca2_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem,
  data = single_imp2,
  trace = FALSE
)
model2c_si <- multinom(
  lca2_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich,
  data = single_imp2,
  trace = FALSE
)
model2d_si <- multinom(
  lca2_class ~ age + gender + race + ethnicity + studentstatus + residence + greekmem + alcmo_dich + marmo_dich + ecigmo_dich + smokmo_dich + cigarmo_dich + rxstmo_dich + rxpkmo_dich + rxsedmo_dich,
  data = single_imp2,
  trace = FALSE
)

pseudo_r2_table <- bind_rows(
  compute_pseudo_r2(model1a_si, model1b_si, n1, "Model 1b"),
  compute_pseudo_r2(model1a_si, model1c_si, n1, "Model 1c"),
  compute_pseudo_r2(model1a_si, model1d_si, n1, "Model 1d"),
  compute_pseudo_r2(model2a_si, model2b_si, n2, "Model 2b"),
  compute_pseudo_r2(model2a_si, model2c_si, n2, "Model 2c"),
  compute_pseudo_r2(model2a_si, model2d_si, n2, "Model 2d")
)
print(pseudo_r2_table, row.names = FALSE)
##     model  LL_null  LL_full McFadden Cox_Snell Nagelkerke
##  Model 1b -3766.25 -3578.64 0.049812    0.0840     0.1014
##  Model 1c -3766.25 -3500.99 0.070429    0.1166     0.1408
##  Model 1d -3766.25 -3495.38 0.071920    0.1189     0.1436
##  Model 2b -1683.88 -1520.59 0.096972    0.1646     0.1951
##  Model 2c -1683.88 -1490.60 0.114782    0.1917     0.2273
##  Model 2d -1683.88 -1488.67 0.115929    0.1934     0.2293
# Incremental pseudo-R² (how much variance each block adds)
incr_r2 <- data.frame(
  comparison = c(
    "1b - 1a",
    "1c - 1b",
    "1d - 1c",
    "2b - 2a",
    "2c - 2b",
    "2d - 2c"
  ),
  delta_McFadden  = round(
    c(
      pseudo_r2_table$McFadden[1] - 0,
      pseudo_r2_table$McFadden[2] - pseudo_r2_table$McFadden[1],
      pseudo_r2_table$McFadden[3] - pseudo_r2_table$McFadden[2],
      pseudo_r2_table$McFadden[4] - 0,
      pseudo_r2_table$McFadden[5] - pseudo_r2_table$McFadden[4],
      pseudo_r2_table$McFadden[6] - pseudo_r2_table$McFadden[5]
    ),
    4
  ),
  delta_Nagelkerke = round(
    c(
      pseudo_r2_table$Nagelkerke[1] - 0,
      pseudo_r2_table$Nagelkerke[2] - pseudo_r2_table$Nagelkerke[1],
      pseudo_r2_table$Nagelkerke[3] - pseudo_r2_table$Nagelkerke[2],
      pseudo_r2_table$Nagelkerke[4] - 0,
      pseudo_r2_table$Nagelkerke[5] - pseudo_r2_table$Nagelkerke[4],
      pseudo_r2_table$Nagelkerke[6] - pseudo_r2_table$Nagelkerke[5]
    ),
    4
  )
)
print(incr_r2, row.names = FALSE)
##  comparison delta_McFadden delta_Nagelkerke
##     1b - 1a         0.0498           0.1014
##     1c - 1b         0.0206           0.0394
##     1d - 1c         0.0015           0.0028
##     2b - 2a         0.0970           0.1951
##     2c - 2b         0.0178           0.0322
##     2d - 2c         0.0011           0.0020
  1. Generate a combined results table.
build_results_table <- function(pooled_model,
                                r2_row,
                                model_label,
                                ref_class = 3) {
  s <- summary(pooled_model)
  
  # number of rows per outcome contrast
  n_params_per_contrast <- length(unique(s$term))
  n_contrasts <- nrow(s) / n_params_per_contrast
  
  # correct contrast labels
  all_classes <- seq_len(n_contrasts + 1)
  nonref_classes <- all_classes[all_classes != ref_class]
  
  if (length(nonref_classes) != n_contrasts) {
    stop("Mismatch between detected contrasts and class labels.")
  }
  
  s$contrast <- rep(paste0("Class ", nonref_classes, " vs. Class ", ref_class),
                    each = n_params_per_contrast)
  
  results <- s |>
    dplyr::mutate(
      model = model_label,
      OR = exp(estimate),
      CI_lower = exp(estimate - 1.96 * std.error),
      CI_upper = exp(estimate + 1.96 * std.error),
      OR_CI = sprintf("%.3f [%.3f, %.3f]", OR, CI_lower, CI_upper),
      p.value = round(p.value, 4),
      sig = dplyr::case_when(
        p.value < .001 ~ "***",
        p.value < .01  ~ "**",
        p.value < .05  ~ "*",
        p.value < .10  ~ ".",
        TRUE           ~ ""
      ),
      fmi = round(pooled_model$pooled$fmi, 3),
      McFadden = round(r2_row$McFadden, 3),
      Nagelkerke = round(r2_row$Nagelkerke, 3)
    ) |>
    dplyr::select(model,
                  contrast,
                  term,
                  OR_CI,
                  p.value,
                  sig,
                  fmi,
                  McFadden,
                  Nagelkerke)
  
  return(results)
}
full_table <- dplyr::bind_rows(
  build_results_table(pooled1b, pseudo_r2_table[1, ], "1b"),
  build_results_table(pooled1c, pseudo_r2_table[2, ], "1c"),
  build_results_table(pooled1d, pseudo_r2_table[3, ], "1d"),
  build_results_table(pooled2b, pseudo_r2_table[4, ], "2b"),
  build_results_table(pooled2c, pseudo_r2_table[5, ], "2c"),
  build_results_table(pooled2d, pseudo_r2_table[6, ], "2d")
)

write_csv(full_table, file = "full_table.csv")
print(full_table, width = getOption("width"))
##     model            contrast                       term                OR_CI
## 1      1b Class 1 vs. Class 3                (Intercept) 0.404 [0.353, 0.462]
## 2      1b Class 1 vs. Class 3                     age21+ 1.143 [0.984, 1.326]
## 3      1b Class 1 vs. Class 3                 genderMale 1.208 [1.032, 1.413]
## 4      1b Class 1 vs. Class 3                genderOther 0.780 [0.566, 1.074]
## 5      1b Class 1 vs. Class 3 raceAfrican American/Black 0.496 [0.347, 0.711]
## 6      1b Class 1 vs. Class 3                  raceAsian 0.370 [0.275, 0.497]
## 7      1b Class 1 vs. Class 3            raceMultiracial 0.897 [0.643, 1.251]
## 8      1b Class 1 vs. Class 3                  raceOther 0.544 [0.345, 0.857]
## 9      1b Class 1 vs. Class 3   ethnicityHispanic/Latino 0.915 [0.731, 1.146]
## 10     1b Class 1 vs. Class 3     studentstatusPart Time 1.163 [0.819, 1.649]
## 11     1b Class 1 vs. Class 3         residenceOn Campus 1.139 [0.977, 1.329]
## 12     1b Class 1 vs. Class 3              greekmemGreek 1.257 [1.010, 1.563]
## 13     1b Class 2 vs. Class 3                (Intercept) 0.070 [0.055, 0.089]
## 14     1b Class 2 vs. Class 3                     age21+ 1.501 [1.201, 1.876]
## 15     1b Class 2 vs. Class 3                 genderMale 4.652 [3.743, 5.781]
## 16     1b Class 2 vs. Class 3                genderOther 0.421 [0.183, 0.970]
## 17     1b Class 2 vs. Class 3 raceAfrican American/Black 0.677 [0.416, 1.102]
## 18     1b Class 2 vs. Class 3                  raceAsian 0.238 [0.146, 0.389]
## 19     1b Class 2 vs. Class 3            raceMultiracial 0.495 [0.260, 0.943]
## 20     1b Class 2 vs. Class 3                  raceOther 0.586 [0.290, 1.187]
## 21     1b Class 2 vs. Class 3   ethnicityHispanic/Latino 0.709 [0.487, 1.032]
## 22     1b Class 2 vs. Class 3     studentstatusPart Time 0.951 [0.547, 1.654]
## 23     1b Class 2 vs. Class 3         residenceOn Campus 1.251 [0.989, 1.583]
## 24     1b Class 2 vs. Class 3              greekmemGreek 2.006 [1.506, 2.672]
## 25     1c Class 1 vs. Class 3                (Intercept) 0.335 [0.281, 0.400]
## 26     1c Class 1 vs. Class 3                     age21+ 1.020 [0.870, 1.197]
## 27     1c Class 1 vs. Class 3                 genderMale 1.182 [1.004, 1.393]
## 28     1c Class 1 vs. Class 3                genderOther 0.774 [0.560, 1.068]
## 29     1c Class 1 vs. Class 3 raceAfrican American/Black 0.533 [0.371, 0.765]
## 30     1c Class 1 vs. Class 3                  raceAsian 0.419 [0.310, 0.566]
## 31     1c Class 1 vs. Class 3            raceMultiracial 0.900 [0.644, 1.258]
## 32     1c Class 1 vs. Class 3                  raceOther 0.554 [0.350, 0.877]
## 33     1c Class 1 vs. Class 3   ethnicityHispanic/Latino 0.922 [0.736, 1.156]
## 34     1c Class 1 vs. Class 3     studentstatusPart Time 1.158 [0.815, 1.646]
## 35     1c Class 1 vs. Class 3         residenceOn Campus 1.129 [0.966, 1.319]
## 36     1c Class 1 vs. Class 3              greekmemGreek 1.145 [0.916, 1.430]
## 37     1c Class 1 vs. Class 3                alcmo_dich2 1.142 [0.945, 1.380]
## 38     1c Class 1 vs. Class 3                marmo_dich2 1.022 [0.850, 1.230]
## 39     1c Class 1 vs. Class 3               ecigmo_dich2 1.308 [1.070, 1.599]
## 40     1c Class 1 vs. Class 3               smokmo_dich2 1.069 [0.857, 1.332]
## 41     1c Class 1 vs. Class 3              cigarmo_dich2 1.420 [1.112, 1.814]
## 42     1c Class 2 vs. Class 3                (Intercept) 0.046 [0.034, 0.064]
## 43     1c Class 2 vs. Class 3                     age21+ 1.116 [0.877, 1.421]
## 44     1c Class 2 vs. Class 3                 genderMale 4.030 [3.190, 5.093]
## 45     1c Class 2 vs. Class 3                genderOther 0.401 [0.173, 0.928]
## 46     1c Class 2 vs. Class 3 raceAfrican American/Black 0.813 [0.492, 1.341]
## 47     1c Class 2 vs. Class 3                  raceAsian 0.342 [0.207, 0.566]
## 48     1c Class 2 vs. Class 3            raceMultiracial 0.523 [0.273, 1.004]
## 49     1c Class 2 vs. Class 3                  raceOther 0.594 [0.287, 1.230]
## 50     1c Class 2 vs. Class 3   ethnicityHispanic/Latino 0.730 [0.497, 1.072]
## 51     1c Class 2 vs. Class 3     studentstatusPart Time 0.970 [0.551, 1.708]
## 52     1c Class 2 vs. Class 3         residenceOn Campus 1.195 [0.937, 1.525]
## 53     1c Class 2 vs. Class 3              greekmemGreek 1.452 [1.071, 1.970]
## 54     1c Class 2 vs. Class 3                alcmo_dich2 1.237 [0.898, 1.703]
## 55     1c Class 2 vs. Class 3                marmo_dich2 1.234 [0.934, 1.631]
## 56     1c Class 2 vs. Class 3               ecigmo_dich2 1.550 [1.146, 2.096]
## 57     1c Class 2 vs. Class 3               smokmo_dich2 1.227 [0.900, 1.672]
## 58     1c Class 2 vs. Class 3              cigarmo_dich2 2.478 [1.835, 3.348]
## 59     1d Class 1 vs. Class 3                (Intercept) 0.336 [0.282, 0.401]
## 60     1d Class 1 vs. Class 3                     age21+ 1.016 [0.866, 1.192]
## 61     1d Class 1 vs. Class 3                 genderMale 1.179 [1.000, 1.389]
## 62     1d Class 1 vs. Class 3                genderOther 0.766 [0.554, 1.060]
## 63     1d Class 1 vs. Class 3 raceAfrican American/Black 0.537 [0.374, 0.771]
## 64     1d Class 1 vs. Class 3                  raceAsian 0.416 [0.308, 0.562]
## 65     1d Class 1 vs. Class 3            raceMultiracial 0.906 [0.648, 1.266]
## 66     1d Class 1 vs. Class 3                  raceOther 0.564 [0.356, 0.892]
## 67     1d Class 1 vs. Class 3   ethnicityHispanic/Latino 0.914 [0.729, 1.145]
## 68     1d Class 1 vs. Class 3     studentstatusPart Time 1.180 [0.830, 1.678]
## 69     1d Class 1 vs. Class 3         residenceOn Campus 1.129 [0.966, 1.319]
## 70     1d Class 1 vs. Class 3              greekmemGreek 1.136 [0.909, 1.420]
## 71     1d Class 1 vs. Class 3                alcmo_dich2 1.141 [0.944, 1.379]
## 72     1d Class 1 vs. Class 3                marmo_dich2 1.004 [0.833, 1.209]
## 73     1d Class 1 vs. Class 3               ecigmo_dich2 1.300 [1.063, 1.590]
## 74     1d Class 1 vs. Class 3               smokmo_dich2 1.051 [0.842, 1.312]
## 75     1d Class 1 vs. Class 3              cigarmo_dich2 1.395 [1.090, 1.785]
## 76     1d Class 1 vs. Class 3               rxstmo_dich2 1.476 [0.964, 2.259]
## 77     1d Class 1 vs. Class 3               rxpkmo_dich2 1.546 [0.912, 2.623]
## 78     1d Class 1 vs. Class 3              rxsedmo_dich2 0.636 [0.339, 1.193]
## 79     1d Class 2 vs. Class 3                (Intercept) 0.047 [0.034, 0.064]
## 80     1d Class 2 vs. Class 3                     age21+ 1.104 [0.867, 1.405]
## 81     1d Class 2 vs. Class 3                 genderMale 4.002 [3.166, 5.059]
## 82     1d Class 2 vs. Class 3                genderOther 0.395 [0.170, 0.916]
## 83     1d Class 2 vs. Class 3 raceAfrican American/Black 0.825 [0.500, 1.362]
## 84     1d Class 2 vs. Class 3                  raceAsian 0.338 [0.204, 0.559]
## 85     1d Class 2 vs. Class 3            raceMultiracial 0.531 [0.277, 1.019]
## 86     1d Class 2 vs. Class 3                  raceOther 0.623 [0.301, 1.287]
## 87     1d Class 2 vs. Class 3   ethnicityHispanic/Latino 0.724 [0.493, 1.064]
## 88     1d Class 2 vs. Class 3     studentstatusPart Time 1.004 [0.570, 1.769]
## 89     1d Class 2 vs. Class 3         residenceOn Campus 1.196 [0.937, 1.526]
## 90     1d Class 2 vs. Class 3              greekmemGreek 1.418 [1.043, 1.928]
## 91     1d Class 2 vs. Class 3                alcmo_dich2 1.246 [0.905, 1.717]
## 92     1d Class 2 vs. Class 3                marmo_dich2 1.193 [0.900, 1.581]
## 93     1d Class 2 vs. Class 3               ecigmo_dich2 1.533 [1.132, 2.075]
## 94     1d Class 2 vs. Class 3               smokmo_dich2 1.197 [0.876, 1.636]
## 95     1d Class 2 vs. Class 3              cigarmo_dich2 2.425 [1.791, 3.282]
## 96     1d Class 2 vs. Class 3               rxstmo_dich2 1.812 [1.082, 3.036]
## 97     1d Class 2 vs. Class 3               rxpkmo_dich2 1.401 [0.687, 2.857]
## 98     1d Class 2 vs. Class 3              rxsedmo_dich2 0.550 [0.239, 1.263]
## 99     2b Class 1 vs. Class 3                (Intercept) 0.184 [0.141, 0.238]
## 100    2b Class 1 vs. Class 3                     age21+ 0.631 [0.483, 0.824]
## 101    2b Class 1 vs. Class 3                 genderMale 2.554 [1.964, 3.321]
## 102    2b Class 1 vs. Class 3                genderOther 4.827 [2.920, 7.979]
## 103    2b Class 1 vs. Class 3 raceAfrican American/Black 2.235 [1.257, 3.973]
## 104    2b Class 1 vs. Class 3                  raceAsian 3.732 [2.387, 5.837]
## 105    2b Class 1 vs. Class 3            raceMultiracial 1.436 [0.814, 2.532]
## 106    2b Class 1 vs. Class 3                  raceOther 2.342 [1.119, 4.904]
## 107    2b Class 1 vs. Class 3   ethnicityHispanic/Latino 1.370 [0.920, 2.042]
## 108    2b Class 1 vs. Class 3     studentstatusPart Time 1.233 [0.674, 2.255]
## 109    2b Class 1 vs. Class 3         residenceOn Campus 1.155 [0.880, 1.515]
## 110    2b Class 1 vs. Class 3              greekmemGreek 0.782 [0.519, 1.180]
## 111    2b Class 2 vs. Class 3                (Intercept) 0.085 [0.062, 0.117]
## 112    2b Class 2 vs. Class 3                     age21+ 1.235 [0.937, 1.629]
## 113    2b Class 2 vs. Class 3                 genderMale 6.382 [4.824, 8.444]
## 114    2b Class 2 vs. Class 3                genderOther 1.999 [0.900, 4.440]
## 115    2b Class 2 vs. Class 3 raceAfrican American/Black 1.980 [1.069, 3.666]
## 116    2b Class 2 vs. Class 3                  raceAsian 1.283 [0.717, 2.295]
## 117    2b Class 2 vs. Class 3            raceMultiracial 0.566 [0.256, 1.254]
## 118    2b Class 2 vs. Class 3                  raceOther 1.086 [0.401, 2.941]
## 119    2b Class 2 vs. Class 3   ethnicityHispanic/Latino 0.979 [0.619, 1.549]
## 120    2b Class 2 vs. Class 3     studentstatusPart Time 0.771 [0.378, 1.574]
## 121    2b Class 2 vs. Class 3         residenceOn Campus 1.182 [0.882, 1.584]
## 122    2b Class 2 vs. Class 3              greekmemGreek 1.657 [1.167, 2.353]
## 123    2c Class 1 vs. Class 3                (Intercept) 0.212 [0.153, 0.292]
## 124    2c Class 1 vs. Class 3                     age21+ 0.710 [0.533, 0.946]
## 125    2c Class 1 vs. Class 3                 genderMale 2.677 [2.037, 3.517]
## 126    2c Class 1 vs. Class 3                genderOther 4.894 [2.942, 8.140]
## 127    2c Class 1 vs. Class 3 raceAfrican American/Black 2.049 [1.148, 3.657]
## 128    2c Class 1 vs. Class 3                  raceAsian 3.308 [2.096, 5.223]
## 129    2c Class 1 vs. Class 3            raceMultiracial 1.419 [0.802, 2.509]
## 130    2c Class 1 vs. Class 3                  raceOther 2.439 [1.156, 5.148]
## 131    2c Class 1 vs. Class 3   ethnicityHispanic/Latino 1.314 [0.878, 1.966]
## 132    2c Class 1 vs. Class 3     studentstatusPart Time 1.261 [0.690, 2.305]
## 133    2c Class 1 vs. Class 3         residenceOn Campus 1.159 [0.882, 1.524]
## 134    2c Class 1 vs. Class 3              greekmemGreek 0.893 [0.588, 1.356]
## 135    2c Class 1 vs. Class 3                alcmo_dich2 0.882 [0.632, 1.230]
## 136    2c Class 1 vs. Class 3                marmo_dich2 0.932 [0.669, 1.300]
## 137    2c Class 1 vs. Class 3               ecigmo_dich2 1.054 [0.733, 1.515]
## 138    2c Class 1 vs. Class 3               smokmo_dich2 0.763 [0.508, 1.145]
## 139    2c Class 1 vs. Class 3              cigarmo_dich2 0.691 [0.446, 1.069]
## 140    2c Class 2 vs. Class 3                (Intercept) 0.078 [0.052, 0.117]
## 141    2c Class 2 vs. Class 3                     age21+ 1.084 [0.804, 1.462]
## 142    2c Class 2 vs. Class 3                 genderMale 5.630 [4.186, 7.573]
## 143    2c Class 2 vs. Class 3                genderOther 1.936 [0.865, 4.333]
## 144    2c Class 2 vs. Class 3 raceAfrican American/Black 2.248 [1.199, 4.214]
## 145    2c Class 2 vs. Class 3                  raceAsian 1.629 [0.896, 2.961]
## 146    2c Class 2 vs. Class 3            raceMultiracial 0.579 [0.260, 1.290]
## 147    2c Class 2 vs. Class 3                  raceOther 1.007 [0.369, 2.750]
## 148    2c Class 2 vs. Class 3   ethnicityHispanic/Latino 1.018 [0.639, 1.621]
## 149    2c Class 2 vs. Class 3     studentstatusPart Time 0.784 [0.380, 1.619]
## 150    2c Class 2 vs. Class 3         residenceOn Campus 1.099 [0.814, 1.484]
## 151    2c Class 2 vs. Class 3              greekmemGreek 1.368 [0.946, 1.978]
## 152    2c Class 2 vs. Class 3                alcmo_dich2 0.838 [0.558, 1.260]
## 153    2c Class 2 vs. Class 3                marmo_dich2 1.076 [0.761, 1.520]
## 154    2c Class 2 vs. Class 3               ecigmo_dich2 1.520 [1.045, 2.210]
## 155    2c Class 2 vs. Class 3               smokmo_dich2 1.053 [0.723, 1.535]
## 156    2c Class 2 vs. Class 3              cigarmo_dich2 1.799 [1.258, 2.574]
## 157    2d Class 1 vs. Class 3                (Intercept) 0.212 [0.154, 0.293]
## 158    2d Class 1 vs. Class 3                     age21+ 0.713 [0.535, 0.951]
## 159    2d Class 1 vs. Class 3                 genderMale 2.673 [2.034, 3.512]
## 160    2d Class 1 vs. Class 3                genderOther 4.814 [2.895, 8.005]
## 161    2d Class 1 vs. Class 3 raceAfrican American/Black 2.038 [1.142, 3.638]
## 162    2d Class 1 vs. Class 3                  raceAsian 3.282 [2.071, 5.199]
## 163    2d Class 1 vs. Class 3            raceMultiracial 1.391 [0.786, 2.460]
## 164    2d Class 1 vs. Class 3                  raceOther 2.405 [1.140, 5.070]
## 165    2d Class 1 vs. Class 3   ethnicityHispanic/Latino 1.316 [0.879, 1.970]
## 166    2d Class 1 vs. Class 3     studentstatusPart Time 1.238 [0.677, 2.263]
## 167    2d Class 1 vs. Class 3         residenceOn Campus 1.153 [0.877, 1.516]
## 168    2d Class 1 vs. Class 3              greekmemGreek 0.906 [0.596, 1.378]
## 169    2d Class 1 vs. Class 3                alcmo_dich2 0.879 [0.629, 1.226]
## 170    2d Class 1 vs. Class 3                marmo_dich2 0.952 [0.681, 1.330]
## 171    2d Class 1 vs. Class 3               ecigmo_dich2 1.050 [0.730, 1.511]
## 172    2d Class 1 vs. Class 3               smokmo_dich2 0.758 [0.504, 1.141]
## 173    2d Class 1 vs. Class 3              cigarmo_dich2 0.706 [0.456, 1.093]
## 174    2d Class 1 vs. Class 3               rxstmo_dich2 0.569 [0.239, 1.354]
## 175    2d Class 1 vs. Class 3               rxpkmo_dich2 1.084 [0.465, 2.531]
## 176    2d Class 1 vs. Class 3              rxsedmo_dich2 2.015 [0.681, 5.963]
## 177    2d Class 2 vs. Class 3                (Intercept) 0.078 [0.052, 0.117]
## 178    2d Class 2 vs. Class 3                     age21+ 1.084 [0.803, 1.462]
## 179    2d Class 2 vs. Class 3                 genderMale 5.598 [4.160, 7.533]
## 180    2d Class 2 vs. Class 3                genderOther 1.948 [0.868, 4.368]
## 181    2d Class 2 vs. Class 3 raceAfrican American/Black 2.254 [1.203, 4.222]
## 182    2d Class 2 vs. Class 3                  raceAsian 1.611 [0.886, 2.928]
## 183    2d Class 2 vs. Class 3            raceMultiracial 0.581 [0.260, 1.295]
## 184    2d Class 2 vs. Class 3                  raceOther 1.017 [0.372, 2.775]
## 185    2d Class 2 vs. Class 3   ethnicityHispanic/Latino 1.008 [0.631, 1.608]
## 186    2d Class 2 vs. Class 3     studentstatusPart Time 0.796 [0.385, 1.644]
## 187    2d Class 2 vs. Class 3         residenceOn Campus 1.096 [0.812, 1.480]
## 188    2d Class 2 vs. Class 3              greekmemGreek 1.359 [0.938, 1.969]
## 189    2d Class 2 vs. Class 3                alcmo_dich2 0.839 [0.558, 1.261]
## 190    2d Class 2 vs. Class 3                marmo_dich2 1.070 [0.755, 1.517]
## 191    2d Class 2 vs. Class 3               ecigmo_dich2 1.512 [1.040, 2.200]
## 192    2d Class 2 vs. Class 3               smokmo_dich2 1.049 [0.718, 1.534]
## 193    2d Class 2 vs. Class 3              cigarmo_dich2 1.797 [1.254, 2.576]
## 194    2d Class 2 vs. Class 3               rxstmo_dich2 1.046 [0.580, 1.887]
## 195    2d Class 2 vs. Class 3               rxpkmo_dich2 1.265 [0.575, 2.782]
## 196    2d Class 2 vs. Class 3              rxsedmo_dich2 0.744 [0.267, 2.071]
##     p.value sig   fmi McFadden Nagelkerke
## 1    0.0000 *** 0.004    0.050      0.101
## 2    0.0799   . 0.001    0.050      0.101
## 3    0.0184   * 0.004    0.050      0.101
## 4    0.1279     0.006    0.050      0.101
## 5    0.0001 *** 0.007    0.050      0.101
## 6    0.0000 *** 0.012    0.050      0.101
## 7    0.5221     0.005    0.050      0.101
## 8    0.0087  ** 0.009    0.050      0.101
## 9    0.4393     0.028    0.050      0.101
## 10   0.3986     0.003    0.050      0.101
## 11   0.0962   . 0.002    0.050      0.101
## 12   0.0401   * 0.002    0.050      0.101
## 13   0.0000 *** 0.002    0.050      0.101
## 14   0.0004 *** 0.001    0.050      0.101
## 15   0.0000 *** 0.002    0.050      0.101
## 16   0.0423   * 0.001    0.050      0.101
## 17   0.1163     0.006    0.050      0.101
## 18   0.0000 *** 0.008    0.050      0.101
## 19   0.0325   * 0.003    0.050      0.101
## 20   0.1380     0.006    0.050      0.101
## 21   0.0729   . 0.068    0.050      0.101
## 22   0.8579     0.008    0.050      0.101
## 23   0.0623   . 0.001    0.050      0.101
## 24   0.0000 *** 0.001    0.050      0.101
## 25   0.0000 *** 0.005    0.070      0.141
## 26   0.8055     0.001    0.070      0.141
## 27   0.0450   * 0.005    0.070      0.141
## 28   0.1191     0.007    0.070      0.141
## 29   0.0006 *** 0.008    0.070      0.141
## 30   0.0000 *** 0.013    0.070      0.141
## 31   0.5374     0.005    0.070      0.141
## 32   0.0117   * 0.009    0.070      0.141
## 33   0.4822     0.024    0.070      0.141
## 34   0.4127     0.003    0.070      0.141
## 35   0.1263     0.002    0.070      0.141
## 36   0.2334     0.002    0.070      0.141
## 37   0.1683     0.007    0.070      0.141
## 38   0.8161     0.003    0.070      0.141
## 39   0.0088  ** 0.004    0.070      0.141
## 40   0.5540     0.002    0.070      0.141
## 41   0.0050  ** 0.003    0.070      0.141
## 42   0.0000 *** 0.004    0.070      0.141
## 43   0.3702     0.001    0.070      0.141
## 44   0.0000 *** 0.003    0.070      0.141
## 45   0.0328   * 0.001    0.070      0.141
## 46   0.4170     0.006    0.070      0.141
## 47   0.0000 *** 0.008    0.070      0.141
## 48   0.0514   . 0.003    0.070      0.141
## 49   0.1610     0.006    0.070      0.141
## 50   0.1086     0.061    0.070      0.141
## 51   0.9149     0.009    0.070      0.141
## 52   0.1517     0.002    0.070      0.141
## 53   0.0164   * 0.001    0.070      0.141
## 54   0.1934     0.006    0.070      0.141
## 55   0.1387     0.002    0.070      0.141
## 56   0.0045  ** 0.001    0.070      0.141
## 57   0.1956     0.002    0.070      0.141
## 58   0.0000 *** 0.002    0.070      0.141
## 59   0.0000 *** 0.005    0.072      0.144
## 60   0.8492     0.001    0.072      0.144
## 61   0.0495   * 0.004    0.072      0.144
## 62   0.1074     0.007    0.072      0.144
## 63   0.0008 *** 0.008    0.072      0.144
## 64   0.0000 *** 0.013    0.072      0.144
## 65   0.5635     0.005    0.072      0.144
## 66   0.0144   * 0.009    0.072      0.144
## 67   0.4334     0.024    0.072      0.144
## 68   0.3572     0.003    0.072      0.144
## 69   0.1266     0.002    0.072      0.144
## 70   0.2615     0.002    0.072      0.144
## 71   0.1714     0.007    0.072      0.144
## 72   0.9699     0.003    0.072      0.144
## 73   0.0106   * 0.004    0.072      0.144
## 74   0.6592     0.002    0.072      0.144
## 75   0.0082  ** 0.004    0.072      0.144
## 76   0.0730   . 0.002    0.072      0.144
## 77   0.1059     0.001    0.072      0.144
## 78   0.1585     0.001    0.072      0.144
## 79   0.0000 *** 0.004    0.072      0.144
## 80   0.4244     0.001    0.072      0.144
## 81   0.0000 *** 0.003    0.072      0.144
## 82   0.0306   * 0.001    0.072      0.144
## 83   0.4517     0.006    0.072      0.144
## 84   0.0000 *** 0.008    0.072      0.144
## 85   0.0569   . 0.003    0.072      0.144
## 86   0.2012     0.006    0.072      0.144
## 87   0.1004     0.063    0.072      0.144
## 88   0.9882     0.010    0.072      0.144
## 89   0.1515     0.002    0.072      0.144
## 90   0.0258   * 0.001    0.072      0.144
## 91   0.1777     0.006    0.072      0.144
## 92   0.2199     0.001    0.072      0.144
## 93   0.0058  ** 0.001    0.072      0.144
## 94   0.2599     0.002    0.072      0.144
## 95   0.0000 *** 0.002    0.072      0.144
## 96   0.0240   * 0.004    0.072      0.144
## 97   0.3541     0.009    0.072      0.144
## 98   0.1585     0.002    0.072      0.144
## 99   0.0000 *** 0.004    0.097      0.195
## 100  0.0008 *** 0.001    0.097      0.195
## 101  0.0000 *** 0.006    0.097      0.195
## 102  0.0000 *** 0.003    0.097      0.195
## 103  0.0062  ** 0.006    0.097      0.195
## 104  0.0000 *** 0.007    0.097      0.195
## 105  0.2116     0.004    0.097      0.195
## 106  0.0241   * 0.011    0.097      0.195
## 107  0.1216     0.066    0.097      0.195
## 108  0.4960     0.001    0.097      0.195
## 109  0.2998     0.003    0.097      0.195
## 110  0.2420     0.003    0.097      0.195
## 111  0.0000 *** 0.003    0.097      0.195
## 112  0.1343     0.001    0.097      0.195
## 113  0.0000 *** 0.001    0.097      0.195
## 114  0.0889   . 0.001    0.097      0.195
## 115  0.0299   * 0.004    0.097      0.195
## 116  0.4016     0.009    0.097      0.195
## 117  0.1613     0.002    0.097      0.195
## 118  0.8706     0.005    0.097      0.195
## 119  0.9291     0.072    0.097      0.195
## 120  0.4750     0.006    0.097      0.195
## 121  0.2622     0.002    0.097      0.195
## 122  0.0048  ** 0.001    0.097      0.195
## 123  0.0000 *** 0.006    0.115      0.227
## 124  0.0194   * 0.003    0.115      0.227
## 125  0.0000 *** 0.008    0.115      0.227
## 126  0.0000 *** 0.004    0.115      0.227
## 127  0.0153   * 0.007    0.115      0.227
## 128  0.0000 *** 0.007    0.115      0.227
## 129  0.2292     0.004    0.115      0.227
## 130  0.0194   * 0.011    0.115      0.227
## 131  0.1845     0.067    0.115      0.227
## 132  0.4504     0.001    0.115      0.227
## 133  0.2886     0.003    0.115      0.227
## 134  0.5952     0.003    0.115      0.227
## 135  0.4581     0.011    0.115      0.227
## 136  0.6801     0.003    0.115      0.227
## 137  0.7761     0.010    0.115      0.227
## 138  0.1911     0.003    0.115      0.227
## 139  0.0970   . 0.006    0.115      0.227
## 140  0.0000 *** 0.007    0.115      0.227
## 141  0.5964     0.002    0.115      0.227
## 142  0.0000 *** 0.002    0.115      0.227
## 143  0.1083     0.001    0.115      0.227
## 144  0.0116   * 0.004    0.115      0.227
## 145  0.1098     0.010    0.115      0.227
## 146  0.1814     0.002    0.115      0.227
## 147  0.9890     0.006    0.115      0.227
## 148  0.9409     0.078    0.115      0.227
## 149  0.5110     0.006    0.115      0.227
## 150  0.5363     0.002    0.115      0.227
## 151  0.0963   . 0.002    0.115      0.227
## 152  0.3961     0.007    0.115      0.227
## 153  0.6791     0.002    0.115      0.227
## 154  0.0286   * 0.003    0.115      0.227
## 155  0.7875     0.002    0.115      0.227
## 156  0.0013  ** 0.003    0.115      0.227
## 157  0.0000 *** 0.006    0.116      0.229
## 158  0.0213   * 0.003    0.116      0.229
## 159  0.0000 *** 0.008    0.116      0.229
## 160  0.0000 *** 0.004    0.116      0.229
## 161  0.0161   * 0.007    0.116      0.229
## 162  0.0000 *** 0.008    0.116      0.229
## 163  0.2576     0.004    0.116      0.229
## 164  0.0213   * 0.011    0.116      0.229
## 165  0.1827     0.067    0.116      0.229
## 166  0.4878     0.001    0.116      0.229
## 167  0.3066     0.003    0.116      0.229
## 168  0.6459     0.003    0.116      0.229
## 169  0.4464     0.011    0.116      0.229
## 170  0.7718     0.003    0.116      0.229
## 171  0.7912     0.010    0.116      0.229
## 172  0.1845     0.003    0.116      0.229
## 173  0.1186     0.006    0.116      0.229
## 174  0.2023     0.002    0.116      0.229
## 175  0.8512     0.007    0.116      0.229
## 176  0.2056     0.002    0.116      0.229
## 177  0.0000 *** 0.006    0.116      0.229
## 178  0.5990     0.002    0.116      0.229
## 179  0.0000 *** 0.002    0.116      0.229
## 180  0.1060     0.001    0.116      0.229
## 181  0.0112   * 0.004    0.116      0.229
## 182  0.1184     0.010    0.116      0.229
## 183  0.1843     0.003    0.116      0.229
## 184  0.9743     0.006    0.116      0.229
## 185  0.9746     0.080    0.116      0.229
## 186  0.5371     0.006    0.116      0.229
## 187  0.5503     0.002    0.116      0.229
## 188  0.1053     0.001    0.116      0.229
## 189  0.3980     0.007    0.116      0.229
## 190  0.7031     0.002    0.116      0.229
## 191  0.0307   * 0.003    0.116      0.229
## 192  0.8047     0.003    0.116      0.229
## 193  0.0014  ** 0.003    0.116      0.229
## 194  0.8815     0.005    0.116      0.229
## 195  0.5596     0.036    0.116      0.229
## 196  0.5712     0.007    0.116      0.229