# A tibble: 3 × 3
N d sig.level
<dbl> <dbl> <dbl>
1 NA 0.2 0.05
2 NA 0.5 0.05
3 NA 0.8 0.05
Step 2 — Define generate, analyse, and summarise functions
Generate <-function(condition, fixed_objects =NULL) {Attach(condition) group1 <-rnorm(N) group2 <-rnorm(N, mean=d) dat <-data.frame(group =gl(2, N, labels=c('G1', 'G2')),DV =c(group1, group2)) dat}Analyse <-function(condition, dat, fixed_objects =NULL) { p <-t.test(DV ~ group, dat, var.equal=TRUE)$p.value p}Summarise <-function(condition, results, fixed_objects =NULL) {# Must return a single number corresponding to f(x) in the# root equation f(x) = b ret <-EDR(results, alpha = condition$sig.level) ret}
Step 3 — Optimize N over the rows in design
# Initial search between N = [10,500] for each row using the default# integer solver (integer = TRUE)# In this example, b = target power.# Terminate if prediction CI is consistently within [.795, .805]solved <-SimSolve(design=Design, b=.8, interval=c(10, 500),generate=Generate, analyse=Analyse,summarise=Summarise, predCI.tol = .01, verbose=FALSE)solved
# A tibble: 3 × 3
N d sig.level
<dbl> <dbl> <dbl>
1 393.39 0.2 0.05
2 63.167 0.5 0.05
3 25.471 0.8 0.05
# also can plot median history and estimate precisionplot(solved, 1, type ='history')
plot(solved, 1, type ='density')
Warning in density.default(x, weights = reps/sum(reps)): Selecting bandwidth
*not* using 'weights'
# verify with true power from pwr packagelibrary(pwr)pwr.t.test(d=.2, power = .8, sig.level = .05)
Two-sample t test power calculation
n = 393.4057
d = 0.2
sig.level = 0.05
power = 0.8
alternative = two.sided
NOTE: n is number in *each* group
pwr.t.test(d=.5, power = .8, sig.level = .05)
Two-sample t test power calculation
n = 63.76561
d = 0.5
sig.level = 0.05
power = 0.8
alternative = two.sided
NOTE: n is number in *each* group
pwr.t.test(d=.8, power = .8, sig.level = .05)
Two-sample t test power calculation
n = 25.52458
d = 0.8
sig.level = 0.05
power = 0.8
alternative = two.sided
NOTE: n is number in *each* group
# use estimated N results to see how close power wasN <- solved$Npwr.t.test(d=.2, n=N[1], sig.level = .05)
Two-sample t test power calculation
n = 393.3934
d = 0.2
sig.level = 0.05
power = 0.7999878
alternative = two.sided
NOTE: n is number in *each* group
pwr.t.test(d=.5, n=N[2], sig.level = .05)
Two-sample t test power calculation
n = 63.16727
d = 0.5
sig.level = 0.05
power = 0.7962324
alternative = two.sided
NOTE: n is number in *each* group
pwr.t.test(d=.8, n=N[3], sig.level = .05)
Two-sample t test power calculation
n = 25.47103
d = 0.8
sig.level = 0.05
power = 0.7991415
alternative = two.sided
NOTE: n is number in *each* group
# with roundingN <-ceiling(solved$N)pwr.t.test(d=.2, n=N[1], sig.level = .05)
Two-sample t test power calculation
n = 394
d = 0.2
sig.level = 0.05
power = 0.8005931
alternative = two.sided
NOTE: n is number in *each* group
pwr.t.test(d=.5, n=N[2], sig.level = .05)
Two-sample t test power calculation
n = 64
d = 0.5
sig.level = 0.05
power = 0.8014596
alternative = two.sided
NOTE: n is number in *each* group
pwr.t.test(d=.8, n=N[3], sig.level = .05)
Two-sample t test power calculation
n = 26
d = 0.8
sig.level = 0.05
power = 0.8074866
alternative = two.sided
NOTE: n is number in *each* group
Solving effect sizes
Similar setup as above, however goal is now to solve d given sample size and power inputs (inputs for root no longer required to be an integer) # Step 1: Create design and solve for missing NAs (effect size d, in this case)
# A tibble: 3 × 3
N d sig.level
<dbl> <dbl> <dbl>
1 100 NA 0.05
2 50 NA 0.05
3 25 NA 0.05
#~~~~~~~~~~~~~~~~~~~~~~~~#### Step 2 --- Define generate, analyse, and summarise functions (same as above)#~~~~~~~~~~~~~~~~~~~~~~~~#### Step 3 --- Optimize d over the rows in design# search between d = [.1, 2] for each row# In this example, b = target power# note that integer = FALSE to allow smooth updates of d, and convergence# is based on whether the prediction CI is consistently within [.795, .805]solved <-SimSolve(design=Design, b = .8, interval=c(.1, 2),generate=Generate, analyse=Analyse,summarise=Summarise, integer=FALSE, predCI.tol=.01, verbose=FALSE)solved
# A tibble: 3 × 3
N d sig.level
<dbl> <dbl> <dbl>
1 100 0.39776 0.05
2 50 0.56304 0.05
3 25 0.80221 0.05