반응형

[R] 일원 배치 분산 분석 (One-way ANOVA, ANalysis Of VAriance) - aov(), pairwise.t.test(), ScheffeTest(), scheffe.test(), duncan.test(), TukeyHSD()

 

 이전 포스팅에서 음주 여부에 따른 ALT 평균에 차이가 있는지를 알아보기 위해서는 T test를 사용한다는 내용을 알아보았다.

2022.11.12 - [모평균 검정/R] - [R] 독립 표본 T검정 (Independent samples T-test) - t.test(), var.test(), levene.test()

 음주 여부는 "1) 음주자", "2) 비음주자"로 나뉘는 이분형 변수다. 즉, 음주자의 ALT 평균과 비음주자의 ALT 평균을 비교한 것이었다. 

 

 만약, 두 개 이상의 범주로 나뉘는 변수에 대해 모평균의 검정을 하고자 한다면 어떻게 해야 할까? 예를 들어, 흡연 상태를 "1) 비흡연자", "2) 과거 흡연자", "3) 현재 흡연자"로 나누었고, 각 그룹의 폐기능 검사 중 하나인 FVC (Forced Vital Capacity)의 평균에 차이가 있는지 알아보고자 한다. 

 

 이때 사용할 수 있는 방법이 일원 배치 분산 분석인 One-way ANOVA (Analysis of Variance)이며 이번 포스팅에서 다뤄볼 주된 내용이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.11.21)

 

분석용 데이터 (update 22.11.21)

2022년 11월 21일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 반복 측정 자료 분석 - 통계

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

목표: 흡연 상태에 따라 FVC 평균은 서로 다르다고 모집단 수준에서 말할 수 있는가?

 

전제조건 (정규성, 등분산성)

 ANOVA에는 두 가지 전제조건이 필요하다. 본 포스팅의 예시에 맞추어 설명하면 다음과 같다.

 1) 정규성: 현재 흡연자, 과거 흡연자, 비흡연자 별로 FVC의 분포를 보았을 때 각각의 분포는 정규성을 따른다. 

 2) 등분산성: 현재 흡연자, 과거 흡연자, 비흡연자 별로 FVC의 분포를 보았을 때 분산은 서로 같다.

 

따라서 각각을 검정해야 한다.

 

전제조건 (정규성) - 코드

 

일원 배치 분산 분석 (One-way ANOVA)의 첫 번째 전제조건은 각각의 독립 표본의 분포가 정규성을 따른다는 것이다. 즉, 여기에서는 흡연 상태 (비흡연자, 과거 흡연자, 현재 흡연자)에 따라 수축기 혈압 (SBP)의 정규성을 검정하도록 하겠다.

 

따라서 다음 두 가지의 일을 해야 한다.

1) 흡연 상태 (비흡연자, 과거 흡연자, 현재 흡연자)에 따라 데이터를 나누기

나누는 방법에 대한 설명은 다음 링크에서 볼 수 있다. 2022.11.10 - [통계 프로그램 사용 방법/R] - [R] 조건에 맞는 자료 추출하기

위 링크에서 확인할 수 있듯이 여러 가지 방법으로 나눌 수 있지만 indexing을 이용하여 나누도록 하겠다.

 

df_ns<-df[df$SMOK==0,]
df_fs<-df[df$SMOK==1,]
df_cs<-df[df$SMOK==2,]

df_ns : 비흡연자로 이루어진 데이터

df_fs : 과거 흡연자로 이루어진 데이터

df_cs : 현재 흡연자로 이루어진 데이터

 

2) 흡연 상태 (비흡연자, 과거 흡연자, 현재 흡연자)에 따라 정규성을 검정하기

정규성 검정에 관한 내용은 다음 링크에서 확인할 수 있다.

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (1) : Q-Q plot - qqnorm(), qqline()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (2) : 히스토그램 - hist(), dnorm()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (3) : 정량적 검정 (Shapiro-Wilk, Kolmogorov-Smirnov) - shapiro.test(), ks.test()

2022.08.12 - [기술 통계/R] - [R] 정규성 검정 (4) : 정량적 검정 (Lilliefors test) - lillie.test()

2022.08.16 - [기술 통계/R] - [R] 고급 Q-Q Plot - Van der Waerden, Rankit, Tukey, Blom

##비흡연자의 FVC 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_ns$FVC_pPRED)
qqline(df_ns$FVC_pPRED)
# 2) 히스토그램 그리기
hist(df_ns$FVC_pPRED, prob=TRUE)
FVC_pPREDrange<-seq(min(df_ns$FVC_pPRED),max(df_ns$FVC_pPRED),length=max(max(df_ns$FVC_pPRED)-min(df_ns$FVC_pPRED),100))
ND<-dnorm(FVC_pPREDrange,mean=mean(df_ns$FVC_pPRED),sd=sd(df_ns$FVC_pPRED))
lines(FVC_pPREDrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_ns$FVC_pPRED)

##과거 흡연자의 FVC 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_fs$FVC_pPRED)
qqline(df_fs$FVC_pPRED)
# 2) 히스토그램 그리기
hist(df_fs$FVC_pPRED, prob=TRUE)
FVC_pPREDrange<-seq(min(df_fs$FVC_pPRED),max(df_fs$FVC_pPRED),length=max(max(df_fs$FVC_pPRED)-min(df_fs$FVC_pPRED),100))
ND<-dnorm(FVC_pPREDrange,mean=mean(df_fs$FVC_pPRED),sd=sd(df_fs$FVC_pPRED))
lines(FVC_pPREDrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_fs$FVC_pPRED)

##과거 흡연자의 FVC 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_cs$FVC_pPRED)
qqline(df_cs$FVC_pPRED)
# 2) 히스토그램 그리기
hist(df_cs$FVC_pPRED, prob=TRUE)
FVC_pPREDrange<-seq(min(df_cs$FVC_pPRED),max(df_cs$FVC_pPRED),length=max(max(df_cs$FVC_pPRED)-min(df_cs$FVC_pPRED),100))
ND<-dnorm(FVC_pPREDrange,mean=mean(df_cs$FVC_pPRED),sd=sd(df_cs$FVC_pPRED))
lines(FVC_pPREDrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_cs$FVC_pPRED)

 

정규성 검정 - 결과

1) 비흡연자

 

 

	Shapiro-Wilk normality test

data:  df_ns$FVC_pPRED
W = 0.99679, p-value = 0.4928

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 

 

2) 과거 흡연자

	Shapiro-Wilk normality test

data:  df_fs$FVC_pPRED
W = 0.99727, p-value = 0.9043

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 

 

3) 현재 흡연자

	Shapiro-Wilk normality test

data:  df_cs$FVC_pPRED
W = 0.98909, p-value = 0.06429

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 

 

 첫 번째 전제조건이 성립한다. 즉, 흡연 상태에 따른 FVC의 분포가 정규성을 따른다고 할 수 있다. 

 

2) 등분산성 

등분산성 검정에 관한 내용은 다음 링크에서 확인할 수 있다.

2022.11.12 - [모평균 검정/R] - [R] 독립 표본 T검정 (Independent samples T-test) - t.test(), var.test(), levene.test()

2022.11.20 - [모평균 검정/R] - [R] 등분산성 검정 (Homogeneity of variance) - levene.test(), bartlett.test()

 

많이들 사용하는 등분산 검정 다섯 가지 중 F test는 그룹이 2개일 때에만 사용 가능하고, O'brien은 R에서 시행 불가하므로, 나머지 3가지 방법으로 검정해본다.

1) F test (그룹이 2개일 때에만 사용 가능)

2) Levene의 등분산 검정

3) O'Brien의 등분산 검정(R에서 검정 불가)

4) Brown and Forsythe의 등분산 검정

5) Bartlett의 등분산 검정

 

코드

#Levene의 등분산 검정
install.packages("lawstat")
library("lawstat")
levene.test(df$FVC_pPRED, df$SMOK, location="mean")

#Brown&Forsythe
install.packages("lawstat")
library("lawstat")
levene.test(df$FVC_pPRED, df$SMOK)

#Bartlett
bartlett.test(df$FVC_pPRED, df$SMOK)

 

결과

	Classical Levene's test based on the absolute deviations
	from the mean ( none not applied because the location is
	not set to median )

data:  df$FVC_pPRED
Test Statistic = 1.3065, p-value = 0.2712

	Modified robust Brown-Forsythe Levene-type test based on
	the absolute deviations from the median

data:  df$FVC_pPRED
Test Statistic = 1.2772, p-value = 0.2793

	Bartlett test of homogeneity of variances

data:  df$FVC_pPRED and df$SMOK
Bartlett's K-squared = 1.8171, df = 2, p-value = 0.4031

 Levene 검정 (p-value: 0.2712), Brown-Forsythe test (p-value: 0.2793), Bartlett test (p-value: 0.4031)로 모두 0.05보다 큰 p-value를 갖는다. 따라서 귀무가설을 기각하지 못하므로, 흡연 상태에 따라  FVC_pPRED의 분산이 동일하다는 귀무가설을 채택한다.

 

따라서 ANOVA의 두 가지 전제조건 (정규성, 등분산성)이 성립하므로 ANOVA를 실행할 수 있다.

 

범주형 변수로의 변환

ANOVA를 시행하기 앞서, df데이터의 SMOK변수는 "비흡연자", "과거 흡연자", "현재 흡연자"를 각각 0,1,2로 코딩한 범주형 변수임을 R에게 알려주어야 한다. 알려주지 않으면 0, 1, 2로 이루어진 숫자형 변수로 인식하고 있기 때문이다. 따라서 변수의 유형을 범주형으로 바꾸어준다. (상세한 내용은 다음 링크를 확인하길 바란다.2022.11.21 - [통계 프로그램 사용 방법/R] - [R] 변수의 유형 (타입, type) 확인 및 변경 - as.factor(), as.numeric(), as.character(), str())

 

df$SMOK<-as.factor(df$SMOK)

 

일원 배치 분산 분석 (One-way ANOVA) 시행

코드

a<-aov(FVC_pPRED~SMOK, data=df)
summary(a)

a<-aov(FVC_pPRED~SMOK, data=df) : df 데이터의 SMOK에 따른 FVC_pPRED의 평균이 서로 다른지 ANOVA를 시행하고, 이를 a라는 객체에 저장하라.
summary(a) : a를 요약하여 보여달라.

 

결과

             Df Sum Sq Mean Sq F value Pr(>F)    
SMOK          2  56791   28396   168.9 <2e-16 ***
Residuals   997 167579     168                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                      Df  Sum Sq  Mean Sq  F value   Pr(>F)    

SMOK             2    56791      28396     168.9 <2e-16 ***

Residuals   997  167579           168                    

 

결과는 복잡하지만 우리가 볼 곳은 빨간 글씨로 칠해놓은 단 하나의 값, p-value다. 값은 $2\times 10^{-16}$보다 작으므로 이는 0.05보다 한참 작은 값이므로 귀무가설을 기각하고 대립 가설을 채택한다. 그렇다면 여기에서 귀무가설 및 대립 가설은 무엇이었는가?

 

 귀무가설:  $H0=$ 세 집단의 모평균은 "모두" 동일하다.

 대립 가설:  $H1=$ 세 집단의 모평균이 모두 동일한 것은 아니다.

 

우리는 대립 가설을 채택해야 하므로 "세 집단의 모평균이 모두 동일한 것은 아니다."라고 결론 내릴 것이다.

이 말은, 세 집단 중 두 개씩 골라 비교했을 때, 적어도 한 쌍에서는 차이가 난다는 것이다. 따라서 세 집단 중 두 개씩 골라 비교를 해보아야 하며, 이를 사후 분석 (post hoc analysis)이라고 한다. 세 집단에서 두 개씩 고르므로 가능한 경우의 수는 $_3 C_2=3$이다.

 (1) 비흡연자 vs 과거 흡연자

 (2) 비흡연자 vs 현재 흡연자

 (3) 과거 흡연자 vs 현재 흡연자

 

사후 분석을 시행하겠다.

SAS를 이용한 ANOVA에 관한 글(2022.10.12 - [모평균 검정/SAS] - [SAS] 일원 배치 분산 분석 (One-way ANOVA, ANalysis Of VAriance) - PROC GLM, PROC ANOVA)에서 많은 사후 분석 방법이 있음을 밝혔고, 많이 사용되는 방법들에 대해서도 언급하였다. 본 포스팅에서는 많이 사용되는 다음 네 가지 사후 분석 방법을 소개한다.

 

1) Bonferroni t test

2) Scheffe's multiple comparison

3) Duncan's multiple range test

4) Tukey's studentized range test

 

 

1) Bonferroni t test - 코드

pairwise.t.test(df$FVC_pPRED, df$SMOK, p.adj="bonferroni")

pairwise.t.test(df$FVC_pPRED, df$SMOK, p.adj="bonferroni") :df 데이터의 FVC_pPRED를 SMOK변수값에 따라 각각 t-test를 시행하는데, p-value는 Bonferroni방식으로 보정하라.

 

결과

	Pairwise comparisons using t tests with pooled SD 

data:  df$FVC_pPRED and df$SMOK 

  0       1      
1 < 2e-16 -      
2 < 2e-16 8.7e-15

P value adjustment method: bonferroni

Pairwise comparisons using t tests with pooled SD 
data:  df$
FVC_pPRED and df$SMOK 

  0 1
1 <2e-16 -
2 <2e-16 8.7e-15

P value adjustment method: bonferroni 

 

결과가 복잡해 보일지라도 우리는 표만 잘 보면 된다.

SMOK에는 3가지 값 (비흡연자:0, 과거 흡연자:1, 현재 흡연자:2)이 들어있고, 이 중 둘을 뽑아 t-test를 시행할 것이다. 따라서 3개 중 2개를 뽑는 경우의 수인 3가지 p-value가 존재하게 된다. 

비흡연자(0)와 과거 흡연자(1)를 비교한 p-value는 빨간색으로 표시된 "<2e-16"이다.

비흡연자(0)와 현재 흡연자(2)를 비교한 p-value는 초록색으로 표시된 "<2e-16"이다.

과거 흡연자(1)와 현재 흡연자(2)를 비교한 p-value는 파란색으로 표시된 "8.7e-15"이다.

즉, 모든 조합에서 평균의 차이가 있다고 결론 내릴 수 있다.

 

따라서, 우리가 채택한 대립 가설 "세 집단의 모평균이 모두 동일한 것은 아니다."을 구체적으로 이야기하면 "비흡연자와 과거 흡연자, 비흡연자와 현재 흡연자, 과거 흡연자와 현재 흡연자 사이의 모평균에 차이가 있다."라고 결론내릴 수 있다.

 

 

2) Scheffe's multiple comparison - 코드 (방법 1)

install.packages("DescTools")
library("DescTools")
ScheffeTest(a)

ScheffeTest(a) :a(ANOVA 시행한 것)의 사후 분석을 Scheffe test로 시행하라.

이 함수는 "DecsTools"라는 패키지를 필요로 하므로 설치 후 사용하길 바란다.

 

결과

  Posthoc multiple comparisons of means: Scheffe Test 
    95% family-wise confidence level

$SMOK
          diff    lwr.ci     upr.ci    pval    
1-0  -9.532840 -11.90048  -7.165204 < 2e-16 ***
2-0 -18.553484 -21.07451 -16.032453 < 2e-16 ***
2-1  -9.020644 -11.77709  -6.264193 2.9e-14 ***

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

 

 

  Posthoc multiple comparisons of means: Scheffe Test 
    95% family-wise confidence level

$SMOK
                   diff         lwr.ci           upr.ci      pval    
1-0  -9.532840  -11.90048   -7.165204 < 2e-16 ***
2-0 -18.553484 -21.07451 -16.032453 < 2e-16 ***
2-1  -9.020644  -11.77709   -6.264193 2.9e-14 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

 

결과가 복잡해 보일지라도 우리는 표만 잘 보면 된다.

SMOK에는 3가지 값 (비흡연자:0, 과거 흡연자:1, 현재 흡연자:2)이 들어있고, 이 중 둘을 뽑아 사후 검정을 시행할 것이다. 따라서 3개 중 2개를 뽑는 경우의 수인 3가지 p-value가 존재하게 된다. 

비흡연자(0)와 과거 흡연자(1)를 비교한 p-value는 빨간색으로 표시된 "<2e-16"이다.

비흡연자(0)와 현재 흡연자(2)를 비교한 p-value는 초록색으로 표시된 "<2e-16"이다.

과거 흡연자(1)와 현재 흡연자(2)를 비교한 p-value는 파란색으로 표시된 "2.9e-14"이다.

즉, 모든 조합에서 평균의 차이가 있다고 결론 내릴 수 있다.

 

 

2-1) Scheffe's multiple comparison - 코드 (방법 2)

install.packages("agricolae")
library(agricolae)
scheffe.test(a,"SMOK",console=TRUE)

"agriocolae"패키지에 있는 scheffe.test() 함수를 이용할 수도 있다.

scheffe.test(a,"SMOK",console=TRUE) : a(ANOVA 시행한 것)에서 "SMOK"변수에 따라 Scheffe test를 시행하고 결과를 보여달라(console=TRUE).

 

결과

Study: a ~ "SMOK"

Scheffe Test for FVC_pPRED 

Mean Square Error  : 168.0834 

SMOK,  means

  FVC_pPRED      std   r      Min      Max
0  95.33911 13.31491 463 60.70763 130.0000
1  85.80627 12.39528 295 50.49873 124.0448
2  76.78563 12.96366 242 50.00000 116.7888

Alpha: 0.05 ; DF Error: 997 
Critical Value of F: 3.004752 

Groups according to probability of means differences and alpha level( 0.05 )

Means with the same letter are not significantly different.

  FVC_pPRED groups
0  95.33911      a
1  85.80627      b
2  76.78563      c

너무나도 복잡해 보이지만, 마지막 결과를 예쁘게 제시해주기 때문에 이 함수를 소개한 것이다.

  groups
0 a
1 b
2 c

0은 group a, 1은 group b, 2는 group c에 속한다. 즉 서로 다른 모평균을 갖는다고 결론 내릴 수 있다.

 

만약 유의미한 차이가 없는 경우 어떻게 제시될까?

df$RESID<-as.factor(df$RESID)
b<-aov(FVC_pPRED~RESID, data=df)
scheffe.test(b,"RESID",console=TRUE)

SMOK가 아니라 RESID에 대해 ANOVA를 시행하고, Scheffe test를 시행한 결과다.

Study: b ~ "RESID"

Scheffe Test for FVC_pPRED 

Mean Square Error  : 219.1342 

RESID,  means

  FVC_pPRED      std   r      Min      Max
0  84.73360 14.84186 323 50.32614 129.7551
1  88.59510 15.17535 335 50.00000 129.7026
2  90.61014 14.39179 342 50.47718 130.0000

Alpha: 0.05 ; DF Error: 997 
Critical Value of F: 3.004752 

Groups according to probability of means differences and alpha level( 0.05 )

Means with the same letter are not significantly different.

  FVC_pPRED groups
2  90.61014      a
1  88.59510      a
0  84.73360      b
  groups
0 a
1 a
2 b

위 표를 보면 비흡연자 (0)과 과거 흡연자 (1)은 모두 group a에 속해있다. 즉 비흡연자와 과거 흡연자 사이에는 유의미한 차이가 발견되지 않은 것이다. 반면 현재 흡연자는 group b에 속해있으므로 비흡연자나 과거 흡연자와는 유의미한 차이가 있었다는 것이다.

 

3) Duncan's multiple range test - 코드

 사실 Tukey나 다음에 나오는 Duncan은 각 그룹별 표본의 수가 같을 때 사용하는 것이므로 이 데이터의 사후 분석으로는 적절하지 않다. 하지만 우선 그냥 시행해보겠다.

install.packages("agricolae")
library(agricolae)
duncan.test(a,"SMOK",console=TRUE)

"agriocolae"패키지에 있는 duncan.test() 함수를 이용하므로 설치부터 한다.

duncan.test(a,"SMOK",console=TRUE) : a(ANOVA 시행한 것)에서 "SMOK"변수에 따라 Duncan test를 시행하고 결과를 보여달라(console=TRUE).

결과

Study: a ~ "SMOK"

Duncan's new multiple range test
for FVC_pPRED 

Mean Square Error:  168.0834 

SMOK,  means

  FVC_pPRED      std   r      Min      Max
0  95.33911 13.31491 463 60.70763 130.0000
1  85.80627 12.39528 295 50.49873 124.0448
2  76.78563 12.96366 242 50.00000 116.7888

Groups according to probability of means differences and alpha level( 0.05 )

Means with the same letter are not significantly different.

  FVC_pPRED groups
0  95.33911      a
1  85.80627      b
2  76.78563      c

마지막 세 줄을 보면 0은 group a, 1은 group b, 2는 group c에 속한다. 즉 서로 다른 모평균을 갖는다고 결론 내릴 수 있다.

 

4) Tukey's studentized range test 

TukeyHSD(a)

TukeyHSD(a) : a (ANOVA 시행한 것)으로 사후 분석을 시행하되 Tukey test를 사용하라.

 

결과

  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = FVC_pPRED ~ SMOK, data = df)

$SMOK
          diff       lwr        upr p adj
1-0  -9.532840 -11.79982  -7.265858     0
2-0 -18.553484 -20.96734 -16.139628     0
2-1  -9.020644 -11.65991  -6.381377     0

  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = FVC_pPRED ~ SMOK, data = df)

$SMOK
                 diff            lwr             upr     p adj
1-0   -9.532840 -11.79982   -7.265858     0
2-0 -18.553484 -20.96734 -16.139628     0
2-1   -9.020644 -11.65991   -6.381377     0

 

결과가 복잡하지만 "p adj"만 보면 된다. 어떤 비교든 p value가 너무 작아 0으로 나타난다. 따라서, 서로 다른 모평균을 갖는다고 결론 내릴 수 있다.

 

이 시점에서 이런 의문이 들 수 있다.

"각각의 그룹별로 평균을 비교하면 되지, 굳이 왜 ANOVA라는 방법까지 사용하는 것인가?"

 아주 논리적인 의문점이다. 하지만, 반드시 ANOVA를 사용해야 한다. 그 이유는 다음과 같다. 본 사례는 흡연 상태에 따른 조합 가능한 경우의 수가 3인데, 각각 유의성의 기준을 α=0.05로 잡아보자. 이때 세 번의 비교에서 모두 귀무가설이 학문적인 진실인데(평균에 차이가 없다.), 세 번 모두 귀무가설을 선택할 확률은 (1−0.95)3≈0.86이다. (이해가 어려우면 p-value에 대한 설명 글을 읽고 오길 바란다. 2022.09.05 - [통계 이론] - [이론] p-value에 관한 고찰)

 그런데, ANOVA의 귀무가설은 "모든 집단의 평균이 같다."이다. 따라서 모든 집단의 평균이 같은 것이 학문적 진실일 때, 적어도 한 번이라도 대립 가설을 선택하게 될 확률은 1−0.86=0.14가 된다. 즉, 유의성의 기준이 올라가게 되어, 덜 보수적인 결정을 내리게 되고, 다시 말하면 대립 가설을 잘 선택하는 쪽으로 편향되게 된다. 학문적으로는 '다중 검정 (multiple testing)을 시행하면 1종 오류가 발생할 확률이 증가하게 된다.'라고 표현한다.

 따라서, 각각을 비교해보는 것이 아니라 한꺼번에 비교하는 ANOVA를 시행해야 함이 마땅하다. 

 

여기에서 한 번 더 의문이 들 수 있다.

 "사후 분석을 할 때에는 1종 오류가 발생하지 않는가?"

그렇다. 1종 오류가 발생할 확률이 있으므로, p-value의 기준을 더 엄격하게 (0.05보다 더 작게) 잡아야 한다. P-value를 보정하는 방법은 여러 가지가 나와있는데, 그중 많이 쓰이는 네 가지를 언급한 것이다.

 

어떤 사후 분석을 쓸 것인가

 이 논의에 대해 정답이 따로 있는 것은 아니다. 적절한 방법을 사용하여 논문에 제시하면 되고, 어떤 것이 정답이라고 콕 집어 이야기할 수는 없다. 다만, 사후 분석 방법이 여러 가지가 있다는 것은 '사후 분석 방법에 따라 산출되는 결과가 달라질 수 있다.'는 것을 의미하고, 심지어는 '어떤 사후 분석 방법을 채택하냐에 따라 유의성 여부가 달라질 수도 있다.'는 것을 의미한다. 심지어, ANOVA에서는 유의한 결과가 나왔는데, 사후 분석을 해보니 유의한 차이를 보이는 경우가 없을 수도 있다. 따라서 어떤 사후 분석 방법 결과에 따른 결과인지 유의하여 해석할 필요가 있다.

 

 

코드 정리

####워킹 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")


####데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")


####데이터 나누기
df_ns<-df[df$SMOK==0,]
df_fs<-df[df$SMOK==1,]
df_cs<-df[df$SMOK==2,]


####정규성 검정
##비흡연자의 FVC 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_ns$FVC_pPRED)
qqline(df_ns$FVC_pPRED)
# 2) 히스토그램 그리기
hist(df_ns$FVC_pPRED, prob=TRUE)
FVC_pPREDrange<-seq(min(df_ns$FVC_pPRED),max(df_ns$FVC_pPRED),length=max(max(df_ns$FVC_pPRED)-min(df_ns$FVC_pPRED),100))
ND<-dnorm(FVC_pPREDrange,mean=mean(df_ns$FVC_pPRED),sd=sd(df_ns$FVC_pPRED))
lines(FVC_pPREDrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_ns$FVC_pPRED)

##과거 흡연자의 FVC 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_fs$FVC_pPRED)
qqline(df_fs$FVC_pPRED)
# 2) 히스토그램 그리기
hist(df_fs$FVC_pPRED, prob=TRUE)
FVC_pPREDrange<-seq(min(df_fs$FVC_pPRED),max(df_fs$FVC_pPRED),length=max(max(df_fs$FVC_pPRED)-min(df_fs$FVC_pPRED),100))
ND<-dnorm(FVC_pPREDrange,mean=mean(df_fs$FVC_pPRED),sd=sd(df_fs$FVC_pPRED))
lines(FVC_pPREDrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_fs$FVC_pPRED)

##과거 흡연자의 FVC 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_cs$FVC_pPRED)
qqline(df_cs$FVC_pPRED)
# 2) 히스토그램 그리기
hist(df_cs$FVC_pPRED, prob=TRUE)
FVC_pPREDrange<-seq(min(df_cs$FVC_pPRED),max(df_cs$FVC_pPRED),length=max(max(df_cs$FVC_pPRED)-min(df_cs$FVC_pPRED),100))
ND<-dnorm(FVC_pPREDrange,mean=mean(df_cs$FVC_pPRED),sd=sd(df_cs$FVC_pPRED))
lines(FVC_pPREDrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_cs$FVC_pPRED)


####등분산 검정
#Levene의 등분산 검정
install.packages("lawstat")
library("lawstat")
levene.test(df$FVC_pPRED, df$SMOK, location="mean")

#Brown&Forsythe
install.packages("lawstat")
library("lawstat")
levene.test(df$FVC_pPRED, df$SMOK)

#Bartlett
bartlett.test(df$FVC_pPRED, df$SMOK)


####범주형 변수로의 변환
df$SMOK<-as.factor(df$SMOK)


####One-way ANOVA 시행
a<-aov(FVC_pPRED~SMOK, data=df)
summary(a)

####사후분석
#1) Bonferroni t test
pairwise.t.test(df$FVC_pPRED, df$SMOK, p.adj="bonferroni")

#2) Scheffe's multiple comparison (1)
install.packages("DescTools")
library("DescTools")
ScheffeTest(a)

#2-1) Scheffe's multiple comparison (2)
install.packages("agricolae")
library(agricolae)
scheffe.test(a,"SMOK",console=TRUE)


#3) Duncan's multiple range test 
install.packages("agricolae")
library(agricolae)
duncan.test(a,"SMOK",console=TRUE)


#4) Tukey's studentized range test 
TukeyHSD(a)

 

[R] 일원 배치 분산 분석 (One-way ANOVA, ANalysis Of VAriance) 정복 완료!

 

작성일: 2022.11.20.

최종 수정일: 2022.11.29.

이용 프로그램: R 4.2.2

RStudio v2022.07.2

RStudio 2022.07.2+576 "Spotted Wakerobin" Release

운영체제: Windows 10, Mac OS 12.6.1

반응형
반응형

 

[R] 등분산성 검정 (Homogeneity of variance) - levene.test(), bartlett.test()

 T-test, ANOVA 등 몇몇 분석에서는 분포들의 분산이 같다는 가정 (등분산성)이 필요하다. 이럴 때에는 등분산성 검정을 해야 하는데, 많이들 사용하는 방법은 크게 다섯 가지가 존재한다.

 

1) F test

2) Levene의 등분산 검정

3) O'Brien의 등분산 검정(R에서 검정 불가)

4) Brown and Forsythe의 등분산 검정

5) Bartlett의 등분산 검정

 

이 중 F test, Levene의 등분산성 검정은 T-test에 관한 글에서 다루었으므로 본 포스팅에서는 다루지 않겠다. Fooled F와 Levene 등분산성 검정에 관한 내용은 다음 링크에서 확인할 수 있다. 2022.11.12 - [모평균 검정/R] - [R] 독립 표본 T검정 (Independent samples T-test) - t.test(), var.test(), levene.test()

 

 결국 우리가 확인하고자 하는 것은, "수축기 혈압 분포의 분산이 고혈압 환자군과 일반인 사이에서 다르다고 할 수 있는가?"이다. 이에 대해 설면하도록 하겠다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.10.11)

 

분석용 데이터 (update 22.10.11)

2022년 10월 11일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 반복 측정 자료 분석 - 통계

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

 

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

코드 - 등분산성 검정

Brown&Forsythe 의 등분산 검정은 "levene.test()"라는 함수를 쓰는데, 이는 "lawstat"이라는 패키지에 있으므로 설치를 한다. Bartlett의 등분산 검정을 시행할 때 사용하는 "bartlett.test()"는 기본 내장 함수이므로 별도의 설치가 필요 없다.

설치에 관한 내용은 다음 링크에서 확인할 수 있다. 2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 패키지 설치하기 - install.packages(), library()

 

install.packages("lawstat")
library("lawstat")

 

등분산성을 검정하는 코드는 다음과 같다.

#Brown&Forsythe
levene.test(df$SBP, df$HTN)

#Bartlett
bartlett.test(df$SBP, df$HTN)

#Brown&Forsythe
levene.test(df$SBP, df$HTN) : df 데이터의 SBP(수축기 혈압) 변수를 df 데이터의 HTN(고혈압 여부) 변수에 따라 Brown&Forsythe 등분산 검정을 시행하라.

#Bartlett
bartlett.test(df$SBP, df$HTN) : df 데이터의 SBP(수축기 혈압) 변수를 df 데이터의 HTN(고혈압 여부) 변수에 따라 Bartlett 등분산 검정을 시행하라.

 

결과 

	Modified robust Brown-Forsythe Levene-type test based on
	the absolute deviations from the median

data:  df$SBP
Test Statistic = 0.010831, p-value = 0.9171

	Bartlett test of homogeneity of variances

data:  df$SBP and df$HTN
Bartlett's K-squared = 3.5705e-07, df = 1, p-value =0.9995

Modified robust Brown-Forsythe Levene-type test based on
the absolute deviations from the median

data:  df$SBP
Test Statistic = 0.010831, p-value = 0.9171

Bartlett test of homogeneity of variances

data:  df$SBP and df$HTN
Bartlett's K-squared = 3.5705e-07, df = 1, p-value =0.9995

 

결과가 복잡해 보이지만 위에 색깔 처리해놓은 숫자만 봐도 충분하다.

Brown-Forsythe 검사 결과 p-value는 0.9171이고

Bartlett test 검사 결과 p-value는 0.9995이다.

 

즉 어떤 방법을 사용하더라도, 모두 p-value가 0.05 이상으로 귀무가설을 기각하지 못해 모분산이 서로 같다고 결론 내릴 수 있다. 

 

코드 정리

#워킹 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")

#데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

#levene.test() 함수를 위한 패키지 설치
install.packages("lawstat")
library("lawstat")

#Brown&Forsythe 등분산 검정
levene.test(df$SBP, df$HTN)

#Bartlett 등분산 검정
bartlett.test(df$SBP, df$HTN)

 

[R] 등분산성 검정 (Homogeneity of variance: Brown&Forsythe, Bartlett test) 정복 완료!

 

작성일: 2022.11.20.

최종 수정일: 2022.11.20.

이용 프로그램: R 4.2.2

RStudio v2022.07.2

RStudio 2022.07.2+576 "Spotted Wakerobin" Release

운영체제: Windows 10, Mac OS 12.6.1

반응형
반응형

[R] 독립 표본 T검정 (Independent samples T-test) - t.test(),  var.test(),  levene.test()

  세상에 존재하는 모든 사람을 대상으로 연구를 하면 참 좋겠지만, 시간적인 이유로, 그리고 경제적인 이유로 일부를 뽑아서 연구를 진행할 수밖에 없다. 모든 사람을 모집단이라고 하고, 뽑힌 일부를 표본이라고 한다. 우리는 표본으로 시행한 연구로 모집단에 대한 결론을 도출해내고자 할 것이다. 

 1000명에게 피검사를 시행하였고, 간 기능 검사의 일환으로 ALT 수치를 모았다. 이 데이터를 기반으로 1000명이 기원한 모집단 인구에서의 ALT평균이 어떻게 될지 예측하는 것이 T-test이다. T-test는 크게 세 가지로 나눌 수 있다.

 

 1) 일표본 T검정 (One sample T-test) : 2022.11.03 - [모평균 검정/R] - [R] 일표본 T검정 (One-sample T-test) - t.test()

 : 모집단의 평균이 특정 값이라고 할 수 있는가?

 예) 모집단의 ALT 평균이 50이라고 할 수 있는가?

 

 

 2) 독립 표본 T검정 (Independent samples T-test, Two samples T-test)

 : 두 모집단의 평균이 다르다고 할 수 있는가?

 예) 고혈압 환자와 일반인의 수축기 혈압 평균이 서로 다르다고 할 수 있는가?

 

 3) 대응표본 T검정 (Paired samples T-test) : 2022.11.25 - [반복 측정 자료 분석/R] - [R] 대응 표본 T검정 (Paired samples T-test) - t.test()

 

 : 모집단의 짝지어진 변수들의 평균이 다르다고 할 수 있는가?

예) 간기능 개선제 복용 전 ALT 평균은 간기는 개선제 복용 후 ALT 평균과 다르다고 할 수 있는가?

 

이번 포스팅에서는 독립 표본 T검정 (Independent samples T-test, Two samples T-test)에 대해 알아볼 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.10.11)

 

분석용 데이터 (update 22.10.11)

2022년 10월 11일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 반복 측정 자료 분석 - 통계

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

목표: 고혈압 환자의 수축기 혈압(SBP) 평균은 정상인의 수축기 혈압 평균과 다르다고 모집단 수준에서 말할 수 있는가?

이번 포스팅의 목적은 1000명의 데이터를 가지고, 이 1000명이 기원한 모집단에서 수축기 혈압 평균이 고혈압 유병 여부에 따라 다르다고 할 수 있는지 판단하는 것이다.

전제조건 (정규성) - 코드

 독립 표본 (Indepent samples, Two tamples) T 검정의 전제조건은 각각의 독립 표본의 분포가 정규성을 따른다는 것이다. 즉, 여기에서는 고혈압 유병 여부에 따라 수축기 혈압 (SBP)의 정규성을 검정하도록 하겠다.

 

따라서 다음 두 가지의 일을 해야 한다.

1) 고혈압 여부에 따라 데이터를 나누기

나누는 방법에 대한 설명은 다음 링크에서 볼 수 있다. 2022.11.10 - [통계 프로그램 사용 방법/R] - [R] 조건에 맞는 자료 추출하기

위 링크에서 확인할 수 있듯이 여러 가지 방법으로 나눌 수 있지만 indexing을 이용하여 나누도록 하겠다.

df_whtn<-df[df$HTN==1,]
df_wohtn<-df[df$HTN==0,]

 

2) 고혈압 여부에 따라 정규성을 검정하기

정규성 검정에 대한 설명은 다음 링크들에서 확인할 수 있다.

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (1) : Q-Q plot - qqnorm(), qqline()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (2) : 히스토그램 - hist(), dnorm()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (3) : 정량적 검정 (Shapiro-Wilk, Kolmogorov-Smirnov) - shapiro.test(), ks.test()

2022.08.12 - [기술 통계/R] - [R] 정규성 검정 (4) : 정량적 검정 (Lilliefors test) - lillie.test()

2022.08.16 - [기술 통계/R] - [R] 고급 Q-Q Plot - Van der Waerden, Rankit, Tukey, Blom

##고혈압 환자의 수축기 혈압 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_whtn$SBP)
qqline(df_whtn$SBP)
# 2) 히스토그램 그리기
hist(df_whtn$SBP, prob=TRUE)
SBPrange<-seq(min(df_whtn$SBP),max(df_whtn$SBP),length=max(max(df_whtn$SBP)-min(df_whtn$SBP),100))
ND<-dnorm(SBPrange,mean=mean(df_whtn$SBP),sd=sd(df_whtn$SBP))
lines(SBPrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_whtn$SBP)

##정상인의 수축기 혈압 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_wohtn$SBP)
qqline(df_wohtn$SBP)
# 2) 히스토그램 그리기
hist(df_wohtn$SBP, prob=TRUE)
SBPrange<-seq(min(df_wohtn$SBP),max(df_wohtn$SBP),length=max(max(df_wohtn$SBP)-min(df_wohtn$SBP),100))
ND<-dnorm(SBPrange,mean=mean(df_wohtn$SBP),sd=sd(df_wohtn$SBP))
lines(SBPrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_wohtn$SBP)

 

정규성 검정 - 결과

1) 고혈압 환자

 

	Shapiro-Wilk normality test

data:  df_whtn$SBP
W = 0.9975, p-value = 0.6677

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 

 

 

2) 정상인

	Shapiro-Wilk normality test

data:  df_wohtn$SBP
W = 0.99676, p-value = 0.4119

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 

 

 전제조건이 성립한다. 즉, 고혈압 유병 여부에 따른 수축기 혈압 (SBP)의 분포가 정규성을 따른다고 할 수 있다. 따라서 독립 표본 T 검정 (Independent samples T test, Two samples T test)을 시행할 수 있다.

 

등분산성 검정

 독립 표본 T 검정 (Independent samples T test, Two samples T test)은 고혈압 유병 여부에 따른 수축기 혈압의 분포의 분산이 같은지 여부에 따라 시행하는 검사 방법이 다르다. 따라서 분산이 같은지 확인하는 등분산성 검정을 먼저 시행해야 한다.

 

많이 사용하는 등분산성 검정 방법은 다음 다섯 가지가 있다.

1) F test

2) Levene의 등분산 검정

3) O'Brien의 등분산 검정(R에서 검정 불가)

4) Brown and Forsythe의 등분산 검정

5) Bartlett의 등분산 검정

 

이 글에서는 F test와 Levene의 등분산 검정까지만 해보고, 나머지는 다음 링크에서 다루기로 한다. 2022.11.20 - [모평균 검정/R] - [R] 등분산성 검정 (Homogeneity of variance) - levene.test(), bartlett.test()

 

#F test
var.test(SBP~HTN, data=df)

#Levene의 등분산 검정
install.packages("lawstat")
library("lawstat")
levene.test(df$SBP, df$HTN, location="mean")

#F test
var.test(SBP~HTN, data=df) : 등분산 검정을 하는데, HTN에 따라 SBP의 분포의 분산이 같은지 검정하라. 데이터는 df를 사용한다.

#Levene의 등분산 검정

install.packages("lawstat") : Levene의 등분산 검정을 하기 위해서는 lawstat이라는 패키지를 설치해야 한다.
library("lawstat") : lawstat패키지를 불러온다.
levene.test(df$SBP, df$HTN, location="mean") : df 데이터의 HTN에 따라 df 데이터의 SBP의 분포의 분산이 같은지 검정하라. 이때 [location="mean"]을 적어주어야 Levene의 등분산 검정을 시행한다.

 

결과

	F test to compare two variances

data:  SBP by HTN
F = 0.99995, num df = 502, denom df = 496, p-value =
0.9994
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.8387988 1.1919414
sample estimates:
ratio of variances 
         0.9999465 
         
         
	Classical Levene's test based on the absolute deviations
	from the mean ( none not applied because the location is
	not set to median )

data:  df$SBP
Test Statistic = 0.010363, p-value = 0.9189

F test to compare two variances
data:  SBP by HTN
F = 0.99995, num df = 502, denom df = 496, p-value =0.9994
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.8387988 1.1919414
sample estimates:
ratio of variances 
         0.9999465 
         
         
Classical Levene's test based on the absolute deviations from the mean ( none not applied because the location is not set to median )
data:  df$SBP
Test Statistic = 0.010363, p-value = 0.9189

 

결과 창에 나오는 것들이 많아 복잡해 보이지만 위에 파란색 볼드로 처리해놓은 내용만 보면 된다. F test의 p-value는 0.9994, Levene의 등분산 검정의 p-value는 0.9189이다. 모두 0.05보다 크므로 귀무가설을 기각할 수 없으며 귀무가설을 택해야 한다. 여기에서의 귀무가설은 "HTN에 따라 SBP의 분포의 분산에 차이가 없다."이므로 분산이 같다는 결론을 내린다.

 

이제 드디어 사전 점검이 모두 끝났고, t-test를 시행할 수 있다. 

코드

##T-test 
t.test(df_wohtn$SBP, df_whtn$SBP, var.equal=TRUE)


t.test(df_wohtn$SBP, df_whtn$SBP, var.equal=TRUE) : 고혈압이 없는 사람들의 수축기 혈압 (df_wohtn$SBP)과 고혈압이 있는 사람들의 수축기 혈압 (df_whtn$SBP)으로 t-test를 시행하라. 대신 두 군의 분산은 같다고 가정한다.

 

만약, 등분산성 검정 결과 분산이 다르다고 결론이 났으면 "var.equal=FALSE" 라고 적으면 된다. 혹은 t.test의 var.equal은 FALSE를 기본값으로 가지므로, "var.equal=TRUE"를 그냥 지워도 된다. 

 

결과

	Two Sample t-test

data:  df_wohtn$SBP and df_whtn$SBP
t = -46.666, df = 998, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -31.19793 -28.68000
sample estimates:
mean of x mean of y 
 120.1473  150.0862

Two Sample t-test

data:  df_wohtn$SBP and df_whtn$SBP

t = -46.666, df = 998, p-value < 2.2e-16

alternative hypothesis: true difference in means is not equal to 0

95 percent confidence interval:  -31.19793 -28.68000

sample estimates:

mean of x mean of y   

120.1473  150.0862 

 

결과가 복잡한 듯 하지만 파란색 글씨만 읽으면 된다. p-value는 $2.2 \times 10^{-16}$보다 작다. 따라서 귀무가설을 기각할 수 있으며, 본 검정에서 귀무가설은 "HTN에 따라 SBP의 평균이 같다."이므로 "HTN에 따라 SBP의 평균은 다르다."라고 결론 내릴 수 있다. 마지막 행을 보면 "mean of x"은 120.1473, "mean of y"은 150.0862라고 알려주고 있는데, x는 코드에 처음 들어간 "df_wohtn$SBP"를 의미하고, y는 두 번째로 들어간 "df_whtn$SBP"를 의미한다. 즉 고혈압이 없는 군의 수축기 혈압 평균은 120.1473, 고혈압이 없는 군의 수축기 혈압 평균은 150.0862다. 

 

코드 정리

#워킹 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")

#파일 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

#고혈압 여부에 따라 데이터 나누기
df_whtn<-df[df$HTN==1,]
df_wohtn<-df[df$HTN==0,]

##고혈압 환자의 수축기 혈압 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_whtn$SBP)
qqline(df_whtn$SBP)
# 2) 히스토그램 그리기
hist(df_whtn$SBP, prob=TRUE)
SBPrange<-seq(min(df_whtn$SBP),max(df_whtn$SBP),length=max(max(df_whtn$SBP)-min(df_whtn$SBP),100))
ND<-dnorm(SBPrange,mean=mean(df_whtn$SBP),sd=sd(df_whtn$SBP))
lines(SBPrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_whtn$SBP)

##정상인의 수축기 혈압 정규성 검정
# 1) Q-Q plot 그리기
qqnorm(df_wohtn$SBP)
qqline(df_wohtn$SBP)
# 2) 히스토그램 그리기
hist(df_wohtn$SBP, prob=TRUE)
SBPrange<-seq(min(df_wohtn$SBP),max(df_wohtn$SBP),length=max(max(df_wohtn$SBP)-min(df_wohtn$SBP),100))
ND<-dnorm(SBPrange,mean=mean(df_wohtn$SBP),sd=sd(df_wohtn$SBP))
lines(SBPrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_wohtn$SBP)

##등분산성 검정
#F test
var.test(SBP~HTN, data=df)

#Levene의 등분산 검정
install.packages("lawstat")
library("lawstat")
levene.test(df$SBP, df$HTN, location="mean")

##T-test 
t.test(df_wohtn$SBP, df_whtn$SBP, var.equal=TRUE)

 

R 독립 표본 T검정 (Dependent samples T-test, Two samples T-test) 정복 완료!

작성일: 2022.11.12.

최종 수정일: 2022.11.30.

이용 프로그램: R 4.2.2

RStudio v2022.07.2

RStudio 2022.07.2+576 "Spotted Wakerobin" Release

운영체제: Windows 10, Mac OS 12.6.1

반응형
반응형

[R] 일표본 T검정 (One-sample T-test) - t.test()

  세상에 존재하는 모든 사람을 대상으로 연구를 하면 참 좋겠지만, 시간적인 이유로, 그리고 경제적인 이유로 일부를 뽑아서 연구를 진행할 수밖에 없다. 모든 사람을 모집단이라고 하고, 뽑힌 일부를 표본이라고 한다. 우리는 표본으로 시행한 연구로 모집단에 대한 결론을 도출해내고자 할 것이다. 

 1000명에게 피검사를 시행하였고, 간 기능 검사의 일환으로 ALT 수치를 모았다. 이 데이터를 기반으로 1000명이 기원한 모집단 인구에서의 ALT평균이 어떻게 될지 예측하는 것이 T-test이다. T-test는 크게 세 가지로 나눌 수 있다.

 

 1) 일표본 T검정 (One sample T-test)

 : 모집단의 평균이 특정 값이라고 할 수 있는가?

 예) 모집단의 ALT 평균이 50이라고 할 수 있는가?

 

 2) 독립 표본 T검정 (Independent samples T-test): 2022.11.12 - [모평균 검정/R] - [R] 독립 표본 T검정 (Independent samples T-test) - t.test(), var.test(), levene.test()

 

 : 두 모집단의 평균이 다르다고 할 수 있는가?

 예) 고혈압 환자와 일반인의 수축기 혈압 평균이 서로 다르다고 할 수 있는가?

 

 3) 대응표본 T검정 (Paired samples T-test): 2022.11.25 - [반복 측정 자료 분석/R] - [R] 대응 표본 T검정 (Paired samples T-test) - t.test()

 : 모집단의 짝지어진 변수들의 평균이 다르다고 할 수 있는가?

예) 간기능 개선제 복용 전 ALT 평균은 간기는 개선제 복용 후 ALT 평균과 다르다고 할 수 있는가?

 

이번 포스팅에서는 일표본 T검정 (One sample T-test)에 대해 알아볼 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.10.11)

 

분석용 데이터 (update 22.10.11)

2022년 10월 11일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 반복 측정 자료 분석 - 통계

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

 

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

 

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

목표: 모집단의 ALT 평균이 50이라고 할 수 있는가?

 이번 포스팅의 목적은 1000명의 데이터를 가지고, 이 1000명이 기원한 모집단의 ALT평균이 50이라고 할 수 있는지 판단하는 것이다.

 

전제조건 (정규성) - 코드

일표본 (One sample) T 검정의 전제조건은 해당 분포가 정규성을 따른다는 것이다. 정규성 검정을 하도록 하겠다. 정규성 검정에 관한 분석 내용은 다음 글에서 살펴볼 수 있다. 

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (1) : Q-Q plot - qqnorm(), qqline()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (2) : 히스토그램 - hist(), dnorm()

2022.08.11 - [기술 통계/R] - [R] 정규성 검정 (3) : 정량적 검정 (Shapiro-Wilk, Kolmogorov-Smirnov) - shapiro.test(), ks.test()

2022.08.12 - [기술 통계/R] - [R] 정규성 검정 (4) : 정량적 검정 (Lilliefors test) - lillie.test()

2022.08.16 - [기술 통계/R] - [R] 고급 Q-Q Plot - Van der Waerden, Rankit, Tukey, Blom

 

# 1) Q-Q plot 그리기
qqnorm(df$ALT)
qqline(df$ALT)

# 2) 히스토그램 그리기
hist(df$ALT, prob=TRUE)
ALTrange<-seq(min(df$ALT),max(df$ALT),length=max(max(df$ALT)-min(df$ALT),100))
ND<-dnorm(ALTrange,mean=mean(df$ALT),sd=sd(df$ALT))
lines(ALTrange, ND, lwd=2)

# 3) Shapiro-Wilk test 시행하기
shapiro.test(df$ALT)

 

 

정규성 검정 - 결과

 

 

	Shapiro-Wilk normality test

data:  df$ALT
W = 0.9982, p-value = 0.3749

 

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 따라서 ALT로는 일표본 T검정 (One-sample T-test)를 시행할 수 있다. 

 

 

일표본 T검정 (One sample T test)의 귀무가설과 대립 가설

 

이번 일표본 T검정 (One sample T test)의 귀무가설은 하나다.

귀무가설: $H_0=$ 모집단의 ALT 평균은 50이다.

 

하지만 대립 가설은 3개가 된다.

1) $H_1=$ 모집단의 평균은 50보다 크다. (단측 검정)

2) $H_1=$ 모집단의 평균은 50보다 작다. (단측 검정)

3) $H_1=$ 모집단의 평균은 50보다 크거나 작다. (양측 검정)

 

대립 가설 별로 코드를 보고자 한다.

 

1)  $H_1=$ 모집단의 평균은 50보다 크다. (단측 검정)

t.test(df$ALT, mu=50, alternative="greater")

t.test(df$ALTmu=50alternative="greater") : T-test를 시행한다. 검정할 변수는 df 데이터의 ALT변수다. ALT의 모평균이 50이라고 할 수 있는지 검정할 것이다. 대립 가설은 "모평균이 50보다 크다"이다.

결과

	One Sample t-test

data:  df$ALT
t = -94.014, df = 999, p-value = 1
alternative hypothesis: true mean is greater than 50
95 percent confidence interval:
 34.85529      Inf
sample estimates:
mean of x 
 35.11594

위의 결과 중 다음 내용에 주목해야 한다.

One Sample t-test
data:  df$ALT
t = -94.014, df = 999, p-value = 1
alternative hypothesis: true mean is greater than 50
95 percent confidence interval:
 34.85529      Inf
 sample estimates:
mean of x  35.11594

 

P-value1.0000이다. 즉, 대립 가설 (모평균의 참값은 50보다 크다.)을 선택하는 것이 말이 안 된다는 것이다. 평균이 50보다 크다고 보는 것보다는 50이라고 보는 것이 더 합리적이라는 뜻이다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다.

 

2)  $H_1=$ 모집단의 평균은 50보다 작다. (단측 검정)

t.test(df$ALT, mu=50, alternative="less")

t.test(df$ALTmu=50alternative="less") : T-test를 시행한다. 검정할 변수는 df 데이터의 ALT변수다. ALT의 모평균이 50이라고 할 수 있는지 검정할 것이다. 대립 가설은 "모평균이 50보다 작다"이다.

 

결과

	One Sample t-test

data:  df$ALT
t = -94.014, df = 999, p-value < 2.2e-16
alternative hypothesis: true mean is less than 50
95 percent confidence interval:
     -Inf 35.37659
sample estimates:
mean of x 
 35.11594

위의 결과 중 다음 내용에 주목해야 한다.

 

One Sample t-test

data:  df$ALT t = -94.014, df = 999, p-value < 2.2e-16

alternative hypothesis: true mean is less than 50

95 percent confidence interval:

     -Inf 35.37659

sample estimates:

mean of x   35.11594 

 

P-value는 $2.2 \times 10^{-16}$보다 작다. 즉, 대립 가설 (모평균의 참값은 50보다 작다.)이 합리적이라는 말이다. 평균이 50이라고 보는 것보다는 50보다 작다고 보는 것이 더 합리적이라는 뜻이다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다.

 

 

3)  $H_1=$ 모집단의 평균은 50보다 작거나 크다. (양측 검정)

t.test(df$ALT, mu=50, alternative="two.sided")

t.test(df$ALT, mu=50)

위 두 개의 코드는 같은 결과를 내준다. 왜냐하면 양측 검정 (alternative="two.sided")가 기본 값이어서 alternative 옵션을 지정해주지 않으면 alternative="two.sided"라고 인식하고 코드가 돌아가기 때문이다.

 

 

t.test(df$ALTmu=50alternative="two.sided") : T-test를 시행한다. 검정할 변수는 df 데이터의 ALT변수다. ALT의 모평균이 50이라고 할 수 있는지 검정할 것이다. 대립 가설은 "모평균은 50이 아니다"이다.

 

결과

One Sample t-test

data:  df$ALT
t = -94.014, df = 999, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 50
95 percent confidence interval:
 34.80527 35.42661
sample estimates:
mean of x 
 35.11594

 

위의 결과 중 다음 내용에 주목해야 한다.

 

One Sample t-test 

data:  df$ALT t = -94.014, df = 999, p-value < 2.2e-16 

alternative hypothesis: true mean is not equal to 50 

95 percent confidence interval:

     34.80527 35.42661 

sample estimates: 

mean of x   35.11594 

 

P-value는 $2.2 \times 10^{-16}$보다 작다. 즉, 대립 가설 (모평균의 참값은 50dㅣ 아니다.)이 합리적이라는 말이다. 평균이 50이라고 보는 것보다는 50보다 작거나 크다고 보는 것이 더 합리적이라는 뜻이다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다.

 

주로 양측 검정이 이용되나, 사실 일표본 T검정은 거의 시행되지 않고 다음 글로 나올 독립 표본 T검정이 더 많이 사용된다. 

 

코드 정리

#워킹 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")

#데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")



##정규성 검정##
# 1) Q-Q plot 그리기
qqnorm(df$ALT)
qqline(df$ALT)

# 2) 히스토그램 그리기
hist(df$ALT, prob=TRUE)
ALTrange<-seq(min(df$ALT),max(df$ALT),length=max(max(df$ALT)-min(df$ALT),100))
ND<-dnorm(ALTrange,mean=mean(df$ALT),sd=sd(df$ALT))
lines(ALTrange, ND, lwd=2)

# 3) Shapiro-Wilk test 시행하기
shapiro.test(df$ALT)


##T-test 1
# 단측 (대립가설=크다) 검정 t-test
t.test(df$ALT, mu=50, alternative="greater")

##T-test 2
# 단측 (대립가설=작다) 검정 t-test
t.test(df$ALT, mu=50, alternative="less")

##T-test 3
# 양측 검정 t-test
t.test(df$ALT, mu=50, alternative="two.sided")
t.test(df$ALT, mu=50)

 

R 일표본 T검정 (One-sample T-test) 정복 완료!

 

작성일: 2022.11.03.

최종 수정일: 2022.11.29.

이용 프로그램: R 4.1.3

RStudio v1.4.1717

RStudio 2021.09.1+372 "Ghost Orchid" Release 

운영체제: Windows 10, Mac OS 10.15.7

반응형
반응형

[SAS] 일원 배치 분산 분석 (One-way ANOVA, ANalysis Of VAriance) - PROC GLM, PROC ANOVA

 이전 포스팅에서 음주 여부에 따른 ALT 평균에 차이가 있는지를 알아보기 위해서는 T test를 사용한다는 내용을 알아보았다. 2022.10.04 - [모평균 검정/SAS] - [SAS] 독립 표본 T검정 (Independent samples T-test) - PROC TTEST

 음주 여부는 "1) 음주자", "2) 비음주자"로 나뉘는 이분형 변수다. 즉, 음주자의 ALT 평균과 비음주자의 ALT 평균을 비교한 것이었다. 

 

 만약, 두 개 이상의 범주로 나뉘는 변수에 대해 모평균의 검정을 하고자 한다면 어떻게 해야 할까? 예를 들어, 흡연 상태를 "1) 비흡연자", "2) 과거 흡연자", "3) 현재 흡연자"로 나누었고, 각 그룹의 폐기능 검사 중 하나인 FVC (Forced Vital Capacity)의 평균에 차이가 있는지 알아보고자 한다. 

 

 이때 사용할 수 있는 방법이 일원 배치 분산 분석인 One-way ANOVA (Analysis of Variance)이며 이번 포스팅에서 다뤄볼 주된 내용이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.10.11)

 

분석용 데이터 (update 22.10.11)

2022년 10월 11일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 반복 측정 자료 분석 - 통계

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

 

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

목표: 흡연 상태에 따라 FVC 평균은 서로 다르다고 모집단 수준에서 말할 수 있는가?

 

전제조건 (정규성, 등분산성)

 ANOVA에는 두 가지 전제조건이 필요하다. 본 포스팅의 예시에 맞추어 설명하면 다음과 같다.

 1) 정규성: 현재 흡연자, 과거 흡연자, 비흡연자 별로 FVC의 분포를 보았을 때 각각의 분포는 정규성을 따른다. 

 2) 등분산성: 현재 흡연자, 과거 흡연자, 비흡연자 별로 FVC의 분포를 보았을 때 분산은 서로 같다.

 

따라서 각각을 검정해야 한다.

 

1) 정규성 

정규성 검정에 관한 내용은 다음 링크에서 확인할 수 있다.

2022.08.12 - [기술 통계/SAS] - [SAS] 정규성 검정 - PROC UNIVARIATE

 

 SMOK: 흡연 상태

 FVC_pPRED: FVC의 백분위 예측치

PROC UNIVARIATE DATA=hong.df NORMAL PLOT;
CLASS SMOK;
VAR FVC_pPRED;
HISTOGRAM FVC_pPRED/ NORMAL (MU=EST SIGMA=EST);
RUN;

 

결과 - 1) 비흡연자 (SMOK=0)

.

 표본의 수가 2,000이 되지 않으므로 Shapiro-Wilk 통계량의 p-value를 보아야 하고, 이는 0.05보다 크다. Q-Q plot, 히스토그램에서 정규성을 띠지 않는다고 할만한 근거가 없으므로 정규성을 따른다고 결론을 짓는다.

 

결과 - 2) 과거 흡연자 (SMOK=1)

 표본의 수가 2,000이 되지 않으므로 Shapiro-Wilk 통계량의 p-value를 보아야 하고, 이는 0.05보다 크다. Q-Q plot, 히스토그램에서 정규성을 띠지 않는다고 할만한 근거가 없으므로 정규성을 따른다고 결론을 짓는다.

 

결과 - 3) 현재 흡연자 (SMOK=2)

 표본의 수가 2,000이 되지 않으므로 Shapiro-Wilk 통계량의 p-value를 보아야 하고, 이는 0.05보다 크다. Q-Q plot, 히스토그램에서 정규성을 띠지 않는다고 할만한 근거가 없으므로 정규성을 따른다고 결론을 짓는다.

 

 따라서 정규성 전제조건은 만족한다고 할 수 있다.

 

2) 등분산성 

등분산성 검정에 관한 내용은 다음 링크에서 확인할 수 있다.

2022.10.04 - [모평균 검정/SAS] - [SAS] 독립 표본 T검정 (Independent samples T-test) - PROC TTEST

2022.10.05 - [모평균 검정/SAS] - [SAS] 등분산성 검정 (Homogeneity of variance) - PROC GLM

 

위 두 개 글에서 제시한 네 가지 방법 모두를 사용하여 등분산 검정을 시행해 보겠다.

*1) Levene;
PROC GLM DATA=hong.df;
CLASS SMOK;
MODEL FVC_pPRED=SMOK;
MEANS SMOK/ HOVTEST=LEVENE(TYPE=ABS);
RUN;

*2) O'Brien;
PROC GLM DATA=hong.df;
CLASS SMOK;
MODEL FVC_pPRED=SMOK;
MEANS SMOK/ HOVTEST=OBRIEN;
RUN;

*3) Brwon and Forsythe;
PROC GLM DATA=hong.df;
CLASS SMOK;
MODEL FVC_pPRED=SMOK;
MEANS SMOK/ HOVTEST=BF;
RUN;

*4) Bartlett;
PROC GLM DATA=hong.df;
CLASS SMOK;
MODEL FVC_pPRED=SMOK;
MEANS SMOK/ HOVTEST=BARTLETT;
RUN;
QUIT;

 

결과

1) Levene

2) O'Brien

3) Brown and Forsythe

4) Bartlett

 어떤 방법을 사용하더라도 p-value>0.05로 등분산성이라는 전제조건을 만족한다는 것을 알 수 있다. 따라서 일원 배치 분산 분석 (One-way ANOVA)를 시행할 수 있다.

 

 

일원 배치 분산 분석 (One way ANOVA) 코드

*1)사후분석- 본페로니;
PROC GLM DATA=hong.df;
CLASS SMOK;
MODEL FVC_pPRED=SMOK;
MEANS SMOK/BON CLDIFF;
RUN;
QUIT;

*2)사후분석- 본페로니;
PROC GLM DATA=hong.df;
CLASS SMOK;
MODEL FVC_pPRED=SMOK;
LSMEANS SMOK/ADJUST=BON PDIFF;
RUN;
QUIT;

*3)사후분석- 던칸;
PROC GLM DATA=hong.df;
CLASS SMOK;
MODEL FVC_pPRED=SMOK;
MEANS SMOK/DUNCAN;
RUN;
QUIT;

세 가지 방법으로 코드를 소개했지만, 모두 대동소이하다. 첫 세 줄이 ANOVA 코드로 모두 동일하다. 네 번째 줄은 사후 분석 및 출력 방법에 대한 코드다. 사후 분석에 대해서는 아래에 설명하도록 하겠다.

 

1) 사후 분석: 본페로니(BONferroni) 방법을 사용하고, 차이의 신뢰구간 (Confidence Limits for DIFFerence)을 나타내라.
PROC GLM DATA=hong.df; : 일반화 선형 모델 (GLM)을 시행하겠다. 데이터는 hong라이브러리의 df파일을 사용하라.
CLASS SMOK; : 흡연 상태에 따라 분산 분석 (ANOVA)를 시행하라.
MODEL FVC_pPRED=SMOK; : 흡연 상태(SMOK)에 따라 FVC % 예측치(FVC_pPRED)의 평균에 차이가 있는지 나타내라.
MEANS SMOK/BON CLDIFF; : 흡연 상태(SMOK)에 따른 FVC % 예측치(FVC_pPRED)의 평균을 보여달라. 사후 분석은 본페로니(BONferroni, BON) 방법을 사용하고, 차이의 신뢰구간 (Confidence Limits for DIFFerence, CLDIFF)을 보여달라

 - CLDIFF를 사용하기 위해서는 "MEANS"로 시작하는 구문을 사용해야 한다.

2) 사후 분석: 본페로니(BONferroni) 방법을 사용하고, 차이의 p-value (P-value for DIFFerence)를 나타내라.
PROC GLM DATA=hong.df; : 일반화 선형 모델 (GLM)을 시행하겠다. 데이터는 hong라이브러리의 df파일을 사용하라.
CLASS SMOK; : 흡연 상태에 따라 분산 분석 (ANOVA)를 시행하라.
MODEL FVC_pPRED=SMOK; : 흡연 상태(SMOK)에 따라 FVC % 예측치(FVC_pPRED)의 평균에 차이가 있는지 나타내라.
LSMEANS SMOK/ADJUST=BON PDIFF; : 흡연 상태(SMOK)에 따른 FVC % 예측치(FVC_pPRED)의 최소 제곱 평균(Least Squares MEANS, LSMEANS)을 보여달라. 사후 분석은 본페로니(BONferroni, BON) 방법을 사용하고, 차이의 p-value (P-value for DIFFerence)를 보여달라

 - PDIFF를 사용하기 위해서는 "LSMEANS"로 시작하는 구문을 사용해야 한다.

3) 사후 분석: 던칸(DUNCAN) 방법을 사용하라.
PROC GLM DATA=hong.df; : 일반화 선형 모델 (GLM)을 시행하겠다. 데이터는 hong라이브러리의 df파일을 사용하라.
CLASS SMOK; : 흡연 상태에 따라 분산 분석 (ANOVA)를 시행하라.
MODEL FVC_pPRED=SMOK; : 흡연 상태(SMOK)에 따라 FVC % 예측치(FVC_pPRED)의 평균에 차이가 있는지 나타내라.
MEANS SMOK/DUNCAN; : 흡연 상태(SMOK)에 따른 FVC % 예측치(FVC_pPRED)의 평균을 보여달라. 사후 분석은 던칸(DUNCAN) 방법을 사용하라.

결과

 위 세 개의 코드에서 공통적인 부분 (ANOVA)의 결과는 다음과 같다.

 

P-value가 <0.0001이므로 귀무가설을 기각하고 대립 가설을 채택한다. 그렇다면 여기에서 귀무가설 및 대립 가설은 무엇이었는가?

 

 귀무가설:  $H0=$ 세 집단의 모평균은 "모두" 동일하다.

 대립 가설:  $H1=$ 세 집단의 모평균이 모두 동일한 것은 아니다.

 

우리는 대립 가설을 채택해야 하므로 "세 집단의 모평균이 모두 동일한 것은 아니다."라고 결론 내릴 것이다.

이 말은, 세 집단 중 두 개씩 골라 비교했을 때, 적어도 한 쌍에서는 차이가 난다는 것이다. 따라서 세 집단 중 두 개씩 골라 비교를 해보아야 하며, 이를 사후 분석 (post hoc analysis)이라고 한다. 세 집단에서 두 개씩 고르므로 가능한 경우의 수는 $_3 C_2=3$이다.

 (1) 비흡연자 vs 과거 흡연자

 (2) 비흡연자 vs 현재 흡연자

 (3) 과거 흡연자 vs 현재 흡연자

 

사후 분석 결과 부분을 보겠다.

 

 

1) 사후 분석으로 본페로니(BONferroni) 방법을 사용하고, 차이의 신뢰구간 (Confidence Limits for DIFFerence)을 나타내라.

 빨간 박스를 먼저 설명하면, 비흡연자 (SMOK=0)가 과거 흡연자 (SMOK=1)보다 FVC가 9.5328%p 더 크다. 그 차이의 95% 신뢰구간은 7.2168에서 11.8499이다. 즉 신뢰구간에 0이 포함되어있지 않으므로 유의미한 차이가 있다고 할 수 있다. 그런 경우 노란 박스의 "***" 표시를 해준다. 밑의 결과도 해석은 같다. 

 즉, 모든 사후 분석 결과에서 유의미한 차이가 있음을 알 수 있다.

 

 

2) 사후 분석: 본페로니(BONferroni) 방법을 사용하고, 차이의 p-value (P-value for DIFFerence)를 나타내라.

 위의 방법 1)에서는 95% 신뢰구간만을 보여주고, p-value가 0.05보다 작은지만 보여줄 뿐, 정확한 p-value의 값은 알려주지 않는다. 정확한 p-value값을 알고 싶은 경우 LSMEANS구문에 PDIFF옵션을 사용하면 된다.

 예를 들어 위의 빨간 박스는 그룹 1 (비흡연자)와 그룹 2(과거 흡연자) 사이의 평균의 차이에 대한 p-value를 보여준다. 위와 다르게 p-value를 보여준다는 장점은 있지만, 그 차이가 얼마인지, 신뢰구간은 얼마인지 보여주지 못하는 단점이 있다. 둘 중 어떤 방법으로 출력을 할지는 개인이 선택을 하면 된다.

 

3) 사후 분석: 던칸(DUNCAN) 방법을 사용하라.

 

이 시점에서 이런 의문이 들 수 있다.

"각각의 그룹별로 평균을 비교하면 되지, 굳이 왜 ANOVA라는 방법까지 사용하는 것인가?"

 아주 논리적인 의문점이다. 하지만, 반드시 ANOVA를 사용해야 한다. 그 이유는 다음과 같다. 본 사례는 흡연 상태에 따른 조합 가능한 경우의 수가 3인데, 각각 유의성의 기준을 $\alpha=0.05$로 잡아보자. 이때 세 번의 비교에서 모두 귀무가설이 학문적인 진실인데(평균에 차이가 없다.), 세 번 모두 귀무가설을 선택할 확률은 $(1-0.95)^3 \approx 0.86$이다. (이해가 어려우면 p-value에 대한 설명 글을 읽고 오길 바란다. 2022.09.05 - [통계 이론] - [이론] p-value에 관한 고찰)

 그런데, ANOVA의 귀무가설은 "모든 집단의 평균이 같다."이다. 따라서 모든 집단의 평균이 같은 것이 학문적 진실일 때, 적어도 한 번이라도 대립 가설을 선택하게 될 확률은 $1-0.86=0.14$가 된다. 즉, 유의성의 기준이 올라가게 되어, 덜 보수적인 결정을 내리게 되고, 다시 말하면 대립 가설을 잘 선택하는 쪽으로 편향되게 된다. 학문적으로는 '다중 검정 (multiple testing)을 시행하면 1종 오류가 발생할 확률이 증가하게 된다.'라고 표현한다.

 따라서, 각각을 비교해보는 것이 아니라 한꺼번에 비교하는 ANOVA를 시행해야 함이 마땅하다. 

 

 여기에서 한 번 더 의문이 들 수 있다.

 "사후 분석을 할 때에는 1종 오류가 발생하지 않는가?"

그렇다. 1종 오류가 발생할 확률이 있으므로, p-value의 기준을 더 엄격하게 (0.05보다 더 작게) 잡아야 한다. P-value를 보정하는 방법은 여러 가지가 나와있는데, 가장 간단하고 제일 보수적인 방법이 위에 예시에서 사용한 본페로니 방법이다. 그 외에도 많은 방법이 있고 다른 방법을 사용하기 위해서는 BON의 자리에 다음 중 하나를 입력하면 된다.

 

코드 내용 코드 내용
BON Bonferroni t test SCHEFFE Scheffe's multiple comparison
DUNCAN Duncan's multiple range test SIDAK Pairwise t test (Sidak's inequality)
DUNNETT Dunnett's two-tailed t test SMM (혹은 GT2) Pairwise comparisons (studentized maximum modulus, Sidak's uncorrelated t-inequality)
DUNNETTL Dunnett's one-tailed t test (less) SNK Student-Newman-Keuls
DUNNELLU Dunnett's one-tailed t test (greater) T (혹은 LSD) Pairwise t test
GABRIEL Gabriel's multiple comparison TUKEY Tukey's studentized range test
REGWQ Ryan-Einot-Habriel-Welsch WALLER Waller-Duncan k-ratio  t test

 

굉장히 많은 방법이 있지만, Bonferroni, Duncan, Scheffe, Tukey가 가장 많이 쓰이는 듯하다. 이 중에 Duncan, Tukey는 그룹별로 표본의 수가 같을 때만 사용해야 하므로 유의하도록 한다.

 

그중에 DUNCAN옵션을 사용하여 산출한 결과는 다음과 같다.

막대기가 연결되어 있으면 평균이 서로 다르다고 할 수 없는 것이고, 끊어져 있으면 서로 다르다고 할 수 있는 것이다. 위의 경우 비흡연자 (SMOK=0)은 파란 막대기가 있고, 과거 흡연자 (SMOK=1)는 빨간 막대기로 파란 막대기와 분리되어 있다. 따라서 과거 흡연자의 FVC는 비흡연자의 FVC와 유의하게 다르다고 할 수 있다. 현재 흡연자 (SMOK=2)는 초록 막대기로 파랑 및 빨간 막대기와 분리되어 있다. 따라서 현재 흡연자의 FVC는 비흡연자 및 과거 흡연자의 FVC와 유의하게 다르다고 할 수 있다. 즉 모든 그룹에서 FVC의 평균은 다르다고 할 수 있다.

 

어떤 사후 분석을 쓸 것인가

 이 논의에 대해 정답이 따로 있는 것은 아니다. 적절한 방법을 사용하여 논문에 제시하면 되고, 어떤 것이 정답이라고 콕 집어 이야기할 수는 없다. 다만, 사후 분석 방법이 여러 가지가 있다는 것은 '사후 분석 방법에 따라 산출되는 결과가 달라질 수 있다.'는 것을 의미하고, 심지어는 '어떤 사후 분석 방법을 채택하냐에 따라 유의성 여부가 달라질 수도 있다.'는 것을 의미한다. 심지어, ANOVA에서는 유의한 결과가 나왔는데, 사후 분석을 해보니 유의한 차이를 보이는 경우가 없을 수도 있다. 따라서 어떤 사후 분석 방법 결과에 따른 결과인지 유의하여 해석할 필요가 있다.

 

PROC ANOVA

 PROC ANOVA에 대한 설명을 듣고자 본 포스팅에 들어온 독자도 있을 것이다. 하지만 이는 다루지 않을 것이다. 왜냐하면 PROC ANOVA는 그룹별로 표본의 수가 같아야만 사용할 수 있는, 아주 제한적인 상황에서만 쓸 수 있는 코드이기 때문이다. 따라서 웬만하면 PROC GLM을 사용하길 권한다. 만약 사용하고자 한다면, PROC GLM을 PROC ANOVA로만 바꾸어 다음과 같이 사용하면 된다.

PROC ANOVA DATA=hong.df;
CLASS SMOK;
MODEL FVC_pPRED=SMOK;
MEANS SMOK;
RUN;

SAS 일원 배치 분산 분석 (One-way ANOVA, ANalysis Of VAriance) 정복 완료!

작성일: 2022.10.12.

최종 수정일: 2022.11.30.

이용 프로그램: SAS v9.4

운영체제: Windows 10

반응형
반응형

[SAS] 등분산성 검정 (Homogeneity of variance) - PROC GLM

 T-test, ANOVA 등 몇몇 분석에서는 분포들의 분산이 같다는 가정 (등분산성)이 필요하다. 이럴 때에는 등분산성 검정을 해야 하는데, 많이들 사용하는 방법은 크게 다섯 가지가 존재한다.

 

1) Fooled F

2) Levene

3) O'Brien

4) Brown and Forsythe

5) Bartlett

 

이 중 첫 번째 방법인 Fooled F 검정은 PROC TTEST에서 확인할 수 있다. 그리고 Levene의 등분산성 검정은 T-test에 관한 글에서 다루었으므로 본 포스팅에서는 다루지 않겠다. Fooled F와 Levene 등분산성 검정에 관한 내용은 다음 링크에서 확인할 수 있다. 2022.10.04 - [모평균 검정/SAS] - [SAS] 독립 표본 T검정 (Independent samples T-test) - PROC TTEST

 

 결국 우리가 확인하고자 하는 것은, "수축기 혈압 분포의 분산이 고혈압 환자군과 일반인 사이에서 다르다고 할 수 있는가?"이다. 이에 대해 설면하도록 하겠다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

 

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

 

코드 - 등분산성 검정

등분산성을 검정하는 코드는 다음과 같다.

*O'Brien;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=OBRIEN(W=0.5);
RUN;
QUIT;

*Brown and Forsythe;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=BF;
RUN;
QUIT;

*Bartlett;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=BARTLETT;
RUN;
QUIT;

PROC GLM DATA=hong.df; : 등분산 검정은 PROC GLM이라는 명령문으로 할 수 있다. PROC GLM을 시행하고, 데이터는 hong 라이브러리에 있는 df를 이용한다.
   CLASS HTN; : 고혈압 여부(HTN)에 따라 분산이 같은지 검정할 것이다.
   MODEL SBP = HTN; : 고혈압 여부(HTN)에 따라 수축기 혈압(SBP)의 분산이 같은지 검정할 것이다.
   MEANS HTN / HOVTEST=OBRIEN(W=0.5); : 고혈압의 평균을 구해주어라. 등분산성 검정 (HOmogeneity of Variance TEST)은 O'Brien방법을 사용한다. O'Brien 방법의 parameter는 W가 있는데 원하는 값을 넣어주면 된다. 기본 값은 0.5로 설정되어 있으며, 기본값 그대로 사용하고자 할 때에는 "(W=0.5)"를 통째로 쓰지 않아도 괜찮다.
RUN; : 코드를 실행한다.
QUIT; : GLM코드는 QUIT구문을 실행하거나, 다른 코드를 실행해야만 끝나므로 QUIT을 실행한다.

 

Brown and Forsythe, Bartlett 방법은 각각 "OBRIEN"을 "BF", "BARTLETT"으로 바꾸어 구한 것이다.

 

결과

1) O'Brien 검정 결과

 

2) Brown and Forsythe 검정 결과

 

3) Bartlett 검정 결과

 

약간의 차이들은 있지만 모두 p-value가 0.05 이상으로 귀무가설을 기각하지 못해 모분산이 서로 같다고 결론 내릴 수 있다. 

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*데이터 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*O'Brien;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=OBRIEN(W=0.5);
RUN;
QUIT;

*Brown and Forsythe;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=BF;
RUN;
QUIT;

*Bartlett;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=BARTLETT;
RUN;
QUIT;

 

SAS 등분산성 검정 (Homogeneity of variance) 정복 완료!

작성일: 2022.10.05.

최종 수정일: 2022.10.05.

이용 프로그램: SAS v9.4

운영체제: Windows 10

반응형
반응형

[SAS] 독립 표본 T검정 (Independent samples T-test) - PROC TTEST

 

  세상에 존재하는 모든 사람을 대상으로 연구를 하면 참 좋겠지만, 시간적인 이유로, 그리고 경제적인 이유로 일부를 뽑아서 연구를 진행할 수밖에 없다. 모든 사람을 모집단이라고 하고, 뽑힌 일부를 표본이라고 한다. 우리는 표본으로 시행한 연구로 모집단에 대한 결론을 도출해내고자 할 것이다. 

 1000명에게 피검사를 시행하였고, 간 기능 검사의 일환으로 ALT 수치를 모았다. 이 데이터를 기반으로 1000명이 기원한 모집단 인구에서의 ALT평균이 어떻게 될지 예측하는 것이 T-test이다. T-test는 크게 세 가지로 나눌 수 있다.

 

 1) 일표본 T검정 (One sample T-test) : 2022.09.30 - [모평균 검정/SAS] - [SAS] 일표본 T검정 (One-sample T-test) - PROC TTEST

 : 모집단의 평균이 특정 값이라고 할 수 있는가?

 예) 모집단의 ALT 평균이 50이라고 할 수 있는가?

 

 

 2) 독립 표본 T검정 (Independent samples T-test, Two samples T-test)

 : 두 모집단의 평균이 다르다고 할 수 있는가?

 예) 고혈압 환자와 일반인의 수축기 혈압 평균이 서로 다르다고 할 수 있는가?

 

 3) 대응표본 T검정 (Paired samples T-test) : 2022.10.07 - [반복 측정 자료 분석/SAS] - [SAS] 대응 표본 T검정 (Paired samples T-test) - PROC TTEST

 : 모집단의 짝지어진 변수들의 평균이 다르다고 할 수 있는가?

예) 간기능 개선제 복용 전 ALT 평균은 간기는 개선제 복용 후 ALT 평균과 다르다고 할 수 있는가?

 

이번 포스팅에서는 독립 표본 T검정 (Independent samples T-test, Two samples T-test)에 대해 알아볼 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

 

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

목표: 고혈압 환자의 수축기 혈압(SBP) 평균은 정상인의 수축기혈압 평균과 다르다고 모집단 수준에서 말할 수 있는가?

 이번 포스팅의 목적은 1000명의 데이터를 가지고, 이 1000명이 기원한 모집단에서 수축기 혈압 평균이 고혈압 유병 여부에 따라 다르다고 할 수 있는지 판단하는 것이다.

 

전제조건 (정규성) - 코드

 독립표본독립 표본 (Indepent samples, Two tamples) T 검정의 전제조건은 각각의 독립 표본의 분포가 정규성을 따른다는 것이다. 즉, 여기에서는 고혈압 유병 여부에 따라 수축기 혈압 (SBP)의 정규성을 검정하도록 하겠다.

 - 정규성 검정에 관한 분석 내용은 다음 글에서 살펴볼 수 있다. 2022.08.12 - [기술 통계/SAS] - [SAS] 정규성 검정 - PROC UNIVARIATE

 - PROC UNIVARIATE명령문에서 "CLASS"옵션을 사용하는 방법은 다음 글에서 살펴볼 수 있다. 2022.09.23 - [기술 통계/SAS] - [SAS] 기술 통계 (평균, 표준편차, 표준오차, 최댓값, 최솟값, 중위수, 분위수 등) - PROC UNIVARIATE, PROC MEANS

 

PROC UNIVARIATE DATA=hong.df NORMAL PLOT;
CLASS HTN;
VAR SBP;
HISTOGRAM SBP/ NORMAL (MU=EST SIGMA=EST);
RUN;

PROC UNIVARIATE : 변수에 대해 알아보는 코드를 작성하겠다.

DATA=hong.df : 데이터는 hong이라는 라이브러리 내에 있는 df를 사용하겠다.

NORMAL : 정규성 검정을 시행해라.

PLOT : 히스토그램과 QQ plot을 그려라

CLASS HTN
VAR SBP : 분석할 변수는 SBP다
HISTOGRAM SBP : SBP의 히스토그램도 그려라

/ NORMAL (MU=EST SIGMA=EST) : 히스토그램에 정규분포 곡선도 덧붙여 그리는데, 정규분포 곡선의 평균은 SBP 데이터로부터 계산한 평균이고, 표준편차도 SBP 데이터의 표준편차다.

 

정규성 검정 - 결과

1) HTN=0 (고혈압을 앓지 않는 정상인 군)

N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 

 

1) HTN=1 (고혈압을 앓는 환자군)

N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 

 

 

전제조건이 성립한다. 즉, 고혈압 유병 여부에 따른 수축기 혈압 (SBP)의 분포가 정규성을 따른다고 할 수 있다. 따라서 독립 표본 T 검정 (Independent samples T test, Two samples T test)을 시행할 수 있다.

 

T-Test 코드

PROC TTEST DATA=hong.df;
CLASS HTN;
VAR SBP;
RUN;

PROC TTEST DATA=hong.df; : T-test를 시행하겠다. 데이터는 hong 라이브러리의 df데이터를 이용한다.
CLASS HTN; : 고혈압 여부에 따라 평균의 차이를 검정하겠다.
VAR SBP; : 검정하고자 하는변수는 수축기 혈압 (SBP)이다.

 

결과

독립 표본 T 검정(Independent samples T-test, Two samples T-test)의 검정 결과는 두 단계에 걸쳐 확인해야 한다.

 1) 등분산성 검정

 등분산성 (Equality of Variances)을 확인해야 한다. 즉 두 분포의 분산이 같다고 할 수 있는지 확인해야 한다. 빨간색 박스의 p-value는 0.9994이다. 그러면 귀무가설을 기각할 수 없다. 그러면 귀무가설은 무엇이었는가?

 귀무가설:  $H_0=$ 두 집단의 모분산은 동일하다.

 대립가설:  $H_1=$ 두 집단의 모분산은 동일하지 않다.

 

귀무가설을 기각할 수 없으므로 모분산은 같다고 생각하기로 한다.

 

2) 평균 차이 검정

PROC TTEST는 평균 차이 검정 결과를 두 가지 제공한다. 분산이 같다고 할 수 있을 때 사용하는 Pooled method, 분산이 다르다고 할 수 있을 때 사용하는 Satterthwaite method이다. 위에서 모분산이 같다고 생각하기로 했으므로 Poold method의 p-value를 보면 <0.0001으로 귀무가설을 기각할 수 있다. 그러면 귀무가설은 무엇이었는가?

 귀무가설:  $H_0=$ 두 집단의 평균 SBP는 동일하다.

 대립가설:  $H_1=$ 두 집단의 평균 SBP는 동일하지 않다.

 

고혈압이 있는 군의 평균 SBP는 150.1, 고혈압이 없는 군의 평균 SBP는 120.1이었으므로 고혈압이 있는 환자의 수축기 혈압이 정상군에 비해 유의미하게 높다고 결론지을 수 있다.

 

 

SAS와 SPSS의 차이

그런데, SPSS의 T-test 결과와 비교해보면 약간 서로 다른 것을 알 수 있다.

SPSS에서의 T-test는 다음 링크에서 확인할 수 있다.

2022.11.30 - [모평균 검정/SPSS] - [SPSS] 독립 표본 T검정 (Independent samples T-test)

 

바로, 등분산성 검정 결과가 다르다. SAS에서는 "Fooled F"를 사용하고, SPSS에서는 "Levene의 등분산 검정"을 사용하기 때문이다. 다행히도 SPSS에서도, SAS에서도 모분산이 동일하다는 결론이 났지만, 간혹 서로 다른 결론을 내리기도 한다. 따라서 어떤 등분산성 검정 방법을 사용했는지 알고 있어야 한다. 

 

당연히, SAS에서도 SPSS처럼 Levene의 등분산 검정을 시행할 수 있는데 코드는 다음과 같다.

코드 - Levene의 등분산 검정

PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=LEVENE(TYPE=ABS);
RUN;
QUIT;

PROC GLM DATA=hong.df; : Levene의 등분산 검정은 PROC GLM이라는 명령문으로 할 수 있다. PROC GLM을 시행하고, 데이터는 hong 라이브러리에 있는 df를 이용한다.
   CLASS HTN; : 고혈압 여부(HTN)에 따라 분산이 같은지 검정할 것이다.
   MODEL SBP = HTN; : 고혈압 여부(HTN)에 따라 수축기 혈압(SBP)의 분산이 같은지 검정할 것이다.
   MEANS HTN / HOVTEST=LEVENE(TYPE=ABS); : 고혈압의 평균을 구해주어라. 등분산성 검정 (HOmogeneity of Variance TEST)은 Levene방법을 사용 한다. Levene의 등분산 검정은 제곱한 값을 사용하는 SQUARE, 차이를 사용하는 ABS가 있는데 차이를 사용한다.
RUN; : 코드를 실행한다.
QUIT; : GLM코드는 QUIT구문을 실행하거나, 다른 코드를 실행해야만 끝나므로 QUIT을 실행한다.

 

이 방법 이외의 등분산성 검정 방법 (O'Brien, Brwon and Forsythe, Bartlett)에 대한 내용은 다음 링크에서 확인할 수 있다. 

2022.10.05 - [모평균 검정/SAS] - [SAS] 등분산성 검정 (Homogeneity of variance) - PROC GLM

 

결과

p-value는 0.9189로 SPSS와 같음을 알 수 있고, 0.05보다 크므로 귀무가설을 기각하지 못해 모분산이 같다고 결론 내릴 수 있다. 

 

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*데이터 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*고혈압 여부에 따라 정규성 검정하기;
PROC UNIVARIATE DATA=hong.df NORMAL PLOT;
CLASS HTN;
VAR SBP;
HISTOGRAM SBP/ NORMAL (MU=EST SIGMA=EST);
RUN;

*T-test실행하기;
PROC TTEST DATA=hong.df;
CLASS HTN;
VAR SBP;
RUN;

*Levene의 등분산성 검정하기;
PROC GLM DATA=hong.df;
   CLASS HTN;
   MODEL SBP = HTN;
   MEANS HTN / HOVTEST=LEVENE(TYPE=ABS);
RUN;
QUIT;

 

SAS 독립 표본 T검정 (Dependent samples T-test, Two samples T-test) 정복 완료!

작성일: 2022.09.30.

최종 수정일: 2022.11.30.

이용 프로그램: SAS v9.4

운영체제: Windows 10

반응형
반응형

[SAS] 일표본 T검정 (One-sample T-test) - PROC TTEST

  세상에 존재하는 모든 사람을 대상으로 연구를 하면 참 좋겠지만, 시간적인 이유로, 그리고 경제적인 이유로 일부를 뽑아서 연구를 진행할 수밖에 없다. 모든 사람을 모집단이라고 하고, 뽑힌 일부를 표본이라고 한다. 우리는 표본으로 시행한 연구로 모집단에 대한 결론을 도출해내고자 할 것이다. 

 1000명에게 피검사를 시행하였고, 간 기능 검사의 일환으로 ALT 수치를 모았다. 이 데이터를 기반으로 1000명이 기원한 모집단 인구에서의 ALT평균이 어떻게 될지 예측하는 것이 T-test이다. T-test는 크게 세 가지로 나눌 수 있다.

 

 1) 일표본 T검정 (One sample T-test)

 : 모집단의 평균이 특정 값이라고 할 수 있는가?

 예) 모집단의 ALT 평균이 50이라고 할 수 있는가?

 

 2) 독립 표본 T검정 (Independent samples T-test): 2022.10.04 - [모평균 검정/SAS] - [SAS] 독립 표본 T검정 (Independent samples T-test) - PROC TTEST

 : 두 모집단의 평균이 다르다고 할 수 있는가?

 예) 고혈압 환자와 일반인의 수축기 혈압 평균이 서로 다르다고 할 수 있는가?

 

 3) 대응표본 T검정 (Paired samples T-test):2022.10.07 - [반복 측정 자료 분석/SAS] - [SAS] 대응 표본 T검정 (Paired samples T-test) - PROC TTEST

 : 모집단의 짝지어진 변수들의 평균이 다르다고 할 수 있는가?

예) 간기능 개선제 복용 전 ALT 평균은 간기는 개선제 복용 후 ALT 평균과 다르다고 할 수 있는가?

 

이번 포스팅에서는 일표본 T검정 (One sample T-test)에 대해 알아볼 것이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

 

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

시작하기 위해 라이브러리를 만들고, 파일을 불러온다.

라이브러리 만드는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 라이브러리 만들기 - LIBNAME

파일 불러오는 방법: 2022.08.05 - [통계 프로그램 사용 방법/SAS] - [SAS] 데이터 불러오기 및 저장하기 - PROC IMPORT, PROC EXPORT

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

 

목표: 모집단의 ALT 평균이 50이라고 할 수 있는가?

 이번 포스팅의 목적은 1000명의 데이터를 가지고, 이 1000명이 기원한 모집단의 ALT평균이 50이라고 할 수 있는지 판단하는 것이다.

 

전제조건 (정규성) - 코드

일표본 (One sample) T 검정의 전제조건은 해당 분포가 정규성을 따른다는 것이다. 정규성 검정을 하도록 하겠다. 정규성 검정에 관한 분석 내용은 다음 글에서 살펴볼 수 있다. 2022.08.12 - [기술 통계/SAS] - [SAS] 정규성 검정 - PROC UNIVARIATE

PROC UNIVARIATE DATA=hong.df NORMAL PLOT;
VAR ALT;
HISTOGRAM ALT/ NORMAL (MU=EST SIGMA=EST);
RUN;

 

정규성 검정 - 결과

 

 

 

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이상이며, Q-Q Plot은 대부분의 데이터가 선상에 있고, 히스토그램에서도 정규성을 따르는 것처럼 볼 수 있다. 따라서 ALT로는 일표본 T검정 (One-sample T-test)를 시행할 수 있다. 

 

 

일표본 T검정 (One sample T test)의 귀무가설과 대립 가설

 

이번 일표본 T검정 (One sample T test)의 귀무가설은 하나다.

귀무가설: $H_0=$ 모집단의 ALT 평균은 50이다.

 

하지만 대립 가설은 3개가 된다.

1) $H_1=$ 모집단의 평균은 50보다 크다. (단측 검정)

2) $H_1=$ 모집단의 평균은 50보다 작다. (단측 검정)

3) $H_1=$ 모집단의 평균은 50보다 크거나 작다. (양측 검정)

 

대립 가설 별로 코드를 보고자 한다.

 

1) $H_1=$ 모집단의 평균은 50보다 크다. (단측 검정)

PROC TTEST DATA=hong.df SIDES=U H0=50;
VAR ALT;
RUN;

PROC TTEST DATA=hong.df SIDES=U H0=50; : T-TEST를 실행할 것이다. 데이터는 hong 라이브러리에 있는 df를 사용할 것이고, 대립 가설은 큰 쪽이며, 검정하고자 하는 모집단의 평균은 50이다.
VAR ALT; : 검정하고자 하는 변수는 ALT다.

 

결과

 

 

P-value는 1.0000이다. 즉, 대립 가설을 선택하는 것이 말이 안 된다는 것이다. 평균이 50보다 크다고 보는 것보다는 50이라고 보는 것이 더 합리적이라는 뜻이다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다.

 

 

2) $H_1=$ 모집단의 평균은 50보다 작다. (단측 검정)

PROC TTEST DATA=hong.df SIDES=L H0=50;
VAR ALT;
RUN;

PROC TTEST DATA=hong.df SIDES=L H0=50; : T-TEST를 실행할 것이다. 데이터는 hong 라이브러리에 있는 df를 사용할 것이고, 대립 가설은 작은 쪽이며, 검정하고자 하는 모집단의 평균은 50이다.
VAR ALT; : 검정하고자 하는 변수는 ALT다.

 

결과

 

P-value는 <0.0001이다. 즉, 대립 가설을 선택하는 것이 합리적이라는 말이다. 평균이 50이라고 보는 것보다는 50보다 작다고 보는 것이 더 합리적이라는 뜻이다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다.

 

3) $H_1=$ 모집단의 평균은 50보다 작거나 크다. (양측 검정)

가장 많이 사용하는 양측 검정이다.

PROC TTEST DATA=hong.df SIDES=2 H0=50;
VAR ALT;
RUN;

PROC TTEST DATA=hong.df H0=50;
VAR ALT;
RUN;

위 두 개의 코드는 같은 결과를 내준다. 왜냐하면 양측 검정 (SIDES=2)가 기본 값이어서 SIDES옵션을 지정해주지 않으면 SIDES=2라고 인식하고 코드가 돌아가기 때문이다.

 

PROC TTEST DATA=hong.df SIDES=2 H0=50; : T-TEST를 실행할 것이다. 데이터는 hong 라이브러리에 있는 df를 사용할 것이고, 대립 가설은 양쪽이며, 검정하고자 하는 모집단의 평균은 50이다.
VAR ALT; : 검정하고자 하는 변수는 ALT다.

 

PROC TTEST DATA=hong.df H0=50; : T-TEST를 실행할 것이다. 데이터는 hong 라이브러리에 있는 df를 사용할 것이고, 대립 가설은 양쪽이며, 검정하고자 하는 모집단의 평균은 50이다.
VAR ALT; : 검정하고자 하는 변수는 ALT다.

 

결과

P-value는 <0.0001이다. 즉, 대립 가설을 선택하는 것이 합리적이라는 말이다. 평균이 50이라고 보는 것보다는 50보다 작거나 크다고 보는 것이 더 합리적이라는 뜻이다. 실제로 평균은 35.1159라고 적혀있으므로 합당한 통계분석임을 알 수 있다.

 

 

주로 양측 검정이 이용되나, 사실 일표본 T검정은 거의 시행되지 않고 다음 글로 나올 독립 표본 T검정이 더 많이 사용된다. 

 

코드 정리

*라이브러리 지정하기;
LIBNAME hong "C:/Users/User/Documents/Tistory_blog";

*파일 불러오기;
PROC IMPORT
DATAFILE="C:\Users\user\Documents\Tistory_blog\Data.xlsx"
DBMS=EXCEL
OUT=hong.df
REPLACE;
RUN;

*정규성 검정;
PROC UNIVARIATE DATA=hong.df NORMAL PLOT;
VAR ALT;
HISTOGRAM ALT/ NORMAL (MU=EST SIGMA=EST);
RUN;

*일표본 T검정 - 모집단의 평균은 50보다 크다. (단측검정)
PROC TTEST DATA=hong.df SIDES=U H0=50;
VAR ALT;
RUN;

*일표본 T검정 - 모집단의 평균은 50보다 작다. (단측검정)
PROC TTEST DATA=hong.df SIDES=L H0=50;
VAR ALT;
RUN;

*일표본 T검정 - 모집단의 평균은 50보다 작거나 크다. (양측검정)
PROC TTEST DATA=hong.df SIDES=2 H0=50;
VAR ALT;
RUN;

*일표본 T검정 - 모집단의 평균은 50보다 작거나 크다. (양측검정)
PROC TTEST DATA=hong.df H0=50;
VAR ALT;
RUN;

 

 

SAS 일표본 T검정 (One-sample T-test) 정복 완료!

작성일: 2022.09.30.

최종 수정일: 2022.11.03.

이용 프로그램: SAS v9.4

운영체제: Windows 10

반응형

+ Recent posts