การสุ่มเข้าเงื่อนไข (Random Assignment)

ในอุดมคติ ผู้ทำการทดลองพยายามควบคุมปัจจัยแทรกซ้อนทั้งหมดให้คงที่ระหว่างกลุ่มทดลองและกลุ่มควบคุม (เช่น กลุ่มตัวอย่างมีน้ำหนัก ส่วนสูง ความฉลาด พื้นฐานการเลี้ยงดู อุณหภูมิห้อง ขั้นตอนการขอความยินยอม ฯลฯ) แต่ในทางปฏิบัติแล้ว ผู้ทดลองมักไม่สามารถควบคุมปัจจัยแทรกซ้อนได้ทั้งหมด โดยเฉพาะปัจจัยส่วนบุคคล (person variables; individual differences) เนื่องจากปัญหาทางด้านต้นทุนในการควบคุม ความเป็นไปได้ รวมไปถึงจริยธรรม การสุ่มเข้าเงื่อนไข (random assignment) จึงเป็นทางออกหนึ่งที่ใช้หลักการความน่าจะเป็นเข้ามาช่วยเฉลี่ยให้เงื่อนไขทดลองและเงื่อนไขควบคุมเท่าเทียมกัน หลักการของการสุ่มเข้าเงื่อนไขทำให้ลักษณะส่วนตัวของกลุ่มตัวอย่างมีโอกาสถูกกระจายไปในแต่ละเงื่อนไขอย่างเท่าเทียมกัน (เช่น แต่ละเงื่อนไขจะผู้เข้าร่วมการวิจัยที่มีบุคคลิกภาพแบบเปิดรับประสบการณ์สูง กลาง หรือต่ำ ในสัดส่วนใกล้เคียงกัน) ในทางสถิติแล้วเรียกว่าค่าความคาดหวัง (expectancy value) ของความแตกต่างระหว่างกลุ่มจะเป็น 0

ในทางปฏิบัติแล้ว การสุ่มเข้าเงื่อนไขไม่ได้ทำให้กลุ่มมีค่าที่สังเกตได้ (observed value) เท่ากัน เพราะความคลาดเคลื่อนทางสถิติ ปัญหานี้จะเบาบางลงถ้าผู้วิจัยสามารถมีกลุ่มตัวอย่างขนาดใหญ่ ซึ่งจะช่วยลดอิทธิพลของค่าคลาดเคลื่อนที่สุดโต่ง (เช่น บังเอิญมีผู้เข้าร่วมการวิจัยที่บุคลิกภาพเปิดตัวสูงมาก) ด้วยค่ากลางหรือค่าสุดโต่งอีกทาง (เช่น กลุ่มตัวอย่างส่วนใหญ่มีบุคลิกภาพเปิดตัวกลาง ๆ หรือ มีคนที่บุคลิกภาพปิดตัวถูกสุ่มมาอยู่ในกลุ่มเดียวกัน) ทำให้ค่าเฉลี่ยของกลุ่มควบคุมกับกลุ่มทดลองนั้นใกล้เคียงกันมากขึ้น ความแตกต่างใด ๆ ระหว่างกลุ่มที่เราพบก่อนเริ่มการทดลองนั้นเกิดจากความบังเอิญ/กระบวนการสุ่ม การทดสอบทางสถิติต่าง ๆ ก็จะคำนึงถึงความคลาดเคลื่อนนี้เอาไว้เพื่อตัดสินว่า “หากพบความแตกต่างระหว่างสองกลุ่ม ความแตกต่างดังกล่าวจะมีนัยสำคัญทางสถิติหรือไม่” (นั่นคือ หากเราคาดหวังว่าความแตกต่างระหว่างกลุ่มเท่ากับ 0 จะมีความน่าจะเป็น (probability) เท่าใดที่เราจะพบค่าความแตกต่างเท่ากับหรือมากกว่าที่สังเกตได้จากข้อมูล)

ปัจจุบันโปรแกรมการเก็บข้อมูลด้วยคอมพิวเตอร์มักจะมีคำสั่งสุ่มเข้าเงื่อนไขอยู่ด้วย แต่ในกรณีที่เราไม่ได้ใช้โปรแกรมเหล่านั้น เราสามารถสร้างการสุ่มเข้าเงื่อนไขด้วยโปรแกรมอื่น ๆ ได้ ในแบบฝึกหัดนี้เราจะพูดถึงการสุ่มด้วย Microsoft Excel, R, และเว็บไซต์

1. Excel

สมมติว่าเราต้องการสุ่มกลุ่มตัวอย่าง 30 ตัวอย่างเข้า 3 เงื่อนไข เงื่อนไขละ 10 คน เราอาจจะใช้วิธีง่าย ๆ เช่น ทอยลูกเต๋าสุ่มเข้าเงื่อนไขเมื่อเก็บข้อมูลแต่ละตัวอย่าง แต่เราอาจจะได้กลุ่มตัวอย่างในแต่ละเงื่อนไขไม่เท่ากันเนื่องจากกระบวนการสุ่ม เพื่อให้เรามั่นใจว่าเราจะได้กลุ่มตัวอย่างในแต่ละกลุ่มเท่า ๆ กัน เราควรจะสุ่มเงื่อนไขไว้ตั้งแต่ก่อนเริ่มการเก็บข้อมูล

1.1 Simple Sort

1.1.1 เริ่มต้นโดยสร้างคอลัมน์ที่ชื่อว่า group และ random number จากนั้นใส่เงื่อนไขทั้งสาม (exp1, exp2, ctrl) ซ้ำไป 10 ครั้ง

1.1.2 สร้าง id ของกลุ่มตัวอย่างเพื่อตรวจสอบว่าครบ 30 ตัวอย่าง

1.1.3 ใส่คำสั่ง rand() ในคอลัมน์ random number คำสั่งนี้จะสร้างตัวเลขสุ่มระหว่าง 0 ถึง 1 โดยใช้ uniform distribution (ทุกค่ามีโอกาสถูกเลือกเท่า ๆ กัน) ใช้เมาส์จับที่มุมขวาของ cell แล้วลากเพิ่มเติมคำสั่งให้ครบทุกแถว (หรือ double-click ที่มุมขวา ก็ได้)

1.1.4 เลือกเฉพาะ group และ random number ทั้งตารางเพื่อเตรียมเรียงลำดับเงื่อนไขโดยใช้เลขสุ่ม สำคัญมาก คำสั่ง sort จะเรียงลำดับเฉพาะข้อมูลที่ถูกเลือก ดังนั้นต้องเลือกข้อมูลที่ต้องการเรียงทั้งหมด และไม่เลือกข้อมูลที่ไม่ต้องการเรียง

1.1.5 เลือกเมนู Sort & Filter -> Custom Sort เลือก Sort By คอลัมน์ random number

Simple random sort with Excel

1.2 Randomize within a set

ผู้วิจัยอาจต้องการเก็บข้อมูลเป็นเซ็ต เช่น สุ่มกลุ่มตัวอย่างเข้าเงื่อนไขให้ครบทุกเงื่อนไขเซ็ตนึงก่อนค่อยเริ่มเก็บข้อมูลเซ็ตถัดไป วิธีการนี้จะช่วยให้มั่นใจได้ว่าหากผู้วิจัยต้องหยุดเก็บข้อมูลกลางคัน จะมีข้อมูลในแต่ละเงื่อนไขเท่ากันหรือเกือบเท่ากัน

1.2.1 สร้างคอลัมน์ id, group, set, และ random number ใส่ค่า set เพื่อให้กลุ่มตัวอย่างอยู่ในเซ็ตเดียวกัน (เช่น เซ็ตละ 3 ตัวอย่าง)

1.2.2 ใช้คำสั่ง rand() เติมในช่อง random number

1.2.3 เลือก Sort & Filter -> Custom Sort แล้ว Sort By set ก่อน จากนั้นกด + เพิ่มการ sort ด้วย random number (เรียงลำดับ set ก่อน แล้วภายในแต่ละ set ให้สุ่มเรียงด้วย random number)

Set random sort with Excel

2. R code

การสร้าง vector ของค่าสุ่มใน R นั้นมีหลากหลายวิธีมาก วิธีที่จะแสดงต่อไปนี้เป็นการเลียนแบบการ sort ใน Excel

2.1 Simple Sort

เริ่มจากการสร้าง vector ของ id, group, และ random_vector

id <- 1:30

เราจะใช้ c() เพื่อรวม (combine) ค่าตัวอักษรที่เป็นชื่อเงื่อนไขเข้าด้วยกัน แล้วใช้คำสั่ง rep() เพื่อทำซ้ำ (replicate) เงื่อนไขการทดลอง 3 เงื่อนไข จำนวน 10 ครั้ง

group <- rep(c("exp1", "exp2", "ctrl"), times = 10)
group
##  [1] "exp1" "exp2" "ctrl" "exp1" "exp2" "ctrl" "exp1" "exp2" "ctrl" "exp1"
## [11] "exp2" "ctrl" "exp1" "exp2" "ctrl" "exp1" "exp2" "ctrl" "exp1" "exp2"
## [21] "ctrl" "exp1" "exp2" "ctrl" "exp1" "exp2" "ctrl" "exp1" "exp2" "ctrl"

ในการสร้าง random_vector เราจะใช้คำสั่งสุ่มตัวเลขจำนวนเต็ม (integer) sample.int() โดยกำหนดให้สุ่มตัวเลข 30 ตัว size คือ 30 (สุ่มระหว่าง 1-30) และสุ่มแบบไม่แทนที่ replace = FALSE

นอกจากนี้เพื่อให้การสุ่มนี้สามารถทำซ้ำได้ ให้ใช้คำสั่ง set.seed() เพื่อกำหนดค่าที่ใช้อ้างอิงในการสร้างตัวเลขสุ่ม (หากคนอื่นมาใช้ seed นี้ จะได้ค่าสุ่มเดียวกัน)

set.seed(2475) # you can pick any value for a seed. This will help when you need to replicate the results.
random_vector <- sample.int(30, size = 30, replace = FALSE)
random_vector
##  [1] 30 22 23 12 26 11  7 10 20 28 13  4 16 18 24 14 25 17 29  9  1 21  6  2 27
## [26] 19 15  5  8  3

เรียงลำดับเงื่อนไขการทดลองด้วย random_vector

random_group <- group[random_vector]
random_group
##  [1] "ctrl" "exp1" "exp2" "ctrl" "exp2" "exp2" "exp1" "exp1" "exp2" "exp1"
## [11] "exp1" "exp1" "exp1" "ctrl" "ctrl" "exp2" "exp1" "exp2" "exp2" "ctrl"
## [21] "exp1" "ctrl" "ctrl" "exp2" "ctrl" "exp1" "ctrl" "exp2" "exp2" "ctrl"

ใช้คำสั่ง cbind() เพื่อรวม vector id และ random_group ให้เป็น column อ่านง่าย

cbind(id, random_group)
##       id   random_group
##  [1,] "1"  "ctrl"      
##  [2,] "2"  "exp1"      
##  [3,] "3"  "exp2"      
##  [4,] "4"  "ctrl"      
##  [5,] "5"  "exp2"      
##  [6,] "6"  "exp2"      
##  [7,] "7"  "exp1"      
##  [8,] "8"  "exp1"      
##  [9,] "9"  "exp2"      
## [10,] "10" "exp1"      
## [11,] "11" "exp1"      
## [12,] "12" "exp1"      
## [13,] "13" "exp1"      
## [14,] "14" "ctrl"      
## [15,] "15" "ctrl"      
## [16,] "16" "exp2"      
## [17,] "17" "exp1"      
## [18,] "18" "exp2"      
## [19,] "19" "exp2"      
## [20,] "20" "ctrl"      
## [21,] "21" "exp1"      
## [22,] "22" "ctrl"      
## [23,] "23" "ctrl"      
## [24,] "24" "exp2"      
## [25,] "25" "ctrl"      
## [26,] "26" "exp1"      
## [27,] "27" "ctrl"      
## [28,] "28" "exp2"      
## [29,] "29" "exp2"      
## [30,] "30" "ctrl"

ในการสุ่มแบบนี้ ผู้วิจัยต้องเก็บกลุ่มตัวอย่างให้ครบ 30 ตัวอย่าง เพื่อให้ได้ตัวอย่างเท่ากันในทุกเงื่อนไข

2.2 Randomized within a set

เพื่อสุ่มเป็น set ให้เราสร้าง id, group , set, และ random_vector

id <- 1:30
group <- rep(c("exp1", "exp2", "ctrl"), times = 10)
set.seed(2475) # set.seed before a random function.
random_vector <- sample.int(30, size = 30, replace = FALSE)

สำหรับตัวแปร set ให้ใช้คำสั่ง rep(x, each = ) option each เป็นตัวบอกว่าจะให้ทำซ้ำแต่ละ element ใน x กี่ครั้ง ในตัวอย่างนี้เราต้องการให้ตัวเลขเซ็ตปรากฏเลขละ 3 ครั้ง เพราะแต่ละเซ็ตการทดลองจะมีสามเงื่อนไข สำหรับ N = 30 เราจะมีทั้งหมด 10 เซ็ต

set <- rep(1:10, each = 3)
set
##  [1]  1  1  1  2  2  2  3  3  3  4  4  4  5  5  5  6  6  6  7  7  7  8  8  8  9
## [26]  9  9 10 10 10

ในการสุ่มนี้เราต้องการให้ เรียง set 1-10 แล้วสุ่มลำดับภายใน set เราจะใช้คำสั่ง order() เพื่อสร้าง vector ของลำดับการสุ่ม โดยใส่ set ก่อนแล้วตามด้วย random_vector เพื่อให้เรียงลำดับจาก set 1-10 ก่อน แล้วเรียงสุ่มภายใน set แล้วบันทึกลำดับนี้ลงตัวแปรชื่อ random_within_set

random_within_set <- order(set, random_vector)
random_within_set
##  [1]  2  3  1  6  4  5  7  8  9 12 11 10 13 14 15 16 18 17 21 20 19 24 23 22 27
## [26] 26 25 30 28 29

จาก output ด้านบนจะเป็นได้ว่า ลำดับจะถูกสุ่มภายในทุก ๆ เซ็ต (เช่น Set ที่ 1 จะกลุ่มได้ลำดับ 2 3 1, Set ที่ 2 คือ 6 4 5, …)

จากนั้นเราจะนำ vector random_within_set นี้ไปใช้เรียงลำดับ vector group เพื่อให้เงื่อนไขเรียงตามการสุ่ม

random_set_group <- group[random_within_set] # sort group with random_within_set
cbind(id, random_set_group, set)
##       id   random_set_group set 
##  [1,] "1"  "exp2"           "1" 
##  [2,] "2"  "ctrl"           "1" 
##  [3,] "3"  "exp1"           "1" 
##  [4,] "4"  "ctrl"           "2" 
##  [5,] "5"  "exp1"           "2" 
##  [6,] "6"  "exp2"           "2" 
##  [7,] "7"  "exp1"           "3" 
##  [8,] "8"  "exp2"           "3" 
##  [9,] "9"  "ctrl"           "3" 
## [10,] "10" "ctrl"           "4" 
## [11,] "11" "exp2"           "4" 
## [12,] "12" "exp1"           "4" 
## [13,] "13" "exp1"           "5" 
## [14,] "14" "exp2"           "5" 
## [15,] "15" "ctrl"           "5" 
## [16,] "16" "exp1"           "6" 
## [17,] "17" "ctrl"           "6" 
## [18,] "18" "exp2"           "6" 
## [19,] "19" "ctrl"           "7" 
## [20,] "20" "exp2"           "7" 
## [21,] "21" "exp1"           "7" 
## [22,] "22" "ctrl"           "8" 
## [23,] "23" "exp2"           "8" 
## [24,] "24" "exp1"           "8" 
## [25,] "25" "ctrl"           "9" 
## [26,] "26" "exp2"           "9" 
## [27,] "27" "exp1"           "9" 
## [28,] "28" "ctrl"           "10"
## [29,] "29" "exp1"           "10"
## [30,] "30" "exp2"           "10"

จะเห็นได้ว่า เงื่อนไขการทดลองทั้ง 3 กลุ่ม จะปรากฏในทุก ๆ 3 ตัวอย่าง แม้ว่าผู้วิจัยจะต้องหยุดเก็บข้อมูลกลางคัน (เช่น 15 ตัวอย่าง) ก็ยังได้กลุ่มตัวอย่างในแต่ละเงื่อนไขจำนวนเท่า ๆ กัน

3. Randomizer Websites

นอกจากนี้ยังมีเว็บไซต์ที่ช่วยสุ่มเข้าเงื่อนไขตามลักษณะที่เรากำหนดได้ ตัวอย่างเช่น

https://www.randomizer.org

https://www.graphpad.com/quickcalcs/randomize2/

 

Copyright © 2022 Kris Ariyabuddhiphongs