R에서 양방향 anova를 수행하는 방법


양방향 ANOVA (“분산 분석”)는 두 요인에 걸쳐 분할된 3개 이상의 독립 그룹의 평균 간에 통계적으로 유의미한 차이가 있는지 여부를 확인하는 데 사용됩니다.

이 튜토리얼에서는 R에서 양방향 ANOVA를 수행하는 방법을 설명합니다.

예: R의 양방향 ANOVA

운동 강도와 성별이 체중 감량에 영향을 미치는지 확인하고 싶다고 가정해 보겠습니다. 이 경우 우리가 보고 있는 두 가지 요소는 운동성별 이며, 응답 변수는 파운드 단위로 측정되는 체중 감소 입니다.

운동과 성별이 체중 감량에 영향을 미치는지 확인하고 운동과 성별이 체중 감량에 상호 작용이 있는지 확인하기 위해 양방향 분산 분석을 수행할 수 있습니다.

우리는 남성 30명, 여성 30명을 무작위로 10명씩 무작위로 할당하여 한 달 동안 운동을 하지 않거나 가벼운 운동 또는 격렬한 운동 프로그램을 따르는 실험에 참여하도록 모집하고 있습니다.

다음 코드는 우리가 작업할 데이터 프레임을 생성합니다.

 #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

데이터 탐색

양방향 ANOVA 모델을 적용하기 전에 dplyr 패키지를 사용하여 6개 치료 그룹 각각에 대한 체중 감소의 평균 및 표준 편차를 찾아 데이터를 더 잘 이해할 수 있습니다.

 #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 

또한 6개 치료 그룹 각각에 대한 상자 그림을 만들어 각 그룹의 체중 감소 분포를 시각화할 수도 있습니다.

 #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
)

강렬한 운동에 참여한 두 그룹의 체중 감량 값이 더 높은 것으로 즉시 알 수 있습니다. 또한 강렬한 운동 그룹과 가벼운 운동 그룹 모두에서 남성이 여성보다 체중 감량 값이 더 높은 경향이 있음을 알 수 있습니다.

다음으로, 이러한 시각적 차이가 실제로 통계적으로 유의한지 확인하기 위해 양방향 ANOVA 모델을 데이터에 적용하겠습니다.

양방향 ANOVA 모델 피팅

R에서 양방향 ANOVA 모델을 피팅하는 일반적인 구문은 다음과 같습니다.

aov(응답 변수 ~predictor_variable1 *predictor_variable2, 데이터 = 데이터 세트)

두 예측 변수 사이의 * 는 두 예측 변수 간의 상호 작용 효과도 테스트하고 싶다는 것을 나타냅니다.

이 예에서는 체중 감량을 응답 변수로 사용하고 성별운동을 두 예측 변수로 사용하여 양방향 ANOVA 모델을 맞추기 위해 다음 코드를 사용할 수 있습니다.

그런 다음 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에서 통계적으로 유의미한 것으로 나타났습니다.

모델 가정 확인

더 나아가기 전에 모델 결과가 신뢰할 수 있도록 모델의 가정이 충족되는지 확인해야 합니다. 특히 양방향 ANOVA는 다음을 가정합니다.

1. 독립성 – 각 그룹의 관찰은 서로 독립적이어야 합니다. 무작위 설계를 사용했기 때문에 이 가정이 충족되어야 하므로 크게 걱정할 필요가 없습니다.

2. 정규성 – 종속 변수는 두 요인 그룹의 각 조합에 대해 대략적인 정규 분포를 가져야 합니다.

이 가정을 테스트하는 한 가지 방법은 모델 잔차의 히스토그램을 만드는 것입니다. 잔차가 대략적으로 정규 분포를 따르는 경우 이 가정이 충족되어야 합니다.

 #define model residuals
reside <- model$residuals

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

잔차는 대략 정규 분포를 따르므로 정규성 가정이 충족된다고 가정할 수 있습니다.

3. 등분산 – 각 그룹의 분산이 동일하거나 거의 동일합니다.

이 가정을 확인하는 한 가지 방법은 car 패키지를 사용하여 등분산 테스트를 수행하는 것입니다.

 #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-값: 0.990364).

또한 R의 plot() 함수를 사용하여 Tukey 테스트의 결과인 95% 신뢰 구간을 시각화할 수 있습니다.

 #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)

양방향 ANOVA 결과 보고

마지막으로 결과를 요약하는 방식으로 양방향 ANOVA의 결과를 보고할 수 있습니다.

성별( 남성, 여성) 및 운동 프로그램 (없음, 가벼운 운동, 강렬한 운동)이 체중 감량 (파운드로 측정)에 미치는 영향을 조사하기 위해 양방향 ANOVA를 수행했습니다. 성별과 운동이 체중 감량에 미치는 영향 사이에는 통계적으로 유의미한 상호작용이 있었습니다(F(2, 54) = 4.615, p = 0.0141). 사후 Tukey의 HSD 테스트가 수행되었습니다.

남성의 경우, 강렬한 운동 프로그램은 가벼운 프로그램(p < 0.0001)이나 운동 프로그램을 하지 않는 것 (p < 0.0001)에 비해 체중 감량 효과가 훨씬 컸습니다. 또한 남성의 경우 가벼운 식사는 운동을 하지 않는 것 보다 훨씬 더 큰 체중 감소를 가져왔습니다(p < 0.0001).

여성의 경우, 강렬한 운동 프로그램은 가벼운 프로그램(p < 0.0001)이나 운동 프로그램을 하지 않는 것 (p < 0.0001)에 비해 훨씬 더 큰 체중 감소를 가져왔습니다.

ANOVA의 가정이 충족되는지 확인하기 위해 정규성 검사와 Levene 테스트를 수행했습니다.

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다