반응형

[R] 로버스트 순위 순서 검정 (비모수 독립 표본 중앙값 검정: Robust rank order test, Flinger-Pollicello test) - rrod.test()

 

 정규분포를 따르지 않는 경우 두 분포의 중앙값이 같은지 보기 위해 맨 휘트니 U 검정 (윌콕슨 순위 합 검정, Mann Whitney U test, Wilcoxon rank sum test)을 시행할 수 있다.(2022.12.01 - [모평균 검정/R] - [R] 윌콕슨 순위 합 검정, 맨 휘트니 U 검정 (비모수 독립 표본 중앙값 검정: Wilcoxon rank sum test, Mann-Whitney U test) - wilcox.test()) 하지만 윌콕슨 순위 합 검정에는 아주 중요하고 강력한 하나의 가정이 필요한데, 두 분포의 생김새가 같다는 것이다. 만약 같지 않다면 정확도가 떨어지게 된다. 그럴 때 사용할 수 있는 로버스트 순위 순서 검정에 대해 소개하고자 한다.

 

단, 이 분석 또한 가정이 아예 필요 없는 것은 아니다. 로버스트 순위 순서 검정은 윌콕슨 순위 합 검정보다는 약한 가정 하나만 요구한다. 바로 중앙값에 대한 대칭성이다.

 

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

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

 

분석용 데이터 (update 22.12.01)

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

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

 

목표:  고혈압 여부에 따라 신경심리검사 5 원점수 (NP5_raw)의 중앙값이 모집단 수준에서 서로 다르다고 말할 수 있는가?

만약 GGT의 분포가 정규성을 따른다면, 독립 표본 T 검정으로 이를 확인할 수 있을 것이다. 따라서 정규성 여부를 먼저 확인해보자.

 

1) 정규성 - 코드

고혈압 별로 NP5_raw의 정규성을 확인하기 위해서는 다음 두 가지의 일을 해야 한다.

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

2) 각각 정규성을 확인하기.

 

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$NP5_raw)
qqline(df_whtn$NP5_raw)
# 2) 히스토그램 그리기
hist(df_whtn$NP5_raw, prob=TRUE, breaks=20) #자세하게 보기 위해 breaks=20을 추가함
NP5_rawrange<-seq(min(df_whtn$NP5_raw),max(df_whtn$NP5_raw),length=max(max(df_whtn$NP5_raw)-min(df_whtn$NP5_raw),100))
ND<-dnorm(NP5_rawrange,mean=mean(df_whtn$NP5_raw),sd=sd(df_whtn$NP5_raw))
lines(NP5_rawrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_whtn$NP5_raw)

#정상인
# 1) Q-Q plot 그리기
qqnorm(df_wohtn$NP5_raw)
qqline(df_wohtn$NP5_raw)
# 2) 히스토그램 그리기
hist(df_wohtn$NP5_raw, prob=TRUE, breaks=20) #자세하게 보기 위해 breaks=20을 추가함
NP5_rawrange<-seq(min(df_wohtn$NP5_raw),max(df_wohtn$NP5_raw),length=max(max(df_wohtn$NP5_raw)-min(df_wohtn$NP5_raw),100))
ND<-dnorm(NP5_rawrange,mean=mean(df_wohtn$NP5_raw),sd=sd(df_wohtn$NP5_raw))
lines(NP5_rawrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_wohtn$NP5_raw)

 

결과

1) 고혈압 환자

	Shapiro-Wilk normality test

data:  df_whtn$NP5_raw
W = 0.95661, p-value = 6.406e-11

 

2) 정상인

	Shapiro-Wilk normality test

data:  df_wohtn$NP5_raw
W = 0.9426, p-value = 4.956e-13

 N수가 2,000개 미만이므로 Shapiro-Wilk 통계량의 p-value를 보면 0.05 이하이며, Q-Q Plot은 대부분의 데이터가 선상에 있지 않고, 히스토그램에서도 정규성을 따르지 않는 것처럼 보인다. 따라서 독립 표본 T검정 (Two-sample T-test)를 시행할 수 없고, 두 분포는 비슷하게 생기지 않았으므로 맨 휘트니 U 검정 (Mann-Whitney U test)도 시행할 수 없다. 그런데 다행히도 각각의 분포는 중앙을 기점으로 대칭성을 이루고 있는 듯하다. 따라서 Robust rank order test를 시행할 수 있겠다.

 

로버스트 순위 순서 검정 (Robust rank order test) 코드

install.packages("trend")
library("trend")

rrod.test(df_whtn$NP5_raw, df_wohtn$NP5_raw)
rrod.test(NP5_raw~HTN, data=df)

로버스트 순위 검정을 시행하는 rrod.test()함수는 trend 패키지에 들어있으므로 설치한다. 패키지 설치에 관한 내용은 다음 링크에서 확인할 수 있다. 2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 패키지 설치하기 - install.packages(), library()

두 개의 코드는 같은 p-value를 제시한다.

아래 코드를 기준으로 설명하면 다음과 같다.

rrod.test(NP5_raw~HTN, data=df) : HTN에 따라 NP5_raw의 중앙값을 검정하되, 데이터는 df를 사용하라.

 

 

결과

	Robust Rank-Order Distributional Test

data:  NP5_raw by HTN
z = -0.090036, p-value = 0.9283
alternative hypothesis: true location shift is not equal to 0

Robust Rank-Order Distributional Test

data:  NP5_raw by HTN

z = -0.090036, p-value = 0.9283

alternative hypothesis: true location shift is not equal to 0

 

p-value를 보면 0.9283으로 0.05보다 크므로 귀무가설을 택한다. 즉, 중앙값에 차이가 없다고 결론 내린다.

 

 

로버스트 순위 순서 검정은 대칭성에 대한 전제만 요구할 뿐, 분포의 모양에 대해서는 어떠한 가정도 하지 않는다. 따라서 이런 경우에 아주 유용하다. 그러면 대칭성을 만족하지 못해 로버스트 순위 순서 검정도 하지 못할 때에는 어떻게 해야 할까? 적절한 변환을 통해 모양을 비슷하게 만들어주면 된다. 흔히 알려져 있는 대수적 변환 외에도 변환 함수를 커스터마이징하면 웬만한 분포는 대칭으로 만들 수 있다. 

 

 

코드 정리

##작업 디렉토리 지정
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$NP5_raw)
qqline(df_whtn$NP5_raw)
# 2) 히스토그램 그리기
hist(df_whtn$NP5_raw, prob=TRUE, breaks=20) #자세하게 보기 위해 breaks=20을 추가함
NP5_rawrange<-seq(min(df_whtn$NP5_raw),max(df_whtn$NP5_raw),length=max(max(df_whtn$NP5_raw)-min(df_whtn$NP5_raw),100))
ND<-dnorm(NP5_rawrange,mean=mean(df_whtn$NP5_raw),sd=sd(df_whtn$NP5_raw))
lines(NP5_rawrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_whtn$NP5_raw)

# 1) Q-Q plot 그리기
qqnorm(df_wohtn$NP5_raw)
qqline(df_wohtn$NP5_raw)
# 2) 히스토그램 그리기
hist(df_wohtn$NP5_raw, prob=TRUE, breaks=20) #자세하게 보기 위해 breaks=20을 추가함
NP5_rawrange<-seq(min(df_wohtn$NP5_raw),max(df_wohtn$NP5_raw),length=max(max(df_wohtn$NP5_raw)-min(df_wohtn$NP5_raw),100))
ND<-dnorm(NP5_rawrange,mean=mean(df_wohtn$NP5_raw),sd=sd(df_wohtn$NP5_raw))
lines(NP5_rawrange, ND, lwd=2)
# 3) Shapiro-Wilk test 시행하기
shapiro.test(df_wohtn$NP5_raw)

#필요 패키지 설치
install.packages("trend")
library("trend")

#로버스트 순위 순서 검정
rrod.test(df_whtn$NP5_raw, df_wohtn$NP5_raw)
rrod.test(NP5_raw~HTN, data=df)

 

[R] 로버스트 순위 순서 검정 (비모수 독립 표본 중앙값 검정: Robust rank order test, Flinger-Pollicello test) 정복 완료!

 

작성일: 2022.12.01.

최종 수정일: 2022.12.19.

이용 프로그램: R 4.2.2

RStudio v2022.07.2

RStudio 2022.07.2+576 "Spotted Wakerobin" Release

운영체제: Windows 10, Mac OS 12.6.1

반응형

+ Recent posts