獨斷論

One-way ANOVA between subjects (통계 R 초급 - 6) 본문

과학과 기술/R 통계

One-way ANOVA between subjects (통계 R 초급 - 6)

부르칸 2013. 8. 1. 05:21

전통적인 paramtric analysis의 일반적인 가정은 다음과 같다.

  • random sampling
  • 특정 observation의 종속변수 값이 다른 observation의 종속변수의 값에 영향을 받지 아니한다.
  • 분산이 homogeneity를 가져야 한다.

대개의 경우 세번째 가정을 만족시키지 못하여 nonparametric analysis를 쓰는 경우가 많다.

 

통계 R은 ANOVA를 수행하기 위한 여러가지 함수를 제공하고 있는데 여기서는 가장 간단한 형태인 oneway.test()에 대해서 알아보기로 하자. 이 함수는 간단한 between subjects design에 사용된다.

사용방법은 다음과 같으며 R terminal에서 help(oneway.test)라고 치면 자세한 것을 볼수 있다.

oneway.test(formula, data, subset, na.action, var.equal = FALSE)  

이제 R에서 기본적으로 제공하는 데이터를 이용하여 oneway.test()를 수행해 보기로 하자.

R에서 제공하는 데이터를 불러들이기 위해 아래와 같이 수행한다.

    > data(InsectSprays)
    > str(InsectSprays)
    'data.frame':   72 obs. of  2 variables:
     $ count: num  10 7 20 14 14 12 10 23 17 20 ...
     $ spray: Factor w/ 6 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 1 1 ...

str()은 데이터의 구조를 간략하게 보여주는 함수이다.

보는 바와 같이 InsectSprays는 observation이 72개이고 변수는 2개인 데이터인데 변수명이 count와 spray이며 각각 numeric과 factor를 그 데이터형으로 갖는다.

spray는 살충제 회사이름이고 count는 해당 살충제를 뿌렸을때 남아 있는 벌레의 갯수를 나타낸다. 따라서 ANOVA를 수행하여 살충제가 제품에 따라 그 효과가 달라지는지를 알수 있다.

Boxplot을 그려보면 그 대략을 알수있다.

> boxplot(InsectSprays$count ~ InsectSprays$spray)

 

그림으로만 보더라도 6가지 종류의 살충제가 그 성능이 제각각임을 보여준다.

이제 ANOVA를 수행해보자.

    > oneway.test(InsectSprays$count ~ InsectSprays$spray)


            One-way analysis of means (not assuming equal variances)


    data:  InsectSprays$count and InsectSprays$spray
    F = 36.0654, num df = 5.000, denom df = 30.043, p-value = 7.999e-12

p-value가 0에 가까움으로 null hypothesis가 성립하지 않는다고 보아야하며 살충제의 효과가 회사별로 서로 다름을 보여준다.

oneway.test()는 기본적으로 각 그룹의 분산이 같다는 가정을 하지 않는다. 만약 각 그룹의 분산이 같다고 가정하고 싶다면 해당옵션을 첨가하면 된다. 그 함수 사용 용례는 아래와 같다.

    > oneway.test(InsectSprays$count ~ InsectSprays$spray, var.equal=T)


            One-way analysis of means


    data:  InsectSprays$count and InsectSprays$spray
    F = 34.7023, num df = 5, denom df = 66, p-value < 2.2e-16

 

Missing values의 처리방법

데이터에 missing values가 있다고 가정하고 임의의 위치에 NA를 지정한다. 여기서는 값이 26인곳을 NA로 지정하였다.

    > new.data = ifelse(InsectSprays$count == 26, NA, InsectSprays$count)
    > spray = InsectSprays$spray

이제 위 새로 만든 데이터를 이용하여 one way ANOVA를 수행하면 아래와 같다.

    > oneway.test(new.data ~ spray)


            One-way analysis of means (not assuming equal variances)


    data:  new.data and spray
    F = 35.5121, num df = 5.000, denom df = 28.697, p-value = 1.926e-11

R에서는 missing values가 있더라도 자동으로 그 값을 제외하고 계산하므로 데이터에 NA가 있더라도 크게 문제될거는 없다. 만약 missing values가 있을때에 수행을 정지하도록 하고싶다면 아래와 같이 수행하면 된다.

    > oneway.test(new.data~spray, na.action="na.fail")
    Error in na.fail.default(list(new.data = c(10, 7, 20, 14, 14, 12, 10,  :
      missing values in object

 

Testing For Homogeneity of Variance 

Bartlett test를 이용하여 각 그룹의 분산이 같은지 다른지 보자.

    > bartlett.test(count ~ spray, data=InsectSprays)

            Bartlett test of homogeneity of variances

    data:  count by spray
    Bartlett's K-squared = 25.9598, df = 5, p-value = 9.085e-05

p-value가 0.05보다 작으므로 95%신뢰도에서 각 그룹의 분산은 같다고 볼수 없다.

 

Nonparametric test

ANOVA를 nonparametric test를 이용하여 수행할 수도 있다.

    > kruskal.test(count ~ spray, data=InsectSprays)


            Kruskal-Wallis rank sum test


    data:  count by spray
    Kruskal-Wallis chi-squared = 54.6913, df = 5, p-value = 1.511e-10

데이터의 분산이 서로 같지 않다고 하여 무조건 kruskal test를 이용하면 다 맞다고 보장할수 있는건 아니다. 이 방법은 주로 정규분포의 문제가 있을때 사용된다.

Comments