Power computation PFOA experiments Keating Lab

Author

Juan P. Steibel

Overall description of the methods

For all the power computations we assumed that the response variable reasonably fitted a Gaussian distribution. According to the cited literature, this is a reasonable assumption and in some cases (see Kang et al 2020), the normality assumption can be fullfilled with a suitable transformation.

Given the assumption of normality, power computations are easily performed with the pwr package in R.

Power computations for pairwise mean comparisons

For pairwise mean comparisons (where the mean response for two treatments is compared), we need to establish the following input parameters: 1) effect size, 2) sample size, 3) one or two-tailed tests.

The effect size is the standardized mean difference: \(ES= {{\mu_1-\mu_2}\over{\sigma}}\)

In the provided publication(Kim et al. 2020), A mean value of 2.4 ng/mL with a standard deviation of 1.7 ng/mL is reported. It’s also indicated that the range is between 0.3 and 14.5.

To compute plausible effects, assumed mean differences between 0.0 and 12.5 ng/mL (maximum - mean value) and divided those by the reported SD and computed power for each value in the sequence. Then, I repeated those computations for a series of sample sizes from n=5, n=10, and n=20.

This can be adjusted to other values as needed

Running Code

library(tidyverse)
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
✔ ggplot2 3.4.0      ✔ purrr   1.0.0 
✔ tibble  3.1.8      ✔ dplyr   1.0.10
✔ tidyr   1.2.1      ✔ stringr 1.5.0 
✔ readr   2.1.3      ✔ forcats 0.5.2 
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(pwr)
library(ggplot2)

#input parameters
#overall mean
m<-2.4
#max expected value (for a mean treatment!)
max<-14.5
#Standard deviation (not SE!)
sd<-1.7
#sample sizes
n<-c(5,10,20)

#computations
m2<-seq(m,max,.5)
es<-(m2-m)/sd
tt<-lapply(n,function(x) pwr.t2n.test(n1 = x,n2 = x,d = es) )
#plot(m2-m,tt$power)
power=(lapply(tt,function(x) x$power)%>%unlist)
N=as.factor(rep(n,each=length(es)))
difs=rep(m2,length(n))
pow1<-tibble(N,difs,power)
ggplot(pow1,aes(y=power,x=difs,colour=N))+geom_line()

Conclussion

With these assumed values, and N=5 in each group would give enough power (p close to 1.0) to detect a difference of 7.5 ng/mL between two groups when testing with \(\alpha=0.05\) and with N=20 per groups we would have enough power to detect a difference of 5 ng/mL.

Potential criticism

We are looking here at in-sample/within-population variation only. Such that we don’t know what would be a plausible mean in an alternative population

Alternative computation based on Estonian data

Bellavia et al (2023) Compared PFOA concentrations across different populations and they provide mean and SD for each population as well as the combined estimate. The difference between the two populations was only 0.62 ng/mL and a combined SD=0.78. We used the combined estimate of the SD and the individual population means to compute effect sizes

n<-seq(10,200,10)
sd=0.78
meandif=0.62

d=meandif/sd

tt<-pwr.t2n.test(n1 = n,n2 = n,d = d)
plot(tt$power~n,xlab="N: sample size per group",ylab = "power",type="l")

Conclussion

A sample size of N=50 per group would be enough to detect the published difference at the average posted variation within populations. In the published paper, the authors used N between 150 and 200.

A high/low variance scenario could also be obtained.

testing for the significance of a correlation coefficient

When looking at the association of PFOA between different tissues, we only need an educated guess of the magnitud of the correlation coefficient. Kang et. al (2020) published an estimate for the correlation between serum and follicle of 0.93 (main text, bottom of page 8).

With such a large magnitude of the correlation coefficient, even small sample sizes will produce enough power. In lieu of a sensitivity analysis, I used correlation coefficient values betweem 0.6 and 0.9 (the rage of correlations for different PFAS components in Kang et al 2020).

n<-seq(5,50,5)
r<-c(0.6,0.75,0.85,0.9)
tt<-lapply(r,function(x) pwr.r.test(n =n ,r = x) )
#plot(m2-m,tt$power)
power=(lapply(tt,function(x) x$power)%>%unlist)
N=(rep(n,length(r)))
correlation=as.factor(rep(r,each=length(n)))
pow2<-tibble(N,correlation,power)
ggplot(pow2,aes(y=power,x=N,colour=correlation))+geom_line()

###Conclussion Even for the most modest correlation coefficient value \(\rho = 0.6\), a sample size of 20 will provide power over 0.8.

Note: this is likely a within-population analysis as this power may be affected if heterogeneous samples (samples from several populations are mixed).

Overall conclusion

Based on these analyses, the largest sample size is for the between sample comparison and then a subsample of those could be used for the correlation analyses.

I am happy to compute power for different scenarios as needed.