--- title: "Non-Inferiority" lang: "en" output: rmarkdown::html_vignette: css: vignette.css toc: true toc_depth: 1 vignette: > %\VignetteIndexEntry{Non-Inferiority} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#" ) ```
 

Details and examples of other methods are accessible via the menu bar on top of the page and in the online manual of all functions.

```{r setup} library(PowerTOST) # attach the library ``` # Defaults | Parameter | Argument | Purpose | Default | |-|--|------|--| | $\small{\alpha}$ | `alpha` | Nominal level of the test | `0.025` | | $\small{\pi}$ | `targetpower` | Minimum desired power | `0.80` | | logscale | `logscale` | Analysis on log-transformed or original scale? | `TRUE` | | margin | `margin` | Non-inferiority margin | see below | | $\small{\theta_0}$ | `theta0` | ‘True’ or assumed T/R ratio | see below | | *CV* | `CV` | CV | none | | design | `design` | Planned design | `"2x2"` | | imax | `imax` | Maximum number of iterations | `100` | | print | `print` | Show information in the console? | `TRUE` | | details | `details` | Show details of the sample size search? | `FALSE` | Note that contrary to the other functions of the package a one-sided *t*-test (instead of TOST) is employed. Hence, $\small{\alpha}$ defaults to 0.025.\ Defaults depending on the argument `logscale`: | Parameter | Argument | `logscale=TRUE` | `logscale=FALSE` | |-|----|:--------:|:--------:| | margin | `margin` | `0.80` | `–0.20` | | $\small{\theta_0}$ | `theta0` | `0.95` | `+0.05` | Arguments `targetpower`, `margin`, `theta0`, and `CV` have to be given as fractions, not in percent.\ The *CV* is generally the *within-* (intra-) subject coefficient of variation. Only for `design = "parallel"` it is the *total* (a.k.a. pooled) *CV*. Designs with one (parallel), two (conventional crossover and paired), and three or four periods (replicates) are supported. ``` # design name df # "parallel" 2 parallel groups n-2 # "2x2" 2x2 crossover n-2 # "2x2x2" 2x2x2 crossover n-2 # "2x2x3" 2x2x3 replicate crossover 2n-3 # "2x2x4" 2x2x4 replicate crossover 3n-4 # "2x4x4" 2x4x4 replicate crossover 3n-4 # "2x3x3" partial replicate (2x3x3) 2n-3 # "2x4x2" Balaam’s (2x4x2) n-2 # "2x2x2r" Liu’s 2x2x2 repeated x-over 3n-2 # "paired" paired means n-1 ``` The terminology of the `design` argument follows this pattern: `treatments x sequences x periods`. The conventional TR|RT (a.k.a. AB|BA) design can be abbreviated as `"2x2"`. Some call the `"parallel"` design a ‘one-sequence’ design. The design `"paired"` has two periods but no sequences, *e.g.*, in studying linear pharmacokinetics a single dose is followed by multiple doses. A profile in steady state (T) is compared to the one after the single dose (R). Note that the underlying model assumes no period effects. With `sampleN.noninf(..., details = FALSE, print = FALSE)` results are provided as a data frame ^[R Documentation. *Data Frames.* 2020-10-26. [R-manual](https://stat.ethz.ch/R-manual/R-devel/library/base/html/data.frame.html).] with eight columns `Design`, `alpha`, `CV`, `theta0`, `Margin`, `Sample size`, `Achieved power`, and `Target power`. To access *e.g.*, the sample size use either `sampleN.noninf[1, 6]` or `sampleN.noninf[["Sample size"]]`. We suggest to use the latter in scripts for clarity. The estimated sample size gives always the *total* number of subjects (not subject/sequence in crossovers or subjects/group in parallel designs – like in some other software packages). # Non-Inferiority If the supplied margin is < 1 (`logscale = TRUE`) or < 0 (`logscale = FALSE`), then it is assumed that *higher* response values are better. The hypotheses are with * `logscale = TRUE` $$\small{H_0:\theta_0 \leq \log({margin})\:vs\:H_1:\theta_0>\log({margin})}$$ where $\small{\theta_0=\mu_\textrm{T}/\mu_\textrm{R}}$ * `logscale = FALSE` $$\small{H_0:\theta_0 \leq {margin}\:vs\:H_1:\theta_0>{margin}}$$ where $\small{\theta_0=\mu_T-\mu_R}$ ## Example 1 Estimate the sample size for assumed intra-subject *CV* 0.25. Defaults `margin` 0.80 and $\small{\theta_{0}}$ 0.95 employed. ```{r example1a} sampleN.noninf(CV = 0.25) ``` To get only the sample size: ```{r example1b} sampleN.noninf(CV = 0.25, details = FALSE, print = FALSE)[["Sample size"]] ``` Note that the sample size is always rounded up to give balanced sequences (here a multiple of two). Since power is higher than our target, likely this was the case here. Let us assess that:\ Which power will we get with a sample size of 35? ```{r example1c} power.noninf(CV = 0.25, n = 35) ``` Confirmed that with 35 subjects we will already reach the target power. That means also that one dropout will not compromise power. # Non-Superiority If the supplied margin is > 1 (`logscale = TRUE`) or > 0 (`logscale = FALSE`), then it is assumed that *lower* response values are better. The hypotheses are with * `logscale = TRUE` $$\small{H_{0}:\theta_0 \geq \log({margin})\:vs\:H_{1}:\theta_0<\log({margin})}$$ where $\small{\theta_0=\mu_\textrm{T}/\mu_\textrm{R}}$ * `logscale = FALSE` $$\small{H_{0}:\theta_0 \geq {margin}\:vs\:H_{1}:\theta_0<{margin}}$$ where $\small{\theta_0=\mu_T-\mu_R}$ ## Example 2 Estimate the sample size for assumed intra-subject *CV* 0.25. ```{r example2} sampleN.noninf(CV = 0.25, margin = 1.25, theta0 = 1/0.95) ``` Same sample size like in [example 1](#example-1) since reciprocal values of both `margin` 0.80 and $\small{\theta_{0}}$ are specified. # Bracketing Approach Compare a new modified release formulation (regimen once a day) with an intermediate release formulation (twice a day).^[European Medicines Agency, Committee for Medicinal Products for Human Use. *Guideline on the pharmacokinetic and clinical evaluation of modified release dosage forms.* London. 20 November 2014. EMA/CPMP/EWP/280/96 Corr1. [online](https://www.ema.europa.eu/en/documents/scientific-guideline/guideline-pharmacokinetic-and-clinical-evaluation-modified-release-dosage-forms_en.pdf).] *C*~min~ is the target metric for efficacy (non-inferiority) and *C*~max~ for safety (non-superiority). Margins are 0.80 for *C*~min~ and 1.25 for *C*~max~. *CV*s are 0.35 for *C*~min~ and 0.20 for *C*~max~; $\small{\theta_{0}}$ 0.95 for *C*~min~ and 1.05 for *C*~max~. Full replicate design due to the high variability of *C*~min~.\ Which PK metric leads the sample size? ```{r bracket1} res <- data.frame(design = "2x2x4", metric = c("Cmin", "Cmax"), margin = c(0.80, 1.25), CV = c(0.35, 0.20), theta0 = c(0.95, 1.05), n = NA, power = NA, stringsAsFactors = FALSE) # this line for R <4.0.0) for (i in 1:2) { res[i, 6:7] <- sampleN.noninf(design = res$design[i], margin = res$margin[i], theta0 = res$theta0[i], CV = res$CV[i], details = FALSE, print = FALSE)[6:7] } print(res, row.names = FALSE) ``` The sample size depends on *C*~min~. Hence, the study is ‘overpowered’ for *C*~max~. ```{r bracket2} power.noninf(design = "2x2x4", margin = 1.25, CV = 0.20, theta0 = 1.05, n = 32) ``` Therefore, that gives us some ‘safety margin’ for *C*~max~. ```{r bracket3} power.noninf(design = "2x2x4", margin = 1.25, CV = 0.25, theta0 = 1.10, n = 32) # higher CV, worse theta0 ``` The bracketing approach does not necessarily give lower sample sizes than tests for equivalence. In this example we could aim at reference-scaling for the highly variable *C*~min~ and at conventional ABE for *C*~max~. ```{r bracket4} res <- data.frame(design = "2x2x4", intended = c("ABEL", "ABE"), metric = c("Cmin", "Cmax"), CV = c(0.35, 0.20), theta0 = c(0.90, 1.05), n = NA, power = NA, stringsAsFactors = FALSE) # this line for R <4.0.0 res[1, 6:7] <- sampleN.scABEL(CV = res$CV[1], theta0 = res$theta0[1], design = res$design[1], print = FALSE, details = FALSE)[8:9] res[2, 6:7] <- sampleN.TOST(CV = res$CV[2], theta0 = res$theta0[2], design = res$design[2], print = FALSE, details = FALSE)[7:8] print(res, row.names = FALSE) ``` Which method is optimal is a case-to-case decision. Although in this example the bracketing approach seems to be the ‘winner’ (32 subjects instead of 34), we might fail if the *CV* of *C*~min~ is larger than assumed, whereas in reference-scaling we might still pass due to the expanded limits. ```{r bracket5} n <- sampleN.scABEL(CV = 0.35, theta0 = 0.90, design = "2x2x4", print = FALSE, details = FALSE)[["Sample size"]] # CV and theta0 of both metrics worse than assumed res <- data.frame(design = "2x2x4", intended = c("ABEL", "ABE"), metric = c("Cmin", "Cmax"), CV = c(0.50, 0.25), theta0 = c(0.88, 1.12), n = n, power = NA, stringsAsFactors = FALSE) # this line for R <4.0.0 res[1, 7] <- power.scABEL(CV = res$CV[1], theta0 = res$theta0[1], design = res$design[1], n = n) res[2, 7] <- power.TOST(CV = res$CV[2], theta0 = res$theta0[2], design = res$design[2], n = n) print(res, row.names = FALSE) ``` See also the vignettes [RSABE](RSABE.html "Reference-scaled Average Bioequivalence"), [ABE](ABE.html "Average Bioequivalence"), and [PA](PA.html "Power Analysis"). # Author{#author} Detlew Labes # License{#license}

[GPL-3](https://cran.r-project.org/web/licenses/GPL-3 "GNU General Public License, Version 3") `r Sys.Date()` Helmut Schütz