Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.23 KB | None | 0 0
  1. library(scales)
  2. library(vcdExtra)
  3. library(data.table)
  4. library(MASS)
  5. library(lme4)
  6. library(questionr)
  7. library(plyr)
  8. library(dplyr)
  9. library(ggplot2)
  10. library(parallel)
  11. library(Rlab)
  12. library(gtools)
  13. library(sjstats)
  14.  
  15. #mediation simulation ####
  16. start.time = Sys.time()
  17.  
  18. mediationSim = function() {
  19.  
  20. #draw number of departments
  21. d = sample(c(100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500), size = 1)
  22. dept = 1:d
  23.  
  24. #draw number of obs per department
  25. s = sample(seq(10,100, by = 2), size = d, replace = T)
  26. j = s/2
  27. x = NULL
  28. for (i in j){
  29. x_prob = runif(1)
  30. xtemp = rbern(i, x_prob)
  31. x = c(x, xtemp)
  32. }
  33.  
  34. #combine variables into a data frame
  35. s = as.data.frame(s)
  36. dept = as.data.frame(dept)
  37. dept = dept[rep(row.names(dept), s$s), 1] #repeat the letter for each department based on number of observations in each department (s)
  38. dat = data.table(dept, x)
  39.  
  40. #compute group means for the x variable
  41. x_group_mean = dat[, list(x_group_mean = mean(x)), by = "dept"]
  42. dat = merge(dat, x_group_mean, by = "dept")
  43.  
  44. #draw random intercept for path a
  45. dat$a_int = rep(rnorm(d, mean = 0, sd = 2), times = j*2)
  46.  
  47. #draw random slope for path a
  48. WG_a = runif(1) #true within group effect
  49. dat$a_slope = rep(mapply(rnorm, n = d, mean = WG_a, sd = .5), times = j*2)
  50.  
  51. #between group effect for path a
  52. BG_a = runif(1)
  53.  
  54. #create mediator variable
  55. dat$m_prob = 1 / (1 + exp(-(dat$a_int + BG_a*dat$x_group_mean + dat$a_slope*dat$x)))
  56. dat$m = rbern(n=length(dat$dept), prob=dat$m_prob)
  57.  
  58. #compute group means for the m variable
  59. m_group_mean = dat[, list(m_group_mean = mean(m)), by = "dept"]
  60. dat = merge(dat, m_group_mean, by = "dept")
  61.  
  62. #create random intercept for path b
  63. dat$b_int = rep(rnorm(d, mean = 0, sd = 2), times = j*2)
  64.  
  65. #draw random slope for path b
  66. WG_b = runif(1)
  67. dat$b_slope = rep(mapply(rnorm, n = d, mean = WG_b, sd = .5), times = j*2)
  68.  
  69. #between group effect for path b
  70. BG_b = runif(1)
  71.  
  72. #path c slope
  73. WG_c = runif(1)
  74.  
  75. #create y variable
  76. dat$y_prob = 1 / (1 + exp(-(dat$b_int + BG_b*dat$m_group_mean + dat$b_slope*dat$m + WG_c*dat$x)))
  77. dat$y = rbern(n=length(dat$dept), prob=dat$y_prob)
  78.  
  79. #compute grand means
  80. dat$x_grand_mean = mean(dat$x)
  81. dat$m_grand_mean = mean(dat$m)
  82.  
  83. #create gmc variables
  84. dat$x_gmc = dat$x - dat$x_grand_mean
  85. dat$m_gmc = dat$m - dat$m_grand_mean
  86.  
  87. #create cwc variables
  88. dat$x_cwc = dat$x - dat$x_group_mean
  89. dat$m_cwc = dat$m - dat$m_group_mean
  90.  
  91. #ICC ####
  92. icc1_m = glmer(m ~ (1|dept), data = dat, family = "binomial")
  93. #icc1 = as.data.frame(VarCorr(icc1_m))$vcov / (as.data.frame(VarCorr(icc1_m))$vcov + (pi^2/3))
  94. icc1 = as.data.frame(icc(icc1_m))[1,1]
  95.  
  96. icc2_m = glmer(y ~ (1|dept), data = dat, family = "binomial")
  97. icc2 = as.data.frame(icc(icc2_m))[1,1]
  98.  
  99. #CWC ####
  100. #estimate model for path a
  101. path_a_cwc = summary(glmer(m ~ x_cwc + x_group_mean + (1+x_cwc|dept), data = dat, family = "binomial"))
  102. WG_a_est_cwc = summary(path_a_cwc)$coef[2,1]
  103. WG_a_SE_cwc = summary(path_a_cwc)$coef[2,2]
  104. #WG_a_recov_cwc = ifelse(WG_a < WG_a_est_cwc+1.96*WG_a_SE_cwc & WG_a > WG_a_est_cwc-1.96*WG_a_SE_cwc, 1, 0)
  105.  
  106. BG_a_est_cwc = summary(path_a_cwc)$coef[3,1]
  107. BG_a_SE_cwc = summary(path_a_cwc)$coef[3,2]
  108. #BG_a_recov_cwc = ifelse(BG_a < BG_a_est_cwc+1.96*BG_a_SE_cwc & BG_a > BG_a_est_cwc-1.96*BG_a_SE_cwc, 1, 0)
  109.  
  110. #estimate model for path b + c'
  111. path_b_cwc = glmer(y ~ x_cwc + m_cwc + m_group_mean + (1+m_cwc|dept), data = dat, family = "binomial")
  112. WG_b_est_cwc = summary(path_b_cwc)$coef[3,1]
  113. WG_b_SE_cwc = summary(path_b_cwc)$coef[3,2]
  114. #WG_b_recov_cwc = ifelse(WG_b < WG_b_est_cwc+1.96*WG_b_SE_cwc & WG_b > WG_b_est_cwc-1.96*WG_b_SE_cwc, 1, 0)
  115.  
  116. BG_b_est_cwc = summary(path_b_cwc)$coef[4,1]
  117. BG_b_SE_cwc = summary(path_b_cwc)$coef[4,2]
  118. #BG_b_recov_cwc = ifelse(BG_b < BG_b_est_cwc+1.96*BG_b_SE_cwc & BG_b > BG_b_est_cwc-1.96*BG_b_SE_cwc, 1, 0)
  119.  
  120. WG_c_est_cwc = summary(path_b_cwc)$coef[2,1]
  121. WG_c_SE_cwc = summary(path_b_cwc)$coef[2,2]
  122. #WG_c_recov_cwc = ifelse(WG_c < WG_c_est_cwc+1.96*WG_c_SE_cwc & WG_c > WG_c_est_cwc-1.96*WG_c_SE_cwc, 1, 0)
  123.  
  124. #GMC ####
  125. #estimate model for path a
  126. path_a_gmc = summary(glmer(m ~ x_gmc + x_group_mean + (1+x_gmc|dept), data = dat, family = "binomial"))
  127. WG_a_est_gmc = summary(path_a_gmc)$coef[2,1]
  128. WG_a_SE_gmc = summary(path_a_gmc)$coef[2,2]
  129. #WG_a_recov_gmc = ifelse(WG_a < WG_a_est_gmc+1.96*WG_a_SE_gmc & WG_a > WG_a_est_gmc-1.96*WG_a_SE_gmc, 1, 0)
  130.  
  131. BG_a_est_gmc = summary(path_a_gmc)$coef[3,1]
  132. BG_a_SE_gmc = summary(path_a_gmc)$coef[3,2]
  133. #BG_a_recov_gmc = ifelse(BG_a < BG_a_est_gmc+1.96*BG_a_SE_gmc & BG_a > BG_a_est_gmc-1.96*BG_a_SE_gmc, 1, 0)
  134.  
  135. #estimate model for path b + c'
  136. path_b_gmc = glmer(y ~ x_gmc + m_gmc + m_group_mean + (1+m_gmc|dept), data = dat, family = "binomial")
  137. WG_b_est_gmc = summary(path_b_gmc)$coef[3,1]
  138. WG_b_SE_gmc = summary(path_b_gmc)$coef[3,2]
  139. #WG_b_recov_gmc = ifelse(WG_b < WG_b_est_gmc+1.96*WG_b_SE_gmc & WG_b > WG_b_est_gmc-1.96*WG_b_SE_gmc, 1, 0)
  140.  
  141. BG_b_est_gmc = summary(path_b_gmc)$coef[4,1]
  142. BG_b_SE_gmc = summary(path_b_gmc)$coef[4,2]
  143. #BG_b_recov_gmc = ifelse(BG_b < BG_b_est_gmc+1.96*BG_b_SE_gmc & BG_b > BG_b_est_gmc-1.96*BG_b_SE_gmc, 1, 0)
  144.  
  145. WG_c_est_gmc = summary(path_b_gmc)$coef[2,1]
  146. WG_c_SE_gmc = summary(path_b_gmc)$coef[2,2]
  147. #WG_c_recov_gmc = ifelse(WG_c < WG_c_est_gmc+1.96*WG_c_SE_gmc & WG_c > WG_c_est_gmc-1.96*WG_c_SE_gmc, 1, 0)
  148.  
  149. #no centering ####
  150. #estimate model for path a
  151. path_a = summary(glmer(m ~ x + x_group_mean + (1+x|dept), data = dat, family = "binomial"))
  152. WG_a_est = summary(path_a)$coef[2,1]
  153. WG_a_SE = summary(path_a)$coef[2,2]
  154. #WG_a_recov = ifelse(WG_a < WG_a_est+1.96*WG_a_SE & WG_a > WG_a_est-1.96*WG_a_SE, 1, 0)
  155.  
  156. BG_a_est = summary(path_a)$coef[3,1]
  157. BG_a_SE = summary(path_a)$coef[3,2]
  158. #BG_a_recov = ifelse(BG_a < BG_a_est+1.96*BG_a_SE & BG_a > BG_a_est-1.96*BG_a_SE, 1, 0)
  159.  
  160. #estimate model for path b + c'
  161. path_b = glmer(y ~ x + m + m_group_mean + (1+m|dept), data = dat, family = "binomial")
  162. WG_b_est = summary(path_b)$coef[3,1]
  163. WG_b_SE = summary(path_b)$coef[3,2]
  164. #WG_b_recov = ifelse(WG_b < WG_b_est+1.96*WG_b_SE & WG_b > WG_b_est-1.96*WG_b_SE, 1, 0)
  165.  
  166. BG_b_est = summary(path_b)$coef[4,1]
  167. BG_b_SE = summary(path_b)$coef[4,2]
  168. #BG_b_recov = ifelse(BG_b < BG_b_est+1.96*BG_b_SE & BG_b > BG_b_est-1.96*BG_b_SE, 1, 0)
  169.  
  170. WG_c_est = summary(path_b)$coef[2,1]
  171. WG_c_SE = summary(path_b)$coef[2,2]
  172. #WG_c_recov = ifelse(WG_c < WG_c_est+1.96*WG_c_SE & WG_c > WG_c_est-1.96*WG_c_SE, 1, 0)
  173.  
  174. res = c(d, icc1, icc2, BG_a, BG_b, WG_a, WG_b, WG_c,
  175. BG_a_est, BG_a_SE, BG_b_est, BG_b_SE,
  176. WG_a_est, WG_a_SE, WG_b_est, WG_b_SE, WG_c_est, WG_c_SE,
  177. BG_a_est_gmc, BG_a_SE_gmc, BG_b_est_gmc, BG_b_SE_gmc,
  178. WG_a_est_gmc, WG_a_SE_gmc, WG_b_est_gmc, WG_b_SE_gmc, WG_c_est_gmc, WG_c_SE_gmc,
  179. BG_a_est_cwc, BG_a_SE_cwc, BG_b_est_cwc, BG_b_SE_cwc,
  180. WG_a_est_cwc, WG_a_SE_cwc, WG_b_est_cwc, WG_b_SE_cwc, WG_c_est_cwc, WG_c_SE_cwc)
  181.  
  182. return(res)
  183.  
  184. }
  185.  
  186. mediationres = do.call(rbind, mclapply(1:100, function(i) mediationSim()))
  187.  
  188. end.time = Sys.time()
  189. time.taken = end.time - start.time
  190. time.taken
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement