비모수 통계학(nonparametric statistics)을 배우다 보면 번역을 한다면 순열을 이용한 평균비교(Permutation test for Means ) 라는 테스트가 있다. 이것은 사실 맨위트니 Rank Sum (순위합) 검정과 결국은 같은 테스트인데 이것을 SAS를 통해서 구현을 해보았다.
초기 데이타는 Mathematical Statistics and Data Analysis p464에 문제 29번을 대상으로 풀었다.

아래와 같이 두가지 방법에 따른 온도를 측정후에 전체 데이타에 순위를 아래와 같이 줬다.이때 집단 A, B의  각각 순위합을 비교하는 것이 맨위트니 검정법(Mann-Whitney test)이다.
퍼뮤테이이션 검정법은 아래  B집단의 데이타가 전체 21개중에 8개이다. 이것을 21개중 8개를 무작위로 뽑아 A, B 그룹의 평균 순위합의 차이를 계산한다. 즉 전체 뽑을 수 있는 가능한 수 21C8 개가 되는데 이때 가능한 수만큼 뽑아서 뽑힌 8개의 평균순위합과 나머지 13개의 평균 순위합의 차이를 그래프로 그린다.
그렇게 하면 처음에 아래 표에서 얻은 두 집단간의 순위합 평균이 어디에 떨어지는지 알 수 있다. 즉 이것을 바탕으로 P_value를 계산할 수 있다.  이것이 바로 퍼뮤테이션 테스트인데 여기서는 1000개만뽑았다. 왜냐면 실제 21C8은 근사적으로 200,000 정도에 육박하는데 1000개 정도만으로 충분히 가능하기 때문이다.

A 7.5 19 11.5 19 15.5 15.5 19 4.5 21 15.5 11.5 9 11.5
B 11.5 1 7.5 4.5 4.5 15.5 2 4.5          

Diff= Mean of group A - Mean of group B = 13.8 - 6.37 =7.43
아래 그래프에서 7.43은 전체 1천개중에서 997번째 큰 값으로 이보다 큰 값이 겨우 3개정도 존재한다. 따라서  
따라서 p_value = 3/1000 =0.003 으로 귀무가설을 기각한다.

아래 히스토그램은 1000개를 뽑아서 그룹간의 평균차를 계산하여 그린 히스토그램이다.
이것을 보면 어디에 위치하는지 알 수 있다.




SAS 프로그램

data kkk1;/* 초기 데이타 입력 */
input method $ value @@;
cards;

A 7.5 A 19 A 11.5 A 19 A 15.5 A 15.5 A 19 A 4.5 A 21 A 15.5 A 11.5 A 9 A 11.5 B 11.5 B 1 B 7.5 B 4.5 B 4.5 B 15.5 B 2 B 4.5 ;run;

%macro bootst;/*매크로 bootst를 생성하는 과정이다*/

%do k=1 %to 1000;/*k변수에 대해서 1부터 1000까지 반복하라는 명령어이다 */

data sample;

set kkk1;

rand= ranuni(&k)*21;/* 0 에서 1 까지 uniform 난수를 발생시킨다음 21를 곱하면 0에서 21까지의 난수가 된다 */

run;

proc rank data=sample out=ppp ;/* 생성된 난수에 순위를 준다 */

var rand;

ranks rank;run;/* 순위는 데이타셋 ppp에  rank라는 변수명으로 하라는 의미이다 */

data ppp;

set ppp;

if rank<= 8 then group='A';else group='B';run;

proc sql ;

create table aaa as

select a.group, avg(a.value) as barX from ppp a group by a.group;

quit;

/* 트랜스포즈 명령어는 아주 유용하다. 데이타값이 실제로 group이라는 변수에 A, B가 들어 있는데 이 두그룹간의 차이를 구하려면 이들이 변수명으로 바꿔야 하는데 이때 이것을 쓰면 아주 유용하다. 여기서 그룹명을 변수로 바꾸고 이때 값을 barX로 하라는 것이 이 문장이다*/

proc transpose data= aaa out=mmm;
var barX;ID group;run;

data ddd;

set ddd mmm; /* 여기서 초기 데이타 ddd는 미리 만들었다. 물론 프로그램에서는 표현을 하지 않았고. 그런다음 위에서 생성된 mmm데이타셋을 계속 머지해가는 것이다. 결국 1000번을 돌면 1001개의 데이타 라인이 생기게 된다.ddd에 말이다. */

run;

%end ;/*Do문을 여기서 멈추라는 명령어이다 */

%mend bootst ;/* 매크로를 닫아주는 명령어*/

%bootst ;/* 매크로를 실행하라는 명령어인데 결국 1000개번의 과정을 반복할 것이다. */

data ddd;

set ddd;

diff=A-B;

run;

proc univariate data=ddd;

var diff;

histogram diff /kernel;run;/* 히스토그램을 그리기 위해서 이 명령어를 사용하였다*/


참고로 만약 t검정 혹은 비모수 검정(윌콕슨 부호순위검정)을 하고 싶다면 SAS에서 다음과 같은 명령어를 사용하면 된다.

PROC NPAR1WAY data=kkk1;class method;var value;run;

proc ttest data=kkk1 ;class method;var value;run;

Posted by wishart
,