update project design

This commit is contained in:
2026-06-03 22:06:23 -08:00
parent 49409a7d1b
commit 73e5d46c30
27 changed files with 490 additions and 8513 deletions
@@ -0,0 +1,98 @@
suppressPackageStartupMessages({
library(dplyr)
library(tidyr)
})
# estimate_naive_vasopressor_mortality_effect() computes the first simple
# mortality comparison for the early vasopressor teaching example.
#
# This function deliberately does NOT adjust for confounding.
# It only compares observed 28-day mortality between eligible patients who did
# and did not receive early vasopressors.
#
# Arguments:
# - icu_data: a data frame or tibble with the columns created by
# simulate_icu_cohort().
#
# Returns:
# - A named list with four pieces:
# - eligible_icu_patients: only the target-trial eligible patients.
# - mortality_risks_by_early_vasopressor: observed 28-day mortality risk in
# each treatment group.
# - mortality_effect_estimates: naive risk difference and risk ratio.
# - baseline_characteristics_by_early_vasopressor: compact baseline means by
# observed treatment group.
#
# Example REPL use:
#
# source("R/simulate_icu_cohort.R")
# icu_data <- simulate_icu_cohort(n_patients = 1000, seed = 20260531)
# mortality_analysis <- estimate_naive_vasopressor_mortality_effect(icu_data)
# mortality_analysis$mortality_effect_estimates
#
estimate_naive_vasopressor_mortality_effect <- function(icu_data) {
eligible_icu_patients <- icu_data |>
filter(eligible == 1)
mortality_risks_by_early_vasopressor <- eligible_icu_patients |>
group_by(early_vasopressor) |>
summarize(
patient_count = n(),
mortality_risk_28d = mean(death_28d),
.groups = "drop"
) |>
mutate(
observed_treatment_group = factor(
early_vasopressor,
levels = c(0, 1),
labels = c("No early vasopressor", "Early vasopressor")
)
) |>
select(observed_treatment_group, patient_count, mortality_risk_28d)
mortality_risk_early_vasopressor <- mortality_risks_by_early_vasopressor |>
filter(observed_treatment_group == "Early vasopressor") |>
pull(mortality_risk_28d)
mortality_risk_no_early_vasopressor <- mortality_risks_by_early_vasopressor |>
filter(observed_treatment_group == "No early vasopressor") |>
pull(mortality_risk_28d)
mortality_effect_estimates <- tibble(
estimate = c(
"Eligible patients",
"Early vasopressor patients",
"No early vasopressor patients",
"28-day mortality risk, early vasopressor",
"28-day mortality risk, no early vasopressor",
"Naive risk difference",
"Naive risk ratio"
),
value = c(
nrow(eligible_icu_patients),
sum(eligible_icu_patients$early_vasopressor == 1),
sum(eligible_icu_patients$early_vasopressor == 0),
mortality_risk_early_vasopressor,
mortality_risk_no_early_vasopressor,
mortality_risk_early_vasopressor - mortality_risk_no_early_vasopressor,
mortality_risk_early_vasopressor / mortality_risk_no_early_vasopressor
)
)
baseline_characteristics_by_early_vasopressor <- eligible_icu_patients |>
group_by(early_vasopressor) |>
summarize(
mean_age = mean(age),
mean_sofa_score = mean(sofa_score),
mean_lactate = mean(lactate),
mean_map = mean(map),
.groups = "drop"
)
list(
eligible_icu_patients = eligible_icu_patients,
mortality_risks_by_early_vasopressor = mortality_risks_by_early_vasopressor,
mortality_effect_estimates = mortality_effect_estimates,
baseline_characteristics_by_early_vasopressor = baseline_characteristics_by_early_vasopressor
)
}