// generated with brms 2.14.0 functions { /* turn a vector into a matrix of defined dimension * stores elements in row major order * Args: * X: a vector * N: first dimension of the desired matrix * K: second dimension of the desired matrix * Returns: * a matrix of dimension N x K */ matrix as_matrix(vector X, int N, int K) { matrix[N, K] Y; for (i in 1:N) { Y[i] = to_row_vector(X[((i - 1) * K + 1):(i * K)]); } return Y; } /* compute correlated group-level effects * Args: * z: matrix of unscaled group-level effects * SD: vector of standard deviation parameters * L: cholesky factor correlation matrix * Returns: * matrix of scaled group-level effects */ matrix scale_r_cor(matrix z, vector SD, matrix L) { // r is stored in another dimension order than z return transpose(diag_pre_multiply(SD, L) * z); } } data { int N; // total number of observations int N_CardiacOutcome; // number of observations int ncat_CardiacOutcome; // number of categories int Y_CardiacOutcome[N_CardiacOutcome]; // response variable int K_muAcute_CardiacOutcome; // number of population-level effects matrix[N_CardiacOutcome, K_muAcute_CardiacOutcome] X_muAcute_CardiacOutcome; // population-level design matrix int Ksp_muAcute_CardiacOutcome; // number of special effects terms int K_muChronic_CardiacOutcome; // number of population-level effects matrix[N_CardiacOutcome, K_muChronic_CardiacOutcome] X_muChronic_CardiacOutcome; // population-level design matrix int Ksp_muChronic_CardiacOutcome; // number of special effects terms int K_muT1MI_CardiacOutcome; // number of population-level effects matrix[N_CardiacOutcome, K_muT1MI_CardiacOutcome] X_muT1MI_CardiacOutcome; // population-level design matrix int Ksp_muT1MI_CardiacOutcome; // number of special effects terms int K_muT2MI_CardiacOutcome; // number of population-level effects matrix[N_CardiacOutcome, K_muT2MI_CardiacOutcome] X_muT2MI_CardiacOutcome; // population-level design matrix int Ksp_muT2MI_CardiacOutcome; // number of special effects terms int N_TroponinSecondMeasure; // number of observations vector[N_TroponinSecondMeasure] Y_TroponinSecondMeasure; // response variable int Nmi_TroponinSecondMeasure; // number of missings int Jmi_TroponinSecondMeasure[Nmi_TroponinSecondMeasure]; // positions of missings int K_TroponinSecondMeasure; // number of population-level effects matrix[N_TroponinSecondMeasure, K_TroponinSecondMeasure] X_TroponinSecondMeasure; // population-level design matrix // data for group-level effects of ID 1 int N_1; // number of grouping levels int M_1; // number of coefficients per level int J_1_CardiacOutcome[N_CardiacOutcome]; // grouping indicator per observation // group-level predictor values vector[N_CardiacOutcome] Z_1_muAcute_CardiacOutcome_1; vector[N_CardiacOutcome] Z_1_muAcute_CardiacOutcome_2; int NC_1; // number of group-level correlations // data for group-level effects of ID 2 int N_2; // number of grouping levels int M_2; // number of coefficients per level int J_2_CardiacOutcome[N_CardiacOutcome]; // grouping indicator per observation // group-level predictor values vector[N_CardiacOutcome] Z_2_muChronic_CardiacOutcome_1; vector[N_CardiacOutcome] Z_2_muChronic_CardiacOutcome_2; int NC_2; // number of group-level correlations // data for group-level effects of ID 3 int N_3; // number of grouping levels int M_3; // number of coefficients per level int J_3_CardiacOutcome[N_CardiacOutcome]; // grouping indicator per observation // group-level predictor values vector[N_CardiacOutcome] Z_3_muT1MI_CardiacOutcome_1; vector[N_CardiacOutcome] Z_3_muT1MI_CardiacOutcome_2; int NC_3; // number of group-level correlations // data for group-level effects of ID 4 int N_4; // number of grouping levels int M_4; // number of coefficients per level int J_4_CardiacOutcome[N_CardiacOutcome]; // grouping indicator per observation // group-level predictor values vector[N_CardiacOutcome] Z_4_muT2MI_CardiacOutcome_1; vector[N_CardiacOutcome] Z_4_muT2MI_CardiacOutcome_2; int NC_4; // number of group-level correlations int prior_only; // should the likelihood be ignored? } transformed data { int Kc_muAcute_CardiacOutcome = K_muAcute_CardiacOutcome - 1; matrix[N_CardiacOutcome, Kc_muAcute_CardiacOutcome] Xc_muAcute_CardiacOutcome; // centered version of X_muAcute_CardiacOutcome without an intercept vector[Kc_muAcute_CardiacOutcome] means_X_muAcute_CardiacOutcome; // column means of X_muAcute_CardiacOutcome before centering int Kc_muChronic_CardiacOutcome = K_muChronic_CardiacOutcome - 1; matrix[N_CardiacOutcome, Kc_muChronic_CardiacOutcome] Xc_muChronic_CardiacOutcome; // centered version of X_muChronic_CardiacOutcome without an intercept vector[Kc_muChronic_CardiacOutcome] means_X_muChronic_CardiacOutcome; // column means of X_muChronic_CardiacOutcome before centering int Kc_muT1MI_CardiacOutcome = K_muT1MI_CardiacOutcome - 1; matrix[N_CardiacOutcome, Kc_muT1MI_CardiacOutcome] Xc_muT1MI_CardiacOutcome; // centered version of X_muT1MI_CardiacOutcome without an intercept vector[Kc_muT1MI_CardiacOutcome] means_X_muT1MI_CardiacOutcome; // column means of X_muT1MI_CardiacOutcome before centering int Kc_muT2MI_CardiacOutcome = K_muT2MI_CardiacOutcome - 1; matrix[N_CardiacOutcome, Kc_muT2MI_CardiacOutcome] Xc_muT2MI_CardiacOutcome; // centered version of X_muT2MI_CardiacOutcome without an intercept vector[Kc_muT2MI_CardiacOutcome] means_X_muT2MI_CardiacOutcome; // column means of X_muT2MI_CardiacOutcome before centering int Kc_TroponinSecondMeasure = K_TroponinSecondMeasure - 1; matrix[N_TroponinSecondMeasure, Kc_TroponinSecondMeasure] Xc_TroponinSecondMeasure; // centered version of X_TroponinSecondMeasure without an intercept vector[Kc_TroponinSecondMeasure] means_X_TroponinSecondMeasure; // column means of X_TroponinSecondMeasure before centering for (i in 2:K_muAcute_CardiacOutcome) { means_X_muAcute_CardiacOutcome[i - 1] = mean(X_muAcute_CardiacOutcome[, i]); Xc_muAcute_CardiacOutcome[, i - 1] = X_muAcute_CardiacOutcome[, i] - means_X_muAcute_CardiacOutcome[i - 1]; } for (i in 2:K_muChronic_CardiacOutcome) { means_X_muChronic_CardiacOutcome[i - 1] = mean(X_muChronic_CardiacOutcome[, i]); Xc_muChronic_CardiacOutcome[, i - 1] = X_muChronic_CardiacOutcome[, i] - means_X_muChronic_CardiacOutcome[i - 1]; } for (i in 2:K_muT1MI_CardiacOutcome) { means_X_muT1MI_CardiacOutcome[i - 1] = mean(X_muT1MI_CardiacOutcome[, i]); Xc_muT1MI_CardiacOutcome[, i - 1] = X_muT1MI_CardiacOutcome[, i] - means_X_muT1MI_CardiacOutcome[i - 1]; } for (i in 2:K_muT2MI_CardiacOutcome) { means_X_muT2MI_CardiacOutcome[i - 1] = mean(X_muT2MI_CardiacOutcome[, i]); Xc_muT2MI_CardiacOutcome[, i - 1] = X_muT2MI_CardiacOutcome[, i] - means_X_muT2MI_CardiacOutcome[i - 1]; } for (i in 2:K_TroponinSecondMeasure) { means_X_TroponinSecondMeasure[i - 1] = mean(X_TroponinSecondMeasure[, i]); Xc_TroponinSecondMeasure[, i - 1] = X_TroponinSecondMeasure[, i] - means_X_TroponinSecondMeasure[i - 1]; } } parameters { vector[Kc_muAcute_CardiacOutcome] b_muAcute_CardiacOutcome; // population-level effects real Intercept_muAcute_CardiacOutcome; // temporary intercept for centered predictors vector[Ksp_muAcute_CardiacOutcome] bsp_muAcute_CardiacOutcome; // special effects coefficients vector[Kc_muChronic_CardiacOutcome] b_muChronic_CardiacOutcome; // population-level effects real Intercept_muChronic_CardiacOutcome; // temporary intercept for centered predictors vector[Ksp_muChronic_CardiacOutcome] bsp_muChronic_CardiacOutcome; // special effects coefficients vector[Kc_muT1MI_CardiacOutcome] b_muT1MI_CardiacOutcome; // population-level effects real Intercept_muT1MI_CardiacOutcome; // temporary intercept for centered predictors vector[Ksp_muT1MI_CardiacOutcome] bsp_muT1MI_CardiacOutcome; // special effects coefficients vector[Kc_muT2MI_CardiacOutcome] b_muT2MI_CardiacOutcome; // population-level effects real Intercept_muT2MI_CardiacOutcome; // temporary intercept for centered predictors vector[Ksp_muT2MI_CardiacOutcome] bsp_muT2MI_CardiacOutcome; // special effects coefficients vector[Nmi_TroponinSecondMeasure] Ymi_TroponinSecondMeasure; // estimated missings vector[Kc_TroponinSecondMeasure] b_TroponinSecondMeasure; // population-level effects real Intercept_TroponinSecondMeasure; // temporary intercept for centered predictors real sigma_TroponinSecondMeasure; // residual SD vector[M_1] sd_1; // group-level standard deviations matrix[M_1, N_1] z_1; // standardized group-level effects cholesky_factor_corr[M_1] L_1; // cholesky factor of correlation matrix vector[M_2] sd_2; // group-level standard deviations matrix[M_2, N_2] z_2; // standardized group-level effects cholesky_factor_corr[M_2] L_2; // cholesky factor of correlation matrix vector[M_3] sd_3; // group-level standard deviations matrix[M_3, N_3] z_3; // standardized group-level effects cholesky_factor_corr[M_3] L_3; // cholesky factor of correlation matrix vector[M_4] sd_4; // group-level standard deviations matrix[M_4, N_4] z_4; // standardized group-level effects cholesky_factor_corr[M_4] L_4; // cholesky factor of correlation matrix } transformed parameters { matrix[N_1, M_1] r_1; // actual group-level effects // using vectors speeds up indexing in loops vector[N_1] r_1_muAcute_CardiacOutcome_1; vector[N_1] r_1_muAcute_CardiacOutcome_2; matrix[N_2, M_2] r_2; // actual group-level effects // using vectors speeds up indexing in loops vector[N_2] r_2_muChronic_CardiacOutcome_1; vector[N_2] r_2_muChronic_CardiacOutcome_2; matrix[N_3, M_3] r_3; // actual group-level effects // using vectors speeds up indexing in loops vector[N_3] r_3_muT1MI_CardiacOutcome_1; vector[N_3] r_3_muT1MI_CardiacOutcome_2; matrix[N_4, M_4] r_4; // actual group-level effects // using vectors speeds up indexing in loops vector[N_4] r_4_muT2MI_CardiacOutcome_1; vector[N_4] r_4_muT2MI_CardiacOutcome_2; // compute actual group-level effects r_1 = scale_r_cor(z_1, sd_1, L_1); r_1_muAcute_CardiacOutcome_1 = r_1[, 1]; r_1_muAcute_CardiacOutcome_2 = r_1[, 2]; // compute actual group-level effects r_2 = scale_r_cor(z_2, sd_2, L_2); r_2_muChronic_CardiacOutcome_1 = r_2[, 1]; r_2_muChronic_CardiacOutcome_2 = r_2[, 2]; // compute actual group-level effects r_3 = scale_r_cor(z_3, sd_3, L_3); r_3_muT1MI_CardiacOutcome_1 = r_3[, 1]; r_3_muT1MI_CardiacOutcome_2 = r_3[, 2]; // compute actual group-level effects r_4 = scale_r_cor(z_4, sd_4, L_4); r_4_muT2MI_CardiacOutcome_1 = r_4[, 1]; r_4_muT2MI_CardiacOutcome_2 = r_4[, 2]; } model { // likelihood including all constants if (!prior_only) { // vector combining observed and missing responses vector[N_TroponinSecondMeasure] Yl_TroponinSecondMeasure = Y_TroponinSecondMeasure; // initialize linear predictor term vector[N_CardiacOutcome] muAcute_CardiacOutcome = Intercept_muAcute_CardiacOutcome + Xc_muAcute_CardiacOutcome * b_muAcute_CardiacOutcome; // initialize linear predictor term vector[N_CardiacOutcome] muChronic_CardiacOutcome = Intercept_muChronic_CardiacOutcome + Xc_muChronic_CardiacOutcome * b_muChronic_CardiacOutcome; // initialize linear predictor term vector[N_CardiacOutcome] muT1MI_CardiacOutcome = Intercept_muT1MI_CardiacOutcome + Xc_muT1MI_CardiacOutcome * b_muT1MI_CardiacOutcome; // initialize linear predictor term vector[N_CardiacOutcome] muT2MI_CardiacOutcome = Intercept_muT2MI_CardiacOutcome + Xc_muT2MI_CardiacOutcome * b_muT2MI_CardiacOutcome; // linear predictor matrix vector[ncat_CardiacOutcome] mu_CardiacOutcome[N_CardiacOutcome]; // initialize linear predictor term vector[N_TroponinSecondMeasure] mu_TroponinSecondMeasure = Intercept_TroponinSecondMeasure + Xc_TroponinSecondMeasure * b_TroponinSecondMeasure; Yl_TroponinSecondMeasure[Jmi_TroponinSecondMeasure] = Ymi_TroponinSecondMeasure; for (n in 1:N_CardiacOutcome) { // add more terms to the linear predictor muAcute_CardiacOutcome[n] += (bsp_muAcute_CardiacOutcome[1]) * Yl_TroponinSecondMeasure[n] + r_1_muAcute_CardiacOutcome_1[J_1_CardiacOutcome[n]] * Z_1_muAcute_CardiacOutcome_1[n] + r_1_muAcute_CardiacOutcome_2[J_1_CardiacOutcome[n]] * Z_1_muAcute_CardiacOutcome_2[n]; } for (n in 1:N_CardiacOutcome) { // add more terms to the linear predictor muChronic_CardiacOutcome[n] += (bsp_muChronic_CardiacOutcome[1]) * Yl_TroponinSecondMeasure[n] + r_2_muChronic_CardiacOutcome_1[J_2_CardiacOutcome[n]] * Z_2_muChronic_CardiacOutcome_1[n] + r_2_muChronic_CardiacOutcome_2[J_2_CardiacOutcome[n]] * Z_2_muChronic_CardiacOutcome_2[n]; } for (n in 1:N_CardiacOutcome) { // add more terms to the linear predictor muT1MI_CardiacOutcome[n] += (bsp_muT1MI_CardiacOutcome[1]) * Yl_TroponinSecondMeasure[n] + r_3_muT1MI_CardiacOutcome_1[J_3_CardiacOutcome[n]] * Z_3_muT1MI_CardiacOutcome_1[n] + r_3_muT1MI_CardiacOutcome_2[J_3_CardiacOutcome[n]] * Z_3_muT1MI_CardiacOutcome_2[n]; } for (n in 1:N_CardiacOutcome) { // add more terms to the linear predictor muT2MI_CardiacOutcome[n] += (bsp_muT2MI_CardiacOutcome[1]) * Yl_TroponinSecondMeasure[n] + r_4_muT2MI_CardiacOutcome_1[J_4_CardiacOutcome[n]] * Z_4_muT2MI_CardiacOutcome_1[n] + r_4_muT2MI_CardiacOutcome_2[J_4_CardiacOutcome[n]] * Z_4_muT2MI_CardiacOutcome_2[n]; } for (n in 1:N_CardiacOutcome) { mu_CardiacOutcome[n] = transpose([muAcute_CardiacOutcome[n], muChronic_CardiacOutcome[n], 0, muT1MI_CardiacOutcome[n], muT2MI_CardiacOutcome[n]]); } for (n in 1:N_CardiacOutcome) { target += categorical_logit_lpmf(Y_CardiacOutcome[n] | mu_CardiacOutcome[n]); } target += normal_lpdf(Yl_TroponinSecondMeasure | mu_TroponinSecondMeasure, sigma_TroponinSecondMeasure); } // priors including all constants target += student_t_lpdf(b_muAcute_CardiacOutcome | 3,0,5); target += student_t_lpdf(bsp_muAcute_CardiacOutcome | 3,0,5); target += student_t_lpdf(b_muChronic_CardiacOutcome | 3,0,5); target += student_t_lpdf(bsp_muChronic_CardiacOutcome | 3,0,5); target += student_t_lpdf(b_muT1MI_CardiacOutcome | 3,0,5); target += student_t_lpdf(bsp_muT1MI_CardiacOutcome | 3,0,5); target += student_t_lpdf(b_muT2MI_CardiacOutcome | 3,0,5); target += student_t_lpdf(bsp_muT2MI_CardiacOutcome | 3,0,5); target += student_t_lpdf(b_TroponinSecondMeasure | 3,0,5); target += student_t_lpdf(sigma_TroponinSecondMeasure | 3, 0, 5.9) - 1 * student_t_lccdf(0 | 3, 0, 5.9); target += student_t_lpdf(sd_1 | 3, 0, 2.5) - 2 * student_t_lccdf(0 | 3, 0, 2.5); target += std_normal_lpdf(to_vector(z_1)); target += lkj_corr_cholesky_lpdf(L_1 | 2); target += student_t_lpdf(sd_2 | 3, 0, 2.5) - 2 * student_t_lccdf(0 | 3, 0, 2.5); target += std_normal_lpdf(to_vector(z_2)); target += lkj_corr_cholesky_lpdf(L_2 | 2); target += student_t_lpdf(sd_3 | 3, 0, 2.5) - 2 * student_t_lccdf(0 | 3, 0, 2.5); target += std_normal_lpdf(to_vector(z_3)); target += lkj_corr_cholesky_lpdf(L_3 | 2); target += student_t_lpdf(sd_4 | 3, 0, 2.5) - 2 * student_t_lccdf(0 | 3, 0, 2.5); target += std_normal_lpdf(to_vector(z_4)); target += lkj_corr_cholesky_lpdf(L_4 | 2); } generated quantities { // actual population-level intercept real b_muAcute_CardiacOutcome_Intercept = Intercept_muAcute_CardiacOutcome - dot_product(means_X_muAcute_CardiacOutcome, b_muAcute_CardiacOutcome); // actual population-level intercept real b_muChronic_CardiacOutcome_Intercept = Intercept_muChronic_CardiacOutcome - dot_product(means_X_muChronic_CardiacOutcome, b_muChronic_CardiacOutcome); // actual population-level intercept real b_muT1MI_CardiacOutcome_Intercept = Intercept_muT1MI_CardiacOutcome - dot_product(means_X_muT1MI_CardiacOutcome, b_muT1MI_CardiacOutcome); // actual population-level intercept real b_muT2MI_CardiacOutcome_Intercept = Intercept_muT2MI_CardiacOutcome - dot_product(means_X_muT2MI_CardiacOutcome, b_muT2MI_CardiacOutcome); // actual population-level intercept real b_TroponinSecondMeasure_Intercept = Intercept_TroponinSecondMeasure - dot_product(means_X_TroponinSecondMeasure, b_TroponinSecondMeasure); // compute group-level correlations corr_matrix[M_1] Cor_1 = multiply_lower_tri_self_transpose(L_1); vector[NC_1] cor_1; // compute group-level correlations corr_matrix[M_2] Cor_2 = multiply_lower_tri_self_transpose(L_2); vector[NC_2] cor_2; // compute group-level correlations corr_matrix[M_3] Cor_3 = multiply_lower_tri_self_transpose(L_3); vector[NC_3] cor_3; // compute group-level correlations corr_matrix[M_4] Cor_4 = multiply_lower_tri_self_transpose(L_4); vector[NC_4] cor_4; // extract upper diagonal of correlation matrix for (k in 1:M_1) { for (j in 1:(k - 1)) { cor_1[choose(k - 1, 2) + j] = Cor_1[j, k]; } } // extract upper diagonal of correlation matrix for (k in 1:M_2) { for (j in 1:(k - 1)) { cor_2[choose(k - 1, 2) + j] = Cor_2[j, k]; } } // extract upper diagonal of correlation matrix for (k in 1:M_3) { for (j in 1:(k - 1)) { cor_3[choose(k - 1, 2) + j] = Cor_3[j, k]; } } // extract upper diagonal of correlation matrix for (k in 1:M_4) { for (j in 1:(k - 1)) { cor_4[choose(k - 1, 2) + j] = Cor_4[j, k]; } } }