#SIMULATION STUDY: #1) Fix \beta_0 and \beta_1 set.seed(1) #Seed for randomness. beta_0 <- round(runif(n = 1, min = -2, max = 2), 1) #-0.9 beta_1 <- round(runif(n = 1, min = 0, max = 0.05), 2) #0.02 #2) Create p_1 = \frac{e^{\beta_0 + \beta_1 x}}{1 + e^{\beta_0 + \beta_1 x}} n <- 10000 #Number of observations. X <- runif(n = n, min = 0, max = 10) X <- floor(X) p_1 <- exp(beta_0 + beta_1 * X) / (1 + exp(beta_0 + beta_1 * X)) range(p_1) #[1] 0.2890505 0.3273930 #3) Simulate Y_1 \sim Bernouilli(p_1) Y_1 <- rbinom(n = n, size = 1, prob = p_1) #4) Fit the glm (check you get \beta_0, \beta_1 and p_1 correct) glm_lev1 <- glm(Y_1 ~ X, family = binomial) coef(glm_lev1) #(Intercept) X #-0.89642433 0.01796293 #They are very similar values to beta_0 and beta_1, as expected: c(beta_0, beta_1) #-0.9 0.02 glm_probs = predict(glm_lev1, type = "response") #glm_probs are very similar to p_1, as expected, see for example: glm_probs[1:10] p_1[1:10] #Rows of each top category: aux0 <- X[which(Y_1 == 0)] aux1 <- X[which(Y_1 == 1)] #5) Fix \sigma, \beta_{00}, \beta_2 and the random factors beta_00 <- round(runif(n = 1, min = -3, max = 3), 1) #-2.1 beta_2 <- round(runif(n = 1, min = 0, max = 2), 1) #0.6 sigma <- round(runif(n = 1, min = 0, max = 1), 1) #0.2 r0 <- rnorm(length(aux0), 0, sigma) #random factor r1 <- rnorm(length(aux1), 0, sigma) #random factor #6) Create p_{2ij} = \frac{e^{\beta_{00} + \beta_2 x}}{1 + e^{\beta_{00} + \beta_2 x}} #and draw Y_{2ij} \sim Bernouilli(p_{2ij}) for j=0,1 p <- function(x, a, b) exp(a + b * x) / (1 + exp(a + b * x)) Y_2i0 <- rbinom(length(aux0), 1, prob = p(aux0, beta_00 + r0, beta_2)) Y_2i1 <- rbinom(length(aux1), 1, prob = p(aux1, beta_00 + r1, beta_2)) Y_2 <- c(Y_2i0, Y_2i1) Y_1_aux <- c(Y_1[which(Y_1 == 0)], Y_1[which(Y_1 == 1)]) data <- data.frame(X, Y_1_aux, Y_2) names(data) <- c("X", "Y1", "Y2") data[c(1:6,9995:10000),] #X Y1 Y2 #5 0 1 #9 0 0 #2 0 1 #8 0 0 #9 0 0 #6 0 0 #4 1 0 #5 1 1 #5 1 1 #6 1 1 #0 1 1 #6 1 0 #7) Fit the glmer (check you get \beta_00, \beta_2, \sigma correct) library(lme4) glm_lev2 <- glmer(Y2 ~ X + (1|Y1), data = data, family=binomial) coef(glm_lev2) #$Y1 # (Intercept) X #0 0.3872395 -0.003517575 #1 0.3872395 -0.003517575 #These values aren't similar to the generated beta_00 and beta_2. VarCorr(glm_lev2) #Groups Name Std.Dev. #Y1 (Intercept) 1.9464e-07 #This value isn't similar to the generated sigma.