[Randomzation] Randomization

Author

SEOYEON CHOI

Published

April 9, 2025

Code

Block Randomization

import random

def chunked_shuffle(base_list, repeat=4, seed=42):
    random.seed(seed)
    result = []

    for _ in range(repeat):
        chunk = base_list.copy()
        random.shuffle(chunk)
        result.extend(chunk)

    return result

base = [1, 2, 3, 4, 5, 6]
shuffled_list = chunked_shuffle(base, repeat=4, seed=20252025)
binary_list = [1 if x <= 3 else 2 for x in shuffled_list]
subject_ids = [f"S{i+1:03}" for i in range(len(shuffled_list))]

sequence_list = ['T-R' if b == 1 else 'R-T' for b in binary_list]

subject_ids = [f"S{i+1:03}" for i in range(len(shuffled_list))]

df = pd.DataFrame({
    'Subject_ID': subject_ids,
    'Treatment': binary_list,
    'Sequence': sequence_list
})

print(df)
   Subject_ID  Treatment Sequence
0        S001          1      T-R
1        S002          2      R-T
2        S003          2      R-T
3        S004          2      R-T
4        S005          1      T-R
5        S006          1      T-R
6        S007          2      R-T
7        S008          1      T-R
8        S009          1      T-R
9        S010          2      R-T
10       S011          2      R-T
11       S012          1      T-R
12       S013          1      T-R
13       S014          2      R-T
14       S015          2      R-T
15       S016          1      T-R
16       S017          2      R-T
17       S018          1      T-R
18       S019          2      R-T
19       S020          1      T-R
20       S021          1      T-R
21       S022          1      T-R
22       S023          2      R-T
23       S024          2      R-T

Stratified Randomization

잠재적 교란요인을 줄이기 위해 층(strate)을 만든 후 각 층 내에서 간단한 무작위화 수행

import random
import pandas as pd

random.seed(42)
n_per_stratum = 6
strata_sex = ['Male', 'Female']
strata_bmi = ['Underweight', 'Normal', 'Overweight']
groups = ['Treatment', 'Control']

stratum_combinations = [(sex, bmi) for sex in strata_sex for bmi in strata_bmi]

subject_data = []

subject_id = 1
for sex, bmi in stratum_combinations:
    stratum_subjects = [f"S{subject_id + i:03}" for i in range(n_per_stratum)]
    subject_id += n_per_stratum
    
    group_assignments = (groups * (n_per_stratum // 2))[:n_per_stratum]
    random.shuffle(group_assignments)
    
    for sid, group in zip(stratum_subjects, group_assignments):
        subject_data.append({
            'Subject_ID': sid,
            'Sex': sex,
            'BMI': bmi,
            'Group': group
        })

df = pd.DataFrame(subject_data)
print(df)
   Subject_ID     Sex          BMI      Group
0        S001    Male  Underweight    Control
1        S002    Male  Underweight    Control
2        S003    Male  Underweight  Treatment
3        S004    Male  Underweight  Treatment
4        S005    Male  Underweight  Treatment
5        S006    Male  Underweight    Control
6        S007    Male       Normal    Control
7        S008    Male       Normal  Treatment
8        S009    Male       Normal  Treatment
9        S010    Male       Normal  Treatment
10       S011    Male       Normal    Control
11       S012    Male       Normal    Control
12       S013    Male   Overweight    Control
13       S014    Male   Overweight    Control
14       S015    Male   Overweight  Treatment
15       S016    Male   Overweight  Treatment
16       S017    Male   Overweight  Treatment
17       S018    Male   Overweight    Control
18       S019  Female  Underweight    Control
19       S020  Female  Underweight  Treatment
20       S021  Female  Underweight    Control
21       S022  Female  Underweight  Treatment
22       S023  Female  Underweight    Control
23       S024  Female  Underweight  Treatment
24       S025  Female       Normal    Control
25       S026  Female       Normal    Control
26       S027  Female       Normal  Treatment
27       S028  Female       Normal  Treatment
28       S029  Female       Normal    Control
29       S030  Female       Normal  Treatment
30       S031  Female   Overweight  Treatment
31       S032  Female   Overweight    Control
32       S033  Female   Overweight  Treatment
33       S034  Female   Overweight    Control
34       S035  Female   Overweight  Treatment
35       S036  Female   Overweight    Control