Code
library(tidyverse)
library(rstan)
rstan_options(auto_write = TRUE)
options(mc.cores = parallel::detectCores())
set.seed(123)
# Global parameters
G <- 10
mu_t0 <- log(5)
mu_I0 <- log(20)
mu_D0 <- log(15)
sigma_mu_t <- 0.4
sigma_mu_I <- 0.6
sigma_mu_D <- 0.4
sigma_t <- 0.5
phi_I <- 0.3
shape_D <- 4
# Copula correlation matrix
R <- matrix(c(1, 0.4, 0.5, 0.4, 1, 0.6, 0.5, 0.6, 1), 3, 3)
L <- chol(R)
mu_t_g <- rnorm(G, mu_t0, sigma_mu_t)
mu_I_g <- rnorm(G, mu_I0, sigma_mu_I)
mu_D_g <- rnorm(G, mu_D0, sigma_mu_D)
out_list <- vector("list", G)
for (g in seq_len(G)) {
n_g <- rpois(1, 3) + 1
dat <- tibble()
while (nrow(dat) < n_g) {
z <- t(L) %*% rnorm(3)
u <- pnorm(z)
t_pk <- max(1L, round(qlnorm(u[1], mu_t_g[g], sigma_t)))
I_pk <- max(1L, qnbinom(u[2], size = 1/phi_I, mu = exp(mu_I_g[g])))
rate_D <- shape_D / exp(mu_D_g[g])
D <- max(t_pk, round(qgamma(u[3], shape_D, rate_D)))
dat <- bind_rows(dat, tibble(grp = g, t_peak = t_pk, I_peak = I_pk, D = D))
}
out_list[[g]] <- dat
}
df <- bind_rows(out_list) %>% mutate(grp = factor(grp))
glimpse(df)Rows: 40
Columns: 4
$ grp <fct> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, …
$ t_peak <dbl> 2, 6, 1, 2, 4, 4, 4, 4, 10, 5, 6, 12, 11, 2, 4, 3, 4, 4, 7, 6, …
$ I_peak <dbl> 18, 42, 8, 35, 67, 15, 25, 43, 13, 26, 54, 46, 37, 19, 28, 16, …
$ D <dbl> 5, 12, 3, 10, 8, 14, 13, 15, 16, 16, 7, 16, 11, 5, 10, 7, 9, 5,…

