Updated R-code [R for BE/BA]

posted by Helmut Homepage – Vienna, Austria, 2018-02-27 17:06  – Posting: # 18471
Views: 4,951

Hi Ana,

» Now it's already randomized by gender as well. When I say randomize by gender, it should not generate the answer:
» 1 F
» 2 F
» 3 F
» 4 F
» 5 F
» 6 F
» 7 M
» 8 M
» 9 M
» 10 M
» 11 M
» 12 M

Did you try it? It doesn’t. But don’t use my previous codes because you might get different numbers of females and males in the sequences. :angry: In my last example:

RT, F: 6
RT, M: 2
TR, F: 2
TR, M: 6


» My question now, for me to do the same for 3x3 crossover studies: (TTR) (RRT)

That’s an unusual design.

» and 4x4: (TTRR) (TRTR) ...

And this one is strange, IMHO.

» how to change the formula?

I packed everything into a function with some fair degree of error handling.

random.sex <- function(n, sequences=c("TR", "RT"),
                       seed, extend=c("no", "down", "up")) {
  require(randomizeBE)
  if (missing(n)) stop("Number of subjects must be given.")
  ext <- switch(match.arg(extend, c("no", "down", "up")), no=0,
                down=-1, up=+1, stop("invalid 'extend'."))
  sequences <- sort(sequences, decreasing=TRUE)
  no.seqs   <- length(sequences)
  if (n %% no.seqs != 0)
    stop("Number of subjects must be a multiple of sequences.")
  n.orig <- n
  if (n %% (no.seqs*2) != 0 & ext != 0) {
    if (ext == -1) {
      n <- n - no.seqs
      msg <- "decreased"
    } else {
      n <- n + no.seqs
      msg <- "increased"
    }
  }
  if (missing(seed)) seed <- runif(1, max=1E7)
  blocksize <- n/no.seqs
  sex       <- rep(c("F", "M"), each=blocksize/no.seqs)
  if (length(sex) == 0) sex <- c("F", "M")
  periods   <- unique(nchar(sequences))
  per.name  <- paste("period", 1:periods)
  random    <- RL4(nsubj=n, seqs=sequences, seed=seed,
                   blocksize=blocksize, randctrl=TRUE)
  per       <- as.data.frame(matrix(nrow=nrow(random$rl), ncol=periods,
                                    dimnames=list(NULL, per.name)))
  for (j in 1:periods) {
    per[, j] <- paste0(substr(random$rl$sequence, j, j), "   ")
  }
  random$rl <- cbind(random$rl, per, stringsAsFactors=FALSE)
  for (j in 1:no.seqs) {
    suppressWarnings(
      random$rl$sex[random$rl$sequence == sequences[j]] <- sample(sex)
    )
  }
  random$rl <- random$rl[, c("subject", "sex", "seqno", "sequence",
                             per.name)]   cat("\n"); print(random, sumry=TRUE)
  collect <- NULL
  for (j in no.seqs:1) {
    F <- sum(random$rl$sex[random$rl$sequence == sequences[j]] == "F")
    M <- sum(random$rl$sex[random$rl$sequence == sequences[j]] == "M")
    cat(paste0("\n", sequences[j], ", F: ", F,
               "\n", sequences[j], ", M: ", M))
    collect <- c(collect, M, F)
  }
  cat("\n")
  if (length(unique(collect)) > 1 & ext == 0)
    cat("Warning message:",
        "\nBalanced randomisation by sex not possible",
        "\nwith the given sample size.\n")
  if (ext != 0 & n != n.orig)
    cat("Sample size", msg, "from", n.orig, "to",
        "\nget balanced randomisation by sex.\n")
}


Examples:

random.sex(n=12, sequences=c("TR", "RT")) gives

Randomization table          created: 2018-02-27 16:54:34
(seed: 666027 blocksize: 6 )

 subject sex seqno sequence period 1 period 2
       1   M     2       RT     R        T   
       2   F     2       RT     R        T   
       3   M     1       TR     T        R   
       4   F     1       TR     T        R   
       5   F     1       TR     T        R   
       6   M     2       RT     R        T   
       7   F     2       RT     R        T   
       8   F     2       RT     R        T   
       9   M     1       TR     T        R   
      10   F     1       TR     T        R   
      11   M     1       TR     T        R   
      12   M     2       RT     R        T   


Summary of randomisation

12 subjects randomized into 2 sequence groups.
Number of subjects in sequence groups:
RT TR
 6  6
Runs test of randomness: p.value=0.2259

RT, F: 3
RT, M: 3
TR, F: 3
TR, M: 3


random.sex(n=12, sequences=c("TRT", "RTR")) gives

Randomization table          created: 2018-02-27 16:55:15
(seed: 6305806 blocksize: 6 )

 subject sex seqno sequence period 1 period 2 period 3
       1   F     2      RTR     R        T        R   
       2   F     1      TRT     T        R        T   
       3   M     2      RTR     R        T        R   
       4   M     1      TRT     T        R        T   
       5   M     2      RTR     R        T        R   
       6   M     1      TRT     T        R        T   
       7   F     2      RTR     R        T        R   
       8   F     1      TRT     T        R        T   
       9   M     2      RTR     R        T        R   
      10   F     2      RTR     R        T        R   
      11   F     1      TRT     T        R        T   
      12   M     1      TRT     T        R        T   


Summary of randomisation

12 subjects randomized into 2 sequence groups.
Number of subjects in sequence groups:
RTR TRT
  6   6
Runs test of randomness: p.value=0.0693

RTR, F: 3
RTR, M: 3
TRT, F: 3
TRT, M: 3


random.sex(n=12, sequences=c("TRTR", "RTRT")) gives

Randomization table          created: 2018-02-27 16:56:30
(seed: 3391479 blocksize: 6 )

 subject sex seqno sequence period 1 period 2 period 3 period 4
       1   F     2     RTRT     R        T        R        T   
       2   F     1     TRTR     T        R        T        R   
       3   M     1     TRTR     T        R        T        R   
       4   F     2     RTRT     R        T        R        T   
       5   F     1     TRTR     T        R        T        R   
       6   M     2     RTRT     R        T        R        T   
       7   M     2     RTRT     R        T        R        T   
       8   M     1     TRTR     T        R        T        R   
       9   M     2     RTRT     R        T        R        T   
      10   F     1     TRTR     T        R        T        R   
      11   M     1     TRTR     T        R        T        R   
      12   F     2     RTRT     R        T        R        T   


Summary of randomisation

12 subjects randomized into 2 sequence groups.
Number of subjects in sequence groups:
RTRT TRTR
   6    6
Runs test of randomness: p.value=0.2259

RTRT, F: 3
RTRT, M: 3
TRTR, F: 3
TRTR, M: 3


random.sex(n=12, sequences=c("TRR", "RTR", "RRT")) gives

Randomization table          created: 2018-02-27 16:57:49
(seed: 1819956 blocksize: 3 )

 subject sex seqno sequence period 1 period 2 period 3
       1   M     1      TRR     T        R        R   
       2   F     2      RTR     R        T        R   
       3   M     3      RRT     R        R        T   
       4   M     2      RTR     R        T        R   
       5   F     1      TRR     T        R        R   
       6   F     3      RRT     R        R        T   
       7   M     1      TRR     T        R        R   
       8   F     2      RTR     R        T        R   
       9   M     3      RRT     R        R        T   
      10   F     1      TRR     T        R        R   
      11   F     3      RRT     R        R        T   
      12   M     2      RTR     R        T        R   


Summary of randomisation

12 subjects randomized into 3 sequence groups.
Number of subjects in sequence groups:
RRT RTR TRR
  4   4   4
Runs test of randomness: p.value=0.2502

RRT, F: 2
RRT, M: 2
RTR, F: 2
RTR, M: 2
TRR, F: 2
TRR, M: 2
Warning message:
Blocksize is not a multiple of sequences! Blocksize adapted to 3.


random.sex(n=12, sequences=williams(ntmt=3)) gives

Randomization table          created: 2018-02-27 21:13:16
(seed: 2807886 blocksize: 6 )

 subject sex seqno sequence period 1 period 2 period 3
       1   M     3      BCA     B        C        A   
       2   F     2      CAB     C        A        B   
       3   M     4      BAC     B        A        C   
       4   F     6      ABC     A        B        C   
       5   M     5      ACB     A        C        B   
       6   M     1      CBA     C        B        A   
       7   F     3      BCA     B        C        A   
       8   F     4      BAC     B        A        C   
       9   F     5      ACB     A        C        B   
      10   F     1      CBA     C        B        A   
      11   M     6      ABC     A        B        C   
      12   M     2      CAB     C        A        B   


Summary of randomisation

12 subjects randomized into 6 sequence groups.
Number of subjects in sequence groups:
ABC ACB BAC BCA CAB CBA
  2   2   2   2   2   2
Runs test of randomness: p.value=1.0000

ABC, F: 1
ABC, M: 1
ACB, F: 1
ACB, M: 1
BAC, F: 1
BAC, M: 1
BCA, F: 1
BCA, M: 1
CAB, F: 1
CAB, M: 1
CBA, F: 1
CBA, M: 1


random.sex(n=12, sequences=williams(ntmt=4)) gives

Randomization table          created: 2018-02-27 21:40:29
(seed: 8600620 blocksize: 4 )

 subject sex seqno sequence period 1 period 2 period 3 period 4
       1   M     3     BCAD     B        C        A        D   
       2   F     2     CDBA     C        D        B        A   
       3   M     4     ABDC     A        B        D        C   
       4   F     1     DACB     D        A        C        B   
       5   F     3     BCAD     B        C        A        D   
       6   M     2     CDBA     C        D        B        A   
       7   M     1     DACB     D        A        C        B   
       8   F     4     ABDC     A        B        D        C   
       9   F     1     DACB     D        A        C        B   
      10   F     2     CDBA     C        D        B        A   
      11   M     3     BCAD     B        C        A        D   
      12   M     4     ABDC     A        B        D        C   


Summary of randomisation

12 subjects randomized into 4 sequence groups.
Number of subjects in sequence groups:
ABDC BCAD CDBA DACB
   3    3    3    3
Runs test of randomness: p.value=0.2259

ABDC, F: 1
ABDC, M: 2
BCAD, F: 1
BCAD, M: 2
CDBA, F: 2
CDBA, M: 1
DACB, F: 2
DACB, M: 1
Warning message:
Balanced randomisation by sex not possible
with the given sample size.


Note the warning. You would need 8 or 16 subjects if you want sex balanced within the 4 sequences. If you insist in this, you can used the optional argument extend="up". Decreasing the sample size by extend="down" is also supported but doesn’t make much sense.
random.sex(n=12, sequences=williams(ntmt=4), extend="up") gives

Randomization table          created: 2018-02-28 00:29:38
(seed: 2223505 blocksize: 4 )

 subject sex seqno sequence period 1 period 2 period 3 period 4
       1   F     1     DACB     D        A        C        B   
       2   F     2     CDBA     C        D        B        A   
       3   M     3     BCAD     B        C        A        D   
       4   F     4     ABDC     A        B        D        C   
       5   M     2     CDBA     C        D        B        A   
       6   M     4     ABDC     A        B        D        C   
       7   F     3     BCAD     B        C        A        D   
       8   M     1     DACB     D        A        C        B   
       9   F     1     DACB     D        A        C        B   
      10   M     3     BCAD     B        C        A        D   
      11   F     2     CDBA     C        D        B        A   
      12   F     4     ABDC     A        B        D        C   
      13   M     1     DACB     D        A        C        B   
      14   M     4     ABDC     A        B        D        C   
      15   M     2     CDBA     C        D        B        A   
      16   F     3     BCAD     B        C        A        D   


Summary of randomisation

16 subjects randomized into 4 sequence groups.
Number of subjects in sequence groups:
ABDC BCAD CDBA DACB
   4    4    4    4
Runs test of randomness: p.value=0.1205

ABDC, F: 2
ABDC, M: 2
BCAD, F: 2
BCAD, M: 2
CDBA, F: 2
CDBA, M: 2
DACB, F: 2
DACB, M: 2
Sample size increased from 12 to
get balanced randomisation by sex.


If you want to reproduce a run, add the argument seed=X to the function call (where X is the seed given in the output of the previous run).

Cheers,
Helmut Schütz
[image]

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

Complete thread:

Activity
 Mix view
Bioequivalence and Bioavailability Forum |  Admin contact
19,486 posts in 4,135 threads, 1,334 registered users;
online 6 (0 registered, 6 guests [including 5 identified bots]).
Forum time (Europe/Vienna): 23:18 CEST

If you don’t know anything about computers,
just remember that they are machines that do exactly what you tell them
but often surprise you in the result.    Richard Dawkins

The BIOEQUIVALENCE / BIOAVAILABILITY FORUM is hosted by
BEBAC Ing. Helmut Schütz
HTML5