Three Age-Group Analysis
Library and Data
library(survival)
library(tidyverse)
library(penalized)
library(kableExtra)
library(stringr)
library(patchwork)
source("../R/utils.R")
library(readxl)
raw_data <- read_excel("../data/Aim3-early-adversity-subjects-F-survival-2021-01-07.xlsx")Raw data here refers to the larger dataset.
EDA
Below is the Kaplan-Meier estimation of the survival function on the raw data.
km <- survfit(Surv(raw_data$age, raw_data$dead) ~ 1, conf.type = "log-log")
ggplot() +
geom_line(aes(x = km$time, y = km$surv)) +
geom_vline(aes(xintercept = 1), color = "red", linetype = "dashed") +
geom_vline(aes(xintercept = 5), color = "red", linetype = "dashed") +
labs(x = expression("Time (year)"), y = expression("Survival"),
title = "Kaplan-Meier estimate") +
scale_x_continuous(breaks = seq(0, 25, 1)) +
theme_classic()Analysis Process
We conduct four models on three datasets derived from the raw data.
Four models:
- Cox model of survival data versus all the main effects (six adversities)
- Cox model of survival data versus main effects and interaction terms selected by lasso
- Cox model of survival data versus main effects and interaction terms selected by stepwise BIC
- Cox model of survival data versus
adv_mom, sum of other adversitiesadv_other_cumulativeand their interaction term
Three datasets:
age_below_1: Include all the samples. For those whoseage> 1, useage= 1, anddead= FALSEage_above_1_below_5: Include samples ofage> 1. For those whoseage> 5, useage= 5, anddead= FALSEage_above_5: Include samples ofage> 5.
Note that for the age_below_1 dataset, we exclude adv_sib from all models.
age_below_1 <- raw_data %>%
select(starts_with("adv_"), age, dead, -adv_cumulative) %>%
mutate(dead = if_else(age > 1, FALSE, dead)) %>%
mutate(age = if_else(age > 1, 1, age))
age_above_1_below_5 <- raw_data %>%
filter(age >= 1) %>%
select(starts_with("adv_"), age, dead, -adv_cumulative) %>%
mutate(dead = if_else(age > 5, FALSE, dead)) %>%
mutate(age = if_else(age > 5, 5, age))
age_above_5 <- raw_data %>%
filter(age >= 5) %>%
select(starts_with("adv_"), age, dead, -adv_cumulative)Below is the summary of three datasets. The number of events refers to the number of uncensored death.
data.frame(
nobs = c(nrow(age_below_1), nrow(age_above_1_below_5), nrow(age_above_5)),
nevt = c(sum(age_below_1$dead), sum(age_above_1_below_5$dead), sum(age_above_5$dead))
) %>%
`row.names<-`(c("Age 1-", "Age 1+, 5-", "Age 5+")) %>%
kable(row.names = TRUE,
col.names = c("Number of Samples", "Number of Events")) %>%
kable_styling(full_width = FALSE, position = "center", font_size = 18)| Number of Samples | Number of Events | |
|---|---|---|
| Age 1- | 562 | 120 |
| Age 1+, 5- | 440 | 92 |
| Age 5+ | 277 | 110 |
Cox Model - Main Effects
run_full_model <- function(data, below_one = FALSE) {
varnames = names(data)[startsWith(names(data), "adv_")]
if (below_one) {
varnames = varnames[varnames != "adv_sib"]
}
full_formula = paste("Surv(age, dead) ~", paste0(varnames, collapse = "+ "))
full_model = coxph(
as.formula(full_formula),
data = data
)
return (full_model)
}Age below 1
full_age_below_1 <- run_full_model(age_below_1, below_one = TRUE)
summary(full_age_below_1)## Call:
## coxph(formula = as.formula(full_formula), data = data)
##
## n= 562, number of events= 120
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_densityTRUE -0.4879 0.6139 0.2529 -1.929 0.0537 .
## adv_rainTRUE -0.2429 0.7844 0.3179 -0.764 0.4449
## adv_momTRUE 0.4337 1.5429 0.1946 2.229 0.0258 *
## adv_mom_rankTRUE 0.1504 1.1624 0.2084 0.722 0.4704
## adv_mom_dsiTRUE -0.1680 0.8453 0.2214 -0.759 0.4480
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_densityTRUE 0.6139 1.6289 0.3740 1.008
## adv_rainTRUE 0.7844 1.2749 0.4206 1.463
## adv_momTRUE 1.5429 0.6481 1.0538 2.259
## adv_mom_rankTRUE 1.1624 0.8603 0.7726 1.749
## adv_mom_dsiTRUE 0.8453 1.1829 0.5477 1.305
##
## Concordance= 0.575 (se = 0.025 )
## Likelihood ratio test= 11.53 on 5 df, p=0.04
## Wald test = 11.23 on 5 df, p=0.05
## Score (logrank) test = 11.43 on 5 df, p=0.04
Age above 1 and below 5
full_age_above_1_below_5 <- run_full_model(age_above_1_below_5)
summary(full_age_above_1_below_5)## Call:
## coxph(formula = as.formula(full_formula), data = data)
##
## n= 440, number of events= 92
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_densityTRUE 0.04178 1.04266 0.24461 0.171 0.864388
## adv_rainTRUE -0.36927 0.69124 0.33866 -1.090 0.275537
## adv_momTRUE 0.78781 2.19858 0.21648 3.639 0.000274 ***
## adv_sibTRUE -0.08060 0.92256 0.27909 -0.289 0.772730
## adv_mom_rankTRUE 0.22330 1.25020 0.24313 0.918 0.358394
## adv_mom_dsiTRUE -0.61402 0.54117 0.27299 -2.249 0.024497 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_densityTRUE 1.0427 0.9591 0.6455 1.6841
## adv_rainTRUE 0.6912 1.4467 0.3559 1.3424
## adv_momTRUE 2.1986 0.4548 1.4384 3.3606
## adv_sibTRUE 0.9226 1.0839 0.5339 1.5943
## adv_mom_rankTRUE 1.2502 0.7999 0.7763 2.0134
## adv_mom_dsiTRUE 0.5412 1.8478 0.3169 0.9241
##
## Concordance= 0.619 (se = 0.029 )
## Likelihood ratio test= 18.38 on 6 df, p=0.005
## Wald test = 18.7 on 6 df, p=0.005
## Score (logrank) test = 19.48 on 6 df, p=0.003
Age above 5
full_age_above_5 <- run_full_model(age_above_5)
summary(full_age_above_5)## Call:
## coxph(formula = as.formula(full_formula), data = data)
##
## n= 277, number of events= 110
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_densityTRUE 0.1406 1.1510 0.2672 0.526 0.59864
## adv_rainTRUE -0.2902 0.7481 0.3099 -0.936 0.34903
## adv_momTRUE 0.7398 2.0956 0.2257 3.278 0.00105 **
## adv_sibTRUE 0.2405 1.2719 0.2469 0.974 0.33003
## adv_mom_rankTRUE 0.2448 1.2773 0.2402 1.019 0.30822
## adv_mom_dsiTRUE -0.2983 0.7421 0.2320 -1.286 0.19852
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_densityTRUE 1.1510 0.8688 0.6818 1.943
## adv_rainTRUE 0.7481 1.3367 0.4075 1.373
## adv_momTRUE 2.0956 0.4772 1.3464 3.262
## adv_sibTRUE 1.2719 0.7862 0.7839 2.064
## adv_mom_rankTRUE 1.2773 0.7829 0.7977 2.045
## adv_mom_dsiTRUE 0.7421 1.3476 0.4709 1.169
##
## Concordance= 0.616 (se = 0.035 )
## Likelihood ratio test= 13.93 on 6 df, p=0.03
## Wald test = 14.83 on 6 df, p=0.02
## Score (logrank) test = 15.31 on 6 df, p=0.02
Cox Model - Lasso
get_penalized_covariates <- function(data, below_one=FALSE) {
data = select(data, starts_with("adv_"))
if (below_one) {
data = select(data, -adv_sib)
}
penalized_covariates <- model.matrix(
as.formula("~ . + .:."),
data = data.frame(data)
)
penalized_covariates <- penalized_covariates[, colnames(penalized_covariates) != "(Intercept)"]
return (penalized_covariates)
}
get_opt_lambda_of_lasso <- function(data, penalized_covariates, seed = 42, fold = 5) {
set.seed(seed)
opt <- optL1(
Surv(data$age, data$dead),
penalized = penalized_covariates,
standardize = T,
fold = fold,
trace = F
)
return (opt$lambda)
}
get_nonzero_varnames_of_opt_lasso <- function(data, penalized_covariates, opt_lambda) {
final = penalized(
Surv(data$age, data$dead),
penalized = penalized_covariates,
standardize = T,
lambda1 = opt_lambda,
trace = F
)
return (names(final@penalized)[final@penalized != 0])
}
get_varnames_in_final_model <- function(nonzero_varnames) {
# append main effects select by interaction terms
ans = c()
for (varname in nonzero_varnames) {
if (str_detect(varname, ":")) {
ans = c(ans, str_split(varname, ":")[[1]])
}
ans = c(ans, varname)
}
return (unique(ans))
}
run_cox <- function(data, varnames, penalized_covariates) {
formula = paste("Surv(age, dead) ~", paste0(varnames, collapse = "+ "))
cox <- coxph(
as.formula(formula),
data = data.frame(
cbind(penalized_covariates,
select(data, c("age", "dead"))
))
)
return (cox)
}Age below 5
penalized_below_1 <- get_penalized_covariates(age_below_1, below_one = TRUE)
opt_lambda_below_1 <- get_opt_lambda_of_lasso(
data = age_below_1,
penalized_covariates = penalized_below_1
)
nonzero_vars_below_1 <- get_nonzero_varnames_of_opt_lasso(
data = age_below_1,
penalized_covariates = penalized_below_1,
opt_lambda = opt_lambda_below_1
)
vars_below_1 <- get_varnames_in_final_model(nonzero_vars_below_1)
cox_below_1 <- run_cox(
data = age_below_1,
varnames = vars_below_1,
penalized_covariates = penalized_below_1
)
summary(cox_below_1)## Call:
## coxph(formula = as.formula(formula), data = data.frame(cbind(penalized_covariates,
## select(data, c("age", "dead")))))
##
## n= 562, number of events= 120
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_densityTRUE -0.5308 0.5881 0.2501 -2.123 0.0338 *
## adv_momTRUE 0.4401 1.5528 0.1937 2.272 0.0231 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_densityTRUE 0.5881 1.700 0.3602 0.9601
## adv_momTRUE 1.5528 0.644 1.0623 2.2698
##
## Concordance= 0.565 (se = 0.022 )
## Likelihood ratio test= 9.94 on 2 df, p=0.007
## Wald test = 9.66 on 2 df, p=0.008
## Score (logrank) test = 9.85 on 2 df, p=0.007
Age above 1 and below 5
penalized_above_1_below_5 <- get_penalized_covariates(age_above_1_below_5)
opt_lambda_above_1_below_5 <- get_opt_lambda_of_lasso(
data = age_above_1_below_5,
penalized_covariates = penalized_above_1_below_5
)
nonzero_vars_above_1_below_5 <- get_nonzero_varnames_of_opt_lasso(
data = age_above_1_below_5,
penalized_covariates = penalized_above_1_below_5,
opt_lambda = opt_lambda_above_1_below_5
)
vars_above_1_below_5 <- get_varnames_in_final_model(nonzero_vars_above_1_below_5)
cox_above_1_below_5 <- run_cox(
data = age_above_1_below_5,
varnames = vars_above_1_below_5,
penalized_covariates = penalized_above_1_below_5
)
summary(cox_above_1_below_5)## Call:
## coxph(formula = as.formula(formula), data = data.frame(cbind(penalized_covariates,
## select(data, c("age", "dead")))))
##
## n= 440, number of events= 92
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_momTRUE 0.5600 1.7506 0.2585 2.166 0.0303 *
## adv_mom_dsiTRUE -0.6434 0.5255 0.2743 -2.346 0.0190 *
## adv_mom_rankTRUE -0.1233 0.8840 0.3350 -0.368 0.7128
## adv_momTRUE:adv_mom_rankTRUE 0.8102 2.2484 0.4958 1.634 0.1022
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_momTRUE 1.7506 0.5712 1.0547 2.9058
## adv_mom_dsiTRUE 0.5255 1.9030 0.3070 0.8996
## adv_mom_rankTRUE 0.8840 1.1313 0.4585 1.7044
## adv_momTRUE:adv_mom_rankTRUE 2.2484 0.4448 0.8509 5.9412
##
## Concordance= 0.612 (se = 0.029 )
## Likelihood ratio test= 19.7 on 4 df, p=6e-04
## Wald test = 21.23 on 4 df, p=3e-04
## Score (logrank) test = 22.39 on 4 df, p=2e-04
Age above 5
penalized_above_5 <- get_penalized_covariates(age_above_5)
opt_lambda_above_5 <- get_opt_lambda_of_lasso(
data = age_above_5,
penalized_covariates = penalized_above_5
)
nonzero_vars_above_5 <- get_nonzero_varnames_of_opt_lasso(
data = age_above_5,
penalized_covariates = penalized_above_5,
opt_lambda = opt_lambda_above_5
)
vars_above_5 <- get_varnames_in_final_model(nonzero_vars_above_5)
cox_above_5 <- run_cox(
data = age_above_5,
varnames = vars_above_5,
penalized_covariates = penalized_above_5
)
summary(cox_above_5)## Call:
## coxph(formula = as.formula(formula), data = data.frame(cbind(penalized_covariates,
## select(data, c("age", "dead")))))
##
## n= 277, number of events= 110
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_momTRUE 0.8824 2.4166 0.2720 3.244 0.00118 **
## adv_rainTRUE 0.3574 1.4296 0.3335 1.072 0.28384
## adv_sibTRUE 0.2025 1.2245 0.2935 0.690 0.49020
## adv_momTRUE:adv_rainTRUE -1.8708 0.1540 0.8200 -2.282 0.02251 *
## adv_momTRUE:adv_sibTRUE 0.3785 1.4601 0.5123 0.739 0.45998
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_momTRUE 2.417 0.4138 1.41804 4.1184
## adv_rainTRUE 1.430 0.6995 0.74362 2.7486
## adv_sibTRUE 1.224 0.8167 0.68885 2.1765
## adv_momTRUE:adv_rainTRUE 0.154 6.4938 0.03087 0.7682
## adv_momTRUE:adv_sibTRUE 1.460 0.6849 0.53495 3.9855
##
## Concordance= 0.623 (se = 0.031 )
## Likelihood ratio test= 18.96 on 5 df, p=0.002
## Wald test = 22.11 on 5 df, p=5e-04
## Score (logrank) test = 24.41 on 5 df, p=2e-04
Cox Model - Stepwise BIC
Age below 1
full_bic_below_1 <- coxph(
as.formula(Surv(age, dead) ~ . + .:.),
data = select(age_below_1, -adv_sib)
)
step_bic_below_1 <- step(
full_bic_below_1,
k = log(nrow(age_below_1)),
#scope = list(lower= ~ adv_density + adv_rain + adv_mom + adv_mom_rank +
# adv_mom_dsi),
trace = F
)
summary(step_bic_below_1)## Call: coxph(formula = Surv(age, dead) ~ 1, data = select(age_below_1,
## -adv_sib))
##
## Null model
## log likelihood= -746.0115
## n= 562
Age above 1, below 5
full_bic_above_1_below_5 <- coxph(
as.formula(Surv(age, dead) ~ . + .:.),
data = age_above_1_below_5
)
step_bic_above_1_below_5 <- step(
full_bic_above_1_below_5,
k = log(nrow(age_above_1_below_5)),
#scope = list(lower= ~ adv_density + adv_rain + adv_mom + adv_mom_rank +
# adv_mom_dsi + adv_sib),
trace = F
)
summary(step_bic_above_1_below_5)## Call:
## coxph(formula = Surv(age, dead) ~ adv_mom, data = age_above_1_below_5)
##
## n= 440, number of events= 92
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_momTRUE 0.7654 2.1498 0.2160 3.543 0.000395 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_momTRUE 2.15 0.4652 1.408 3.283
##
## Concordance= 0.579 (se = 0.025 )
## Likelihood ratio test= 11.52 on 1 df, p=7e-04
## Wald test = 12.55 on 1 df, p=4e-04
## Score (logrank) test = 13.18 on 1 df, p=3e-04
Age above 5
full_bic_above_5 <- coxph(
as.formula(Surv(age, dead) ~ . + .:.),
data = age_above_5
)
step_bic_above_5 <- step(
full_bic_above_5,
k = log(nrow(age_above_5)),
#scope = list(lower= ~ adv_density + adv_rain + adv_mom + adv_mom_rank +
# adv_mom_dsi + adv_sib),
trace = F
)
summary(step_bic_above_5)## Call:
## coxph(formula = Surv(age, dead) ~ adv_rain + adv_mom + adv_rain:adv_mom,
## data = age_above_5)
##
## n= 277, number of events= 110
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_rainTRUE 0.3199 1.3769 0.3288 0.973 0.331
## adv_momTRUE 0.9748 2.6507 0.2342 4.162 3.16e-05 ***
## adv_rainTRUE:adv_momTRUE -1.9110 0.1479 0.8144 -2.346 0.019 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_rainTRUE 1.3769 0.7263 0.72289 2.623
## adv_momTRUE 2.6507 0.3773 1.67490 4.195
## adv_rainTRUE:adv_momTRUE 0.1479 6.7596 0.02998 0.730
##
## Concordance= 0.609 (se = 0.027 )
## Likelihood ratio test= 16.76 on 3 df, p=8e-04
## Wald test = 18.74 on 3 df, p=3e-04
## Score (logrank) test = 20.24 on 3 df, p=2e-04
Cox model - Cumulative
run_cox_with_cumulative <- function(data) {
data = data %>%
mutate(adv_other_cumulative = adv_sib+adv_rain+adv_mom_dsi+adv_mom_rank+adv_density) %>%
select(age, dead, adv_mom, adv_other_cumulative)
cox = coxph(
formula = as.formula("Surv(age, dead) ~ . + adv_mom:adv_other_cumulative"),
data = data
)
return (cox)
}Age below 1
cox_below_1 <- run_cox_with_cumulative(age_below_1)
summary(cox_below_1)## Call:
## coxph(formula = as.formula("Surv(age, dead) ~ . + adv_mom:adv_other_cumulative"),
## data = data)
##
## n= 562, number of events= 120
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_momTRUE 0.8931 2.4427 0.3214 2.779 0.00545 **
## adv_other_cumulative 0.4640 1.5904 0.1113 4.168 3.07e-05 ***
## adv_momTRUE:adv_other_cumulative -0.3634 0.6953 0.1971 -1.843 0.06530 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_momTRUE 2.4427 0.4094 1.3011 4.586
## adv_other_cumulative 1.5904 0.6288 1.2786 1.978
## adv_momTRUE:adv_other_cumulative 0.6953 1.4381 0.4725 1.023
##
## Concordance= 0.618 (se = 0.025 )
## Likelihood ratio test= 21.39 on 3 df, p=9e-05
## Wald test = 20.9 on 3 df, p=1e-04
## Score (logrank) test = 21.32 on 3 df, p=9e-05
Age above 1 and below 5
cox_above_1_below_5 <- run_cox_with_cumulative(age_above_1_below_5)
summary(cox_above_1_below_5)## Call:
## coxph(formula = as.formula("Surv(age, dead) ~ . + adv_mom:adv_other_cumulative"),
## data = data)
##
## n= 440, number of events= 92
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_momTRUE 0.70391 2.02164 0.32593 2.160 0.0308 *
## adv_other_cumulative -0.17439 0.83997 0.16013 -1.089 0.2761
## adv_momTRUE:adv_other_cumulative 0.07605 1.07902 0.24430 0.311 0.7556
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_momTRUE 2.022 0.4946 1.0673 3.829
## adv_other_cumulative 0.840 1.1905 0.6137 1.150
## adv_momTRUE:adv_other_cumulative 1.079 0.9268 0.6685 1.742
##
## Concordance= 0.602 (se = 0.031 )
## Likelihood ratio test= 13.04 on 3 df, p=0.005
## Wald test = 13.82 on 3 df, p=0.003
## Score (logrank) test = 14.62 on 3 df, p=0.002
Age above 5
cox_above_5 <- run_cox_with_cumulative(age_above_5)
summary(cox_above_5)## Call:
## coxph(formula = as.formula("Surv(age, dead) ~ . + adv_mom:adv_other_cumulative"),
## data = data)
##
## n= 277, number of events= 110
##
## coef exp(coef) se(coef) z Pr(>|z|)
## adv_momTRUE 0.98709 2.68342 0.35927 2.748 0.006 **
## adv_other_cumulative 0.09773 1.10267 0.14777 0.661 0.508
## adv_momTRUE:adv_other_cumulative -0.29894 0.74161 0.29290 -1.021 0.307
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## adv_momTRUE 2.6834 0.3727 1.3270 5.426
## adv_other_cumulative 1.1027 0.9069 0.8254 1.473
## adv_momTRUE:adv_other_cumulative 0.7416 1.3484 0.4177 1.317
##
## Concordance= 0.592 (se = 0.031 )
## Likelihood ratio test= 9.87 on 3 df, p=0.02
## Wald test = 11.14 on 3 df, p=0.01
## Score (logrank) test = 11.67 on 3 df, p=0.009
Discussion
For the full model with main effects of all six adversities, group
age_below_1andage_above_5behave similarly in terms of the significant variableadv_mom. Groupage_above_1_below_5has one more significant relationship withadv_dsi, and the significance level ofadv_momis much lower, indicating the hazard might work differently within this age range.For the model selected by lasso, the resulting model picks quite a small fraction of variables, with no interaction terms in the
age_below_1group, and one non-significant interaction terms in theage_above_1_below_5group. Interaction termadv_mom:adv_rainis significant in theage_above_5group while the other interaction termadv_mom:adv_sibis picked but not significant.For the model selected by stepwise BIC, no interaction terms are selected in
age_below_1andage_above_1_below_5, which is the same result as in models selected by lasso. Meanwhile,adv_mom:adv_rainis picked and significant inage_above_5.Interestingly, the cumulative model in the “age_below_1” group shows significance for the cumulative variable and the interaction term. There does not seem to be much worth noting in the other two groups.