# Statistical power calculation in R using the package "pwr": # pwr: https://cran.r-project.org/web/packages/pwr/index.html # If pwr is not installed yet: # install.packages(pwr) library("pwr") # For t-test power calculation (equal sample sizes): # pwr.t.test(n = , d = , sig.level = , power = , type = c("two.sample", "one.sample", "paired")) # d is for effect size # Cohen suggests that d values of 0.2, 0.5, and 0.8 represent small, medium, and large effect sizes, respectively. # For Cohen's d value: https://www.rdocumentation.org/packages/DescTools/versions/0.99.19/topics/CohenD pwr.t.test(n = 30, d = 0.5, sig.level = 0.05, type = "two.sample") # For t-test power calculation (unequal sample sizes): # pwr.t2n.test(n1 = , n2= , d = , sig.level =, power = ) pwr.t2n.test(n1 = 30, n2= 50, d = 0.5, sig.level = 0.05) # For a one-way analysis of variance power calculation: # pwr.anova.test(k = , n = , f = , sig.level = , power = ) # k is the number of groups, n is the common sample size in each group, and f is effect size # Cohen suggests that f values of 0.1, 0.25, and 0.4 represent small, medium, and large effect sizes respectively pwr.anova.test(k = 4, n = 12, f = 0.25, sig.level = 0.05) # For correlation coefficients power analysis: # pwr.r.test(n = , r = , sig.level = , power = ) # n is the sample size and r is the correlation coefficient # Cohen suggests that r values of 0.1, 0.3, and 0.5 represent small, medium, and large effect sizes, respectively pwr.r.test(n = 50, r = 0.3, sig.level = 0.05) # When comparing two proportions from equal size samples, to calculate the power of the test: # pwr.2p.test(h = , n = , sig.level = , power = ) # h is the effect size and n is the common sample size in each group # Cohen suggests that h values of 0.2, 0.5, and 0.8 represent small, medium, and large effect sizes, respectively pwr.2p.test(h = 0.5, n = 50, sig.level = 0.05) # For unequal sample sizes: # pwr.2p2n.test(h = , n1 = , n2 = , sig.level = , power = ) pwr.2p2n.test(h = 0.5, n1 = 40, n2 = 60, sig.level = 0.05) # Example # For chi-square tests: # pwr.chisq.test(w = , N = , df = , sig.level = , power = ) # w is the effect size, N is the total sample size, and df is the degrees of freedom # Cohen suggests that w values of 0.1, 0.3, and 0.5 represent small, medium, and large effect sizes, respectively pwr.chisq.test(w = 0.3, N = 100, df = 1, sig.level = 0.05) # Example # An alternative method is provided in DescTools::power.chisq.test(). SEE: https://www.rdocumentation.org/packages/DescTools/versions/0.99.19/topics/power.chisq.test # EXAMPLES: Power calculations from Quick-R: # For a one-way ANOVA comparing 5 groups, calculate the # sample size needed in each group to obtain a power of # 0.80, when the effect size is moderate (0.25) and a # significance level of 0.05 is employed. pwr.anova.test(k=5,f=.25,sig.level=.05,power=.8) # What is the power of a one-tailed t-test, with a # significance level of 0.01, 25 people in each group, # and an effect size equal to 0.75? pwr.t.test(n=25,d=0.75,sig.level=.01,alternative="greater") # Using a two-tailed test proportions, and assuming a # significance level of 0.01 and a common sample size of # 30 for each proportion, what effect size can be detected # with a power of .75? pwr.2p.test(n=30,sig.level=0.01,power=0.75) # Power calculation for GLM using the R package pwr https://www.statmethods.net/stats/power.html https://data-se.netlify.com/2018/07/24/power-calculation-for-the-general-linear-model # For more examples, see: https://cran.r-project.org/web/packages/pwr/vignettes/pwr-vignette.html # Creating Power or Sample Size Plots # Plot sample size curves for detecting correlations of various sizes # range of correlations r <- seq(.1, .5, .01) nr <- length(r) # power values p <- seq(.4, .9, .1) np <- length(p) # obtain sample sizes samsize <- array(numeric(nr*np), dim=c(nr,np)) for (i in 1:np){ for (j in 1:nr){ result <- pwr.r.test(n = NULL, r = r[j], sig.level = .05, power = p[i], alternative = "two.sided") samsize[j,i] <- ceiling(result$n) } } # set up graph xrange <- range(r) yrange <- round(range(samsize)) colors <- rainbow(length(p)) plot(xrange, yrange, type="n", xlab="Correlation Coefficient (r)", ylab="Sample Size (n)" ) # add power curves for (i in 1:np){ lines(r, samsize[,i], type="l", lwd=2, col=colors[i]) } # add annotation (grid lines, title, legend) abline(v=0, h=seq(0,yrange[2],50), lty=2, col="grey89") abline(h=0, v=seq(xrange[1],xrange[2],.02), lty=2, col="grey89") title("Sample Size Estimation for Correlation Studies\n Sig=0.05 (Two-tailed)") legend("topright", title="Power", as.character(p), fill=colors) # t-test power curve plot: # FROM: https://www.r-exercises.com/2017/11/11/power-analysis-tutorial sample_sizes = seq(5, 300, by=5) power_t_test = pwr.t.test(n = sample_sizes , d = 0.3 , sig.level = 0.05, power = , type = "two.sample") par(mfrow=c(1,1),oma=c(0,0,0,0),mar=c(4.5,4.5,0.5,0.5)) plot(sample_sizes,power_t_test$power, type='b', pch=16, las=1, ylab='statistical power', xlab='sample size', cex.lab=1.4, cex.axis=1.2, ylim = c(0,1), col = "blue") abline(h = 0.80, lty=2, lwd=2,col='red') # For effect sizes, see: https://cran.r-project.org/web/packages/pwr/vignettes/pwr-vignette.html # To find out an effect size (ES): cohen.ES(test = "r", size = "medium") cohen.ES(test = "t", size = "medium") cohen.ES(test = "anov", size = "medium") cohen.ES(test = "p", size = "medium") cohen.ES(test = "chisq", size = "medium") cohen.ES(test = "f2", size = "medium") # 'arg(test)' should be one of “p”, “t”, “r”, “anov”, “chisq”, “f2” # 'arg(size)' should be one of “small”, “medium”, “large” # List of functions in pwr: # function power calculations for # pwr.2p.test two proportions (equal n) # pwr.2p2n.test two proportions (unequal n) # pwr.anova.test balanced one way ANOVA # pwr.chisq.test chi-square test # pwr.f2.test general linear model # pwr.p.test proportion (one sample) # pwr.r.test correlation # pwr.t.test t-tests (one sample, 2 sample, paired) # pwr.t2n.test t-test (two samples with unequal n) # FROM: https://www.statmethods.net/stats/power.html