Bioinformatics 비전공자를 위한, Bioinformatics 어떻게 공부하는게 효과적일까?

지난 포스팅에 이어서, 주변에 계시는 분들께 종종 받는 질문에 대한 포스팅입니다. 가끔 주변의 선생님들로부터 아래와 같은 질문을 심심치 않게 듣습니다.

“Bioinformatics나 머신 러닝에 대해서 공부하고 싶은데, 너무 막막해요. 무슨 교재를 보고 어떻게 공부하는게 좋나요?”

저는 BioinformaticsComputational Biology 전공자도 아닐 뿐 더러, 코딩을 잘하는 것도 아닙니다. 다만 연구자로써 그 때 그때 필요한 Bioinformatics 도구들을 많이 사용한 경험이 있고, 구글링을 잘 활용할 뿐 입니다. 물론 컴퓨터 언어를 전혀 모른다면 문제겠지만, 프로그래밍 언어 자체를 배우는데 시간을 낭비할 필요는 없습니다. (원래 인생은 바로 실전 아니겠습니까?)

unnamed

책을 사서 프로그래밍 언어 자체를 독학을 하는 것은 시간적으로 효율도 나쁠 뿐 더러, 실전에는 별로 도움이 안되는 (=별로 쓰이지 않는) 내용들이 많습니다. 논문을 쓸 때, 통계 기법을 사용하는 것도 분석을 하고 해석을 통해 결과를 도출하기 위해서이지, 그것을 위해 우리 모두가 통계학 책을 꺼내서 처음부터 정독할 필요는 없습니다. 그런 의미에서 대부분의 사람들에게는 Bioinformatics tool 이나 머신 러닝 기법도 통계 기법과 같이, 데이터를 다루는 도구일 뿐이며, 우리는 이러한 도구들을 적당히 이용해서 데이터를 해석하고, 결과를 만들면 됩니다. (즉, 어떤 칼을 사용하던지 생선 손질만 하면 되는 것 아니겠습니까)

 

r-bioconductor-training_1

python_ml_header

R? Python? 머신러닝을 위한 Tensor Flow? 어떤 프로그래밍 언어를 먼저 배워야하는지, 어떤 교재를 봐야할지 고민할 시간에, 일단 아무거라도 시작해 보세요. 프로그램을 설치해보고, 데이터를 로딩해보고, 요리 조리 만지다 보면, 점점 뭐가 필요한지 깨닫게 됩니다. (개인적으로 R과 Python은 좀 더 쓰기 친숙한 Interface를 제공하는 R studio와 Anaconda를 설치해서 사용하기를 추천합니다.) 아래는 제가 생각하는 비전공자들이 BI tool의 사용법을 가장 효율적으로 습득하는 방법입니다.

 

1. 나만의 Real dataset을 가지고, 논문을 써보자

데이터는 직접 만지고, 조작을 해봐야 하는데, 자신이 분석하고자 하는 데이터셋이 있는 경우가 가장 좋습니다. 내가 가장 친숙한 데이터셋일 뿐 더러, 남의 깨끗하게 정제된 데이터가 아니라, 날 것 (?) 자체의 데이터 (Raw data)를 가공하는 과정에서 많은 것들을 배우게 됩니다. 이를 이용해서 논문을 한번 써보면 금상첨화 입니다.

비슷한 특성의 데이터셋을 이용해서 이미 분석해서 출판한 선행 논문을 참고 삼아서, 그 논문에서 이용한 분석 방법론을 그대로 나의 데이터셋에 적용해보세요. 그러다보면 자연스럽게 방법론을 습득하게 되고, 그 과정에서 어떤 프로그래밍 Tool이 필요한지, 어떤 분석 방법들을 다룰 수 있어야하는지를 알게 됩니다. 조금더 나아가 이런 방법을 응용하거나 확장하면 나만의 논문을 쓸 수 있을 정도의 데이터 분석 수준에 도달하게 됩니다. (사실 대부분의 Bioinformatics 전문가들도, 이러한 과정을 통해서 박사 학위를 마치고, 전문가가 됩니다.)

 

2. 검색을 최대한 활용하자: Google knows everything!

위에서 언급한 대로 일단 나의 데이터셋을 가지고 시작을 하면, 얼마 지나지 않아 바로 문제에 봉착하게 됩니다.

“아 설치하는데 왜 안되는 거야? 파일 로딩을 어떻게 하는거지… 프로그램을 잘 돌아가는데, 에러는 왜 발생하는 거야..?” 등등

google_god_hero

여기서 재밌는 점은 내가 봉착한 문제는 대부분 다른 사람들도 다 겪었다는 점입니다. 다른 말로하면 구글에 검색해보면 똑같은 문제를 질문한 사람이 꼭 있습니다. (없다면 검색을 제대로 못한 것..)

그렇게 그들의 질문과 다른 전문가들의 답변을 따라서 하나씩 문제를 해결해 가다 보면, 대부분의 문제들은 해결됩니다. 그리고 이러한 과정이 실력을 쌓아가는 과정이기도 합니다. (물론, 이런 시행 착오 과정을 단축 시켜줄 전문가가 옆에 있다면 매우 좋겠지만, 독학하는 사람에게는 구글이 슨상님입니다..) 이러한 방법의 장점은 교재가 필요없고, 돈도 들어가지 않으며 (= 온라인 교재, 무료), 단 시간에 가장 핵심적으로 실무에 필요한 기술만 습득할 수 있다는 점입니다.

 

3. Community Forum, Github tutorial 및 온라인 강의 (Youtube) 활용

마지막으로 위와 같은 과정으로 대충 어떤 스킬이 필요한지, 조금은 감이 왔다면 조금은 더 advanced 된 과정을 배우고 싶은 생각이 들기도 합니다. 이제 관심사와 처지가 비슷한 사람들이 모여있는 커뮤니티에 들어가서 눈팅을하고 질문을 합시다. 요새는 다양한 Bioinformatics 관련 커뮤니티가 활성화되어 있어서, 질문을 올리고 전문가의 답변을 얻기가 훨씬 용이해졌습니다.

maxresdefault

대표적으로 R과 관련한 다양한 블로그 및 포럼, Kaggle과 같은 Machine Learning 포럼, 유전체 분석 관련 Biostar, Bioinformatics Stack Exchange 등등의 커뮤니티들이 있으며, Software 제작자들이 Github에 친절하게 tutorial을 만들어주기도 합니다. 최근에는 유튜브가 활성화되어서, 친절하게 Step-by-step으로 분석 방법을 알려주는 영상도 많이 업로드되고 있으며, Coursera 온라인 강의도 접근이 쉽습니다.

이제는 정보의 홍수 속에서 얼마나 더 효율적으로 원하는 정보를 찾고, 활용하는지가 중요한 시대가 온 것 같습니다. 저런 정보들만 잘 활용한다면, Bioinformatics 도구를 활용하는데 큰 걸림돌은 없을 것이라고 믿어 의심치 않습니다.

이번 포스팅은 여기까지 입니다. 혹시라도 더 좋은 팁이 있다면 알려주세요^^

 

 

암유전체 분석: Waterfall plot

최근에 종양 내과에 계신 선배와 함께 담관암 (Biliary tract cancer) 환자들의 암유전체 (Cancer Genomics) 관련 NGS 분석을 시작했습니다. 확실히 작년부터 다양한 질환과 환자들의 다양한 유전체 데이터를 접하다보니, 데이터셋의 특성에 따라서 분석 및 접근 방법이 많이 다른 것을 느낍니다. 사실 그동안 저는 주로 Germline variant 분석을 했었는데, Somatic variant 가 더 중요한 암 환자들을 분석하기 위해서는 추가로 더 공부하고 알아야 할 내용들이 많은 것 같습니다. 특히 암과 같은 경우는 선천적으로 가지고 있는 Germline variant와 살면서 축적된 Somatic mutation을 종합적으로 함께 고려해야하기 때문에, 더 복잡한 측면이 있는 것 같습니다.

관련 포스팅 보기 > [유전학 중요개념 정리] Germline vs. Somatic mutation

오늘은 암유전체 분석 관련 논문들의 Figure 1을 차지하는 Waterfall plot을 만드는 법을 잘 소개하고 있는 페이지가 있어 관련 내용을 스크랩 합니다.

다운로드

Waterfall plot: 환자군에서 나타나는 Mutation을 유전자별로 나타내어, 전체 암 유전체의 특성을 잘 나타내주는 plot으로 마치 폭포가 떨어지는 모양과 비슷한데서 그 이름의 유래가 있습니다.

관련 설명 링크 가기:

Waterfall plot: introduction

Introduction to waterfall plots (Griffith Lab)

 

이제 연구자들에게 Bioconductor와 R과 같은 프로그램은 필수죠. 다행히 저와 같은 코드를 잘 모르는 사람을 위해서 R package가 잘 만들어져 있습니다. 위 페이지에서 소개하는 필수 코드를 약간 정리하여 올립니다.


library(GenVisR)
setwd("c:/BTC_R/sample")

# Load data file
mutationData <- read.csv("BKM120_mutationdata.csv")
clinicalData <- read.csv("BKM120_clinical.csv")
mutationBurden <- read.csv("BKM120_mutationburden.csv")

# Reformat the mutation data for waterfall()
mutationData <- mutationData[,c("patient", "gene.name", "trv.type", "amino.acid.change")]
colnames(mutationData) <- c("sample", "gene", "variant_class", "amino.acid.change")

# Create a vector to save mutation priority order for plotting
mutation_priority <- as.character(unique(mutationData$variant_class))

# Create an initial plot
waterfall(mutationData, fileType = "Custom", variant_class_order=mutation_priority)

# Define a mutation hierarchy
mutationHierarchy <- c("nonsense", "frame_shift_del", "frame_shift_ins", "in_frame_del", "splice_site_del", "splice_site", "missense", "splice_region", "rna")

# define colours for all mutations
mutationColours <- c("nonsense"='#4f00A8', "frame_shift_del"='#A80100', "frame_shift_ins"='#CF5A59', "in_frame_del"='#ff9b34', "splice_site_del"='#750054', "splice_site"='#A80079', "missense"='#009933', "splice_region"='#ca66ae', "rna"='#888811')

# Find which samples are not in the mutationBurden data frame
# First, let's look at the sample names in the mutationData and mutationBurden
mutationData$sample
mutationBurden$sample

# Now, determine the non-overlap between these values
sampleVec <- unique(mutationData$sample)
sampleVec[!sampleVec %in% mutationBurden$sample]

# Fix mutationBurden to match mutationData
mutationBurden$sample <- gsub("^WU(0)+", "", mutationBurden$sample)

# Check for non-overlap again
sampleVec[!sampleVec %in% mutationBurden$sample]
# reformat clinical data to long format
library(reshape2)
clinicalData_2 <- clinicalData[,c(1,2,3,5)]
colnames(clinicalData_2) <- c("sample", "Months on Study", "Best Response", "Treatment Setting")
clinicalData_2 <- melt(data=clinicalData_2, id.vars=c("sample"))

# find which samples are not in the mutationBurden data frame
sampleVec <- unique(mutationData$sample)
sampleVec[!sampleVec %in% clinicalData$sample]

# fix mutationBurden to match mutationData
clinicalData_2$sample <- gsub("^WU(0)+", "", clinicalData_2$sample)

# create the waterfall plot
waterfall(mutationData, fileType = "Custom", variant_class_order=mutationHierarchy, mainPalette=mutationColours, mutBurden=mutationBurden, clinData=clinicalData_2, clinLegCol=3, clinVarCol=c('0-6'='#ccbadc', '6.1-12'='#9975b9', '12.1+'='#663096', 'Partial Response'='#c2ed67', 'Progressive Disease'='#E63A27', 'Stable Disease'='#e69127', '1'='#90ddee', '2'='#649aa6', '3+'='#486e77'), clinVarOrder=c('1', '2', '3+', 'Partial Response', 'Stable Disease', 'Progressive Disease', '0-6', '6.1-12', '12.1+'), section_heights=c(1, 5, 1), mainLabelCol="amino.acid.change", mainLabelSize = 3)
# Create a sample ordering
sample_ordering <- c("19", "5", "31", "22", "12", "2", "32", "8", "28", "18", "4", "24", "23", "17", "11", "14")

# Create a gene ordering
gene_ordering <- c("CDH1", "MALAT1", "RUNX1", "NCOR1", "GATA3", "FOXA1", "ESR1", "CBFB", "TBX3", "TAB1", "MED12", "XBP1", "TP53", "RB1CC1", "BRCA2", "ATM", "SMARCD1", "MLL3", "MLL2", "ARID1A", "FBXW7", "CAV1", "MAP3K1", "MAP2K4", "NOTCH4", "PDGFRA", "ERBB3", "ERBB2", "RELN", "MAGI3", "MTOR", "AKT2", "AKT1", "PTEN", "PIK3CA")

# Create a gene ordering
waterfall(mutationData, fileType = "Custom", variant_class_order=mutationHierarchy, mainPalette=mutationColours, mutBurden=mutationBurden, clinData=clinicalData_2, clinLegCol=3, clinVarCol=c('0-6'='#ccbadc', '6.1-12'='#9975b9', '12.1+'='#663096', 'Partial Response'='#c2ed67', 'Progressive Disease'='#E63A27', 'Stable Disease'='#e69127', '1'='#90ddee', '2'='#649aa6', '3+'='#486e77'), clinVarOrder=c('1', '2', '3+', 'Partial Response', 'Stable Disease', 'Progressive Disease', '0-6', '6.1-12', '12.1+'), section_heights=c(1, 5, 1), mainLabelCol="amino.acid.change", mainLabelSize=3, sampOrder=sample_ordering, geneOrder=gene_ordering)

 

GenVisR Bioconductor 페이지 바로가기

 

[Reference]

Skidmore, Zachary L., et al. “GenVisR: genomic visualizations in R.” Bioinformatics 32.19 (2016): 3012-3014.