Leistungsanalyse für longitudinale mehrstufige/lineare Mischeffektmodelle.
Der Zweck von powerlmm ist es, Längsschnittstudien (parallele Gruppen) mit oder ohne Clusterbildung auf höherer Ebene (z. B. von Therapeuten, Gruppen oder Arzt) und fehlenden Daten zu entwerfen (z. B. longitudinal. Die Hauptmerkmale des Pakets sind:
powerlmm kann aus Cran und GitHub installiert werden.
# CRAN, version 0.4.0
install.packages( " powerlmm " )
# GitHub, dev version
devtools :: install_github( " rpsychologist/powerlmm " )Dies ist ein Beispiel für die Einrichtung eines dreistufigen Längsmodells mit zufälligen Steigungen sowohl auf der Subjekt- als auch auf der Cluster-Ebene mit verschiedenen fehlenden Datenmustern pro Behandlungsarm. Es werden relative standardisierte Eingänge verwendet, aber auch nicht standardisierte Rohparameterwerte können verwendet werden.
library( powerlmm )
d <- per_treatment( control = dropout_weibull( 0.3 , 2 ),
treatment = dropout_weibull( 0.2 , 2 ))
p <- study_parameters( n1 = 11 ,
n2 = 10 ,
n3 = 5 ,
icc_pre_subject = 0.5 ,
icc_pre_cluster = 0 ,
icc_slope = 0.05 ,
var_ratio = 0.02 ,
dropout = d ,
effect_size = cohend( - 0.8 ,
standardizer = " pretest_SD " ))
p
# >
# > Study setup (three-level)
# >
# > n1 = 11
# > n2 = 10 x 5 (treatment)
# > 10 x 5 (control)
# > n3 = 5 (treatment)
# > 5 (control)
# > 10 (total)
# > total_n = 50 (treatment)
# > 50 (control)
# > 100 (total)
# > dropout = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 (time)
# > 0, 0, 1, 3, 6, 9, 12, 16, 20, 25, 30 (%, control)
# > 0, 0, 1, 2, 4, 5, 8, 10, 13, 17, 20 (%, treatment)
# > icc_pre_subjects = 0.5
# > icc_pre_clusters = 0
# > icc_slope = 0.05
# > var_ratio = 0.02
# > effect_size = -0.8 (Cohen's d [SD: pretest_SD]) plot( p )get_power( p , df = " satterthwaite " )
# >
# > Power Analyis for Longitudinal Linear Mixed-Effects Models (three-level)
# > with missing data and unbalanced designs
# >
# > n1 = 11
# > n2 = 10 x 5 (treatment)
# > 10 x 5 (control)
# > n3 = 5 (treatment)
# > 5 (control)
# > 10 (total)
# > total_n = 50 (control)
# > 50 (treatment)
# > 100 (total)
# > dropout = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 (time)
# > 0, 0, 1, 3, 6, 9, 12, 16, 20, 25, 30 (%, control)
# > 0, 0, 1, 2, 4, 5, 8, 10, 13, 17, 20 (%, treatment)
# > icc_pre_subjects = 0.5
# > icc_pre_clusters = 0
# > icc_slope = 0.05
# > var_ratio = 0.02
# > effect_size = -0.8 (Cohen's d [SD: pretest_SD])
# > df = 7.971459
# > alpha = 0.05
# > power = 68%Ungleiche Clustergrößen werden ebenfalls unterstützt, die Clustergrößen können entweder zufällig (abgetastet) oder die Grenzverteilung angegeben werden.
p <- study_parameters( n1 = 11 ,
n2 = unequal_clusters( 2 , 3 , 5 , 20 ),
icc_pre_subject = 0.5 ,
icc_pre_cluster = 0 ,
icc_slope = 0.05 ,
var_ratio = 0.02 ,
effect_size = cohend( - 0.8 ,
standardizer = " pretest_SD " ))
get_power( p )
# >
# > Power Analyis for Longitudinal Linear Mixed-Effects Models (three-level)
# > with missing data and unbalanced designs
# >
# > n1 = 11
# > n2 = 2, 3, 5, 20 (treatment)
# > 2, 3, 5, 20 (control)
# > n3 = 4 (treatment)
# > 4 (control)
# > 8 (total)
# > total_n = 30 (control)
# > 30 (treatment)
# > 60 (total)
# > dropout = No missing data
# > icc_pre_subjects = 0.5
# > icc_pre_clusters = 0
# > icc_slope = 0.05
# > var_ratio = 0.02
# > effect_size = -0.8 (Cohen's d [SD: pretest_SD])
# > df = 6
# > alpha = 0.05
# > power = 44%Clustergrößen folgen einer Poisson -Verteilung
p <- study_parameters( n1 = 11 ,
n2 = unequal_clusters( func = rpois( 5 , 5 )), # sample from Poisson
icc_pre_subject = 0.5 ,
icc_pre_cluster = 0 ,
icc_slope = 0.05 ,
var_ratio = 0.02 ,
effect_size = cohend( - 0.8 ,
standardizer = " pretest_SD " ))
get_power( p , R = 100 , progress = FALSE ) # expected power by averaging over R realizations
# >
# > Power Analyis for Longitudinal Linear Mixed-Effects Models (three-level)
# > with missing data and unbalanced designs
# >
# > n1 = 11
# > n2 = rpois(5, 5) (treatment)
# > - (control)
# > n3 = 5 (treatment)
# > 5 (control)
# > 10 (total)
# > total_n = 24.96 (control)
# > 24.96 (treatment)
# > 49.92 (total)
# > dropout = No missing data
# > icc_pre_subjects = 0.5
# > icc_pre_clusters = 0
# > icc_slope = 0.05
# > var_ratio = 0.02
# > effect_size = -0.8 (Cohen's d [SD: pretest_SD])
# > df = 8
# > alpha = 0.05
# > power = 48% (MCSE: 1%)
# >
# > NOTE: n2 is randomly sampled. Values are the mean from R = 100 realizations.Es sind auch mehrere Bequemlichkeitsfunktionen enthalten, z. B. zum Erstellen von Kraftkurven.
x <- get_power_table( p ,
n2 = 5 : 10 ,
n3 = c( 4 , 8 , 12 ),
effect_size = cohend(c( 0.5 , 0.8 ), standardizer = " pretest_SD " ))plot( x ) Das Paket enthält eine flexible Simulationsmethode, mit der die Leistung verschiedener Modelle untersucht werden kann. Vergleichen wir beispielsweise den Leistungsunterschied zwischen dem 2-Stufe LMM mit 11 wiederholten Maßnahmen mit einer ANCOVA im Posttest. Die Verwendung von sim_formula -Modellen kann während der Simulation an denselben Datensatz angepasst werden.
p <- study_parameters( n1 = 11 ,
n2 = 40 ,
icc_pre_subject = 0.5 ,
cor_subject = - 0.4 ,
var_ratio = 0.02 ,
effect_size = cohend( - 0.8 ,
standardizer = " pretest_SD " ))
# 2-lvl LMM
f0 <- sim_formula( " y ~ time + time:treatment + (1 + time | subject) " )
# ANCOVA, formulas with no random effects are with using lm()
f1 <- sim_formula( " y ~ treatment + pretest " ,
data_transform = transform_to_posttest ,
test = " treatment " )
f <- sim_formula_compare( " LMM " = f0 ,
" ANCOVA " = f1 )
res <- simulate( p ,
nsim = 2000 ,
formula = f ,
cores = parallel :: detectCores( logical = FALSE )) Anschließend fassen wir die Ergebnisse mit summary zusammen. Schauen wir uns die Behandlungseffekte speziell an.
summary( res , para = list ( " LMM " = " time:treatment " ,
" ANCOVA " = " treatment " ))
# > Model: summary
# >
# > Fixed effects: 'time:treatment', 'treatment'
# >
# > model M_est theta M_se SD_est Power Power_bw Power_satt
# > LMM -1.1 -1.1 0.32 0.32 0.93 0.93 .
# > ANCOVA -11.0 0.0 3.70 3.70 0.85 0.84 0.84
# > ---
# > Number of simulations: 2000 | alpha: 0.05
# > Time points (n1): 11
# > Subjects per cluster (n2 x n3): 40 (treatment)
# > 40 (control)
# > Total number of subjects: 80
# > ---
# > At least one of the models applied a data transformation during simulation,
# > summaries that depend on the true parameter values will no longer be correct,
# > see 'help(summary.plcp_sim)'Wir können uns auch ein bestimmtes Modell ansehen, hier sind die Ergebnisse für das 2-LVL-LMM.
summary( res , model = " LMM " )
# > Model: LMM
# >
# > Random effects
# >
# > parameter M_est theta est_rel_bias prop_zero is_NA
# > subject_intercept 99.00 100.0 -0.00560 0 0
# > subject_slope 2.00 2.0 -0.00310 0 0
# > error 100.00 100.0 0.00086 0 0
# > cor_subject -0.39 -0.4 -0.03200 0 0
# >
# > Fixed effects
# >
# > parameter M_est theta M_se SD_est Power Power_bw Power_satt
# > (Intercept) 0.0048 0.0 1.30 1.30 0.050 . .
# > time 0.0011 0.0 0.25 0.25 0.054 . .
# > time:treatment -1.1000 -1.1 0.32 0.32 0.930 0.93 .
# > ---
# > Number of simulations: 2000 | alpha: 0.05
# > Time points (n1): 11
# > Subjects per cluster (n2 x n3): 40 (treatment)
# > 40 (control)
# > Total number of subjects: 80
# > ---
# > At least one of the models applied a data transformation during simulation,
# > summaries that depend on the true parameter values will no longer be correct,
# > see 'help(summary.plcp_sim)' Die grundlegende Funktionalität des Pakets wird auch in einer glänzenden Webanwendung implementiert, die sich an Benutzer richtet
library( powerlmm )
shiny_powerlmm()