Monday, March 6, 2017

ExAC boosts clinical variant interpretation in rare diseases


현존하는 DB 중 가장 많은 protein-coding genetic variation을 보유한 DB는 ExAC (Exome Aggregation Consortium) 으로 20개 이상의 연구로 부터 나온 60,706 개의 exome data를 가지고 있다.

ExAC의 분석 결과 
- Variants ("Analysis of protein-coding genetic variation in 60,706 humans" Nature 2016)
  • 7.4M 개의 high-confidence genetic variants (평균적으로 8bp(base pair)당 1개의 bp에 해당)를 확인.
  • 이 중 72%는 그 어떤 다른 DB 에서도 발견되지 않은 variant였고, 
  • 99%의 variant가  frequency < 1%.
  • 54%는 오직 한번만 발견된 variant.
    
- Effected gene by variants
  • 3,230 gene이 highly loss-of-function-intolerant.
  • 대부분의 haploinsufficient disease gene이 이 3,230에 포함. 
  • 그러나 72%는 여전히 관련 phenotype을 모름.

- CNV ("Patterns of genie intolerance of rare copy number variation in 59,898 human exome" Nat.Genet 2016)
  • rare copy number variation (CNV) 분석 결과 70% 정도 사람들이 하나 이상의 rare CNV를 가지고 있고
  • 이로 인해 평균적으로 0.81개의 deleted gene과 
  • 1.75개의 duplicated gene을 가지고 있음.

이 ExAC DB는 rare disease의 variant를 이해하는데 이용될 수 있다. ExAC의 분석결과 DB에 있는 사람들이 평균적으로 54개의 이전에 질병 원인이라고 알려진 variant를 가지고 있는 것으로 확인 되었다. 곧 misclassification을 correcting하는데 사용할 수 있음. 실제 ExAC에서 높은 비율로 나타난 pathogenic variant 라 분류된 192개를 확인해 본 결과 9개만 pathogenicity 의 충분한 근거를 가지고 있었다. 

이러한 ExAC DB의 가능성을 보여주는 논문 2편이 ExAC 프로젝트에서 추가로 나왔다. 

하나는 cardiomyopathies 에 관련된 논문 ("Reassessment of Mendelian gene pathogenicity using 7,855 cardiomyopathy cases and 60,706 reference samples" Genet.Med. 2016 )
  • 7,855 명의 심장근육관련 질병을 진단받은 환자와 ExAC의 normal reference 비교
  • 상당수의 pathogenic variant 혹은 gene이라고 알려져 있는 것들이 그렇지 않았다는 것을 보임(심지어 gene panel에 표함되어 있는 것도 있음).

다른 하나는 prion disease랑 관련된 논문 ("Quantifying prion disease penetrance using large population control cohorts" Sci.Trans.Med. 2016l)
  • 16,025 명의 prion disease 환자(10-15% 의 환자는 PRNP 유전자의 변이로 인한 것으로 추정)와 ExAC비교
  • 실제로 상당 수의 PRNP 유전자의 pathogenic and highly penetrant variant가 likely benign 이었다는 확인


ExAC은 2017년까지 120,000개의 exome데이터와 20,000개의 whole-genome data 확보하려 한다고 함.

이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

Monday, February 13, 2017

OMIM.org


OMIM (Online Medelian Inheritance) 은 의사인 Victor A. McKusick에 의해 1966년에 출판되기 시작한  유전자와 유전적 표현형의 정보와 그 사이의 관계를 정리한 내용의 MIM (Mendelian Inheritance in Man) 이 시초로 1987년 검색 가능하도록 온라인화 된 것이다. 다른 데이터베이스와는 다르게 OMIM 은 전문가들에 의한 생명과학 및 의학 관련 문서의 리뷰를 바탕으로 정보를 제공한다.  

2014년 10월 30일 기준으로 14,831개의 유전자와 7,894의 표현형의 정보를 담고 있다. (https://omim.org/static/omim/data/mim2gene.txt 를 보면 OMIM의 담고 있는 유전자와 phenotype의 갯수를 파악할 수 있다)





OMIM SOURCE MATERIAL
45개 이상의 저널, PubMed의 타겟 검색, Current Contents, 그리고 저자 기반의 전체 논문을 리뷰한다. 유전자와 표현형의 관계에 대한 통찰력을 줄수 있는 인간 생물학, 또는 질병에 대한 임상적 특성, 질병의 발생 원인에 관한 내용의 논문을 우선시 한다.



OMIM STRUCTURE
OMIM의 구조는 아래 그림과 같다. OMIM에서 하나의 유전자에서의 각각의 변이(variant)는 서로 다른 표현형과 연관되어 있을 수 있기 때문에 유전자와 표현형은 분리 시켰다. 그리고 변이 관한 정보는 유전자에 포함되고 임상적 개요나 임상적 묘사는 표현형에 포함시켰다. 
OMIM의 식별자인 MIM number는 6자리 숫자로 되어 있으며 첫번째 숫자가 1,2,6일 경우에는 Autosomal entry, 3으로 시작하면 X-linked entry, 4로 시작하면 Y-linked entry, 5로 시작하면 mitochondrial entry 이며 소숫자리 4자리는 variant 의 식별자로 사용된다.


MIM number (OMIM의 일련 번호) 앞에 붙어 있는 심볼은 아래의 분류에 따라 붙이게 된다.
  • asterisk (*) : 유전자를 의미, mim2gene.txt 파일에서 "gene"이라고 분류되어 있음

  • number symbol (#) : 표현형을 의미. molecular basis known. 하나의 유일한 locus 에 의한 표현형이 아니라 여러 유전자 혹은 하나의 유전자에 의한 것이라도 발병의 원인이 다양한 경우(homozygous or compound heterozygous mutation)의 표현형. mim2gene.txt 파일에서 "phenotype"이라고 분류되어 있음

  • plus sign (+) : 유전자 이자 표현형. mim2gene.txt 에서 "gene / phenotype"으로 분류되어 있음

  • percent sign (%) : 확인된 mendelian phenotype 혹은 phenotypic locus이긴 하나 정확한 기작은 모르는 경우(원인 variant까지는 모르는 경우). no known inheritance pattern or molecular basis.  mim2gene.txt 파일에서 "phenotype"이라고 분류되어 있음

  • No symbol ( ) : mendelian 기반의 phenotype으로 보이나 의심스럽거나 다른 entry와의 구분이 명확해보이지 않은 표현형. mim2gene.txt 파일에서 "predominantly phenotype"이라고 분류되어 있음

  • caret (^) : legacy, 곧 다른 mim number로 바뀐 entry


OMIM의 entry는 gene 과 phenotype로 구분되어 있다.
  • gene 은 위 심볼에서 "*" 과 "+" 를 갖는 entry 이다. 
  • gene은 아래의 것들을 포함한다. 
    • protein-coding gene
    • regulatory elements
    • micro-RNA
    • non-coding RNA
    • 그 밖의 functional element 들이다.

  • phenotype 은 MIM number 앞에 "#", "%", no symbol 의 심볼이 붙는 entry이다. 
  • phenotype은 아래의 것들을 포함한다.
    • single gene mendelian disorder, 
    • phenotypic traits (머리색같은 것들), 
    • susceptibility to drug reaction (와파린에 대한 감수성 같은 것), 
    • reaction to infection (HIV 의 감염에 따른 AIDS의 발병과 같은 것), 
    • germline susceptibility to cancer(BRCA1/2 같은 것),  
    •  recurrent deletion and duplication syndromes



CLINICAL SYNOPSES
clinical synopses (임상 개요)라는 것은 문헌으로 부터 뽑아낸 phenotypic feature를 semi-controlled vocabulary 로 정리한 것. 이는 HPO, SNOMED CT, UMLS 등의 vocabulary DB에 mapping되어 있다.



THE GENE, MORBID AND SYNIOSIS MAPS

  • Gene Map : 유전자의 cytogenetic location
  • Morbid Map : disorder(phenotype)의 cytogenetic location

OMIM에서 gene map table 로 검색을 하게 되면 정보를 유전자, locus와 그것에 관련된 phenotype정보를 테이블 형식으로 나타낸다. 곧 gene, phenotype, 그리고 게놈상의 위치 정보를 정리된 표로 나타낸다. 
이 표에 phenotype column에서 사용되는 기호의 의미는 아래와 같다.
  • brackets [] : non-diseases. 질병이 아님. 실험실에서  비정상적인 테스트 값을 나타내는 유전 변이.
  • braces {} : 천식이나 당뇨병과 같은 multifactorial disorder (다원인 질병, complex disease) 나 감염에 대한 감수성과 관련된 phenotype
  • question mark ? : phenotype과 gene과의 관계가 잠정적인 경우를 의미. comment 부분에 더 자세한 설명이 되어 있다.

또한 표의 pheno map key에 컬럼의 숫자의 의미는 아래와 같다.
  • 1 : The disorder was positioned by mapping of the wild type gene.
  • 2 : The disease phenotype itself was mapped (The disorder was placed on the map by statistical method).
  • 3 : The molecular basis of the disorder is known.
  • 4 : The disorder is a chromosome deletion or duplication syndrome.



REPRESENTATION OF GENE-PHENOTYPE RELATIONSHIPS
AV (Allelic Variant)는 OMIM의 gene-phenotype 관계에서 핵심이 되는 부분으로 아래의 기준으로 선별된 변이들이다.
  • The first mutation to be discovered
  • high population frequency
  • distinctive phenotype
  • historic significance
  • unusual mechanism of mutation
  • unusual pathogenetic mechanism or distinctive inheritance

NGS의 기술로 인해 variant가 급격하게 밝혀짐에 따라 2013년 1월 부터 OMIM은 gene-phenotype 관계가 성립되기 위한 아래의 기준들을 마련하였다.
  • 동일한 유전자의 pathogenic variant를 가진 서로 관계가 없는 다수의 개인들이 존재할 경우
  • multiplex family(질환을 있는 환자의 1 또는 2촌 가족 구성원이 같은 유전 질환을 갖는 가족) 에서 variant가 phenotype에 따라 segregation될 경우
  • variant가 통계적으로 유의한 숫자의 개인에게서 de novo로 발생할 경우

qualified gene-phenotype relationship을  위한 기준은 아래와 같다.
"variant에 대해 오직 하나의 multiplex family 의 경우만 밝혀진 경우" AND "supportive functional data가 있는 경우 (in vitro, in vivo 의 유전자 활성 실험이라던지 모델 생물체에서의 비교할만한 phenotype 데이터가 있다던지)" 



OMIM PHENOTYPIC SERIES
비슷한 phenotype들의 genetic heterogeneity (하나의 phenotype 가 여러 개의 원인, 곧 allelic variant나 non-allelic variant에 의한 것)를 표의 형태로 나타낸 것. 정의가 잘 된 phenotype의 새로운 원인 유전자가 발견되거나 different mapping (genome상의 다른 위치에 관련이 있게 된다거나)이 될 때 series('PS'로 시작되는 identifier)를 생성하여 관련 phenotype을 연결시켜 놓는다. 현재 387 개의  series가 있다.


이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

Monday, February 6, 2017

Regulation of Genetic Tests


아래 글은 위 링크의 미국에서의 유전 검사의 규제에 대한 정리 번역이다.

유전 검사 (Genetic Testing) : 사람의 DNA, RNA, 단백질, 분석을 포함한 일련의 기술들을 의미한다.



Federal Regulation of Genetic Tests
위 그림과 같이 3개의 연방 기관이 유전 검사에 대해 관리한다. 


  • CMA : CLIA 를 제대로 준수하는지 clinical laboratory를 감시하는 역할을 한다. CLIA의 목적은 테스트의 과정 검증, 기술자의 숙련도등의 자격을 포함한 임상 테스트의 질을 보장하기 위함이다.

  • FDA : FDA 가 유전 검사의 규제에 대한 가장 포괄적인 권한을 가지고 있다. 이는 연방 식품, 의약품, 화장품 법 하에 유전 검사의 안정성과 효용성을 규제하는 것이다. 유전검사는 두가지로 나눠 볼수 있는데 한가지가 'kit' 로 유전 샘플을 처리하는 일련의 시약들을 묶어서 여러 실험실에 판매하는 제품과 오직 한곳의 실험실에서만 개발되고 수행되어지는 LTD (Laboratory-developed test)로 유전 검사를 받을 샘플들이 테스트를 개발한 실험실로 보내지는 제품으로 나눠진다. 현재 kit에 대해서는 규제를 하고 있으며 LDT에 대해서는 'enforcement discretion'(언제 규제를 적용하는지 그리고 규제를 강제할지를 그때 그때 FDA가 판단) 을 시행하고 있다. FDA의 유전 검사에 대한 관리 감독의 정도는 유전 검사의 사용 목적과 얼마나 부정확한 결과를 내포하고 있는지에 따라 달렸다. FDA는 유전 검사를 포함한 의료 장치를 'class 1'에서 'class 3'까지 3단계로 구분한다(class 3이 가장 엄격한 감독하에 놓은 품목을 의미). 또한 약효에 대해 유전 정보를 이용하는 pharmacogenomics 도 FDA의 감독하에 있다.

  • FTC : CMA, FDA 와는 달리 FTC 의 권한은 상당히 제한적인데 어떻게 유전 검사를 홍보하는 가를 감시하는 역할을 한다. 




FDA Regulation and Genomics Research
FDA는 1976년 의료기기개정안으로 의회로 부터 상업적으로 판매되는 의료 기기에 대해 시판 전 검토에 대한 권한을 부여받음과 동시에 임상 연구에서 사용되는 의료 기기에 대해 관리 감독할 권한도 부여 받았다. 'kit'와 'LDT'로 구분되어 제한하는 상업적으로 판매되는 유전 검사와는 달리 임상연구에서는 구분없이 FDA의 관리 대상이다. 

게놈, 엑솜, 타겟 시퀀싱과 같은 기술을 이용한 임상 연구에서는 연구 참가자의 등록 전에 FDA로 부터 IDE (Investigational Device Exemptions)을 받아야 한다. 이는 IND (Investigational New Drug application)과 비슷한 것으로 이는 FDA로 부터 승인되지 않은 의료 기기의 연구 사용에 대한 적절한 감시가 이루어짐을 보장하기 위한 것으로 연구에 사용되어지는 의료 기기에 대한 효용성을 포함한 정보를 FDA에 제공해야 한다는 것이다. 



FDA Plans to Regulate LDTs
2010년, FDA는 검사를 수행하는 실험실과 검사를 주문하는 의사와의 커져가는 괴리와 유전 검사의 복잡성 증대와 같은 시장의 변화를 인용하며 LDT를 규제할 계획이라고 발표했다. 이는 수년 간의 LDT를 규제하기 위한 자문위원들의 요구에 의한 것이다. 

2014년 7월 31일, FDA는 60일 이내에 LDT를 규제하기 위한 가이드라인 초안을 발표하겠다고 의회에 전했다.

그러나 아직까지 모든 유전 검사에 대해 규제를 확대하겠다는 FDA의 계획은 실현되고 있지 않으며 여전히 'kit'에 대한 규제를 지속하고 있을 뿐이다.



이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

Tuesday, January 31, 2017

Mother's Negligence Suit Against Quest's Athena


현재 진행되고 있는 유전자 검사 관련 소송이 있어 어떠한 내용이가를 소개해 본다. 아래 글은 위 링크의 번역이다. 

이 사건을 보면서 유전자 분석 및 검사 서비스를 위해서는 제공하고자 하는 정보의 정확한 기준 필요하며 정해진 기준의 준수가 반드시 필요하다는 것이라 생각된다. 또한 직접적으로 환자에게 정보를 제공하는 유전자 검사 서비스가 필요하다는 것과 설령 현재는 VUS(variant of unknown significance) 라 할지라도 정보의 불확실성과 불완전성을 몇번이고 사용자에게 숙지시켜야 함을 느끼게 된다.


원고: Amy Williams
피고: Athena Diagnostics 와 모기업인 Quest Diagnostics
혐의: Athena DNA 검사의 유전변이의 잘못된 분류가 William의 아들을 죽음으로 이끈 의사의 위험한 처방을 야기했다는 것.

현재 판결의 주된 쟁점은 실제로 이번 사건이 보통의 관습법의 태만이나 부주의가 아닌 의료과실 치사인가라는 점이다. 이 사건은 연방 법원의 판결을 기다리고 있는 상황이다. 이 판결에 따라 소송이 배심재판을 받을지가 결정이 된다.



Case History
2005년 8월 태어난 Christian Millare 는 태어난지 4개월째부터 발작 증상이 나타나기 시작했다. 그의 의사는 Dravet syndrome(이 질환을 가진 환자의 80%는 SCN1A 유전자에 변이가 있는것으로 알려짐)이 아닌 간질성발작으로 판단하고 sodium channel inhibitor medication 을 처방하였다. 2007년 1월 SCN1A 유전자를 검사하기 위해 Christian의 DNA가 Athena Diagnostics로 보내졌다. 만약 SCN1A 유전자에 변이가 있는 Dravet syndrome이라면 나트륨 채널 억제 약물 처방은 피해야 했다. 2007년 5월에 DNA sequencing이 진행되었으며 6월에 이 테스트를 의뢰한 의사에게로 결과가 전달되었다. DNA 검사 결과에는 Christian이 SCN1A에 유전자 변이가 있지만 이는 VUS (variant of unknown significance), 즉 질병의 원인이 된다고는 밝혀지지 않은 유전변이라는 것이라 서술되어 있었다. Christian의 담당의는 이 결과를 바탕으로 계속적으로 나트륨 채널 억제 약물을 처방했다. Athena 는 환자나 환자의 가족에게는 유전자 검사 결과를 발행하지 않았다. 결국 Christian는 2008년 1월 사망하게 되었다.

The Complaint - March 2016 : 보호자로 부터의 소송
Christian의 엄마인 Amy Williams 는 Athena for 2016년 5월 사우스 캘리포니아 주 법원에 고소하게 된다. 고소 내용은 Athena가 'Christian이 Dravet syndrome 을 가지고 있다는 것을 확인하는데 실패'했고 'DNA 변이 분류 기준을 준수하지 못함'이라는 2가지로 치료 기준을 위반했다는 것이다. 
2007년 Athena 의 유전변이 분류의 정의에 따르면 특정 변이가 'known disease-associated mutation' 으로 분류되기 위해서는 질병과 관련이 있다는 문헌이 있어햐 한다는 것이다. 그런데 2006년과 2007년 두차례에 걸쳐 관련 논문이 출판되었었다. 그렇기 때문에 Christian의 유전변이를 VUS로 분류한 것은  Athena의 잘못이라는 것이다. 2007년 검사 결과에서는 2005년 출판된 논문을 '계류 중' 이라고 표시한것으로 보아 Athena의 문헌 통합이 2년 정도 뒤쳐져 있었다고 판단된다는 것이다.

Hearing on Defendant's Motion to Dismiss - January 4, 2017 : 피고인의 항변
Athena측은 William이 제기한 과실에 대한 혐의는 의료 과실에 대한 것으로 혐의를 제기할 시간 제한이 있는 사항이라는 것이다. 사우스 켈리포니아에서는 원고가 healthcare provider(의료 공급자)에게 의료과실에 대해 소송을 걸수 있는 기간은 과실을 발견한 시점으로 부터 3년이다. 그러나 6년이 지난후에는 완전히 그 권리를 잃게 되는데 이 6년을 'statute of repose'라 한다. William의 변호인측은 이는 의료과실법이 아닌 일반의 관습법에 관한 것이라 주장하고 있다. 

결국 재판관이 이 문제를 어떻게 판결하는 가는 CLIA-certified clinical laboratory 를 사우스 캘리포니아 주법하에 licensed healthcare provider 로 보는가에 달려 있다. 특히 환자가 직접적으로 거래하지 않는 실험실에서 의료 과실 기준이 적용되는 환자와의 전문적 수탁 관계를 갖을 수 있을 것인가 하는 것이다. 

이는 사우스 캘리포나아 주 대법원에서 Athena를 healthcare provider로 인정해줄 것인가에 달렸다. 소송은 사우스 캘리포니아 주법원에서 시작되었고 피고인들이 이를 연방 법원으로 넘겼으나(피고와 원고가 서로 다른 주에 소속되었기에) 결국은 사우스 캘리포니아 주법에 따라 Athena가 healthcare provider임을 certification 되는 문제가 되어 이는 사우스 캘리포니아 주 대법원의 판결에 영향을 받게 된다.




  

이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

Monday, January 2, 2017

Molecular diagnostic experience of whole-exome sequencing in adult patients



성인(18세 이상)에서의 WES의 결과의 특성과 진단에 대한 것을 정리한다. 이 논문은 계속적으로 2014년에 JAMA에 출판한 소아 대상 WES 의 결과들의 분석 과 비교함.

WES를 통해 소아의 경우 25% 정도 진단이 되는것에 비해 성인의 경우 17.5% (85/486) 의 비율로 진단이 됨. 18-30세의 경우 23.9% 진단이 되고 30세 이상의 경우 10.4% 진단이 됨. 두개의 질병이 진단된 경우는 7%. 신경계, 골격계, 머리, 목, 성장에 장애가 있는 경우에 진단이 되는 빈도가 높음. 진단 비율은 가족력의 정보의 유무와 상관없고 autosomal dominant 의 61.4% 는 de novo mutation에 의한것.

여기서는 WES 를 통한 exotic deletion, duplication 의 detection은 진단에 포함되지 않았음. 단 SNP array 를 QC로 했기에 3명의 환자에서 large deletion, CNV가 발견할 수 있었다. 또한 mitochondria 역시 sequencing을 했기에 2명의 환자에게서 causal variant를 찾을 수 있었다.

분자 진단은 관측되는 phenotype, 예상되는 inheritance와 일관성이 있는 Mendelian disease gene의 pathogenic 혹은 likely pathogenic 만을 포함한다.

각 환자들에게 하나 이상의 HPO를 할당. 그래서 이 HPO를 이용해서 phenotype class 별 진단 비율 확인.
아래 표는 환자의 나이별 분포 및 진단 비율

486명의 환자의 WES 결과 중 85명의 환자에게 분자 진단이 내려졌고 진단이 내려진 환자 중 2 환자는 mitochondria에의 deletion(mitochondria sequencing을 통해 확인), mutation에 의한 것이였고 3환자의 경우 CNV, large deletion에 의한 것(SNP array를 통해 확인). 나머지 환자 80명들의 진단은 WES 에 의한 것으로 111개의 distinct variant가 원인으로 밝혀짐.

111개의 variant중 SNV가 84개(75.7%), indel 이 26(23.4%)개, 나머지 한개는 double mutation variant. 84개의 SNV중 57개가 missens, 16개가 nonsense, 10개가 splice site, 1개가 initiation codon mutation.

아래는 inheritance pattern의 비율.  JAMA의 것(신생들의 분석 결과)과 비슷.

아래 표가 사용된 HPO term의 빈도수



 위 표는 환자들에게 할당된 HPO term들의 빈도를 의미한다.
환자당 평균 10개의 HPO term이 할당. HPO term을 바탕으로 환자에게 하나 이상의 HPO phenotype class 부여. 아래 그림에서 볼수 있드시 신경계, 근육 조직, 골격계의 비정상이 가장 많은 class 이다.

아래 그림 b 에서 볼수 있듯 진단은 phenotype에 dependent 하다. 머리/목, 성장, 근육 조직, 신경계 등의 문제가 있는 경우 진단이 더 잘 되고 가슴, 종양등과 관련된 phenotype 의 경우 진단이 잘 안되었다.



이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

Monday, June 20, 2016

tensorflow로 logistic regression 구현하기


아래 내용은 Andrew Ng 의 [coursera](https://www.coursera.org/learn/machine-learning/) 강의 일부와 Fast campus 의 [deep learning](http://www.fastcampus.co.kr/data_camp_deeplearning/) 강의 예제와 내용을 이용한 것이다. Andrew Ng 강의에서의 sigmoid function은 코드에서는 softmax function으로 변경되었고 cost function 역시 코드에서는 cross entropy가 사용되었다.

nbviewer  에서도 아래 내용을 볼 수 있다.


Logistic regression

linear regression은 값에 대한 예상치를 구하는 것에 반해 logistic regression은 classification(분류)을 위한 확률 모델이다 (classification 대신 regression을 쓰는 이유는 단지 역사적인 이유일뿐).
아래 식과 같이 input 값 x vector의 weight를 곱한 다항식을 sigmoid function을 통해서 확률값으로 변경한 것이 logistic regression 에 의한 결과이다.
$$ \begin{align} h_\theta &= g(\theta^Tx) &&\text{hypothesis function} \\ g(x) &= {1 \over 1+e^{-x}} &&\text{sigmoid function (=logistic functon)} \\ \end{align} $$
logistic function의 parameter인 theta값은 아래 overall cost function을 이용하여 구한다.
$$ \begin{align} J(\theta) &= {1 \over m} \sum_{i=1}^m Cost(\ h_\theta(x^{(i)}),\ y^{(i)}) &&\text{overall cost function} \\ Cost(h_\theta(x), y) &= \begin{cases} -log(h_\theta(x)), & \mbox{if }y=1 \\ -log(1-h_\theta(x)), & \mbox{if }y=0 \end{cases} &&\text{cost function}\\ &= -ylog(h_\theta(x)) -(1-y)log(1-h_\theta(x)) \\ \end{align} $$
training 데이터의 overall cost function의 최소값이 되도록 하는 theta값이 logistic regression의 parameter가 된다.
$$ min_\theta J(\theta) $$
overall cost function의 최소값이 되는 theta는 아래 gradient descent 를 이용하여 계산한다.
$$ \begin{align} \theta_j &:= \theta_j - \alpha{\partial\over\partial \theta_j}J(\theta) &&\text{gradient descent} \\ &:= \theta_j -\alpha\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} \end{align} $$
위의 gradient descent 식에 training 데이터를 넣어 theta값을 갱신한다. 갱신된 theta를 이용한 overall cost function 값이 더이상 작아지지 않을 때까지 위를 반복한다 (혹은 derivative 가 0에 가까워지면).

Tensorflow

tensorflow는 구글에서 개발한 deep learning 프로그래밍을 위한 python package이다.
tensorflow를 이용하는 것은 deep learning을 위한 graph(=model)를 구축한는 것이라고 생각하면 될 것 같다. 그래프의 입력값과 같은 데이터의 통로는 tensorflow의 placeholder 라는 것으로 정의하고 데이터를 사용하여 그래프가 트레이닝 되는 동안 변해가는 값, 곧 변수는 tensorflow의 Variable을 사용하여 정의한다. 그래프를 구축하고 실제로 그 그래프를 실행하는 것은 tensorflow 의 session의 run을 사용한다.
In [19]:
%matplotlib inline    # maplotlib의 그림을 notebook 안에 그리기 위한 명령어 (magic이라 함)

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
In [32]:
mnist = input_data.read_data_sets('data/', one_hot=True)
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
In [34]:
print mnist.train.num_examples
55000
notebook 이 실행된 폴더의 서브폴더 data를 생성하고 그 안에 mnist 데이터를 다운받게 된다. mnist는 Mixed National Institute of Standards and Technology의 약어로 이미지 프로세싱 시스템을 트레이닝에 사용되는 손글씨로 쓴 숫자 이미지의 모음이다. one_hot 인자의 true의 의미는 숫자의 label 을 0과 1로 표현하겠다는 의미이다.
In [33]:
trainimg = mnist.train.images 
trainlabel = mnist.train.labels 
testimg = mnist.test.images
testlabel = mnist.test.labels

print type(trainimg), type(trainlabel)
print trainimg.shape, trainlabel.shape
print type(trainimg[0]), trainimg[0].shape
print type(trainlabel[0]), trainlabel[0].shape
print trainlabel[10]
plt.imshow(trainimg[10].reshape((28,28)))
<type 'numpy.ndarray'> <type 'numpy.ndarray'>
(55000, 784) (55000, 10)
<type 'numpy.ndarray'> (784,)
<type 'numpy.ndarray'> (10,)
[ 1.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
Out[33]:
<matplotlib.image.AxesImage at 0x10c624a90>
trainimg 는 55000 행과 784 열로 이루어진 2-dimensional array 이다. 행은 training할 데이터의 수를 의미하며 열은 하나의 데이터를 이루는 숫자의 모음이다. 곧 트레이닝 데이터는 55000개로 이루어 져 있으며 하나의 데이터는 784 (=28*28)의 숫자로 구성되어 있다. trainlabel 역시 2차원 array이며 각 행은 각 데이터의 label을 의미하며 각 데어터의 label은 10개의 0혹은 1 값으로 구성되어 있다.
위의 예처럼 그림이 0을 의미하면 label의 값 중에 0 을 의미하는 첫번째 인덱스의 값만 1이고 나머지는 0이 된다.
In [40]:
learning_rate = 0.01
training_epochs = 50
batch_size = 100
display_step = 10

x = tf.placeholder('float', [None, 784])  # trainimg 혹은 testimg가 들어갈 변수, 데이터가 들어갈 입력변수
y = tf.placeholder('float', [None, 10])  # None 은 입력 데이터의 행 수를 임의로 지정한 것
W = tf.Variable(tf.zeros([784, 10]))  # 그래프가 트레이닝 됨에 따라 변하는 변수
b = tf.Variable(tf.zeros([10]))  # bias 를 나타나내는 변수

actv = tf.nn.softmax(tf.matmul(x, W) + b)
cost = tf.reduce_mean(-tf.reduce_sum(y * tf.log(actv), reduction_indices=1)) # cross entropy
#cost = tf.reduce_mean(tf.pow(actv - y, 2))  # squared loss

optm = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

pred = tf.equal(tf.argmax(actv, 1), tf.argmax(y, 1))
accr = tf.reduce_mean(tf.cast(pred, 'float'))

init = tf.initialize_all_variables()
epoch 는 모든 training data가 다 사용되는 한번의 turn(=loop)을 뜻하며 batch size는 한번의 turn(=loop)이 되는 동안 사용되어 지는 데이터의 크기(=갯수)를 뜻한다. 예를 들어 55000개의 training data가 있을 경우 batch size 를 100으로 정했으면 550 번의 iteration이 돌아야 한번의 epoch가 완성되는 것이다.
위 코드에서는 sigmoid function 대신 softmax function을 사용하였다.
$$ softmax_i(a) = { e^{a_i} \over \sum e^{a_i}} \ \ \ \ \ \ \ \ \text{softmax} $$
또한 cost function으로 cross entropy 를 사용하였다.
$$ H(p, q) = -\sum_x p(x)\ log\ q(x) \ \ \ \ \ \ \ \ \text{cross entropy} $$
In [42]:
with tf.Session() as sess: # 위의 코드는 그래프를 생성한 것. 실제로 구동은 Session에서 이뤄진다
    sess.run(init)
    
    for epoch in range(training_epochs):
        avg_cost = 0.
        num_batch = int(mnist.train.num_examples / batch_size)
        for i in range(num_batch):
            if 0: # tensorflow 에서 제공하는 mnist데이터 객체의 batch 를 뽑아내는 함수를 이용하는 방법  
                batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            else: # OR manually implement random extraction
                randidx = np.random.randint(trainimg.shape[0], size = batch_size)
                batch_xs = trainimg[randidx, :]
                batch_ys = trainlabel[randidx, :]
                
            sess.run(optm, feed_dict = {x: batch_xs, y: batch_ys}) # optimizer 를 실행. placeholder로 잡아논 변수를 인자로 넣어줌.
            avg_cost += sess.run(cost, feed_dict = {x: batch_xs, y: batch_ys}) / num_batch
        
        if epoch % display_step == 0:
            train_acc = accr.eval({x: batch_xs, y: batch_ys})
            print "Epoch: %03d/%03d cost: %.9f train_acc: %.3f"%(epoch, training_epochs, avg_cost, train_acc)
            
    print "Optimizer finished."
    print "Accuracy:", accr.eval({x: mnist.test.images, y: mnist.test.labels})

print "Done."
Epoch: 000/050 cost: 1.172424991 train_acc: 0.890
Epoch: 010/050 cost: 0.382650341 train_acc: 0.920
Epoch: 020/050 cost: 0.340528482 train_acc: 0.940
Epoch: 030/050 cost: 0.325556715 train_acc: 0.940
Epoch: 040/050 cost: 0.309887736 train_acc: 0.880
Optimizer finished.
Accuracy: 0.9183
Done.

Tuesday, June 14, 2016

chapter 2: Measures of Disease Occurrence

아래 내용은 Staistics for Epidemiology 의 chapter 2 의 내용의 요약이다.


1. Prevalence and incidence
point prevalence 란 질병에 걸릴 가능성이 있는 사람들 중에 특정 시점에서 질병에 걸려 있는 사람의 비율을 뜻한다. 

interval prevalance 란 질병에 걸릴 가능성이 있는 사람들 중에 특정 시간 구간내에 질병에 걸려 있는 사람의 비율을 뜻한다.

incidence proportion (=cumulative incidence proportion) 질병에 걸릴 가능성이 있는 사람들 중에 특정 시간의 구간 안에서 질병 걸린 사람의 비율을 뜻한다. 그렇기 때문에 prevalance와는 달리 조사 시점 시작 전에 질병에 걸려 있던 사람은 제외한다. 

집단의 크기가 100명이라는 가정아래 figure 1 에서 특정 시점 t에서의 point prevalence는 4/100 혹은 4/99 이다. 4/99 인 이유는 case4를 질병에 걸릴 가능성이 있느냐의 여부에 따른다(특정 질병의 경우 질병이 걸리고 회복이 되면 질병에 면역력이 생겨서 다시 걸릴 가능성이 없어진다. 이럴 경우는 계산 대상에서 빠지게 된다). [t0, t1] 시간 구간의 incidence proportion은 4/98 이다 (case4 와 case1은 조사 시작이 되기 전에 이미 질병에 걸려 있었기 때문에 계산에서 제외된다).

incidence와 prevalence의 차이는 incidence는 특정 조사 시간 내에서 병이 시작된 사람들만 포함을 한다는 것이다.

prevalence 는 질병의 발생뿐만 아니라 질병의 지속 시간(duration) 에 의존적이기 때문에 사용에 문제가 있을 수 있다. 

초기 사망이 많은 CHD (coronary heart disease)의 예인 아래 table1 의 통계를 보면 prevalence 사용의 문제점을 확인할 수 있다. 이는 1966년에 30~59 세의 남성의 콜레스테롤과 CHD의 상관성에 대한 연구이다. 이 연구에서는 콜레스테롤 수치를 4단계로 구분하였고 highest와 lowest가 아래 표의 high와 low에 해당한다. 표에서 보듯이 10년기간의 incidence 에서는 콜레스테롤이 높은 집단에서 확연하게 CHD 의 비율이 높은 것이 확인된다 (incidence에서 콜레스테롤 수치는 연구 기간 시작 시점에서의 콜레스테롤 수치이다). 그러나 10년 마지막 시점에서 조사한 prevalence 를 보면 콜레스테롤 높낮이와 CHD의 발병률에 차이가 없음을 확인 할 수 있다(prevalence에서의 콜레스테롤 수치는 연구기간 10년의 마지막 시점에서 측정한 수치이다). 


이와 같이 prevalence 에서 별 차이가 나지 않는 이유는 콜레스테롤에 의한 CHD는 조기 사망이 높아서 일 수 있다. 콜레스테롤 수치가 높아서 CHD가 걸린 사람들은 질병 발생 초반에 사망을 했을 수 있기 때문에 counting이 되지 않았기 때문이다. 또 다른 이유는 CHD에 걸려 살아 남은 사람들이 콜레스테롤 수치를 조절하여 낮췄을 수 있기 때문이다. 

이 예는 prevalence 데이터를 질병과 risk factor의 인과관계의 해석에 사용하였을 경우 발생할 수 있는 위험을 보여준다.

이 글에서 소개되는 통계적인 방법은 prevalence와 incidence 둘 다에서 사용될 수 있으나 이 글은 incidence를 가정한다. 이는 질병과 위험 인자의 인과성을 연구하기 위해서는 당연히 incidence 수치를 사용해야 하기 때문이다.


2. Disease rates
시간 구간이 너무 길고 특정 그룹의 발병이 초기단계에 일어나면 incidence proportion의 사용이 유용하지 않을 수 있다. 

이럴 경우 proportion 대신 rate를 사용하여 시간 구간 동안의 발병의 시간을 조절한다.

incidence rate (=average incidence rate) 는 발병 개체 수 나누기 발병까지의 총 시간으로 나눈 값이다.

아래 figure2 는 5명의 집단에 대한 예이다. o 표시는 사망을 의미하고 x는 disease의 발생을 의미한다.
t =0 시점에서의 point prevalence 는 0 / 5 = 0 이고 t = 5 시점에서의 point prevalence 는 1/2 = 0.5 이다.
t=0 ~ t=5 의 incidence proportion은 3/5 = 0.6 이며
incidence rate 는 3/(5+1+4+3+1) = 3/14 = 0.21 per year 이다.

만약 집단 크기와 연구 기간이 명확하지 않거나 혹은 한사람이 여러번 질병에 걸릴 수 있다면 incidence rate의 단위를 0.21 cases per person-year (per person per year)로 한다.



3. The hazard function
시간 구간 동안 집단이 질환의 발병이 급격하게 변화한다면 이와 같은 현상을 잡아내기 위해서는 시간 구간을 작은 부분 구간으로 나눌 필요가 있다. 집단의 크기가 작으면 발병 횟수 자체가 작아서 이런 접근을 시도 할 수 없지만 집단의 크기가 충분히 크다면 시간 구간을 작은 부분구간으로 나누어 부분 구간별 incidence rate를 계산할 수 있다. 이 부분 구간이 이론적으로 굉장히 작다면 이 부분 구간의 incidence rate를 hazard function, h(f) 라고 한다. figure 3 은 남성의 나이 별 사망률(motality)에 대한 hazard function 의 그림이다. 나이는 x 축으로 motality rate, 곧 hazard function 값은 y 축으로 표현했다. 이 그림에 대한 해석은 N = 1000 이고 시간 t 에서의 hazard function 의 값이 0.005/year 라면 시점 t를 중심으로 한 1년 기간 동안에 질병 발생(여기서는 사망) 횟수가 5 가 되는 것이다. 


시간 구간 [0, T] 에 대해 0<= t <= T 인 시간 t의 hazard function, h(t) 과 시간 구간 [0, t] 의 incidence proportion 간에 아래 식과 같은 직접적인 관계가 있다 (단 질병이 발생한 개체의 경우 더 이상 발병 위험에 노출되지 않는다고 가정한고, 또한 위험에 노출되지 않는 경우는 오직 이 경우 밖에 없다고 가정한다). 
I(t) 는 incidence proportion을 나타내기 때문에 d I (t) / dt 는 incidence proportion 의 시간 t 에서의 기울기를 의미하여 1 - I(t) 는 위험에 노출되어 있는 개체 비율, 곧 질병에 걸릴 수 있는 개체 비율을 의미한다. 

만약에 관심이 있는 것이 질병이 아닌 질병에 의한 사망에 있다면 보통 incidence proportion 대신 1 - incidence proportion 인 survival function 을 사용한다( S(t) = 1 - t(t) ).

아래 figure 4는 figure 3 에 대한 survival function을 나타낸 그림이다. 


hazard function 의 이점은 손쉽게 시간 변화에 따른 발병 정보인 dynamic information을 얻을 수 있다는 것이다.

예를 들면 figure 3 과 figure 4 모두 같은 데이터를 표현한 그림이지만 생의 첫해의 사망 위험과 60대의 사망 위험이 크게 다르지 않다는 정보를 figure 3의 hazard function이 더 쉽게 표현하고 있다 (figure4 에서는 t = 0 과 t = 60 의 y 값 수치가 상당히 차이가 있다). 또한 65 이후 사망률이 크게 올라가기 시작한다는 것을 figure3을 통해 더 쉽게 파악할 수 있다.




이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.