Adjusting weight to reflect group differences in Model [General Statistics]
❝ As per EMA […]
@Divyen: You are absolutely right when it comes to designing a study.
@Kotu: Were you interested in what to do when Murphy’s law hit and it turned out that groups of eligible subjects differed by a great extent? If yes:
- First of all, make sure that you use the not the simple t-test but the Welch-test. The former is sensitive (specifically: anticonservative) to unequal variances and/or group sizes. Hence, that’s important even for equal group sizes.
- FDA Section VI.B.d:
‘[…] equal variances should not be assumed.’
- EMA Section 4.1.8:
‘The statistical analysis should take into account sources of variation that can be reasonably assumed to have an effect on the response variable.’
SAS
and ‘The precise model to be used for the analysis should be pre-specified in the protocol.’
If this was not the case, essentially you have two options.
Regulatory acceptance not guaranteed. At the 2nd GBHI conference (September 2016, Rockville) there was a discussion about adding body weight as a covariate in crossover studies in patients because it may change with time. Response of regulators: No (though apparently the FDA was more open to the idea).
❝ In general, it is recommended to have balanced between treatment arms.
Correct – even in a crossover. It is a common misconception that period effects mean out because T and R are affected to the same degree. That’s not correct for unbalanced sequences. However, unless the degree if imbalance is extreme, the bias is small.
Edit: The published Two-Stage-Design methods are also correct in the strict sense for balanced sequences only. At the end an
Example: Potvin ‘Method B’ (default), 24 subjects dosed in the first stage, 12 eligible in sequence RT and 10 in sequence TR (dropout-rate ≈8.3%), CV 25%, exact sample size re-estimation (default) taking the stage-term in the pooled analysis into account.
TSD(n1 = 24, n1.1 = 12, n1.2 = 10, CV = 25)
TSD-method: 1 (α = 0.0294, GMR = 95%, power = 80%)
Sample size re-estimation: exact
──────────────────────────────────────────────────
Stage 1
──────────────────────────────────────────────────
Randomized/dosed subjects : 24
Eligible subjects (drop-outs) : 22 (2)
Eligible subjects in sequences RT|TR : 12|10
Allocation ratio RT/TR : 1:0.8333
Drop-out rate : 8.333%
──────────────────────────────────────────────────
Interim analysis
──────────────────────────────────────────────────
Relevant PK metrics’ maximum CV : 25%
Estimated total sample size : 34
──────────────────────────────────────────────────
Stage 2
──────────────────────────────────────────────────
Preliminary sample size : 12
Expected drop-out rate : 8.333%
Final sample size (adj. for drop-outs): 14
Randomized subjects in sequences RT|TR: 6|8
Expected eligible subj. in seq. RT|TR : 6|7
Allocation ratio RT/TR : 1:1.167
──────────────────────────────────────────────────
Pooled data set
──────────────────────────────────────────────────
Expected eligible subjects : 35
Expected eligible subj. in seq. RT|TR : 18|17
Allocation ratio RT/TR : 1:0.9444 (imbalanced)
Estimated n2 12. Assuming that we will see the same dropout-rate like in the first stage, adjusted n2 14. Instead of dosing seven subjects / sequence, we dose six in sequence RT and eight in sequence TR. If the dropout-rate is realized, we get an allocation-ratio of 1:0.9444, which is not that bad.
library(Power2Stage)
TSD <- function(method1 = 1, method2 = 1, n1, n1.1, n1.2, CV, do.2) {
up2even <- function(n) { # get balanced sequences
return(as.integer(2 * (n %/% 2 + as.logical(n %% 2))))
}
nadj <- function(n, do.r) { # adjust for dropout-rate
return(as.integer(up2even(n / (1 - do.r))))
}
n1.e <- n1.1 + n1.2 # stage 1: eligible subjects
n1.ar <- n1.2 / n1.1 # stage 1: sequence allocation ratio
do.r <- abs((n1.e - n1) / n1) # stage 1: drop-out rate
if(!missing(do.2)) do.2 <- do.2 / 100 # anticipated drop-out rate stage 2
if(missing(do.2)) do.2 <- do.r # apply 1st if not given
CV <- CV / 100
if (method1 == 1) {adj <- 0.0294; GMR <- 0.95; pwr <- 0.8}
if (method1 == 2) {adj <- 0.0280; GMR <- 0.90; pwr <- 0.8}
if (method1 == 3) {adj <- 0.0284; GMR <- 0.95; pwr <- 0.9}
if (method1 == 4) {adj <- 0.0274; GMR <- 0.95; pwr <- 0.9}
if (method1 == 5) {adj <- 0.0269; GMR <- 0.90; pwr <- 0.9}
if (method2 == 1) me <- "exact"
if (method2 == 2) me <- "nct"
if (method2 == 3) me <- "shifted"
n2.p <- sampleN2.TOST(alpha = adj, CV = CV, n1 = n1.e, theta0 = GMR,
targetpower = pwr, method = me)[["Sample size"]]
nt <- n1.e + n2.p # preliminary total sample size
n2.1 <- nadj(nt/2-n1.1, do.2) # adjust for drop-outs
n2.2 <- nadj(nt/2-n1.2, do.2) # adjust for drop-outs
n2 <- n2.1+n2.2 # dosed in stage 2
n2.1e <- round(n2.1*(1-do.2), 0) # stage 2: expected elig. subjects in seq. 1
n2.2e <- round(n2.2*(1-do.2), 0) # stage 2: expected elig. subjects in seq. 2
n2.e <- n2.1e+n2.2e # stage 2: expected elig. subjects
n2.ar <- n2.2e/n2.1e # stage 2: sequence allocation ratio
ar <- (n1.2+n2.2e)/(n1.1+n2.1e) # pooled data’s allocation ratio
ifelse(ar == 1, bal <- "(balanced)", bal <- "(imbalanced)")
sep <- paste(paste0(rep("\u2500", 50), collapse=""), "\n")
if(method2 > 1) me <- c(me, "t-distribution")
cat("\n TSD-method:", method1,
paste0("(\u03b1 = ", adj, ", GMR = ", 100*GMR, "%, power = ", 100*pwr, "%)\n"),
"Sample size re-estimation:", me, "\n", sep,
"Stage 1\n", sep,
"Randomized/dosed subjects :", n1, "\n",
"Eligible subjects (drop-outs) :", n1.e, paste0("(", n1-n1.e,")"), "\n",
"Eligible subjects in sequences RT|TR :", paste0(n1.1, "|", n1.2), "\n",
"Allocation ratio RT/TR :", paste0("1:", signif(n1.ar, 4)), "\n",
"Drop-out rate :", paste0(signif(100*do.r, 4), "%\n"), sep,
"Interim analysis\n", sep,
"Relevant PK metrics’ maximum CV :", paste0(signif(100*CV, 4), "%\n"),
"Estimated total sample size :", as.numeric(nt), "\n", sep,
"Stage 2\n", sep,
"Preliminary sample size :", n2.p, "\n",
"Expected drop-out rate :", paste0(signif(100*do.2, 4),"%\n"),
"Final sample size (adj. for drop-outs):", n2, "\n",
"Randomized subjects in sequences RT|TR:", paste0(n2.1, "|", n2.2), "\n",
"Expected eligible subj. in seq. RT|TR :", paste0(n2.1e, "|", n2.2e), "\n",
"Allocation ratio RT/TR :", paste0("1:", signif(n2.ar, 4)), "\n", sep,
"Pooled data set\n", sep,
"Expected eligible subjects :", n1.e+n2.e, "\n",
"Expected eligible subj. in seq. RT|TR :", paste0(n1.1+n2.1e, "|", n1.2+n2.2e), "\n",
"Allocation ratio RT/TR :", paste0("1:", signif(ar, 4)), bal, "\n\n")
}
method1 <- 1 # select from TSD-Methods
###################################################
# GMR% power% #
# 1 Potvin et al. (2008) Methods B/C: 95 80 #
# 2 Montague et al. (2011) Method D: 90 80 #
# 3 Fuglsang (2013) Method B: 95 90 #
# 4 Fuglsang (2013) Method C1/D1: 95 90 #
# 5 Fuglsang (2013) Method C2/D2: 90 90 #
###################################################
method2 <- 1 # select from power-estimation Methods
#######################################
# 3 shifted t-distribution: good #
# 2 noncentral t-distribution: better #
# 1 exact (Owen’s Q-function): best #
#######################################
Dif-tor heh smusma 🖖🏼 Довге життя Україна!
![[image]](https://static.bebac.at/pics/Blue_and_yellow_ribbon_UA.png)
Helmut Schütz
![[image]](https://static.bebac.at/img/CC by.png)
The quality of responses received is directly proportional to the quality of the question asked. 🚮
Science Quotes
Complete thread:
- Adjusting weight to reflect group differences in Model balakotu 2022-03-29 11:24 [General Statistics]
- Adjusting weight to reflect group differences in Model dshah 2022-03-29 18:40
- Adjusting weight to reflect group differences in ModelHelmut 2022-03-30 11:07
- Adjusting weight to reflect group differences in Model ElMaestro 2022-03-30 11:19
- Adjusting weight to reflect group differences in ModelHelmut 2022-03-30 11:07
- Adjusting weight to reflect group differences in Model dshah 2022-03-29 18:40