Saturday, June 20, 2009

Random permutation generator

Bioinformatics 분야에서 널리 쓰이는 통계적 테스트 방법으로 Permutation test가 있다.

샘플 숫자가 통계적 테스트를 할 만큼 크지 않은 경우, 주어진 샘플을 permutation 하여
인공적으로 샘플 숫자를 늘려, 전체 population 을 통계적 테스트가 가능한 크기만큼 키운 후,
원래의 주어진 샘플에 대한 수치 ( e.g. mean, standard deviation , etc ) 가 전체 셋과 비교하여
얼마나 유의한지 ( significant ) 테스트 하는 방식이다.

permutation 할 수 있는 개수는 원래의 샘플의 개수에 따라 이미 정해져 있지만, 샘플 개수가
10개만 넘어가도 가능한 전체 숫자 만큼의 permutation set을 모두 고려하기 힘들다. 따라서
permutation set의 generation은 random 하게 통계 테스트가 가능할 만큼만 하면 충분하다.
보통 그 숫자는 1000개, 10,000 개 정도다.

최근 이 Permutation test 를 코딩해야할 일이 있어 코딩하던 중, CPAN의 random permutation
generator를 써봤는데, 이 모듈 사용이 직관적이지 않고, 쓸데없는 정보를 덧붙여 클래스 형태로 데이터를 format해야 해서 쓰기가 번거롭다.

그래서 random permutation 모듈을 하나 만들어봤다. 그냥 간단한 서브루틴 하나다.



sub rand_permutation{
my @array=@_;
my @permuted_array;

while( @array ){
my $rand_pos=int(rand(@array));
push @permuted_array, $array[$rand_pos];
delete $array[$rand_pos];
@array=grep /\w/, @array;
}
return @permuted_array;

}

1,2,3,4,5 로 구성된 어레이를 넘기면 서브루틴이 random 하게 이 순서를 뒤섞어 준다.
그래서 결과로는 5,1,3,2,4 와 같이 random하게 permutation 된 셋을 리턴한다.