simulate_one_dataset <- function(N, true_params) {
with(true_params, {
# Exogenous continuous variables
TR <- rnorm(N, mean = 0, sd = 1)
ADT <- rnorm(N, mean = 0, sd = 1)
PEB_yes <- rnorm(N, mean = 0, sd = 1)
# Binary predictors
r1e1 <- rbinom(N, size = 1, prob = 0.5)
r0e2 <- rbinom(N, size = 1, prob = 0.5)
r1e2 <- rbinom(N, size = 1, prob = 0.5)
r0e3 <- rbinom(N, size = 1, prob = 0.5)
r1e3 <- rbinom(N, size = 1, prob = 0.5)
# IM
lin_IM <-
b_r1e1 * r1e1 +
b_r0e2 * r0e2 +
b_r1e2 * r1e2 +
b_r0e3 * r0e3 +
b_r1e3 * r1e3 +
b_TR * TR +
b_ADT * ADT +
b_PEB * PEB_yes
IM <- lin_IM + rnorm(N, mean = 0, sd = 1)
# EEF
lin_EEF <-
c_r1e1 * r1e1 +
c_r0e2 * r0e2 +
c_r1e2 * r1e2 +
c_r0e3 * r0e3 +
c_r1e3 * r1e3 +
c_IM * IM +
c_TR * TR +
c_ADT * ADT +
c_PEB * PEB_yes
# EEC
lin_EEC <-
d_r1e1 * r1e1 +
d_r0e2 * r0e2 +
d_r1e2 * r1e2 +
d_r0e3 * r0e3 +
d_r1e3 * r1e3 +
d_IM * IM +
d_TR * TR +
d_ADT * ADT +
d_PEB * PEB_yes
# Correlated residuals for EEF and EEC
residuals <- MASS::mvrnorm(
n = N,
mu = c(0, 0),
Sigma = matrix(
c(
1, d_EEF_EEC,
d_EEF_EEC, 1
),
nrow = 2,
byrow = TRUE
)
)
# Outcomes
EEF <- lin_EEF + residuals[, 1]
EEC <- lin_EEC + residuals[, 2]
# Return dataset
dat <- data.frame(
r1e1, r0e2, r1e2, r0e3, r1e3,
IM, EEF, EEC, TR, ADT, PEB_yes
)
dat
})
}