bioinfo:itol에서_annotated_tree_만들기
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
bioinfo:itol에서_annotated_tree_만들기 [2023/08/11 16:54] – [트리 자료의 준비] hyjeong | bioinfo:itol에서_annotated_tree_만들기 [2023/08/17 09:06] (current) – [BSR matrix의 heatmap 표현] hyjeong | ||
---|---|---|---|
Line 5: | Line 5: | ||
===== 트리 자료의 준비 ===== | ===== 트리 자료의 준비 ===== | ||
- | 업로드 가능한 트리 자료는 텍스트로 이루어진 Newick, Nexus 또는 PhyloXML 포맷의 파일이다. Roary에서 얻어진 core gene의 다중 서열 정렬 결과물을 FastTree로 처리하여 얻은 트리 파일 또는 ANI 분석물을 가공하여 얻은 트리 파일을 전부 이용할 수 있다. 후자의 경우 선행 분석 프로그램으로부터 쌍 혹은 매트릭스 형태의 ANI 자료를 얻게 되는데, 이로부터 트리 자료를 만들어 내려면 R을 사용해야 한다. 이번 실습에서는 pyani에서 | + | 업로드 가능한 트리 자료는 텍스트로 이루어진 Newick, Nexus 또는 PhyloXML 포맷의 파일이다. Roary에서 얻어진 core gene의 다중 서열 정렬 결과물을 FastTree로 처리하여 얻은 트리 파일 또는 ANI 분석물을 가공하여 얻은 트리 파일을 전부 이용할 수 있다. 후자의 경우 선행 분석 프로그램으로부터 쌍 혹은 매트릭스 형태의 ANI 자료를 얻게 되는데, 이로부터 트리 자료를 만들어 내려면 R을 사용해야 한다. 이번 실습에서는 pyani를 사용하여 |
+ | > library(ape) | ||
+ | # check=F는 행과 열의 라벨이 원본 파일에 있는 그대로 쓰이게 만든다. | ||
+ | # 그렇지 않으면 R이 라벨 내의 공백을 밑줄로 바꾸거나 숫자로 시작하는 라벨을 | ||
+ | # 수정하는 일이 벌어진다. | ||
+ | ani = read.table(" | ||
+ | | ||
+ | # gsub() 함수를 이용하여 행과 열 라벨에서 불필요한 텍스트를 제거한다. | ||
+ | # 실제 상황에 맞게 함수를 적용해야 한다. | ||
+ | > colnames(ani) = gsub(" | ||
+ | > rownames(ani) = gsub(" | ||
+ | | ||
+ | # 계층적 클러스터링 방법 중 average 메소드는 흔히 UPGMA라 불리는 것이다. | ||
+ | # 결과를 newick 포맷으로 저장한다. | ||
+ | fit = hclust(dist(as.matrix(ani)), | ||
+ | plot(fit, | ||
+ | my_tree = as.phylo(fit) | ||
+ | write.tree(phy=my_tree, | ||
+ | | ||
+ | # average 메소드는 흔히 UPGMA라 불리는 것이다. | ||
+ | fit = hclust(dist(as.matrix(ani)), | ||
+ | plot(fit, | ||
+ | my_tree = as.phylo(fit) | ||
+ | write.tree(phy=my_tree, | ||
+ | | ||
+ | # 데이터를 tree에 나타난 라벨 순서대로, | ||
+ | label_sorted = fit$labels[c(fit$order)] | ||
+ | ani.sorted = ani[, | ||
+ | ani.sorted = ani.sorted[label_sorted, | ||
+ | | ||
+ | # 데이터의 저장 I: 라벨만 수정한 데이터프레임 | ||
+ | write.table(ani," | ||
+ | | ||
+ | # 데이터의 저장 II: 클러스터링된 순서대로 정렬 | ||
+ | write.table(ani.sorted," | ||
+ | | ||
+ | # 클러스터를 나누기 위해 다시 plot() 함수를 써서 시각화 | ||
+ | plot(fit, | ||
+ | | ||
+ | # 5개의 클러스터로 나눈다. | ||
+ | rect.hclust(fit, | ||
+ | | ||
+ | # 각 클러스터의 멤버를 추출한다. | ||
+ | groups = cutree(fit, | ||
+ | table(groups) | ||
+ | names(groups[groups==1]) | ||
+ | 이상의 과정에서 얻어진 ANI_UPGMA.newick을 iTOL에 업로드한 뒤 다음과 같은 형태로 준비된 labels.txt 파일을 마우스로 드래그하여 넣으면 제대로 라벨이 표시된다. | ||
+ | |||
+ | LABELS | ||
+ | | ||
+ | SEPARATOR COMMA | ||
+ | | ||
+ | DATA | ||
+ | | ||
+ | GCF_001956155.1, | ||
+ | GCF_000146875.3, | ||
+ | GCF_000217775.1, | ||
+ | GCF_000520755.1, | ||
+ | GCF_000520795.1, | ||
+ | ... | ||
+ | |||
+ | labels.txt 파일을 만드는 방법은 비교적 쉽다. 실습용 zip 파일의 압축을 해제하였을 때 나오는 accessions.txt 파일을 ncbi-genome-download(' | ||
+ | |||
+ | $ ncbi-genome-download -A accessions.txt -n bacteria | ||
+ | |||
+ | 실제로 이 명령을 실행해 보면 accessions.txt에 수록된 51개 genome 중 50개에 대한 정보만이 반환될 것이다(2022-08-11 기준). 이는 [[https:// | ||
===== Heatmap 자료의 표현 ===== | ===== Heatmap 자료의 표현 ===== | ||
+ | Heamap 데이터셋에서는 각 노드에 연결된 복수의 수치 자료(필드, | ||
+ | |||
+ | 수치는 annotation file([[https:// | ||
+ | |||
+ | 앞 과정에서 만들었던 ANIm_modified_labels_sorted.csv를 heatmap으로 표현하는 방법을 알아보자. 컬럼/로 라벨은 전부 assembly accession(예: | ||
+ | |||
+ | # 이전 작업 내용을 지운다. | ||
+ | > rm(list=ls()) | ||
+ | | ||
+ | > ani = read.table(" | ||
+ | > data = read.table(" | ||
+ | > key = data[,1] | ||
+ | > names(key) = data[,2] | ||
+ | | ||
+ | # 만약 일부의 컬럼만 취하고 싶다면 해당되는 accession number를 수록한 벡터(key2)를 만들고 | ||
+ | # 컬럼 라벨을 바꾸기 전에 다음을 실행한다. | ||
+ | > key2 = c(" | ||
+ | | ||
+ | > ani.subset = ani[, | ||
+ | | ||
+ | # key2 벡터에 들어갈 값이 너무 많아서 별도의 텍스트 파일(data.txt)에 line-by-line | ||
+ | # 형태로 들어 있다면, 이를 읽어들여서 처리하면 된다. | ||
+ | # data.txt 파일이 multi-column file이라면 $V2, $V3..을 붙여넣어 지정한다. | ||
+ | > key2 = read.table(“data.txt”, | ||
+ | # 꼭 which(colnames() %in% ) 구문을 쓰지 않아도 된다. 다음과 같이 하면 | ||
+ | # key2 벡터에 출현하는 순서대로 컬럼 이름이 정렬되는 효과를 갖는다. | ||
+ | > ani.subset = ani[,key2] | ||
+ | | ||
+ | # key2의 순서에 맞게 컬럼을 정렬한다. | ||
+ | > ani.subset = ani.subset[, | ||
+ | | ||
+ | # column name substitution using named vector(" | ||
+ | > for (i in names(ani)) { | ||
+ | temp = names(key)[key==i] | ||
+ | names(ani)[names(ani)==i] = temp | ||
+ | } | ||
+ | | ||
+ | > for (i in names(ani.subset)) { | ||
+ | temp = names(key)[key==i] | ||
+ | names(ani.subset)[names(ani.subset)==i] = temp | ||
+ | } | ||
+ | | ||
+ | > write.table(ani," | ||
+ | > write.table(ani.subset," | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | 이상의 방법에서는 ANI 매트릭스를 미리 정렬해 두고 iTOL에서도 그대로 표현되게 하느라 상당히 공을 들였다. 행 단위의 정렬은 iTOL에 최초로 업로드한 트리 자료를 따르게 되므로, 여기에서 설명한 정렬이란 열(컬럼) 단위, 즉 수치화된 필드의 정렬을 의미한다. 그런데 열 단위의 정렬 정보를 별도의 트리 파일로 보유하고 있다면 이를 heatmap.txt 데이터 파일에 넣는 것으로 작업이 단순해진다(FIELD_TREE 항목). 단, 콤마가 섞인 newick format의 자료가 데이터 파일에 포함되므로 field separator는 콤마가 아닌 것으로 바꾸어야 하고, leaf label에는 괄호 등이 들어가지 않게 유의해야 한다. 또한 newick file의 leaf label은 field label과 같아야 한다. 다시 말해서 GCA_ 또는 GCF_(assembly accession)로 시작하는 파일명을 지닌 유전체 염기서열을 이용하여 ANI 매트릭스를 만들었고 이것으로부터 hierarchical clustering을 하여 newick file을 만들게 되면 당연히 assembly accession이 leaf label이 될 것이다. 그러나 iTOL annotated tree에서 heatmap 데이터의 필드를 assembly accession으로 표현하고 싶지는 않을 것이다. 따라서 accession-label.txt 파일을 참조하여 assembly accession을 균주명 등의 정보로 치환하는 것이 바람직하다. 그러나 괄호나 콜론 등 균주명에서는 허용될지라도 newick 파일에서는 특수한 용도로 쓰이는 문자는 다른 것으로 치환해야 하니 세심한 작업이 필요하다. | ||
+ | |||
+ | |||
+ | | ||
===== BSR matrix의 heatmap 표현 ===== | ===== BSR matrix의 heatmap 표현 ===== | ||
+ | LS-BSR에서 얻어진 마커 유전자에 대한 blast score ratio 매트릭스도 마찬가지 방법으로 정리하여 iTOL에서 heatmap 데이터셋으로 표현할 수 있다. LS-BSR의 설치 및 일반적인 사용 방법은 본 매뉴얼 내의 [[bioinfo: | ||
앞에서 설명한 ANI 매트릭스는 column/ | 앞에서 설명한 ANI 매트릭스는 column/ | ||
+ | > bsr = read.table(" | ||
+ | > bsr.t = t(bsr) | ||
+ | # 자료 구조 확인용 | ||
+ | > dim(bsr.t) | ||
+ | > View(bsr.t) | ||
+ | > row.names(bsr.t) = gsub(" | ||
+ | > write.table(bsr.t, | ||
+ | 컬럼으로 전환된 마커 유전자의 순서는 markers.fasta(or .pep) 파일에 있던 것과 달라질 수 있다. 아마도 LS-BSR 프로그램 내부에서 FASTA 파일의 서열 ID를 추출하여 문자열 기준으로 다시 정렬을 하는 것으로 보인다. 원래 상태로의 재정렬이 필요하다면 R 환경에서 하는 것이 좋을 것이다. 바로 위의 “Heatmap 자료의 표현” 항목에서 컬럼의 일부만을 추출하는 방법을 참고하기 바란다. | ||
+ |
bioinfo/itol에서_annotated_tree_만들기.1691740474.txt.gz · Last modified: by hyjeong