Advertisement
Guest User

Untitled

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