วิธีดำเนินการวิเคราะห์ความแปรปรวนแบบสองทางใน r


การวิเคราะห์ ความแปรปรวนแบบสองทาง (“การวิเคราะห์ความแปรปรวน”) ใช้เพื่อพิจารณาว่ามีความแตกต่างที่มีนัยสำคัญทางสถิติระหว่างค่าเฉลี่ยของกลุ่มอิสระสามกลุ่มขึ้นไปที่ถูกแบ่งออกเป็นสองปัจจัยหรือไม่

บทช่วยสอนนี้จะอธิบายวิธีดำเนินการวิเคราะห์ความแปรปรวนแบบสองทางใน R

ตัวอย่าง: การวิเคราะห์ความแปรปรวนแบบสองทางใน R

สมมติว่าเราต้องการพิจารณาว่าความเข้มข้นของการออกกำลังกายและเพศส่งผลต่อการลดน้ำหนักหรือไม่ ในกรณีนี้ ปัจจัยสองประการที่เรากำลังดูคือ การออกกำลังกาย และ เพศ และตัวแปรการตอบสนองคือ การลดน้ำหนัก โดย มีหน่วยวัดเป็นปอนด์

เราสามารถใช้การวิเคราะห์ความแปรปรวนแบบสองทางเพื่อตรวจสอบว่าการออกกำลังกายและเพศส่งผลต่อการลดน้ำหนักหรือไม่ และเพื่อพิจารณาว่ามีปฏิสัมพันธ์ระหว่างการออกกำลังกายและเพศต่อการลดน้ำหนักหรือไม่

เรากำลังคัดเลือกผู้ชาย 30 คนและผู้หญิง 30 คนเพื่อเข้าร่วมการทดลอง โดยสุ่มมอบหมายให้คนละ 10 คนทำตามโปรแกรมที่ไม่ออกกำลังกาย ออกกำลังกายเบา ๆ หรือออกกำลังกายหนัก ๆ เป็นเวลาหนึ่งเดือน

รหัสต่อไปนี้จะสร้าง data frame ที่เราจะใช้งานด้วย:

 #make this example reproducible
set.seed(10)

#create data frame
data <- data.frame(gender = rep(c("Male", "Female"), each = 30),
                   exercise = rep(c("None", "Light", "Intense"), each = 10, times = 2),
                   weight_loss = c(runif(10, -3, 3), runif(10, 0, 5), runif(10, 5, 9),
                                   runif(10, -4, 2), runif(10, 0, 3), runif(10, 3, 8)))

#view first six rows of data frame
head(data)

# gender exercise weight_loss
#1 Male None 0.04486922
#2 Male None -1.15938896
#3 Male None -0.43855400
#4 Male None 1.15861249
#5 Male None -2.48918419
#6 Male None -1.64738030

#see how many participants are in each group
table(data$gender, data$exercise)

# Intense Light None
# Female 10 10 10
# Male 10 10 10

สำรวจข้อมูล

ก่อนที่จะปรับแบบจำลองการวิเคราะห์ความแปรปรวนแบบสองทางให้เหมาะสม เราสามารถเข้าใจข้อมูลได้ดีขึ้นโดยการค้นหาค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐานของการลดน้ำหนักสำหรับแต่ละกลุ่มการรักษาทั้งหกกลุ่มโดยใช้แพ็คเกจ dplyr :

 #load dplyr package
library(dplyr)

#find mean and standard deviation of weight loss for each treatment group
data %>%
  group_by (gender, exercise) %>%
  summarize (mean = mean(weight_loss),
            sd = sd(weight_loss))

# A tibble: 6 x 4
# Groups: gender [2]
# gender exercise means sd
#          
#1 Female Intense 5.31 1.02 
#2 Female Light 0.920 0.835
#3 Female None -0.501 1.77 
#4 Male Intense 7.37 0.928
#5 Male Light 2.13 1.22 
#6 Male None -0.698 1.12 

นอกจากนี้เรายังสามารถสร้าง boxplot สำหรับแต่ละกลุ่มการรักษาทั้งหกกลุ่มเพื่อให้เห็นภาพการกระจายตัวของการลดน้ำหนักสำหรับแต่ละกลุ่ม:

 #set margins so that axis labels on boxplot don't get cut off
by(mar=c(8, 4.1, 4.1, 2.1))

#create boxplots
boxplot(weight_loss ~ gender:exercise,
data = data,
main = "Weight Loss Distribution by Group",
xlab = "Group",
ylab = "Weight Loss",
col = "steelblue",
border = "black", 
las = 2 #make x-axis labels perpendicular
)

เราจะเห็นได้ทันทีว่าทั้ง 2 กลุ่มที่ออกกำลังกาย หนักๆ ดูเหมือนจะมีค่าการลดน้ำหนักที่สูงกว่า เรายังเห็นได้ว่าผู้ชายมักจะมีค่าการลดน้ำหนักที่สูงกว่าผู้หญิงทั้งในกลุ่มออกกำลังกาย ที่เข้มข้น และ เบา

ต่อไป เราจะปรับแบบจำลองการวิเคราะห์ความแปรปรวนแบบสองทางให้พอดีกับข้อมูลของเรา เพื่อดูว่าความแตกต่างทางสายตาเหล่านี้มีนัยสำคัญทางสถิติจริง ๆ หรือไม่

ติดตั้งโมเดล ANOVA แบบสองทาง

ไวยากรณ์ทั่วไปสำหรับการปรับโมเดล ANOVA แบบสองทางให้เหมาะสมใน R คือ:

aov (ตัวแปรการตอบสนอง ~predictor_variable1 *predictor_variable2, data = ชุดข้อมูล)

โปรดทราบว่าเครื่องหมาย * ระหว่างตัวแปรทำนายทั้งสองบ่งชี้ว่าเราต้องการทดสอบเอฟเฟกต์การโต้ตอบระหว่างตัวแปรทำนายทั้งสองด้วย

ในตัวอย่างของเรา เราสามารถใช้โค้ดต่อไปนี้เพื่อให้พอดีกับโมเดล ANOVA แบบสองทาง โดยใช้ Weight_loss เป็นตัวแปรตอบสนอง และใช้ เพศ และ แบบฝึกหัด เป็นตัวแปรทำนายสองตัว

จากนั้นเราสามารถใช้ฟังก์ชัน summary() เพื่อแสดงผลลัพธ์ของโมเดลของเรา:

 #fit the two-way ANOVA model
model <- aov(weight_loss ~ gender * exercise, data = data)

#view the model output
summary(model)

# Df Sum Sq Mean Sq F value Pr(>F)    
#gender 1 15.8 15.80 11.197 0.0015 ** 
#exercise 2 505.6 252.78 179.087 <2e-16 ***
#gender:exercise 2 13.0 6.51 4.615 0.0141 *  
#Residuals 54 76.2 1.41                   
#---
#Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

จากผลลัพธ์ของแบบจำลอง เราจะเห็นว่า เพศ การออกกำลังกาย และปฏิสัมพันธ์ระหว่างตัวแปรทั้งสองล้วนมีนัยสำคัญทางสถิติที่ระดับนัยสำคัญ 0.05

การตรวจสอบสมมติฐานแบบจำลอง

ก่อนที่เราจะไปไกลกว่านั้น เราต้องตรวจสอบว่าเป็นไปตามสมมติฐานของแบบจำลองของเรา เพื่อให้ผลลัพธ์ของแบบจำลองของเราเชื่อถือได้ โดยเฉพาะอย่างยิ่ง การวิเคราะห์ความแปรปรวนแบบสองทางจะถือว่า:

1. ความเป็นอิสระ – การสังเกตของแต่ละกลุ่มจะต้องเป็นอิสระจากกัน เนื่องจากเราใช้ การออกแบบแบบสุ่ม จึงควรเป็นไปตามสมมติฐานนี้ ดังนั้นเราจึงไม่ต้องกังวลกับเรื่องนี้มากเกินไป

2. ความปกติ – ตัวแปรตามควรมีการแจกแจงแบบปกติโดยประมาณสำหรับการรวมกันของกลุ่มของทั้งสองปัจจัยแต่ละกลุ่ม

วิธีหนึ่งในการทดสอบสมมติฐานนี้คือการสร้างฮิสโตแกรมของส่วนที่เหลือของแบบจำลอง หากส่วนที่เหลือมีการกระจายตามปกติโดยประมาณ ก็ควรจะเป็นไปตามสมมติฐานนี้

 #define model residuals
reside <- model$residuals

#create histogram of residuals
hist(resid, main = "Histogram of Residuals", xlab = "Residuals", col = "steelblue")

ส่วนที่เหลือจะมีการกระจายตามปกติโดยประมาณ ดังนั้นเราจึงสรุปได้ว่าเป็นไปตามสมมติฐานภาวะปกติ

3. ความแปรปรวนที่เท่ากัน – ความแปรปรวนสำหรับแต่ละกลุ่มจะเท่ากันหรือเท่ากันโดยประมาณ

วิธีหนึ่งในการตรวจสอบสมมติฐานนี้คือทำการทดสอบ Levene เพื่อหาความเท่าเทียมกันของความแปรปรวนโดยใช้แพ็คเกจ รถ :

 #load car package
library(car)

#conduct Levene's Test for equality of variances
leveneTest(weight_loss ~ gender * exercise, data = data)

#Levene's Test for Homogeneity of Variance (center = median)
# Df F value Pr(>F)
#group 5 1.8547 0.1177
#54  

เนื่องจากค่า p ของการทดสอบมากกว่าระดับนัยสำคัญของเราที่ 0.05 เราจึงสามารถสรุปได้ว่าเป็นไปตามสมมติฐานของเราในเรื่องความเท่าเทียมกันของความแปรปรวนระหว่างกลุ่ม

วิเคราะห์ความแตกต่างในการรักษา

เมื่อเราตรวจสอบแล้วว่าเป็นไปตามสมมติฐานของแบบจำลองแล้ว เราก็สามารถทำการ ทดสอบหลังการทดสอบ เพื่อระบุได้อย่างแน่ชัดว่ากลุ่มการรักษาใดที่แตกต่างกัน

สำหรับการทดสอบหลังการทดสอบ เราจะใช้ฟังก์ชัน TukeyHSD() เพื่อทำการทดสอบ Tukey สำหรับการเปรียบเทียบหลายรายการ:

 #perform Tukey's Test for multiple comparisons
TukeyHSD(model, conf.level=.95) 

#Tukey multiple comparisons of means
# 95% family-wise confidence level
#
#Fit: aov(formula = weight_loss ~ gender * exercise, data = data)
#
#$gender
# diff lwr upr p adj
#Male-Female 1.026456 0.4114451 1.641467 0.0014967
#
#$exercise
# diff lwr upr p adj
#Light-Intense -4.813064 -5.718493 -3.907635 0.0e+00
#None-Intense -6.938966 -7.844395 -6.033537 0.0e+00
#None-Light -2.125902 -3.031331 -1.220473 1.8e-06
#
#$`gender:exercise`
# diff lwr upr p adj
#Male:Intense-Female:Intense 2.0628297 0.4930588 3.63260067 0.0036746
#Female:Light-Female:Intense -4.3883563 -5.9581272 -2.81858535 0.0000000
#Male:Light-Female:Intense -3.1749419 -4.7447128 -1.60517092 0.0000027
#Female:None-Female:Intense -5.8091131 -7.3788841 -4.23934219 0.0000000
#Male:None-Female:Intense -6.0059891 -7.5757600 -4.43621813 0.0000000
#Female:Light-Male:Intense -6.4511860 -8.0209570 -4.88141508 0.0000000
#Male:Light-Male:Intense -5.2377716 -6.8075425 -3.66800066 0.0000000
#Female:None-Male:Intense -7.8719429 -9.4417138 -6.30217192 0.0000000
#Male:None-Male:Intense -8.0688188 -9.6385897 -6.49904786 0.0000000
#Male:Light-Female:Light 1.2134144 -0.3563565 2.78318536 0.2185439
#Female:None-Female:Light -1.4207568 -2.9905278 0.14901410 0.0974193
#Male:None-Female:Light -1.6176328 -3.1874037 -0.04786184 0.0398106
#Female:None-Male:Light -2.6341713 -4.2039422 -1.06440032 0.0001050
#Male:None-Male:Light -2.8310472 -4.4008181 -1.26127627 0.0000284
#Male:None-Female:None -0.1968759 -1.7666469 1.37289500 0.9990364

ค่า p บ่งชี้ว่าแต่ละกลุ่มมีความแตกต่างที่มีนัยสำคัญทางสถิติหรือไม่

ตัวอย่างเช่น ในแถวสุดท้ายด้านบน เราพบว่ากลุ่มผู้ชายที่ไม่ออกกำลังกายไม่มีความแตกต่างที่มีนัยสำคัญทางสถิติในการลดน้ำหนัก เมื่อเทียบกับกลุ่มผู้หญิงที่ไม่ออกกำลังกาย (p-value: 0.990364)

นอกจากนี้เรายังสามารถเห็นภาพช่วงความเชื่อมั่น 95% ที่เกิดจากการทดสอบ Tukey โดยใช้ฟังก์ชัน plot() ใน R:

 #set axis margins so labels don't get cut off
by(mar=c(4.1, 13, 4.1, 2.1))

#create confidence interval for each comparison
plot(TukeyHSD(model, conf.level=.95), las = 2)

การรายงานผลลัพธ์การวิเคราะห์ความแปรปรวนแบบสองทาง

สุดท้ายนี้ เราสามารถรายงานผลลัพธ์ของการวิเคราะห์ความแปรปรวนแบบสองทางในลักษณะที่สรุปผลลัพธ์ได้:

ทำการวิเคราะห์ความแปรปรวนแบบสองทางเพื่อตรวจสอบผลกระทบของเพศ ( ชาย หญิง) และโปรแกรมการออกกำลังกาย (ไม่มี เบา รุนแรง) ต่อการลดน้ำหนัก (วัดเป็นปอนด์) มีปฏิสัมพันธ์ที่มีนัยสำคัญทางสถิติระหว่างผลกระทบของเพศและการออกกำลังกายต่อการลดน้ำหนัก (F(2, 54) = 4.615, p = 0.0141) ทำการทดสอบ HSD ของ Post-hoc Tukey

สำหรับผู้ชาย โปรแกรมการออกกำลังกาย เข้มข้น ส่งผลให้น้ำหนักลดลงมากกว่าโปรแกรม เบาๆ (p < 0.0001) หรือ ไม่ออกกำลังกายเลย (p < 0.0001) อย่างมีนัยสำคัญ นอกจากนี้ ในผู้ชาย การรับประทานอาหาร เบาๆ ส่งผลให้น้ำหนักลดลงมากกว่า การไม่ออกกำลังกายอย่าง มีนัยสำคัญ (p < 0.0001)

สำหรับผู้หญิง โปรแกรมการออกกำลังกาย เข้มข้น ส่งผลให้น้ำหนักลดลงมากกว่าโปรแกรม เบาๆ (p < 0.0001) หรือ ไม่ออกกำลังกายเลย (p < 0.0001) อย่างมีนัยสำคัญ

การตรวจสอบภาวะปกติและการทดสอบ Levene ดำเนินการเพื่อตรวจสอบว่าเป็นไปตามสมมติฐานของ ANOVA

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *