Algebra [Power / Sample Size]

posted by Helmut Homepage – Vienna, Austria, 2022-05-16 17:01 (710 d 00:01 ago) – Posting: # 22990
Views: 2,297

Hi Divyen!

❝ Even I am getting around CV = 156% (pooled variance estimate) considering N=140 (N=70/group).

❝ Only when N=70 is considered, I am getting CV~92%.


How did you calculate it?

The lower and upper limits \(\small{\{L,U\}}\) of a \(\small{1-2\,\alpha}\) confidence interval for given sample sizes \(\small{n_1,\,n_2}\)1 are calculated by $$\{L,U\}=\exp\left(\log_e(PE)\mp t_{1-\alpha,n_1+n_2-2}\cdot \sqrt{MSE\cdot(1/n_1+1/n_2)} \right)\textsf{.}\tag{1}$$ Hence, for given \(\small{1-2\,\alpha}\), \(\small{\{L,U\}}\), and \(\small{n_1,\,n_2}\) we can derive the \(\small{MSE}\) and subsequently calculate the \(\small{CV}\):
  1. Calculate the point estimate \(\small{PE}\) and \(\small{\Delta_\text{CL}}\):$$PE=\sqrt{L\cdot U}\tag{2}$$$$\Delta_\text{CL}=\log_{e}PE-\log_{e}L\;\small{\textsf{or}}\tag{3a}$$$$\Delta_\text{CL}=\log_{e}U-\log_{e}PE\textsf{,}\phantom{\small{\textsf{or}}}\tag{3b}$$ where \(\small{\Delta_\text{CL}}\) is the difference between one of the confidence limits and the point estimate in \(\small{\log_{e}\textsf{-}}\)scale (aka the ‘log half-width’). In practice select \(\small{(3\text{a})}\) or \(\small{(3\text{b})}\) which is based on the most significant digits.

  2. \(\small{\log_{e}}\)-transform \(\small{(1)}\):$$\log_e\{L,U\}=\log_e(PE)\mp t_{1-\alpha,n_1+n_2-2}\cdot \sqrt{MSE\cdot(1/n_1+1/n_2)}\tag{4}$$
  3. Rearrange \(\small{(3)}\), substitute in \(\small{(4)}\), and cancel \(\small{\log_e(PE)}\):$$\require{cancel}\eqalign{\Delta_\text{CL}&=\cancel{\log_e(PE)-\log_e(PE)+}t_{1-\alpha,n_1+n_2-2}\cdot \sqrt{MSE\cdot(1/n_1+1/n_2)}\\
    &=t_{1-\alpha,n_1+n_2-2}\cdot \sqrt{MSE\cdot(1/n_1+1/n_2)}}\tag{5}$$
  4. Solve \(\small{(5)}\) for \(\small{MSE}\): $$\eqalign{\sqrt{MSE\cdot(1/n_1+1/n_2)}&=\Delta_\text{CL}/t_{1-\alpha,n_1+n_2-2}\\
    MSE\cdot(1/n_1+1/n_2)&=\left(\Delta_\text{CL}/t_{1-\alpha,n_1+n_2-2}\right)^2\\
    MSE&=\frac{\left(\Delta_\text{CL}/t_{1-\alpha,n_1+n_2-2}\right)^2}{1/n_1+1/n_2}\\
    \small{\color{Blue}{\textsf{Note that if }}}\color{Blue}{n_1=n_2:}MSE&=\frac{\color{Blue}{N}\cdot\left(\Delta_\text{CL}/t_{1-\alpha,\color{Blue}{N}-2}\right)^2}{\color{Blue}{4}}}\tag{6}$$ If only the total sample size \(\small{N}\) is known and \(\small{n_1 \neq n_2}\), the calculated \(\small{MSE}\) will be larger than the true one. Hence, if used in a sample size estimation it will be conservative.

  5. Finally as usual:$$CV=\sqrt{\exp(MSE)-1}\tag{7}$$
This algorithm is implemented in the function CI2CV() of PowerTOST.

With Sereng’s numbers:$$\{L,U\}=\{0.87,1.35\},\,n_1=n_2=70,\,N=n_1+n_2=140\\\nu=N-2=138,\,\alpha=0.05,\,t_{1-\alpha,\nu}=1.65597$$ $$PE\approx\sqrt{0.87\times1.35}\approx1.08374\tag{←2}$$ $$\Delta_\text{CL}\approx\log_e1.35-\log_e1.08374\approx\log_e1.08374-\log_e0.87\approx0.21968\tag{←3}$$ $$MSE\approx\frac{\left(0.21968/1.65597\right)^2}{1/70+1/70}\approx\frac{140\times\left(0.21968/1.65597\right)^2}{4}\approx0.61595\tag{←6}$$ $$CV\approx\sqrt{\exp(0.61595)-1}\approx\color{DarkGreen}{0.92272}\tag{←7}$$ Check whether the recalculated \(\small{MSE}\) is correct: $$\{L,U\}\approx100\exp\left(\log_e 1.08374\mp 1.65597\times \sqrt{0.61595\times(1/70+1/70)}\right)\sim\color{DarkGreen}{\{87,135\}}\;\tiny{\blacksquare}\tag{←1}$$ If results don’t match:I get your \(\small{CV}\) for a balanced 2×2×2 crossover design with \(\small{N=140}\). In such a case the denominator in the last line of \(\small{(6)}\) would be \(\small{2}\) instead of \(\small{4}\).2,3
Consequently, the \(\small{MSE}\) doubles and the \(\small{CV}\) is much larger than the correct \(\small{\approx92\%}\): $$\eqalign{MSE&\approx\frac{140\times\left(0.21968/1.65597\right)^2}{\color{Red}{2}}\approx1.23193\\
CV&\approx100\sqrt{\exp(1.23193)-1}\approx\color{Red}{156\%}
}$$ Try:

library(PowerTOST)
print(known.designs()[c(1, 3), c(2:3, 6, 9)], row.names = FALSE)
   design  df bk              name
 parallel n-2  4 2 parallel groups
    2x2x2 n-2  2   2x2x2 crossover

The first column gives the design argument to be used in the functions CI2CV() and CI.BE(), the second are the degrees of freedom (where n is the total sample size), and bk is the ‘design constant’ or the denominator used in \(\small{(6)}\).
You will see that with your \(\small{CV}\) the backcalculated confidence interval does not match the original \(\small{\left\{87,135\right\}}\):

CV  <- 1.558152
MSE <- log(CV^2 + 1)                                                # trivial
CI  <- round(100 * exp(log(1.083744) + c(-1, +1) *
                       1.65597 * sqrt(MSE * (1 / 70 + 1 / 70))), 2) # (1)
cat("CI =", paste0("{", paste(CI, collapse = ", ") , "}\n"))
isTRUE(all.equal(c(87, 135), CI))                                   # check
CI = {79.43, 147.86}
[1] FALSE


In PowerTOST without rounding:

library(PowerTOST)
CV <- CI2CV(lower = 0.87, upper = 1.35, n = c(70, 70), design = "parallel")
CI <- 100 * CI.BE(CV = CV, pe = sqrt(0.87 * 1.35), n = c(70, 70), design = "parallel")
cat("CV =", CV, "\nCI =", paste0("{", paste(CI, collapse = ", ") , "}\n"))
isTRUE(all.equal(100 * c(0.87, 1.35), as.numeric(CI)))             # check
CV = 0.9227379
CI = {87, 135}

[1] TRUE


If you don’t trust in the functions of PowerTOST, use the formulas from above in Base [image]:

L        <-  87 / 100
U        <- 135 / 100
n1       <- n2 <- 70
N        <- n1 + n2
PE       <- sqrt(L * U)                                  # (2)
signif.L <- nchar(as.character(signif(L * 100, 12)))
signif.U <- nchar(as.character(signif(U * 100, 12)))
if (signif.L >= signif.U) {
  Delta.CL <- log(PE) - log(L)                           # (3a)
} else {
  Delta.CL <- log(U) - log(PE)                           # (3b)
}
alpha    <- 0.05
nu       <- N - 2
t.value  <- qt(p = 1 - alpha, df = nu)
MSE      <- (Delta.CL / t.value)^2 / (1 / n1 + 1 / n2)   # (6)
CV       <- sqrt(exp(MSE) - 1)                           # (7)
CI       <- exp(log(PE) + c(-1, +1) *
                t.value * sqrt(MSE * (1 / n1 + 1 / n2))) # (1)
txt      <- paste(
            paste0("\n", paste(rep("—", 30), collapse = "")),
            "\nGiven",
            paste0("\n", paste(rep("—", 30), collapse = "")),
            "\nn1     =",   sprintf("%3.0f", n1),
            "\nn2     =", sprintf("%3.0f", n2),
            "\nalpha  =", sprintf("%6.5g", alpha),
            "\nL      =",  sprintf("%6.2f%%", 100 * L),
            "\nU      =", sprintf("%6.2f%%", 100 * U),
            paste0("\n", paste(rep("—", 30), collapse = "")),
            "\nCalculated             Formula",
            paste0("\n", paste(rep("—", 30), collapse = "")),
            "\nN      =", sprintf("%3.0f", N),
            "\nPE     =", sprintf("%6.2f%%", 100 * PE),
            "          (2)",
            "\nDelta  =", sprintf("%9.5f", Delta.CL),
            "        (3)",
            "\nnu     =", sprintf("%3.0f", nu),
            "\nt      =", sprintf("%9.5f", t.value),
            "\nMSE    =", sprintf("%9.5f", MSE),
            "        (6)",
            "\nCV     =", sprintf("%6.2f%%", 100 * CV),
            "          (7)",
            paste0("\n", 100 * (1 - 2 * alpha), "% CI ="),
            sprintf("{%.2f%%,", 100 * CI[1]),
            sprintf("%.2f%%} (1)", 100 * CI[2]),
            paste0("\n", paste(rep("—", 30), collapse = "")))
if (isTRUE(all.equal(100 * c(L, U), round(100 * CI, 2)))) {
  txt <- paste0(txt, "\nThe calculated CI agrees with\nthe given one.\n")
} else {
  txt <- paste0(txt, "\nThe calculated CI does not\nagree with given one! ",
               "Please\ncheck.\n")
}
cat(txt)
——————————————————————————————
Given
——————————————————————————————
n1     =  70
n2     =  70
alpha  =   0.05
L      =  87.00%
U      = 135.00%
——————————————————————————————
Calculated             Formula
——————————————————————————————
N      = 140
PE     = 108.37%           (2)
Delta  =   0.21968         (3)
nu     = 138
t      =   1.65597
MSE    =   0.61597         (6)
CV     =  92.27%           (7)
90% CI = {87.00%, 135.00%} (1)
——————————————————————————————
The calculated CI agrees with
the given one.



  1. In a parallel design the indices refer to the groups and in a crossover to the sequences.
  2. Schütz H. Sample Size Estimation for BE Studies. Bucarest, 19 March 2013. Slides 26–29.
  3. Yuan J, Tong T, Tang M-L. Sample Size Calculation for Bioequivalence Studies Assessing Drug Effect and Food Effect at the Same Time With a 3-Treatment Williams Design. Regul Sci. 2013; 47(2): 242–7. doi:10.1177/2168479012474273.

Dif-tor heh smusma 🖖🏼 Довге життя Україна! [image]
Helmut Schütz
[image]

The quality of responses received is directly proportional to the quality of the question asked. 🚮
Science Quotes

Complete thread:

UA Flag
Activity
 Admin contact
22,993 posts in 4,828 threads, 1,651 registered users;
105 visitors (0 registered, 105 guests [including 6 identified bots]).
Forum time: 17:02 CEST (Europe/Vienna)

Never never never never use Excel.
Not even for calculation of arithmetic means.    Martin Wolfsegger

The Bioequivalence and Bioavailability Forum is hosted by
BEBAC Ing. Helmut Schütz
HTML5