층화 무작위배정을 실제로 하는 방법


본 포스팅에서는 임상시험에서 층화 무작위배정 을 실제로 어떻게 하는지에 대해 알아보겠습니다.층화 무작위배정 은 공변량에 대해 층화하여 무작위 배정을 하는 방법입니다. 층화 무작위배정 을 하는 이유는 1) 해당 공변량 대해 Randomization 되어있도록 해서 bias 를 줄이고자 하는 것입니다. 이는 treatment/control group 간에 공변량의 분포가 다른 경우, bias 가 생기기 때문입니다. 하지만 공변량에 대해 treatment/control group 이 randomization 되어있다면, 해당 이론적으로는 공변량에 대해서는 분포가 다를 수 없어 이로 인한 bias 가 생기지 않게 됩니다. 2) 또한 공변량을 보정하면 공변량의 effect 를 제외하여 treatment effect size 의 참값을 더욱 잘 추정할 수 있습니다. 이를 통해 검정력을 증가시킬 수 있습니다. 


다음과 같은 상황을 예로 들어 봅시다. 


1. 총 4개의 기관이 임상 시험에 참여

2. 기관당 임상시험 참여자는 20명

3. 나이를 공변량으로 잡고 Block size 는 6,6,6,2 로 설정한다. 

구체적으로 기관 별로 아래와 같은 

- 20~30세 : 6명

- 30~40세 : 6명

- 40~50세 : 6명

- 50~60세 : 2명


4. treatment/control group 의 배정 비율은 1:1 이다.

즉, Block size가 6이면 treatment 3명, control 3명을 무작위 배정한다.


전략


1. 기관별로 층화 -> 똑같은 코드를 4번 돌리는 것으로 구현 

2. 나이를 사이즈 6,6,6,2 로 층화 무작위 배정 -> for 문으로 구현

3. 블록별 무작위 배정을 위해 블록 별로 0~1사이의 난수를 발생하고 (이중 for 문으로 구현 ), 이 값을 기준으로 sorting 해서 중위수를 기준으로 두 그룹으로 나눈 후, A, B 약을 배정한다. 

blockrand <- function(R, N, blocksize){ result <- data.frame(block=numeric(N), item=numeric(N), drug=character(N), rand=numeric(N), random_no=character(N), stringsAsFactors=FALSE) index <- 1 for (i in c(1:ceiling(N/blocksize))){ if (i == (ceiling(N/blocksize))){ blocksize <- N - (i-1)*blocksize # 2 } for (j in c(1:blocksize)){ result[index, 'block'] <- i result[index, 'item'] <- j if (j <= blocksize/2){ result[index, 'drug'] <- 'A' } else { result[index, 'drug'] <- 'B' } result[index, 'rand'] <- runif(1) index = index + 1 } } result <- result[order(result$block, result$rand), ] result$random_no <- c(paste0(R,'-R', as.character(c(1:(ceiling(N/blocksize)*blocksize))))) return (result) } inst1 <- blockrand('01', 20, 6) inst2 <- blockrand('02', 20, 6) inst3 <- blockrand('03', 20, 6) inst4 <- blockrand('04', 20, 6)

이를 위하여 blockrand 라는 함수를 만듭니다. 이 함수는 기관명 R, 기관별 대상자 수 N, 블록 사이즈 blocksize 를 parameter 로 받아 결과 테이블을 dataframe 형식으로 생성하여 반환하는 함수입니다. 


결과 예시

 

block item         drug       rand random_no

3      1    3 A 0.03323463     01-R1

5      1    5   B 0.23377875     01-R2

1      1    1 A 0.58872123     01-R3

4      1    4   B 0.64914300     01-R4

2      1    2 A 0.86294140     01-R5

6      1    6   B 0.86923215     01-R6

8      2    2 A  0.01529889     01-R7

9      2    3 A 0.11754757     01-R8

11     2    5   B 0.13073496     01-R9

10     2    4   B 0.46934007    01-R10

7      2    1 A  0.56171635    01-R11

12     2    6   B 0.61339224    01-R12

14     3    2 A 0.11352796    01-R13

13     3    1 A 0.62667742    01-R14

15     3    3 A 0.82257959    01-R15

18     3    6   B 0.85910418    01-R16

17     3    5   B 0.87995944    01-R17

16     3    4   B 0.92778095    01-R18

20     4    2   B 0.70824728    01-R19

19     4    1 A 0.76212643    01-R20


이러한 층화 무작위배정은 머신러닝에서 특정 변수의 분포를 train/valid/test set 에서 맞추어줘서 모델의 일반화 성능을 보다 정확히 평가하고 싶은 경우에 사용되기도 합니다. 


  • 2021.05.25 11:17

    비밀댓글입니다