Friday, March 27, 2009

Symbolic reference 사용시 유의점


$x=10;
$sym='x';
$$sym=20;

print "$x\n";



위의 코드를 실행하면 $x 값으로 20이 출력되는 것을 확인할 수 있다.
Symbolic reference 가 적용되어 $sym = 'x'에 대해
$ { $sym } = $ { x} = $x 로 해석되어
$$sym=20 은 $x=20과 같이 해석되기 때문이다.

그럼 아래 코드는 어떨까?


my $x=10;
my $sym='x';
$$sym=20;

print "$x\n";


첫번째 코드의 결과와 같은 값이 출력될까?
정답은 NO!
이 코드는 그대로 $x에 대해 첫 라인의 정의대로 10이 출력된다.

해답은 'my' 과 symbolic reference의 동작 원리에 담겨있다.
my로 선언된 lexical 변수는 symbol table에 저장되지 않는다.
symbolic reference는 오직 lexical 변수를 제외한 package 변수에만 적용된다.


따라서 두번째 코드에서 변수 선언을 my 대신 local이나 our로 해주면 첫번째 코드와 같은 결과를 얻을 수 있다.


my $x=10;
$sym='x';
$$sym=20;

prnt "$x\n";


이 코드는 어떨까?
$$sym = ${x}= $x 로 해석되어 최종적으로 symbolic reference
의 적용을 받는 변수는 $x다. 그런데 $x가 my 로 선언되어 있어
symbol table에 저장되어 있지 않다.

따라서 $$sym=20 은 lexical 영역의 $x에 영향을 주지 못하고
이 코드는 결과적으로 $x=10 을 출력하게 된다.

그렇다면 $$sym=20 는 완전히 아무런 의미도 없는 코드일까?

그렇지 않다. $$sym 은 원래의 역할 그대로의 역할을 수행했다.
즉, symbol table에 존재하는 package global $x 에 20을
저장한 것이다.

이를 확인하기 위해서는 package 변수 $x를 출력해 보면 된다.


my $x=10;
$sym='x';
$$sym=20;

print "Lexical 변수 : $x \n"; # 10을 출력
print "Package 변수 : $::x \n "; # 20을 출력

Wednesday, March 18, 2009

BioTool::NCBIfetch

Nowadays, I've tried to build my own perl pacakges selections on routine bioinformatics tasks.
Althrough BioPerl is already out there, it usually doesn't have modules for my own purpose.
For example, a package for learning PAML packages from A to Z, not requiring specific formatting to run the BioPerl. Well, so I started to build my own perl packages.

I named the base package name 'BioTool' and added packages whenever I confronted any situation
that I found some tasks might be used repeatly and routinely.

Recenlty, I made 'BioTool::NCBIfetch' package, which can extract sequences and all the related references db information including Gene symbol, Gene description, Chromosome location, Ensembl, Unigene, Uniprot, KEGG and GO for a given gene query.

Since the package fetches the information from result of NCBI eutils query, which results with up-to-date information, the analysis result for a given gene is up-to-dated. So users don't need to worried about whether the reference data is out-dated when they use a program which works the same taks based on localized data. In short, users could free themselves from updating all related indenpent databases day to day.

I'll show some example usage of this package


use BioTool::NCBIfetch;
my $ncbi=BioTool::NCBIfetch->new;
$fetch->set_query(gene,780,xml); # Input : search DB, ID(geneID, gID), result type, result format type)

$fetch->get_result;
my $symbol=$fetch->get_symbol;
my @TreEMBL=$fetch->get_uniprotTreEMBL;

print "$symbol\t@TreEMBL\n";



This package might be very helpful for ones who want to cross mapping between major biology databases based on NCBI gene identifier. I actually made it for cross-mapping genes in GEO platform since GEO platform annotation is frequently incomplete and inaccurate.

If anyone interests in this pacakge and want to use, request!

Tuesday, March 10, 2009

Economic crisis & public data deposition in GEO

Does stunning global economic crisis starting from the late 2007 influence each gorvernment to cut down the budget for scientific research? If you're an independent researcher, you've already experienced how serious it is. If you are not, you don't know the actual influence of it on science research.

Starting with just interest, I tried to answer to above question by analyze the trend of data deposition to the largest public gene expression database, GEO. Since the number of gene expression data deposition has been increasing from the creation of GEO, I hypothesize that the data deposition might be not continuously increasing in year 2008 if the global economic crisis was really a matter for cutting down the budget for the science research.




Look at the table above! The number of data deposition to GEO in 2008 is slightly decreased as I expected. The number of data deposition has continuously increased from 2001 through 2007 but this trend stop in the year 2008.



This trend is repeately found for the top 5 countries of budget for science. By the way, USA is really a huge player in the basic science. Look at the size of data! US itself deposited several fold more data than the sum of all the data the other four countries deposited. Anyhow, back to the main point, I think this trend represent the effect of economic crisis on shirinking science budget in each gorvernment.




Except the USA from the chart, another interesting point shows up. That's UK. Deposition of data from UK was decreased from 2007 not 2008. Their contribution to public data was peak in 2006 but the number is less than a half in 2007. What happened in UK at that time? I don't have any evidence on this matter. Just I expect that UK changed their research plan for biology using microarray since microarray generally lack reproducibility and consistency. Or there might be some big scientific project to producing microarray data in 2006 only.

Among the 5 countries I mentioned here, Germany showed least decreasing nubmer of deposited
data. They deposited only 21 data set less compared to previous year ( 14% ) while the other four countries decreased that number around 50%.

The small contributing countries with less than 50 deposition in each year, some countries seem that they are not affected by economic crisis. South Korea is one of the exam. Their deposition increased from 16 in 2007 to 19 in 2008. As I'm researching in Korea, I think it's not because Korean gorvernment did not cut budget for science but most of researchers who producing microarray data don't know GEO at all or don't consider to deposit their data. Why? most of them are just wet-lab biologist. So they usually don't use public data for their own resarch. Even when they want to contribute, depositing data to GEO needs some computational skills for easy or automatic depositing. Without any programming skill, the process to deposit the data is very tedious and boring. So three more data sets of deposited data does not show the actual trend of Korean science budget related to economic crisis. I think the minor contributing countries might have similar situation.

That's all I want to say today! In one sentence, global economic crisis seems actually to force each gorvenment to cut their science budget.

Sunday, February 15, 2009

String split problem

스트링에 아래와 같은 문자열이 저장되어 있다고 할 때,

my $string=q/ man , girl, woman, boy, "man,woman", "girl,boy"/ ;

콤마(,) 를 기준으로 각 단어를 나눌려면 어떻게 해야할까?
이때, 따옴표(")로 묶여있는 단어 사이의 콤마는 무시 한다.

나누어
@result=( 'man', 'girl', 'woman', 'boy', 'man,woman', 'girl,boy' )
6개의 element로 저장하는 것이 최종 목표.

내 답은 아래와 같다. 더 깔끔하고, 간결한 코드가 있겠지?

my @result;
map { /"/?push @result,$_:push @result, split /,/,$_ } split /(".*?")/, $string;

Wednesday, February 4, 2009

Lookaround in PERL

'Lookaround' , a regular expression in perl, could be used as anchor in regular expression. The anchor which I mean here is a point in the string from which the perl scan for a given regular expression.

Examples of anchor in perl.



'great job boy'=~/^g/; # '^' is used to anchor
'great job boy'=~/y$/; # '$' is used to anchor


Alike the anchors above exam code, lookaround could be used similary as below



'great job boy'=~/(?=job).*boy/; # (?=pattern) is a form of positive lookaround
'great job boy'=~/(?!job).*boy/; # ( ?!pattern) is a form of negative lookaround


So how the above example lookaroud code works?

(?=job) anchors the position of match at 'j' of job.

In other words, perl scan the whole string 'great job boy' first, but after lookaround matches, perl start to search for remaining 'job boy'.

Then regular expression below matches or not?



'great job boy'=~/(?=job)boy/ ;


The answer is NO!!!

As I mentioned above, lookaround is working as anchor like '^'.
So (?=job) anchors at the position of j of 'job'. The first character
that could be matched after anchoring is j of 'job, not b of 'boy' which
is following job. Therefore, it doesn't match!

To make 'boy' match after anchoring (?=job), it need to be as below



'great job boy'=~/(?=job).*boy/;


What about negative lookaround? It's more complicated to understand.

Guess what happens below.



'YouAre'=~/(?!You)Are/;
Does it matches? It matches! Why it matches?
'You' comes before 'Are'. To regular expression success,
string before 'Are' should not be 'You'.

Then what on earth (?!You) anchor?
It should anchor where there's no 'You'.
Then it may be position 'o' or 'u' which does not match to 'You'.

Yes it is.
Then what is before 'Are' , which doesn't match to 'You'?
'u' can be! Therfore the above regular expression including negative lookaround success.


We can verify where negative lookaround anchors with some exams below


print "$`\t$'\n" if 'YouAre'=~/(?!You)/;
# Y ouAre

print "$`\t$'\n" if 'YouAre'=~/(?!You)e/;
# YouAr e

'YouAre'=~/You(?!Are)/;
# it doesn't match

Microsoft scripting game 2009

aero님의 블로그를 통해 지난해 microsoft에서 scripting game을
계최하고 있었다는 걸 알게 되었었다. 당시 이를 접한 시점에서 이미
Competetion이 끝나있어 아쉬워서, 다음 대회를 기다리고 있었는데
2009년에는 매년 2월 계최되던 winter game 에서 Summer game으로
변경되어 계최될 예정이라고 한다.

지난해 출제된 문제의 경우 굉장히 평이한 편이었는데, 올해는 좀 더 advance된
문제들이 출제될지 궁금하다. 올핸 꼭 참가하고 끝까지 문제를 풀어서
MS에서 기념품 한번 받아봐야겠다

Microsoft webpage for scripters: http://www.microsoft.com/technet/scriptcenter/default.mspx

Friday, January 16, 2009

경제력과 행복의 상관관계

" 국민총행복은 국민총생산보다 더 중요하다."

지그메 상예 왕추크 부탄 국왕이 했던 말이라고 한다.

석유 개발로 부국이 된 국가 브루나이는 이 부를 국민들의 행복도 향상을 위해 쏟아부었다고 한다. 전국민을 대상으로 마치 공무원에게 월급 주듯 월급을 주고, 언제든지 들어와서 살 수 있는 초현대식 집을 지어주고, 외부가 금으로 도금된 7성 호텔을 짓고, 저렴한 가격에 이용할 수 있는 항공사를 운영한다. 이러한 국가의 노력이 브루나이 국민들의 행복도를 이전에 비해 높여주었을까?


잘 사는 나라일수록 행복할까? 만약 그렇다면, 행복하기 위해선 얼마나 더 부강해져야 할까? 풍요롭게 잘 사는 나라도 불행한 국가일 수 있고, 반대로 경제적으로 힘든 국가라도 행복한 국가인 경우도 있다고 하던데, 과연 국가의 경제력과 행복도는 구체적으로 어떤 상관관계를 가지고 있을까?

이에 대한 궁금증을 구체적으로 해소해 보고자, 국가 행복도와 국가의 경제력에 대한 객관적인 데이터를 이용해 분석해 보았다. 국가 행복도는 World Database of Happiness ( http://worlddatabaseofhappiness.eur.nl/ )의 국가 평균 행복도 자료를 이용하였고, 국가의 경제력은 국가 전체의 경제력 보다는 한 국가에 속한 개인의 경제력이 개인의 행복에 실질적인 영향을 준다고 생각하여 개인당 GNI 지수 (GNI per capia, http://web.worldbank.org ) 를 이용하였다. ( 국가 평균 행복도는 2000년 부터 2008년 까지 해당 국가에서 시행된 행복도 조사의 평균 행복도이고, 개인당 GNI 지수는 2007년 기준 자료 )


개인당 소득과 국가 행복도의 상관관계

개인당 소득 ( GNI per capia ) 와 국가의 평균 행복도 ( 개인의 행복도 총 합 / 조사 대상 국민수 ) 의 관계도를 그려보면 ( 그림 1) , 국가의 개인당 소득이 증가할수록 평균 행복도도 증가하는 경향이 있음을 확인할 수 있다. Pearson 상관계수 값도 0.67로 두 변수 간에 유의한 상관관계가 있음을 증명한다. 그래프를 보면 이러한 경향성이 개인당 국민소득 2만 불이 넘어가는 시점에서도 계속적으로 존재하고 있는 것을 알 수 있다. 행복한 국가가 되기위해선 결국 더 잘 사는 국가가 되는 수밖에 없는걸까? 국민 소득 2만불 언저리에서 헤메고 있는 대한민국 국민이 그리 행복하지 못하다고 느끼는 건 당연한 것이었을까?



그림 1. 개인당 국민 소득과 국가 평균 행복도의 관계 그래프



얼마나 잘 살아야 하나?

개인당 국민소득의 증가가 더 이상 국가의 행복도를 높여주지 못하는 시점은 대체 언제일까? 대체 얼마나 잘 살아야 국가의 행복도가 '돈'의 영향력에서 독립적인 요소가 될 수 있을까?

그림 2는 특정 개인당 국민 소득 이상의 국가들에 대한 행복도와 개인소득의 상관관계를 나타낸 그래프다. X 축의 개인당 국민 소득이 증가함에 따라 대상 국가들은 특정 개인당 국민 소득 이상의 부자 국가들로 점점 한정되는데, 이에 따라 행복도와의 상관계수가 급격히 낮아지는 시점은 개인당 국민소득이 30,000$ 되는 지점에 가깝다.






그림 2. 특정한 개인당 국민 소득에 이상을
나타내는 국가에 대한 행복도와
개인당 국민 소득과의 상관관계.
X 축의 30,000$에 해당하는 Y 축은 개인당
국민소득 30,000$ 이상의 국가들에 대한
국민소득과 행복도의 상관관계를 의미한다.

전체 조사 대상국을 국민소득을 10,000$ 단위로 나누어 분류하고 각 구간별 행복도와 개인소득의 상관관계를 보면 ( 그림 3) , 0$에서 10,000$ 그룹에 속한 국가들에서 상관관계가 가장 높았고, 그 다음으로 높은 상관관계를 보여준 구간이 30,000$~40,000$ 구간에 속한 국가들이다. 그림 2와 3에서 공통적으로 개인당 국민소득 40,000$ 가 넘는 국가들에서는 더 이상 개인당 국민소득이 행복도에 영향을 미치지 못하고 있음을 확인할 수 있다.

소득 수준에 따라 가장 행복도가 상승한 0~10,000$ 그룹을 생각해 보면, 이 단계의 소득 수준을 보이는 국가들은 소득 수준에 따라 생명에 직결되는 의식주의 만족도가 크게 차이가 나기 때문에, 행복과 경제력의 관계가 가장 밀접하게 나타나지 않나 생각된다. 이 이상의 그룹에서 경제력의 차이는 의식주의 문제와는 직접적으로 관련이 없어, 각 국가의 문화적 배경과 정치적 안정도 등에 따라 행복도가 더 크게 영향을 받지 않나 짐작해 본다.


그림 3. 개인당 국민 소득 구간별 행복도와의 상관관계.
X축 값은 구간 시작값. 0$ 인 경우 0$에서
10,000$ 까지 구간의 상관계수를 의미한다.


못살아도 행복한 국가, 잘 살지만 불행한 국가

개인당 국민소득 순위와 행복도 순위의 차를 구해 다시 순위를 매겨서 소득 순위가 높지만 행복도가 낮은 나라와 소득 순위가 낮지만 행복한 국가를 분류해 보았다.

소득 순위보다 행복도 순위가 월등히 높은 상위 국가들을 살펴보면 나이지리아, 베트남, 콜롬비아, 우즈벡스탄, 콴타나모, 라오스, 인도네시아, 엘살바도르 등 소득 순위 100위권, 실제 개인당 국민소득이 수천달러에 불과한 나라들이 이름을 올리고 있다. 이 중에 행복도 순위가 가장 높은 국가는 콜롬비아로 행복도는 4위, 소득순위는 97위를 기록하고 있다. 소득 순위가 60위 이내이면서 상위에 랭크된 국가로는 멕시코가 행복도 5위, 소득순위 58위로 못살아도 행복한 국가 25위에 랭크되었다. ( 그림 4)

그림 4. 행복도 순위가 국민소득 순위 보다 높은 상위 30개 국가.


반대로 소득순위에 비해 행복도가 낮은 국가들의 순위를 살펴보면, 리투아니아, 불가리아, 라트비아, 마케도니아, 헝가리, 러시아, 보츠나와 등이 상위에 이름을 올리고 있고, 한국 ( 소득 순위 38위, 행복도 순위 68위 )은 전체 대상국 130개국 중, 12 번째로 소득 순위에 비해 행복도가 낮은 국가에 이름을 올렸다. 이 순위에서 아시아의 부국들 홍콩( 소득순위 29위, 행복순위 63위), 쿠웨이트 ( 소득 26위, 행복 39위 ), 싱가폴(소득 28위, 행복 37위 ),일본 ( 소득 24위, 행복 49위) 이 30위 안에 랭크되어 있는 것이 눈에 띈다. 특히나 행복도 조사가 이루어지지 않아 조사 대상에서 제외된 대만을 제외한 동아시아 경제 4룡 한국, 홍콩, 싱가폴과 아시아 최대 경제대국 일본이 모두 포함되어 있다는 점이 흥미롭다. 소득 수준에 비해 행복한 국가들 모두 소득 순위 100위권의 빈국들이었던데 반해, 소득 수준에 비해 불행한 국가들의 많은 수가 개인당 국민소득 10,000$ 이상의 비교적으로 경제적으로 안정된 국가들이 많다는 것이 특징적이다. 지역별로 보면 정치적으로 불안한 동구권 유럽 국가들, 문화적으로 개인적 가치보다 집단의 가치가 중시되는 아시아 국가들이 특징적으로 분포하고, 세계 폐권 국가를 자처하는 미국도 27위에 올라 있다. ( 그림 5)

그림 5. 행복도가 국민소득 순위보다 낮은 상위 30개 국가



돈이 먼저냐? 행복이 먼저냐? 좀 더 행복해 지기 위해서...

행복도 순위 상위 30개국의 평균 개인 소득은 30,859$ 로 행복도 하위 30개국의 평균 개인 소득 1,445$ 에 비해 21배나 많다. 동시에 30 행복 국가 중 개인당 국민소득이 10,000$가 안 되는 국가도 9개나 존재한다. 콜롬비아 ( 3,250$ ) 나 엘살바도르 ( 2,850$) 과테말라(2,440$) 베트남 ( 790$) 처럼 국민 소득이 턱없이 낮아도 행복한 국가들이 존재하고 있는 것이다.

행복도 순위 하위 30개국 중 소득 1,000$가 넘는 국가는 12개국이고, 10,000$가 넘는 국가는 존재하지 않는다 ( 이 중, 소득이 가장 높은 나라는 리투아니아로 9,920$). 나머지 18개국의 평균 개인당 국민소득은 379$ 이고, 가장 소득이 낮은 브룬디는 110$ 밖에 되지 않는다. ( 그래도 브룬디는 행복도 하위 30개국 중 가장 소득이 높은 리투아니아보다 행복도가 두단계나 높다. )

전체적인 경향성을 보면, 경제력이 일정 수준이 일정 수준 이하가 되면 행복한 국가가 되는 것이 힘들다. 경제력이 좋으면 좋을수록 행복도도 높은 경향성이 있고 이런 경향성은 국민소득 30,000$이 넘어가는 상태까지 지속되지만, 40,000$가 넘어서는 이런 경향성이 사라진다.

그러나 앞서 살펴보았듯, 경제력이 높다고 무조건 행복한 국가가 되는 것은 아니다. 동아시아 경제 부국인 일본, 홍콩, 싱가폴, 한국이 모두 경제력에 비해 행복도가 낮은 것은 결코 우연이 아니다. 개인의 행복은 개인의 가치를 중시하는 문화 안에서, 개개인의 의지로 창의력을 마음껏 발휘하며 스스로의 가치를 쌓아나갈 때 높아지게 된다. 유교 문화권에서 개인의 가치보다 집단의 가치를 중시하고 개인의 욕구를 억누르고 남의 시선을 신경쓰는 삶의 행태를 어릴 때 부터 교육받아온 동아시아 부국의 국민들이 경제적으론 풍요롭지만 상대적으로 불행한 이유가 아닐까?

같은 맥락에서 공산주의의 전체주의적 문화와 삶의 방식이 몸에 벤 동유럽 국가 국민들의 낮은 행복도도 설명될 수 있으리라 생각한다.

결론적으로 국가의 경제력( 국민당 개인소득 기준) 은 국가의 행복도를 가늠할 수 있는 잣대가 될 수 있으며, 경제력과 행복도의 상관관계는 의식주 문제가 해결된 단계 이상에서도 유지될 만큼 한 국가의 행복도와 밀접한 관련성이 있다.

경제력이 높은 국가일수록 상대적으로 국민의 복지 수준이 높고, 사회적 안전망이 잘 발달해 있고, 또한 사회적 약자들의 행복도 수준을 높여줄 수 있는 각종 장치들이 마련되어 있을 가능성이 높다는 점 등을 감안하면 이러한 경제력과 행복도의 높은 상관관계가 이해될 수 있으리라 생각한다.

동시에 국민 개개인이 스스로의 삶에 만족하며 행복하게 살 수 있는 개인의 가치를 중시하고 존중하는 사회, 문화, 정치적 변화가 경제 발전과 더불어 진행되어야 그에 걸맞는 행복한 국가로 발전해 나갈 수 있을 거라 생각한다.

개인적으로 한국을 생각할 땐 항상 무언가 답답한 마음이 들고, 행복하게 살기 힘든 나라라는 느낌을 받는다. 대부분의 사람들이 스스로의 의지와 가치 보다는 남들의 시선, 기대, 평가에 의해 스스로의 삶을 평가하고 수정해 나가고, 계획하며 살아가고 있기 때문이다. 나도 내 주변의 사람들 ( 부모, 친구, 동료 등) 에 의해 그러한 압력을 받을 때가 있고, 그런 압력을 받을 때 마다 내 스스로의 꿈과 의지, 계획들을 온전히 지키기 위해 많은 에너지를 소모하게 된다.

좀 더 행복해 지기 위해선, 자기 자신과의 진지한 대화를 끊임없이 해야하고, 좀 더 고독과 친해져야 하고, 자신 만의 온전한 세계를 꿈꿀 수 있어야 한다.