Statistics, R

R에서 variance ratio test (variance test)를 하는 방법

Jonggg 2023. 11. 11. 23:01

종종 두 그룹에서 데이터의 분산이 다른지 검정하고 싶을 수 있다 (궁금증이 많으면 그럴수도 있다. 이해하시라). 몇몇사람들은 t-test에서 등분산을 가정할지 말지 결정하기 위해서 t-test를 수행하기 이전에 variance ratio test를 먼저 수행해 보기도 한다.

 

R로 variance ratio test를 수행해 보기 위해, t-test에서와 마찬가지로 datasets 패키지에 내장되어있는 airquality 데이터를 이용해보자.

 

data(airquality)
str(airquality)
## 'data.frame':    153 obs. of  6 variables:
##  $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
##  $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
##  $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
##  $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
##  $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...
airquality$Ozone_g <- ifelse(airquality$Ozone >= mean(airquality$Ozone, na.rm=T), "high", "low")
head(airquality)
##   Ozone Solar.R Wind Temp Month Day Ozone_g
## 1    41     190  7.4   67     5   1     low
## 2    36     118  8.0   72     5   2     low
## 3    12     149 12.6   74     5   3     low
## 4    18     313 11.5   62     5   4     low
## 5    NA      NA 14.3   56     5   5    <NA>
## 6    28      NA 14.9   66     5   6     low


R에서는 아래와 같이 var.test() 함수를 이용한다.

 

(var_test <- var.test(Temp ~ Ozone_g, data=airquality))
## 
##  F test to compare two variances
## 
## data:  Temp by Ozone_g
## F = 0.45283, num df = 43, denom df = 71, p-value = 0.006092
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.2682961 0.7925954
## sample estimates:
## ratio of variances 
##          0.4528301


var.test() 결과 object(아래 예시에서는 var_test) 역시 아래와 같은 요소들을 가지고 있으니, 확인해 보자.

 

var_test$statistic # F값
var_test$parameter # dfs
var_test$p.value # F값에 대한 p-value
2*pf(q=var_test$statistic, df1=var_test$parameter[1], df2=var_test$parameter[2]) # F값에 대한 p-value
var_test$conf.int # 두 그룹 variance ratio에 대한 95% CI
var_test$estimate # variance ratio
(v1 <- tapply(airquality$Temp, airquality$Ozone_g, FUN=function(x) var(x))[1])
(v2 <- tapply(airquality$Temp, airquality$Ozone_g, FUN=function(x) var(x))[2])
v1/v2 # variance ratio
var_test$null.value # 두 그룹 variance ratio가 어떤값과 다른지 평가하기 위한 null value, default는 1
var_test$alternative # "two.sided" (default), "greater" or "less"
cat("F값: ", var_test$statistic
    , "\ndfs: ", var_test$parameter
    , "\nF값에 대한 p-value: ", var_test$p.value, 2*pf(q=var_test$statistic, df1=var_test$parameter[1], df2=var_test$parameter[2])
    , "\n두 그룹 variance ratio에 대한 95% CI: ", var_test$conf.int
    , "\nvariance ratio: ", var_test$estimate
    , "\nvariance1: ", (v1 <- tapply(airquality$Temp, airquality$Ozone_g, FUN=function(x) var(x))[1])
    , "\nvariance2: ", (v2 <- tapply(airquality$Temp, airquality$Ozone_g, FUN=function(x) var(x))[2])
    , "\nvariance ratio: ", v1/v2
    , "\n두 그룹 variance ratio가 어떤값과 다른지 평가하기 위한 null value(default는 1): ", var_test$null.value
    , "\ntwo.sided (default), greater or less: ", var_test$alternative
    )
## F값:  0.4528301 
## dfs:  43 71 
## F값에 대한 p-value:  0.006092383 0.006092383 
## 두 그룹 variance ratio에 대한 95% CI:  0.2682961 0.7925954 
## variance ratio:  0.4528301 
## variance1:  25.92178 
## variance2:  57.24394 
## variance ratio:  0.4528301 
## 두 그룹 variance ratio가 어떤값과 다른지 평가하기 위한 null value(default는 1):  1 
## two.sided (default), greater or less:  two.sided

 

이상으로 R에서 variance ratio test를 하는 방법을 알아보았다.