Power and Sample Size Analysis: Z test
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Abstract
This article provide a brief background about power and sample size analysis. Then, power and sample size analysis is computed for the Z test.
Next articles will describe power and sample size analysis for:
- one sample and two samples t test;,
- p test, chi-square test, correlation;
- one-way ANOVA;
- DOE .
Finally, a PDF article showing both the underlying methodology and the R code here provided, will be published.
Background
Power and sample size analysis are important tools for assessing the ability of a statistical test to detect when a null hypothesis is false, and for deciding what sample size is required for having a reasonable chance to reject a false null hypothesis.
The following four quantities have an intimate relationship:
- sample size
- effect size
- significance level = P(Type I error) = probability of finding an effect that is not there
- power = 1 – P(Type II error) = probability of finding an effect that is there
Given any three, we can determine the fourth.
Z test
The formula for the power computation can be implemented in R, using a function like the following:
powerZtest = function(alpha = 0.05, sigma, n, delta){ zcr = qnorm(p = 1-alpha, mean = 0, sd = 1) s = sigma/sqrt(n) power = 1 - pnorm(q = zcr, mean = (delta/s), sd = 1) return(power) } |
In the same way, the function to compute the sample size can be built.
sampleSizeZtest = function(alpha = 0.05, sigma, power, delta){ zcra=qnorm(p = 1-alpha, mean = 0, sd=1) zcrb=qnorm(p = power, mean = 0, sd = 1) n = round((((zcra+zcrb)*sigma)/delta)^2) return(n) } |
The above code is provided for didactic purpose. In fact, the pwr package provide a function to perform power and sample size analysis.
install.packages("pwr") library(pwr) |
The function pwr.norm.test() computes parameters for the Z test. It accepts the four parameters see above, one of them passed as NULL. The parameter passed as NULL is determined from the others.
Some examples
Power at for against 100″ />.
, ,
sigma = 15 h0 = 100 ha = 105 |
This is the result with the self-made function:
> powerZtest(n = 20, sigma = sigma, delta = (ha-h0)) [1] 0.438749 |
And here the same with the pwr.norm.test() function:
> d = (ha - h0)/sigma > pwr.norm.test(d = d, n = 20, sig.level = 0.05, alternative = "greater") Mean power calculation for normal distribution with known variance d = 0.3333333 n = 20 sig.level = 0.05 power = 0.438749 alternative = greater |
The sample size of the test for power equal to 0.80 can be computed using the self-made function
> sampleSizeZtest(sigma = sigma, power = 0.8, delta = (ha-h0)) [1] 56 |
or with the pwr.norm.test() function:
> pwr.norm.test(d = d, power = 0.8, sig.level = 0.05, alternative = "greater") Mean power calculation for normal distribution with known variance d = 0.3333333 n = 55.64302 sig.level = 0.05 power = 0.8 alternative = greater |
The power function can be drawn:
ha = seq(95, 125, l = 100) pwrTest = pwr.norm.test(d = d, n = 20, sig.level = 0.05, alternative = "greater")$power plot(d, pwrTest, type = "l", ylim = c(0, 1)) |
View (and download) the full code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | ### Self-made functions to perform power and sample size analysis powerZtest = function(alpha = 0.05, sigma, n, delta){ zcr = qnorm(p = 1-alpha, mean = 0, sd = 1) s = sigma/sqrt(n) power = 1 - pnorm(q = zcr, mean = (delta/s), sd = 1) return(power) } sampleSizeZtest = function(alpha = 0.05, sigma, power, delta){ zcra=qnorm(p = 1-alpha, mean = 0, sd=1) zcrb=qnorm(p = power, mean = 0, sd = 1) n = round((((zcra+zcrb)*sigma)/delta)^2) return(n) } ### Load pwr package to perform power and sample size analysis library(pwr) ### Data sigma = 15 h0 = 100 ha = 105 ### Power analysis # Using the self-made function powerZtest(n = 20, sigma = sigma, delta = (ha-h0)) # Using the pwr package pwr.norm.test(d = (ha - h0)/sigma, n = 20, sig.level = 0.05, alternative = "greater") ### Sample size analysis # Using the self-made function sampleSizeZtest(sigma = sigma, power = 0.8, delta = (ha-h0)) # Using the pwr package pwr.norm.test(d = (ha - h0)/sigma, power = 0.8, sig.level = 0.05, alternative = "greater") ### Power function for the two-sided alternative ha = seq(95, 125, l = 100) d = (ha - h0)/sigma pwrTest = pwr.norm.test(d = d, n = 20, sig.level = 0.05, alternative = "greater")$power plot(d, pwrTest, type = "l", ylim = c(0, 1)) |
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.