獨斷論

Factorial Between-Subjects ANOVA - 첫번째 (통계 R 초급 - 8) 본문

과학과 기술/R 통계

Factorial Between-Subjects ANOVA - 첫번째 (통계 R 초급 - 8)

부르칸 2013. 11. 24. 11:28

이번에 할것은 Factorial Between-Subjects ANOVA이다. 

우선 R에서 제공하는 ToothGrowth 데이터를 이용한다.

이를 불러오기 위해서는 아래와 같이 실행하면 된다.

> data(ToothGrowth)
> str(ToothGrowth)
'data.frame':   60 obs. of  3 variables:
 $ len : num  4.2 11.5 7.3 5.8 6.4 10 11.2 11.2 5.2 7 ...
 $ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 2 2 2 2 ...
 $ dose: num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
>

데이터구조는 dataframe이고 60개의 observation에 3개의 변수를 갖는다.

  • len는 치아의 길이로
    numeric형이다.
  • supp는 보충제로 VC는 ascorbic acid로 비타민 C의 종류이다. OJ는 오렌지주스를 나타낸다.
    factor형이다.
  • dose는 위 supp를 처치한 양을 나타낸다.
    numeric형이다. 
ToothGrowth의 자세한 내용을 보기 원한다면 아래와 같이 실행한다. 
> View(ToothGrowth)
이제 치아의 길이가 오렌지주스와 비타민 C의 투여량의 변화에 따라 어떻게 달라지는가를 ANOVA로 알아볼 것이다. 
 
R에서 ANOVA를 실행하기 전에 독립변수는 factor 변수형을 고쳐야만 하는데 아래와 같이 실행하면 된다.
> ToothGrowth$dose = factor(ToothGrowth$dose, levels = c(0.5, 1.0, 2.0), labels = c("low", "med", "high"))
> str(ToothGrowth)  
'data.frame':   60 obs. of  3 variables:
 $ len : num  4.2 11.5 7.3 5.8 6.4 10 11.2 11.2 5.2 7 ...
 $ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 2 2 2 2 ...
 $ dose: Factor w/ 3 levels "low","med","high": 1 1 1 1 1 1 1 1 1 1 ...

결과에서 보듯이 dose가 numeric형에서 factor형으로 바뀌어있다. 

그리고 0.5를 low, 1.0을 med, 2.0을 high라는 factor형 데이터값으로 바꾸었다. 

 

이제 boxplot을 그려 대략의 ANOVA결과를 짐작해보자.

> boxplot(len ~ supp*dose, data=ToothGrowth, ylab="Tooth Length", main="Boxplots")

 

위 그림에서 평균에서 큰 차이를 보여주고 있지만, 분산은 서로 다르므로 Bartlett’s test for Homogeneity of Variance를 해봐야 할 것이다. 

 

Interaction term을 없애고 각각의 변수로 그려볼수도 있다. 

> boxplot(len ~ supp, data=ToothGrowth, ylab="Tooth Length", main="Boxplots")

> boxplot(len ~ dose, data=ToothGrowth, ylab="Tooth Length", main="Boxplots")

결과는 지면관계상 생략하지만 OJ나 VC는 len을 크게 변화시키지 못하고 dose의 양이 len을 크게 변화시킴을 보여줄 것이다. 

 

그리고 ANOVA에서 중요한 것은 interaction plot인데 아래와 같이 그릴수 있다. 

> with(ToothGrowth, interaction.plot(x.factor=dose, trace.factor=supp, response=len, 

                                     fun=mean, type="b", legend=T, 

                                     ylab="Tooth length", main="Interaction plot", 

                                     pch=c(1,19)))

위 R script에서 

x.factor는 x축에 그려질 변수이고, 

trace.factor는 그래프에서 각각 그려질 변수이다. 

response는 y변수를 나타낸다. 

fun은 어떤 함수를 그릴것인가를 나타내는데 여기서는 평균값을 그렸다. 

type는 line과 point 두 개(both)를 그린다고 하여 "b"로 나타내었다. 나머지는 쉽게 알수 있다. 

 

위 그래프에서 우리는 아래와 같은 것을 알수있다. 

  • high dose에서 두 그룹 사이에 큰 차이가 없다. 
  • dose양이 많을수록 치아의 크기가 커짐을 알수 있다.(main effect)
  • supp는 크게 영향을 미치지 않는다.(main effect)
위 그래프를 coplot이라는 걸 이용해서 나타낼 수도 있다. 
> coplot(len ~ dose | supp, data=ToothGrowth, panel=panel.smooth, xlab="Tooth Growth Data")

 

 

지금까지의 결과를 숫자로 나타내기를 위한다면 아래와 같이 수행하면 된다.

> with(ToothGrowth, tapply(len, list(supp, dose), mean))

     low   med  high

OJ 13.23 22.70 26.06

VC  7.98 16.77 26.14

supp가 VC이고 dose가 low일때 len는 7.98이다라고 해석할수 있고 나머지도 이와 같다. 

 

또한 ANOVA를 수행하기 전에 homogeneity를 검사해봐야 하는데 아래와 같이 수행한다. 

> bartlett.test(len~supp*dose, data=ToothGrowth)

 

        Bartlett test of homogeneity of variances

 

data:  len by supp by dose

Bartlett's K-squared = 1.4217, df = 1, p-value = 0.2331

p가 0.2331 < 0.05이고 significant하지 않으므로 그룹간의 분산은 크게 다르지 않다고 할수 있다. 

 

여기까지 ANOVA를 수행하기 전에 대략적으로 알아보기 위한 것이며 다음에 본격적으로 ANOVA를 수행해보기로 하자. 

 

 

Comments