<h1>Simulation and Power Analysis of Generalized Linear Mixed Models</h1> <h2>Brandon LeBeau</h2> <h3>University of Iowa</h3> # Overview 1. Power 2. `simglm` package 3. Shiny Demo # Power - Power is the ability to statistically detect a true effect (i.e. non-zero population effect). - For simple models (e.g. t-tests, regression) there are closed form equations for generating power. + R has routines for these: `power.t.test, power.anova.test` + Gpower3 # Power Example ```r n <- seq(20, 1000, 5) power <- sapply(seq_along(n), function(i) power.t.test(n = n[i], delta = .15, sd = 1, type = 'two.sample')$power) ``` ![plot of chunk visualize](/figs/visualize-1.png) # Power for (G)LMM - Power for more complex models is not as straightforward; + particularly with messy real world data. - There is software for GLMM models to generate power + Optimal Design: <http://hlmsoft.net/od/> + MLPowSim: <http://www.bristol.ac.uk/cmm/software/mlpowsim/> + Snijders, *Power and Sample Size in Multilevel Linear Models*. + Moerbeek & Teerenstra, *Power Analysis of Trials with Multilevel Data*. # Power is hard - In practice, power is hard. - Need to make many assumptions on data that has not been collected. + Therefore, data assumptions made for power computations will likely differ from collected sample. - A power analysis needs to be flexible, exploratory, and well thought out. # Why do power? - Three common reasons to do power analysis: 1. Power evidence for grant/planning 2. Post Hoc to explore insignificant results 3. Monte Carlo studies # `simglm` Features * Longitudinal data simulation * Three levels of nesting * Specification of distribution of random components (random effects and random error) * Specification of serial correlation * Specification of the number of variables + Ability to add time-varying covariates + Specify the mean and variance of fixed covariate variables + Factor variable simulation + Ordinal variable simulation # `simglm` Features Continued * Power by simulation + Vary parameters for a factorial simulation design. + Can vary model fitted to the data to misspecify directly. * Simulation of missing data * Include other distributions for covariate simulation. * Continuous, Logistic (dichotomous), and Poisson (count) outcome variables. # Replicate with `simglm` * Note this code uses the development version on GitHub ```r library(simglm) fixed <- ~ 1 + trt_f fixed_param <- c(0, 0.15) fact_vars <- list(numlevels = 2, var_type = 'single', opts = list(list(replace = TRUE))) n <- NULL error_var <- 1 with_err_gen <- 'rnorm' pow_param <- c('(Intercept)', 'I(trt_f - 1)') alpha <- .05 pow_dist <- "t" pow_tail <- 2 replicates <- 500 terms_vary <- list(n = seq(20, 2000, 40)) power_out <- sim_pow(fixed = fixed, fixed_param = fixed_param, cov_param = NULL, n = n, error_var = error_var, with_err_gen = with_err_gen, fact_vars = fact_vars, data_str = "single", pow_param = pow_param, alpha = alpha, pow_dist = pow_dist, pow_tail = pow_tail, replicates = replicates, terms_vary = terms_vary, raw_power = FALSE, lm_fit_mod = sim_data ~ I(trt_f - 1)) ``` # Plot Results ![plot of chunk power_out_figure](/figs/power_out_figure-1.png) # More Realistic? ```r terms_vary <- list(n = seq(20, 2000, 40), fact_vars = list(list(numlevels = 2, var_type = 'single', opts = list(list(replace = TRUE))), list(numlevels = 2, var_type = 'single', opts = list(list(replace = TRUE, prob = c(.7, .3)))))) pow_param <- c('I(trt_f - 1)') power_out <- sim_pow(fixed = fixed, fixed_param = fixed_param, cov_param = NULL, n = n, error_var = error_var, with_err_gen = with_err_gen, fact_vars = fact_vars, data_str = "single", pow_param = pow_param, alpha = alpha, pow_dist = pow_dist, pow_tail = pow_tail, replicates = replicates, terms_vary = terms_vary, raw_power = FALSE, lm_fit_mod = sim_data ~ I(trt_f - 1)) ``` # Results ![plot of chunk power_factor](/figs/power_factor-1.png) # Shiny Demo - Once the package is installed, can run the Shiny app locally. ```r run_shiny() ``` # Connect - Twitter: @blebeau11 - Website: <https://brandonlebeau.org> - Slides: <https://brandonlebeau.org/slides/jsm2017.html> - GitHub: <http://github.com/lebebr01/simglm>