상세 컨텐츠

본문 제목

R에서 T-Test 반복수행과 통계표 작성

프로그래밍/Big Data

by 삶의 재발견 2018. 1. 12. 09:05

본문

반응형

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")]


최종결과가 다음과 같이 표시되어, 편리하게 보고서와 논문에 바로 사용할 수 있습니다.







반응형

관련글 더보기