Advertisement
Guest User

Untitled

a guest
Mar 15th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.08 KB | None | 0 0
  1. # Simulate study of treatment vs control w/ half male subjects
  2. sim = function(n, show_dat = FALSE, show_fit = FALSE, sex_main = F, intercept = F){
  3. a = rnorm(n, 0.0, 1)
  4. b1 = rnorm(n/2, 0.75, 1)
  5. b2 = rnorm(n/2, 1.25, 1)
  6.  
  7. dat = data.frame(Group = c(rep("C", n), rep("T", n)),
  8. Sex = rep(c(rep("M", n/2), rep("F", n/2)), 2),
  9. Val = c(a, b1, b2))
  10.  
  11. if(sex_main){
  12. fit = 'if'(intercept, lm(Val ~ 0 + Group*Sex, dat), lm(Val ~ Group*Sex, dat))
  13. }else{
  14. fit = 'if'(intercept, lm(Val ~ 0 + Group + Group:Sex, dat), lm(Val ~ Group + Group:Sex, dat))
  15. }
  16. pvals = summary(fit)$coefficients[, 4]
  17.  
  18. if(show_dat) print(dat)
  19. if(show_fit) print(summary(fit))
  20. return(pvals)
  21. }
  22.  
  23. # Analytical power calculation by effect and sample size
  24. exactPwr = function(nvals, delta){
  25. sapply(nvals, function(n)
  26. power.t.test(n = n, delta = delta, sd = 1, sig.level = .05, strict = T)$power)
  27. }
  28.  
  29.  
  30. # Run Simulations
  31. par(mfrow = c(2, 2))
  32. nvals = seq(4, 100, by = 2)
  33. nsim = 1e3
  34. out = list()
  35. mat = expand.grid(c(TRUE, FALSE), c(TRUE, FALSE))
  36. for(i in 1:nrow(mat)){
  37. res = out[[i]] = sapply(nvals, function(n)
  38. rowMeans(replicate(nsim, sim(n, sex_main = mat[i, 1], intercept = mat[i, 2])) < 0.05))
  39.  
  40. # Get Sample size nearest to 80% power
  41. n80 = nvals[which.min(abs(res["GroupT",] - 0.8))]
  42.  
  43. # Simulation Results
  44. main = paste0(c("sex_main:", "intercept:"), mat[i,])
  45. plot(nvals, res[1, ], type = "n", ylim = range(res), xlab = "n", ylab = "% Sig", main = main, panel.first = grid())
  46. for(i in 1:nrow(res)){
  47. lines(nvals, res[i,], col = rainbow(4)[i], lwd = 3)
  48. }
  49.  
  50. # Add analytical results
  51. lines(nvals, exactPwr(nvals, 1), lwd = 2, lty = 2)
  52. lines(nvals, exactPwr(nvals/2, .5), lwd = 2, lty = 2)
  53.  
  54. abline(h = 0.8, v = n80, lty = 2)
  55. legend("topright", c(rownames(res), "Analytic Match"),
  56. col = c(rainbow(4), "Black"), lwd = 3, lty = c(rep(1, 4), 2), bg = "White")
  57.  
  58.  
  59. res[, nvals == n80]
  60. exactPwr(n80/2, .5)
  61. }
  62. cbind(exactPwr(nvals, 1), exactPwr(nvals/2, .5))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement