Monday, December 29, 2008

I'm not a scientist, I'm a number!

plos comput. perspective :http://www.ploscompbiol.org/article/info%3Adoi%2F10.1371%2Fjournal.pcbi.1000247

Ten simple rules series를 쓰던 Phillip bourne이
Perspective article을 하나 썼다. 이 글 제목이
바로 그 글의 제목인데,

이 글에선 일종의 과학자 '평가' 시스템을
openID 를 통해 기존의 논문에 국한하지
않고 전 'web' 활동 범위로 확대하자는
idea를 설명하고 있다.

과학자 impact factor =
H factor ( 기존의 paper based impact factor)
+ ( #{Grant/Review editor}/20 )
+ ( #{Annotation/software/Dataset}/5 )
+ ( # Web factor /50 )

과 같은 수식을 사용하여 블로그 글에 달린
답글이 50이 넘을 때 마다 1씩 researcher factor
를 주고, 논문 에디터도 20번 이상이면 1씩,
소프트웨어나 데이터셋 public 에 공개 등도
5회 이상이면 1씩 이 팩터를 증가시키는
방식으로 과학자의 전방위 활동에 대한
scoring을 할 수 있다는 것이다.

이런 식의 web-based author , paper,
software, dataset 등에 대한 파급효과
scoring은 필요에 따라 우리도 다양하게
시도해 볼 수 있는 것 같다.

최근에 나도 GEO에 있는 micorarray
dataset에 대한 impact size scoring
을 google scholar를 이용해 시도한
적이 있다. 데이터셋이 얼마나 커뮤니티에
파급효과가 있었는지를 그 데이터를
쓴 논문에 대한 citation, cite한 논문에
대한 citation, ... 로 citation의 propagation
을 쭉 따라가며 scoring을 할려고 했는데,

google scholar가 web scrapping robot
program에 대해 접근을 차단하는 정책을
써서 개발을 중단한 상태다.

이 문제를 해결할 수 있는 아이디어가 있는 분들의
답글 기대하면 좋겠는데,내 블로그를 구독하는

사람이 거의 없어서 ㅜㅜ

Remove nonword character

Lperl에서 non-word character를 regexp에서 지정하려면
\W 를 쓰면 된다.

parkinson's disease 라는 문자열에서 's를 제거한다면


$line='parkinson's disease';
$line=~s/\Ws//;


와 같이 쓸 수 있다.

그러나 윈도우 시스템에서 특수 문자로 지정된 " ' " 는 하나의
위의 정규식으로 처리되지 않는다.

대신

$line=~s/\W+s//;


를 써야 제대로 동작한다. 윈도우 특수 문자의 경우 non-word character가
리눅스 시스템에서 하나 이상의 character로 표현되는 경우가 많기 때문이다.

오늘 맞부닥친 특수 문자의 경우 3개의 문자로 구성되어 있었다.
이것 때문에 삽질을 장시간 ㅜㅜ

Tuesday, December 23, 2008

Mirroring files via FTP

대용량 데이터베이스를 다운 받고, Up-to-date 로 유지하기 위해서 Database mirroring이 필요하다.

이때, lftp를 쓰면 간편하게 작업을 수행할 수 있다.

예로, NCBI의 GEO DB 중 SeriesMatrix 폴더 하의 파일들을 mirroring하고 싶으면


>lftp ftp.ncbi.nlm.nih.gov/pub/geo/DATA/SeriesMatrix
>mirror

Thursday, December 18, 2008

Mapping Ensembl to external

Bio data들 간의 Cross-mapping 은 어떤 데이터를 다루든 맨처음 해결해야 하는 문제로, 때때로 골머리를 썩히곤 한다.
Ensembl의 경우 Ensembl 고유의 gene, protein 에 대한 ID를 extermal bio database 들과 mapping 시켜주는 서비스를
Biomart라는 툴을 통해 제공하고 있다.

Biomart at Ensembl : http://www.ensembl.org/biomart

사용법은 위의 url 에 연결된 biomart 홈페이지에 가서 원하는 ensembl genome data와 필요한 external database를
선택하고, 결과 파일을 다운 받으면 된다.

Tuesday, December 16, 2008

Pairwise gene-gene co-expression 계산 시간 단축

몇일전 Affymetrix chip 의 모든 probeset vs. probeset correlation coefficient 계산을 CPAN 모듈을 이용해서 수행했다. 계산량이 45001*45000/2 , 10억 번이 넘는 어마어마한 양이라 지레 짐작으로 꾀나 걸리겠구나 하고 그냥 두었는데 하루가 지나서 보니 2.2GB 용량에 기껏 몇천만개 정도만 계산이 된 상태. 썅.

부랴부랴 계산 시간을 점검해 봤더니 하나당 0.003초 정도.
전체 계산 횟수 45001*45000/2 곱하기 0.003 초. 이걸 다시 3600초로 나눠 몇시간이나 드는가를 계산해 보면 843.7687 시간, 35일은 더 돌려야 하는 엄청난 계산 시간!

CPAN 모듈을 쓴 경우 probeset pair에 대한 correlation 계산이 각각에 대한 standard deviation을 매번 계산하기 때문에, 중복된 계산이 어마어마하다. 그래서 먼저 각 probeset 의 expression data를 z-score로 transform 했다. z-score transform 된 경우 두 probeset의 z-score transformed expression vector를 곱해서 더해주기면 하면 correlation coefficient가 되기 때문에 계산량이 대폭 줄어든다. (포스팅 참조)



## Correlation function 이용한 경우

correlation(\@pair1,\@pair2 );

sub correlation{
my $i=shift;
my $j=shift;
my $sd1=standardize($i);
my $sd2=standardize($j);
my $cor;
$cor+=$sd1->[$_]*$sd2->[$_] for 0..$#$sd1;
$cor/=$#$sd1;
return $cor;
}

## 먼저 z-score transform 한 경우

$cor+=$pair1[$_]*$pair2[$_] for 0..$#pair1;
$cor/=$#pair1;





이렇게 한 결과 하나당 계산 시간이 0.0001초로, 약 30배로 계산 속도가 빨라졌다.
이렇게 해도 전체 셋에 대한 계산은 44시간이 걸리긴 한다만...

Tuesday, December 2, 2008

[CPAN] WWW::Search::PubMed, Affiliation 출력 기능 추가

WWW::Search::PubMed 는 기본적으로 Abstract, pmid, date, day, month, year
의 6개 분류에 대해 search result를 출력할 수 있게 구현되었다.

상황에 따라 author 나 저자의 affiliation 에 대한 정보가 필요한 경우가 있는데,
이를 위해선 WWW::Search::PubMed 모듈과 WWW::Search::PubMedResult 모듈에
몇 줄을 더 넣어 주면 간단하게 기능을 추가할 수 있다.

Affiliation 결과 출력 기능 추가는 아래와 같다

WWW::Search::PubMed 모듈

..
my $abstract = $self ... // 이 라인 근처에 아래 라인을 넣으면 된다
my $affiliation = $self->get_text_node($article,'Affiliation');

..
$hit->.. // $hit 으로 시작되는 라인들이 모여 있는 곳에 아래 라인을 추가한다.
$hit->affiliation($affiliation);
..



WWW::Search::PubMed::Result 모듈

..
sub affiliation { return shift->_elem('affiliation',@_); } // Affiliation 정보를 얻는 함수
..



** Search result 개수 제한 문제
WWW::Search 모듈에서는 maximum_to_retrieve 옵션으로 result개수를 지정할 수 있다. default는 500개.
WWW::Search를 베이스로 하고 있는 Pubmed 모듈도 이를 사용할 수 있는데, 여기서 500개 이상을 지정할 수 없게 되어 있다. 이는 pubmed 모듈 안의 search 옵션이 default로 500으로 지정되어 있고, 이는 maximum_to_retrieve로 선택할 수 있는 변수가 아니기 때문에 발생하는 문제다. 이 문제 해결을 위해서는 이 값을 적당히 큰 값으로 바꾸면 된다.


my constant QUERY_ARTICLE_LIST_URI => 'http://eutils.ncbi.nlm.nih. .. .fcgi?db=pubmed&retmax=500'; // 500을 적당히 큰 수로 바꾼다