R Project: инструменты для рандомизации в клинических исследованиях

Речь пойдет о двух библиотеках для создания рандомизационных последовательностей. В чем суть проблемы? – Может показаться, что для составления рандомизационных последовательностей подойдет любой способ случайного распределение в группы. Однако, прежде всего необходимо ответить на вопрос: каковы критерии “правильной” рандомизационной последовательности? Попробуем их сформулировать:

  1. Рандомизационная последовательность не должна быть привычной, т.е. одной и той же или с минимальными изменениями для разных исследований;
  2. Рандомизационная последовательность должна быть, генерируемой случайно или псевдо-случайно;
  3. Рандомизационная последовательность должна быть случайной;
  4. Рандомизационная последовательность должна быть воспроизводимой и/или идентифицируемой.

Пункт 1. носит декларативный характер и выполняется при выполнении пункта 2 и 4.

Пункт 2. Выполняется при использовании генераторов случайных чисел (True Random Number Generator), к примеру – Quantis RNG, или при помощи алгоритмов генерации псевдо-случайных чисел (Mersenne twister, PCG32,Xoroshiro128+ и т.д.).

Пункт 3. Даже последовательность сгенерированная случайно может быть неслучайной сама по себе – могут быть длинные цепочки одних и тех же значений, существенный дисбаланс в распределении и т.д. Таким образом случайная последовательность должна быть проверена статистическими методами на предмет – случайна ли она?

Пункт 4. Последоватльености генерируемые с помощью TRNG не могут быть воспроизводимы, но последовательности генерируемые псевдо-случайно могут  должны быть воспроизводимы, для чего должен быть сохранен seed каждой последовательности и при генерации следующих последовательностей недопустимо использование одного и того же seed, что необходимо для соблюдения Пункта 1. Для TRNG необходимо определить идентификатор последовательности к примеру хеш функцию (MD5, SHA256 и т.д.), что также позволит сопоставить последовательности генерируемые в разные периоды времени.

Получение seed также должно быть случайным. При неимении технических возможностей можно воспользоваться ресурсами типа https://www.random.org/

Итак для R Project доступно не менее 2х библиотек для генерации случайных чисел.

randomizeBE | Описание

Использовать очень просто:

1
2
3
library(randomizeBE)
rl <- RL4(nsubj=24, blocksize=4, seqs=c("TR","RT"), seed=123)
print(rl, sumry=TRUE)

 

где nsubj – количество субъектов,

blocksize – размер блока (для того что бы распределение было равномерным на малых выборках лучше ставить размер блока 2-6 субъектов, меньший размер блока гарантирует отсутствие длинных цепочек одинаковых значений),

seqs – количество последовательностей в виде вектора с из кодами,

значение seed надо указывать самостоятельно или с помощью sample(1:100000000, 1).

Это можно выполнить в одну команду:

1
print(RL4(nsubj=24, blocksize=4, seqs=c("TR","RT"), seed=sample(1:1000000, 1)), sumry=TRUE)

Тест на случайность выполняется по методу Уалда-Вольфовица, параметром pmethod можно задать метод вычисления p.

randomizeR | Описание

Пакет более сложный. Дает возможность генерации с помощью различных методов и для разных дизайнов. Подробное описание пакета заняло бы отдельную большую статью. Поэтому подробное описание пакета не привожу, оно доступно по ссылкам:

Приведем три наиболее распространенных примера генерации.

Random Allocation Rule:

1
2
3
4
5
library(randomizeR)
rar <- rarPar(24)
seq <- genSeq(rar, r = 1, seed = 123)
result <- getRandList(seq)
t(result)

Permuted Block Randomization:

1
2
3
4
5
library(randomizeR)
pbr <- pbrPar(rep(4, 24/4))
seq <- genSeq(pbr, r = 1, seed = 123)
result <- getRandList(seq)
t(result)

Big Stick Design:

1
2
3
4
5
library(randomizeR)
bsd <- bsdPar(24, 2)
seq <- genSeq(bsd, r = 1, seed = 123)
result <- getRandList(seq)
t(result)