Achievement of Steady State: Visual inspection & common sense [General Sta­tis­tics]

posted by Helmut Homepage – Vienna, Austria, 2021-07-31 12:58 (1146 d 00:17 ago) – Posting: # 22490
Views: 4,605

Hi arl_stat,

❝ […] achievement of Steady state using NOSTASOT (Non-Statistical-significance–of-Trend) method.


Never heard of this abbreviation. THX for the explanation.

❝ Please help me out for SAS codes for analysis.


Sorry, I’m not equipped with ‘[image]’.
Easy in any software. Run a linear regression of pre-dose concentrations vs time and test the slope against zero (or whether zero is included in the 95% CI of the slope). The former should be part of the output.
However, I don’t recommend it (see here and there). The EMA stated:*

Achievement of steady state can be evaluated by collecting pre-dose samples on the day before the PK assessment day and on the PK assessment day. A specific statistical method to assure that steady state has been reached is not considered necessary in bioequivalence studies. Descriptive data is sufficient.



Simulated one-compartment model: V = 4, D = 500, k01 = 0.6931472 h–1, k10 = 0.0504107 h–1, τ = 24. Sufficient built-up of (pseudo-) state state: 96 h = 6.98 half lives.

n    <- 3 # number of pre-dose samples for the regression
data <- data.frame(dose = 2:6, t = seq(-96, 0, 24))
# low and high variability of pre-dose concentrations
lo   <- cbind(data, C = c(40.08, 51.87, 55.77, 56.64, 57.66))
hi   <- cbind(data, C = c(40.41, 52.03, 55.36, 56.74, 57.25))
res  <- data.frame(variability = c("low", "high"), int =  NA_real_,
                   slope = NA_real_, signif = "no   ",
                   CL.lo = NA_real_, CL.hi = NA_real_)
for (j in 1:nrow(res)) {
  if (j == 1) {
    tmp <- tail(lo, n)
  } else {
    tmp <- tail(hi, n)
  }
  muddle       <- lm(C ~ t, data = tmp)        # linear regression
  res$int[j]   <- signif(coef(muddle)[[1]], 5) # intercept
  res$slope[j] <- signif(coef(muddle)[[2]], 5) # slope
  if (anova(muddle)[1, 5] < 0.05) res$signif[j] <- "yes  "
  res[j, 5:6]  <- sprintf("%+.6f", confint(muddle, level = 0.95)[2, ])
}
names(res)[4] <- "signif # 0?"
print(lo, row.names = FALSE)
print(hi, row.names = FALSE)
print(res, row.names = FALSE)
op <- par(no.readonly = TRUE)
par(mar = c(4, 4, 2.5, 0.5))
split.screen(c(2, 1))
screen(1) # saturation phase
plot(lo$t, lo$C,  type = "n", axes = FALSE,
     xlab = "time", ylab = "concentration",
     ylim = range(c(lo$C, hi$C)))
grid(nx = NA, ny = NULL); box()
abline(v = unique(lo$t), lty = 3, col = "lightgrey")
lines(lo$t, lo$C, col = "blue", lwd = 2)
points(lo$t, lo$C, pch = 19, col = "blue", cex = 1.5)
lines(hi$t, hi$C, col = "red", lwd = 2)
points(hi$t, hi$C, pch = 19, col = "red", cex = 1.5)
axis(1, at = lo$t)
axis(2, las = 1)
axis(3, at = unique(lo$t),
     label = paste0("dose #", unique(lo$dose)))
screen(2) # last 3 pre-dose concentrations
plot(tail(lo$t, n), tail(lo$C, n), type = "n", axes = FALSE,
     xlab = "time", ylab = "concentration",
     ylim = range(c(tail(lo$C, n), tail(hi$C, n))))
grid(nx = NA, ny = NULL); box()
abline(v = unique(tail(lo$t, n)), lty = 3, col = "lightgrey")
lines(tail(lo$t, n), tail(lo$C, n), col = "blue", lwd = 2)
lines(tail(hi$t, n), tail(hi$C, n), col = "red", lwd = 2)
segments(x0 = -48, y0 = res$int[1] - res$slope[1] *48,
         x1 = 0, y1 = res$int[1], col = "blue", lty = 2)
segments(x0 = -48, y0 = res$int[2] - res$slope[2] *48,
         x1 = 0, y1 = res$int[2], col = "red", lty = 2)
axis(1, at = lo$t)
axis(2, las = 1)
axis(3, at = unique(lo$t),
     label = paste0("dose #", unique(lo$dose)))
close.screen(all = TRUE)
par(op)


Gives:
 dose   t     C
    2 -96 40.08
    3 -72 51.87
    4 -48 55.77
    5 -24 56.64
    6   0 57.66

 dose   t     C
    2 -96 40.41
    3 -72 52.03
    4 -48 55.36
    5 -24 56.74
    6   0 57.25

 variability    int    slope signif # 0?     CL.lo     CL.hi
         low 57.635 0.039375       yes   +0.016450 +0.062300
        high 57.395 0.039375       no    -0.093589 +0.172339


[image]

low variability
high variability
dashed lines: linear regression




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
23,228 posts in 4,879 threads, 1,652 registered users;
38 visitors (1 registered, 37 guests [including 8 identified bots]).
Forum time: 13:15 CEST (Europe/Vienna)

To know that we know what we know,
and to know that we do not know what we do not know,
that is true knowledge.    Nicolaus Copernicus

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