기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

R 비모수적 검정(nonparametic test)

내용

비모수적 검정(nonparametic test)

t-검정 또는 ANOVA의 정규분포를 따르다는 등의 모수적 가정을 충족할 수 없는 경우 비모수적 접근 방식으로 전환할 수 있습니다. 예를 들어, 결과 변수가 본질적으로 심하게 치우치거나 순서가 있는 경우 Wilcoxon-Tesst과 같은 비모수적 검정 방법을 사용할 수 있습니다.

구분 모수검정(parametic Test) 비모수검정(nonparametic test)
가정 정규분포 (0)정규분포(x), 집단의 분포를 모름
통계량평균 (mean) 중앙값 (median)
1 sample 1 sample t-test 1 sample Wilcoxon signed rank test
2 samples 2 sample t-testWilcoxon rank sum test,
Mann-Whitney U-test
paired 2-sample t-test Wilcoxon signed rank test
more than
2 samples
one-way ANOVAKruskal-Wallis test

Wilcoxon test(두 그룹의 비교)

Wilcoxon 검정은 모집단의 데이터들이 정규분포를 따른다고 가정할 수 없거나 분포를 알수 없을 경우 중간값(median)의 유의성을 검정하기 위해 실시합니다. 또한 t-test의 짝비교와 같이 두 그룹의 중간값의 차이가 통계적으로 유의한가를 결정하기 위해 사용합니다. 이 비모수분석 방법이므로 t-test에 비해 전제 조건이 작지만 각 데이터의 독립성은 가정됩니다.

중심극한 정리에 의해 Wilcoxon test의 통계량 w는 정규분포에 부합한다고 가정할 수 있습니다. 이 가정은 통계량의 유의성 검정을 가능하게 합니다. 통계량 w는 평균이 0이고 샘플 크기 n을 기준으로 계산하는 분산은 n(n+1)(2n+1)/6이므로 귀무가설에서 제시한 중간값을 z score로 변환하여 확률을 계산할 수 있습니다. 이 검정의 귀무가설과 대립가설은 다음과 같습니다.

  • 귀무가설: median=a
  • 대립가설: median ≠ a

예를 들어 다음 데이터들의 중간값이 160이라는 귀무가설에 대한 Wilcoxon 검정을 실시합니다.

da<-c(176.9, 158.3, 152.1, 158.8, 172.4, 169.8, 159.7, 162.7, 156.6, 174.5, 184.4, 165.2, 147.8, 177.8, 160.1, 160.5 )
med<-160
  1. 각 값과 중간값과의 차이를 계산합니다.
  2. dif<-da-med; dif
    [1]  16.9  -1.7  -7.9  -1.2  12.4   9.8  -0.3   2.7  -3.4  14.5  24.4   5.2
    [13] -12.2  17.8   0.1   0.5
  3. dif의 절대값에 대한 순위를 결정하고 각값의 부호와 그 순위의 곱의 합을 계산합니다.
  4. difRank<-rank(abs(dif)); difRank
    [1] 14  5  9  4 12 10  2  6  7 13 16  8 11 15  1  3
    difSign<-sign(dif); difSign
    [1]  1 -1 -1 -1  1  1 -1  1 -1  1  1  1 -1  1  1  1
    w<-sum(difRank*difSign); w
    [1] 60
  5. w의 평균 0, 분산은 다음과 같습니다.
  6. n<-length(da)
    sigma<-sqrt(n*(n+1)*(2*n+1)/6); sigma
    [1] 38.67816
  7. z score 계산
  8. z<-(w-0)/sigma; z
    [1] 1.551263
  9. 양쪽검정을 기준으로 표준정규분포에서의 유의수준 0.05에서의 z0.05값은 1.96이며 신뢰구간은 [-1.96, 1.96]이 됩니다. 위에서 계산한 z은 이 구간내에 포함되므로 귀무가설을 기각할 수 없습니다.
  10. qnorm(1-0.025)
    [1] 1.959964
  11. p-value=2p(z>1.55)가 됩니다. 다음의 결과와 같이 p-value는 유의수준 0.05보다 크므로 역시 귀무가설을 기각할 수 없습니다.
  12. p<-2*(1-pnorm(z));p
    [1] 0.1208387

R에서 Wilcoxon test는 다음 함수를 사용합니다. 기본적으로(exact가 지정되지 않은 경우) 표본의 크기가 50개 미만이고 동률이 없는 경우 정확한 p-값이 계산됩니다. 그렇지 않으면 정규 근사가 사용됩니다. 샘플이 작으면 매우 높은 신뢰 구간 범위를 달성하지 못할 수 있습니다.

wilcox.test(x, y = NULL, alternative = c("two.sided", "less", "greater"), mu = 0, paired = FALSE, conf.int = FALSE, conf.level = 0.95, ...)
x, y: 변수이고 두 객체가 전달되면 paried 비교가 실시됩니다.
y~x: y는 수치형벡터, x는 2개의 group을 구분하기 위한 변수
두개의 그룹이 전달되고 paried=FALSE인 경우 Mann-Whitney test라고 합니다.

위 데이터 da에 대해 wilcox.test()함수를 적용하면 다음과 같습니다. 여러가지 원인에 의해 위에서 계산한 결과와 약간의 수치적 차이가 발생할 수 있습니다. 그러나 분석 결과는 같습니다.

wilcox.test(da, mu=160, conf.int=TRUE)
        Wilcoxon signed rank exact test

data:  da
V = 98, p-value = 0.1297
alternative hypothesis: true location is not equal to 160
95 percent confidence interval:
 159.0 170.5
sample estimates:
(pseudo)median
        164.85 

MASS 라이브러리의 데이터 UScrime의 변수 So, Prob에 대한 Mann-Whitney test를 적용합니다.

library(MASS)
with(UScrime, by(Prob, So, median))
So: 0
[1] 0.038201
------------------------------------------------------------
So: 1
[1] 0.055552
wilcox.test(Prob~So, data=UScrime)

        Wilcoxon rank sum exact test

data:  Prob by So
W = 81, p-value = 8.488e-05
alternative hypothesis: true location shift is not equal to 0

위 결과의 p값은 유의확률 0.01보다 작으므로 Prob(수감율)이 So 변수의 두 그룹(남부 주와 비남부 주)에서 동일하다는 가설을 기각할 수 있습니다.

Wilcoxon 부호 있는 순위 검정은 종속 표본 t-검정에 대한 비모수적 대안을 제공합니다. 그룹이 쌍을 이루고 정규성 가정이 타당하지 않은 상황에 적합합니다. 형식은 Mann-Whitney U 테스트와 동일하지만 paired=TRUE 옵션을 추가합니다. 데이터 셋 UScrime의 실업에 대한 두 변수 U1, U2에 대한 두 방법을 적용합니다.

sapply(UScrime[c("U1", "U2")], median)
U1 U2
92 34
Wilcoxon 부호 검정
with(UScrime, wilcox.test(U1, U2, paired=TRUE))
        Wilcoxon signed rank test with continuity correction

data:  U1 and U2
V = 1128, p-value = 2.464e-09
alternative hypothesis: true location shift is not equal to 0

경고메시지(들):
wilcox.test.default(U1, U2, paired = TRUE)에서:
  tie가 있어 정확한 p값을 계산할 수 없습니다
Mann-Whitney 검정
with(UScrime, wilcox.test(U1, U2))
        Wilcoxon rank sum test with continuity correction

data:  U1 and U2
W = 2209, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0

경고메시지(들):
wilcox.test.default(U1, U2)에서: tie가 있어 정확한 p값을 계산할 수 없습니다 
일반적으로 짝비교일 경우 Mann-Whitney 검정이 우선됩니다. 

3 그룹 이상의 비교

비교할 그룹이 2개 이상일 경우에는 모수적 접근 방식으로 분산분석(ANOVA)을 고려할 수 있지만 이 분석의 가정을 충족할 수 없는 경우 비모수적 접근 방식을 사용하여 그룹 차이를 평가할 수 있습니다. 그룹이 독립적인 경우 Kruskal-Wallis 테스트는 유용한 접근 방식을 제공합니다. 그룹간의 연관성이 존재하는 경우(예: 반복 측정 또는 무작위 블록 설계) Friedman 검정이 더 적합합니다.

Kruskal-Wallis 검정
kruskal.test(y~A, data)
y: 수치형 데이터, A: 두개이상의 수준(level)을 가진 변수
Friedman 검정
friedman.test(y~A|B, data)
y: 수치형 데이터, A: 그룹화 변수, B: 대응하는 관찰치들을 식별하는 블럭화 변수
두 경우 모두 data는 변수를 포함하는 행렬 또는 데이터 프레임입니다.
states<-as.data.frame(cbind(state.region, state.x77)) head(states, 1)
state.regionPopulationIncomeIlliteracyLife ExpMurderHS GradFrostArea
Alabama2361536242.169.0515.141.32050708
kruskal.test(Illiteracy~state.region, data=states)
        Kruskal-Wallis rank sum test

data:  Illiteracy by state.region
Kruskal-Wallis chi-squared = 22.672, df = 3, p-value = 4.726e-05

위 결과는 4개의 그룹간의 유의한 차이가 있음을 나타냅니다. 그러나 위 결과는 어느 그룹들간의 차이가 유의한지에 대한 답은 없습니다. 이러한 질문을 위한 평가는 Mann-Whitney의 두 그룹 검정으로 평가할 수 있습니다. 위와 같이 4개의 그룹이 존재하는 경우 Mann-Whitney 검정은 6번을 실시해야 합니다. pairwise.wilcox.test()함수를 각 그룹간의 p 값을 확인할 수 있습니다.

pairwise.wilcox.test(states$Illiteracy, states$state.region)
        Pairwise comparisons using Wilcoxon rank sum test with continuity correction

data:  states$Illiteracy and states$state.region

     1         2           3
2 0.012     -            -
3 0.054   8.1e-05   -
4 0.867   0.018      0.867

P value adjustment method: holm
경고메시지(들): 
1: wilcox.test.default(xi, xj, paired = paired, ...)에서:
  tie가 있어 정확한 p값을 계산할 수 없습니다 ...

그러나 다중비교 내에서 위와 같이 2그룹간의 비교를 사용하는 경우 Type I error(차이가 없는 상황에서 차이가 존재한다고 결정할 수 있는 에러)가 증가하는 위험을 가집니다. 대안으로 2개 이상의 그룹들에 대한 비모수 분석을 제공하는 nparcomp 패키지를 적용합니다. 이 패키지의 nparcomp() 함수는 kruscal.test()와 같은 식(formular)으로 데이터들을 전달합니다. 이 함수는 분석결과와 data에 대한 전반적인 사항들을 모두 반환하므로 summary()함수를 사용하여 그 결과를 요약하거나 다음과 같이 각 비교군의 p-value만을 출력할 수 있습니다.

library(nparcomp)
hoc<-nparcomp(Illiteracy~state.region, data=states)
attributes(hoc)
$names
[1] "Data.Info"   "Contrast"    "Analysis"    "Overall"     "input"
[6] "text.Output" "connames"    "AsyMethod"

$class
[1] "nparcomp"
hoc$Analysis
ComparisonEstimatorLowerUpperStatisticp.Value
1p( 1 , 2 )0.8750.5810.9723.092769810391840.0106956764325296
2p( 1 , 3 )0.190.0380.578-2.11248884256690.156276994260242
3p( 1 , 4 )0.3970.140.727-0.7673426147948120.925735874250196
4p( 2 , 3 )0.010.0010.113-4.695197185924383.32226687898007e-05
5p( 2 , 4 )0.1880.0510.496-2.598530583332930.0464818222669201
6p( 3 , 4 )0.5640.2670.8220.5221675249155480.985318332838074

위 결과는 그룹 2와 3 사이에 유의한 차이를 보이는 것을 알 수 있습니다.

댓글