Thursday, December 15, 2011

head first design pattern 1

head first design pattern에 정의된 내용.
  • strategy pattern : strategy pattern 은 알고리즘군을 정의(인터페이스)하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 이를 이용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
    • 예제 : 연못의 오리 게임. Duck 이라는 super class를 만들고 이를 상속 받은 여러 종류의 오리 class가 있다. 원래 Duck class에는 없는 기능을 넣을 려면 어떻게 해야 하는가?
    • 단순 답변 : Duck class에 특정 기능의 함수를 넣어준다. 하지만 이는 Duck class를 상속 받은 클래스 모두에게 이 기능이 생기게 된다. 만약 특정 derived class는 이 기능이 변형되어야 한다면?
    • strategy pattern : 위 문제는 함수 오버라이딩으로 가능하기는 하지만.. 이보다는 변형 가능한 것들을 하나의 인터페이스로 만든 다음 이것을 Duck class 의 맴버 변수로 넣는다. 구현은 이 인터페이스를 상속받는 여러 클래스들에서 구현. 
  • observer pattern : observer pattern 에서는 한 객체(subject)의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다.
    • 예제 : 기상스테이션 예제로 WeatherStation이라는 클래스가 있고 이 클래스에서는 기상변화를 관찰 한다. 기상 정보는 실시간으로 WeatherData라는 클래스의 객체로 넘어가고 이때 WeatherData 객체는 이 업데이트된 정보를 각각의 Display 객체들에게 통보해야 한다. 
    • observer pattern : Subject 라는 인터페이스를 만들고 그 안에는 Observer 라는 interface를 갖고 있다. WeatherData 클래스는 Subject 인터페이스를 구현하고 있다. Observer 는 여러 Display 클래스들에 의해 구현되어 지고 이 Display 클래스들은 WeatherData 클래스 객체를 맴버 변수고 갖고 있어서 생성자가 호출될 때 WeatherData 객체를 넘겨 받아서 넘겨받은 WeatherData의 add 함수를 호출해서 WeatherData의 observer 맴버 변수 배열에 Display 자기 자신을 등록한다.
  • Decorator pattern : decorator pattern에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 긴능을 유연하게 확장할 수 있는 방법을 제공한다.
    • 예제 : 스타버즈라는 커피숍의 주문 시스템을 만든다. 각 매뉴들을 표현하고 가격을 구현해야 한다. 
    • 단순 답변 : Beverage라는 베이스 클래스를 만들고 새로 생기는 메뉴마다 이 슈퍼 클래스를 상속받는 서브 클래스를 만든다. 아니면 베이스 클래스에다가 서브 클래스에서 쓸 맴버 변수들을 포함시킨다. 이러한 경우 서브 클래스가 엄청 많아진다거나 혹은 서브 클래스가 필요하지도 않은 많은 맴버 변수들을 상속받게 된다.
    • decorator pattern : 문제를 파악해보면 DarkRoast, HouseBlend, Decaf는 기본이 되는 음료가 되고 여기에다가 Mocha나 Whip (휘핑크림) 등은 decorator가 되겠다. 모든 음료의 기본이 되는 베이스 가상 클래스인 Beverage를 정의 하고 각종음료(DarkRoast, HouseBlend, Decaf)는 이를 상속하고 구현하는 구상 클래스가 되겠다. 그리고 decorator들(Mocah, Whip) 역시 Beverage 가상 클래스를 상속하게 한다. 이것의 목적은 Beverage로 부터 행동을 상속 받기 위함이 아니라 decorator의 형식과 각종 음료의 형식을 맞취기 위한 것이다. 확장되는 행동들은 decorator 안에 구현하고 decorator 안에는 또한 Beverage를 구성 요소로 갖는다. 결론적으로 기본음료를 decorator가 감싸고 이 감싼 객체를 또다른 decorator가 감싸는 형식으로 구현하는 것이다. 


디자인 원칙
  1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다.
  2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
  3. 상속보다는 구성을 활용한다. 
  4. 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.

    Tuesday, October 11, 2011

    GWAS

    GWAS 란?
    다음을 요약해보면..
    일단 GWAS는 genome wide association study의 약자. 뭔말인고 하니 genome wide 하게 association study를 한다는 의미. 이건 또 무슨 말인고 하니 genome wide 하게 DNA를 관측하고 이 DNA의 차이 혹은 변화를 질병과 같은 변수와 연관지여 연구를 한다는 의미.
    사람의 genome은 서로 99.9%가 동일하다. 그래서 차이는 거의 없을 거고 이 차이가 나름 중요한 역할을 할거다(질병이라던지 관련해서). 그럼 이 개인간의 차이 즉 common SNP은 몇개나 있을까? 10 million쯤 있을거라 생각되고.. 그럼 GWAS를 연구할려면 이 10M SNP를 다 detecting 해야 하냐? 아니다. 과학자들이 HapMap project라는 것을 진행해서 SNP의 조합인 haplotype들을 찾아놨기 때문에 돈은 많이 싸졌다. 물론 요즘 NGS 값이 워낙 싸서 더 싸졌다.




    그럼 어떤식으로 GWAS를 진행할까?
    많은 다수 그러니까 수천명 규모에서 수만명까지 특정 질병군(case)와 일반군(control)의 사람이 필요하고(이때 confounding factor인 성, 종족등을 통일(?)시킨다)


    1.각각의 사람을 genotyping 한다. 그러니까 SNP를 찾는다.
    2.quality control of genotype data.
    3.genotype과 phenotype간의 통계적으로 연관이 있는지 확인. chi-squared 같은 걸 이용
    4.연관된 주변의 추가적인 SNP의 genotyp으로 fine mapping of association signal. 그니까 3번 step에서 유의하다고 생각되는 snp 주변의 SNP들을 추가적으로 genotyping 해서 haplotype을 경험적으로다가 만들어 낸다.
    5.그 담에 다른 집단에다가 적용. 이땐 지정된 SNP로다가만 testing 한다.
    6.biological validation




     GWAS tools
    많다. CRAN 의 task view의 genetics에서도 보면 GWAS를 할 수 있는 많은 package를 소개한다. 또한 broad institute 에서 만든 PLINK도 많이 사용한다.

    Friday, September 23, 2011

    R multiple plots in same window

    맨날 까먹어.. 난.. 인터넷이 폐해인가? 아님 내가 원래 붕어인건가?




    check point 1
    "par 함수의 사용"


    일단은 한 윈도우 안에 여러 그림을 그릴려면 par 라는 함수를 사용해야 하고 이건 뭐하는 거냐 하면 query for graphical parameter. 각종 device 마다의 parameter가 있는데 이걸 par 함수의 attribute라고 해야 하나 옵션이라고 해야 하나.. 이런 것들을 이용해서 query로 던지는 것. 특히 mfrow(or mfcol)과 fig 옵션을 사용하면 각 plot의 위치와 범위를 선정 할 수 있다. 다음의 사이트와 블로그에 잘 설명이 되어 있는데 간략하게 설명하자면 


    par(mfrow=c(2,2)) #multiple figures by row로 multiple plot이 몇 x by x 인지 또 각 plot들어가는 순서를 나타낸다.
    par(fig=c(0,0.3,0.5,1)) #앞의 두 vector는 x 축의 coordinate, 뒤 두 vector는 y 축의 coordinate를 의미하는 것으로 0과 1 사이 값을 갖게 된다.아래 그림 참조
    plot(somthing) # par의 fig로 영역을 잡은 곳에 그림을 그림


    %아래 그림은 "불탄五징어" 님 블로그에서 발췌함을 밝힌다.%
    그런데 여기서 fig의 coordinate의 기준이 어디냐? 아래 그림을 보면 NDC space가 fig가 따르는 체계(?)이다. 다음 참조




    check point 2
    "heat map 그리기"


    사실 이건 multiple plot이랑 상관없지만 또 잊어버릴까봐 기록한다.




    check point 3
    "histogram horizontal"


    hist 자체에는 horiz 이라는 parameter가 없는데 이를 해결하는 것이 hist의 return 값을  barplot을 이용하여 그리는 것. 근데 문제가 y축의 label을 쓰는 것이 생각보다 골치 아픈데.. 다음을 참조하면 해결 가능해진다.


    h.temp = hist(something$value, plot=FALSE) #plot 옵션을 F로 줘서 그림은 그리지 않은채 hist의 return 값만 받는다.
    barplot(h.temp$count, space=0,horiz=TRUE) #space는 hist가 원래 space가 0이므로 가능한 비슷하게 그리기 위해 준 옵션이고 horiz를 통해서 rotated hist를 그린다.
    labels = h.temp$breaks #y축에 label을 할 숫자들
    text(par('usr')[1]-3,1:length(labels)-1,srt=90,adj=0.5,labels=labels,xpd=T) #첫 두 숫자는 x,y의 coordinate로 label의 갯수만큼 vector를 생성해야 한다(여기의 경우 y vector를 label수 만큼 지정했기 때문에 x 축의 값은 하나라도 반복되서 적용). srt는 label의 글씨를 90도 기울인 것이고 adj는 label의 가운데와 tick과 정렬시키는 것. 


    Conclusion
    결국 내가 하려던 것은 The DNA methylome of Human Peripheral Blood Mononuclear Cells에 나오는 figure를 그리고 싶었던 것인데.. 최종 코드는 아래와 같다.

    Thursday, September 22, 2011

    UCSC GENE table cdsStartStat, csEndStat SQP type 설명

    아 cdsStartStat과 cdsEndStat의 필드의 데이터가 enum('none', 'unk', 'incmpl', 'cmpl')로 되어 있는지 첨 알았다. 항상 exonStarts와 exonEnds와 같은 형식으로 되어있는줄 알았는데 parsing 하다보니까 알게됐네.. 


    이 enum('none', 'unk', 'incmpl', 'cmpl') 는 뭐야 도대체..


    다음 링크를 따라가 본다.

    • none - no CDS specified from the sequence's data source.
    • unk - unknown - not known if CDS start/end is complete.
    • incmpl - the CDS start/end is incomplete
    • cmpl - the CDS start/end is complete.