R에서 T-Test 반복수행과 통계표 작성
R에서 T-Test를 여러 변수에 대해 수행하는 경우 다음과 같은 방법으로 하면 됩니다.
1. iris에서 2개의 그룹만 추출
> df_data <- iris %>% filter(Species %in% c("setosa","versicolor" ))
2. 모든 대상 변수(컬럼) 추출
# 모든 컬럼명 추출 후 분류가 되는 Species는 제외
> t.cols <- colnames(df_data)
> t.cols <- t.cols[t.cols!= "Species"]
3. 모든 대상 변수(컬럼)에 대해 그룹별 T-Test 수행
> lapply(df_data[,t.cols], function(x) t.test(x ~ df_data$Species, var.equal = TRUE))
"Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"에 대해서 각각의 T-Test 결과가 표시됩니다.
4. 문제점
위의 방법의 문제점은 분산 동질성 결과를 고려하여 T-Test의 var.equal 옵션이 반영되지 않는 점이며, 통계표를 작성하기 위해서 모든 값들을 찾아서 정리해야 한다는 것입니다.
5. 해결방법: 분산동질성
다음 코드를 이용하면, 분산동질성 결과에 따라 자동으로 T-Test 옵션을 설정하고 그룹별 평균과, p-value, t-value, t-method 등의 값을 하나로 정리해 줍니다.
#분류별 T-Test 수행
> t.return <- lapply(
t.cols,
function(x) {
Tw= var.test(df_data[[x]] ~ df_data$Species)
VarEqual<-ifelse(Tw$p.value>0.05, TRUE, FALSE) #분산동질성 검증결과에 따라 T-test 방법설정
Tx = t.test(df_data[[x]] ~ df_data$Species, var.equal =VarEqual)
return(data.frame(name=x,
group1.mean=Tx$estimate[1],
group2.mean=Tx$estimate[2],
f.p_value=Tw$p.value,
t.value=Tx$statistic,
t.p_value=Tx$p.value,
t.method=substr(Tx$method,1,12)
))
})
# List로 된 형태를 Data Frame으로 변경
> t.result <- NULL
rownames(t.result) <- NULL
for(i in 1:length(t.return)) {
t.result <- rbind(t.result, t.return[[i]])
}
> t.result
다음과 같이 그룹별 통계값들이 표시되어 이전에 비해 많이 편리해졌습니다.
그런데, 표본수와 표준편차값이 표시되지 습니다.
5. 표본수, 편차 추가하기
#표본수와 편차구하기: summarise_at에서 n()이 불가능하여, 일련번호를 추가하고 n_distinct() 이용
> t.n <- df_data %>% mutate(id=as.numeric(rownames(df_data))) %>%
group_by(Species) %>% summarise_at(t.cols, funs(n_distinct(id)))
> t.sd <- df_data %>% mutate(id=as.numeric(rownames(df_data))) %>%
group_by(Species) %>% summarise_at(t.cols, sd)
> t.result <- bind_cols(
t.result,
group1.n=as.numeric(t.n[1,2:(length(t.n))]),
group1.sd=as.numeric(t.sd[1,2:(length(t.sd))]),
group2.n=as.numeric(t.n[2,2:(length(t.n))]),
group2.sd=as.numeric(t.sd[2,2:(length(t.sd))])
)
# 소숫점 반올림하고 순서대로 출력
> t.result <- rapply(object = t.result, f = round, classes = "numeric", how = "replace", digits = 3)
> t.result[c("name", "group1.n" ,"group1.mean", "group1.sd", "group2.n", "group2.mean", "group2.sd","f.p_value" ,"t.value", "t.p_value", "t.method")]
최종결과가 다음과 같이 표시되어, 편리하게 보고서와 논문에 바로 사용할 수 있습니다.