ในอุดมคติ ผู้ทำการทดลองพยายามควบคุมปัจจัยแทรกซ้อนทั้งหมดให้คงที่ระหว่างกลุ่มทดลองและกลุ่มควบคุม (เช่น กลุ่มตัวอย่างมีน้ำหนัก ส่วนสูง ความฉลาด พื้นฐานการเลี้ยงดู อุณหภูมิห้อง ขั้นตอนการขอความยินยอม ฯลฯ) แต่ในทางปฏิบัติแล้ว ผู้ทดลองมักไม่สามารถควบคุมปัจจัยแทรกซ้อนได้ทั้งหมด โดยเฉพาะปัจจัยส่วนบุคคล (person variables; individual differences) เนื่องจากปัญหาทางด้านต้นทุนในการควบคุม ความเป็นไปได้ รวมไปถึงจริยธรรม การสุ่มเข้าเงื่อนไข (random assignment) จึงเป็นทางออกหนึ่งที่ใช้หลักการความน่าจะเป็นเข้ามาช่วยเฉลี่ยให้เงื่อนไขทดลองและเงื่อนไขควบคุมเท่าเทียมกัน หลักการของการสุ่มเข้าเงื่อนไขทำให้ลักษณะส่วนตัวของกลุ่มตัวอย่างมีโอกาสถูกกระจายไปในแต่ละเงื่อนไขอย่างเท่าเทียมกัน (เช่น แต่ละเงื่อนไขจะผู้เข้าร่วมการวิจัยที่มีบุคคลิกภาพแบบเปิดรับประสบการณ์สูง กลาง หรือต่ำ ในสัดส่วนใกล้เคียงกัน) ในทางสถิติแล้วเรียกว่าค่าความคาดหวัง (expectancy value) ของความแตกต่างระหว่างกลุ่มจะเป็น 0
ในทางปฏิบัติแล้ว การสุ่มเข้าเงื่อนไขไม่ได้ทำให้กลุ่มมีค่าที่สังเกตได้ (observed value) เท่ากัน เพราะความคลาดเคลื่อนทางสถิติ ปัญหานี้จะเบาบางลงถ้าผู้วิจัยสามารถมีกลุ่มตัวอย่างขนาดใหญ่ ซึ่งจะช่วยลดอิทธิพลของค่าคลาดเคลื่อนที่สุดโต่ง (เช่น บังเอิญมีผู้เข้าร่วมการวิจัยที่บุคลิกภาพเปิดตัวสูงมาก) ด้วยค่ากลางหรือค่าสุดโต่งอีกทาง (เช่น กลุ่มตัวอย่างส่วนใหญ่มีบุคลิกภาพเปิดตัวกลาง ๆ หรือ มีคนที่บุคลิกภาพปิดตัวถูกสุ่มมาอยู่ในกลุ่มเดียวกัน) ทำให้ค่าเฉลี่ยของกลุ่มควบคุมกับกลุ่มทดลองนั้นใกล้เคียงกันมากขึ้น ความแตกต่างใด ๆ ระหว่างกลุ่มที่เราพบก่อนเริ่มการทดลองนั้นเกิดจากความบังเอิญ/กระบวนการสุ่ม การทดสอบทางสถิติต่าง ๆ ก็จะคำนึงถึงความคลาดเคลื่อนนี้เอาไว้เพื่อตัดสินว่า “หากพบความแตกต่างระหว่างสองกลุ่ม ความแตกต่างดังกล่าวจะมีนัยสำคัญทางสถิติหรือไม่” (นั่นคือ หากเราคาดหวังว่าความแตกต่างระหว่างกลุ่มเท่ากับ 0 จะมีความน่าจะเป็น (probability) เท่าใดที่เราจะพบค่าความแตกต่างเท่ากับหรือมากกว่าที่สังเกตได้จากข้อมูล)
ปัจจุบันโปรแกรมการเก็บข้อมูลด้วยคอมพิวเตอร์มักจะมีคำสั่งสุ่มเข้าเงื่อนไขอยู่ด้วย แต่ในกรณีที่เราไม่ได้ใช้โปรแกรมเหล่านั้น เราสามารถสร้างการสุ่มเข้าเงื่อนไขด้วยโปรแกรมอื่น ๆ ได้ ในแบบฝึกหัดนี้เราจะพูดถึงการสุ่มด้วย Microsoft Excel, R, และเว็บไซต์
สมมติว่าเราต้องการสุ่มกลุ่มตัวอย่าง 30 ตัวอย่างเข้า 3 เงื่อนไข เงื่อนไขละ 10 คน เราอาจจะใช้วิธีง่าย ๆ เช่น ทอยลูกเต๋าสุ่มเข้าเงื่อนไขเมื่อเก็บข้อมูลแต่ละตัวอย่าง แต่เราอาจจะได้กลุ่มตัวอย่างในแต่ละเงื่อนไขไม่เท่ากันเนื่องจากกระบวนการสุ่ม เพื่อให้เรามั่นใจว่าเราจะได้กลุ่มตัวอย่างในแต่ละกลุ่มเท่า ๆ กัน เราควรจะสุ่มเงื่อนไขไว้ตั้งแต่ก่อนเริ่มการเก็บข้อมูล
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
ผู้วิจัยอาจต้องการเก็บข้อมูลเป็นเซ็ต เช่น สุ่มกลุ่มตัวอย่างเข้าเงื่อนไขให้ครบทุกเงื่อนไขเซ็ตนึงก่อนค่อยเริ่มเก็บข้อมูลเซ็ตถัดไป วิธีการนี้จะช่วยให้มั่นใจได้ว่าหากผู้วิจัยต้องหยุดเก็บข้อมูลกลางคัน จะมีข้อมูลในแต่ละเงื่อนไขเท่ากันหรือเกือบเท่ากัน
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)
การสร้าง vector ของค่าสุ่มใน R นั้นมีหลากหลายวิธีมาก วิธีที่จะแสดงต่อไปนี้เป็นการเลียนแบบการ sort ใน Excel
เริ่มจากการสร้าง 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 ตัวอย่าง เพื่อให้ได้ตัวอย่างเท่ากันในทุกเงื่อนไข
เพื่อสุ่มเป็น 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 ตัวอย่าง) ก็ยังได้กลุ่มตัวอย่างในแต่ละเงื่อนไขจำนวนเท่า ๆ กัน
นอกจากนี้ยังมีเว็บไซต์ที่ช่วยสุ่มเข้าเงื่อนไขตามลักษณะที่เรากำหนดได้ ตัวอย่างเช่น
Copyright © 2022 Kris Ariyabuddhiphongs