![](https://i.imgur.com/0y2WqLA.png) # Filogenômica de *Utricularia* (seção *Utricularia*: Lentibulariaceae): uma possível história de evolução reticulada e estado de conservação de um grupo de plantas carnívoras ### FAPESP #20/11053-1 ## Análise de dados a partir de Genotype-by-Sequencing (GBS) Para a análise dos dados foi utilizado o pipeline ***ipyrad***, sendo que foram feitos testes a partir de montagem *de novo* e com referência. Ademais foram feitos testes com diferentes quantidades de *missing data*, modificando principalmente os parâmetros de quantidades mínimas de *loci* por população. Abaixo encontram-se as comparações mais interessantes para discussão do trabalho: O comando básico para todas as análises fora realizado a partir do comando: ```python!= ipyrad -f -p params-Utricularia.txt -s 1234567 ``` ## Criar "ramificação" da análise somente com as amostras de Utricularia foliosa (27 amostras) ```python= ipyrad -p params-Utricularia.txt -b Ufoliosa_T1 3336_2 3336_5 3376_1 3376_2 3376_3 3376_4 3376_6 3380_1 3380_2 3380_3 3380_5 pop1_10 pop1_11 pop1_12 pop1_13 pop1_14 pop1_15 pop1_2 pop1_6 pop1_7 pop1_8 pop1_9 pop5_1 pop5_2 pop5_3 pop5_4 pop5_5 ``` ## Criar "ramificação" da análise somente com as amostras de Utricularia gibba (56 amostras) ```python= ipyrad -p params-Utricularia.txt -b Ugibba 3301_1 3301_2 3301_3 3301_4 3301_5 3304_2 3307_1 3307_2 3309_2 3309_3 3309_4 3309_5 3309_6 3321_1 3321_2 3321_3 3321_4 3321_5 3322_1 3322_2 3322_3 3322_4 3322_5 3322_6 3322_7 3331_1 3331_2 3331_3 3334_3 3334_4 3335_1 3335_2 3335_3 3335_4 3337_1 3337_2 3337_4 3337_6 3337_7 3367_2 3367_3 3367_4 3367_5 3368_0 3379_1 3379_2 3379_5 3379_6 3382_1 3646_1 3646_2 3646_3 3646_4 3646_5 3646_6 3379_3 ``` ## Criar "ramificação" da análise somente com as amostras de Utricularia poconensis (5 amostras) ```python= ipyrad -p params-Utricularia.txt -b Upoconensis 2110_3 2110_1 3349_4 3349_5 3349_2 ``` ## Análises realizadas em *Utricularia foliosa* ![](https://i.imgur.com/i56yOUD.jpg) #### Arquivos "fundamentais" e comandos utilizados nas análises Para utilizar o pipeline do *ipyrad* para este trabalho utilizamos os arquivos: 1. com as referências dos barcodes [barcodes_path](https://drive.google.com/file/d/1IRSwgJgbU35-Y-7ngWW4YJLIwIzUhQfN/view?usp=sharing): 2. com identificação das amostras de acordo com as populações [pop_assign_file](https://drive.google.com/file/d/1CyPJzu1zw_3XlrPHqau0p6f3nDUmRRl5/view?usp=sharing): ``` ipyrad -f -p params-Ufoliosa_T1.txt -s 34567 ``` Sendo que as variações dos parâmetros para cada Teste foram feitas no arquivo "params-Ufoliosa_T*N*.txt". :::info Haja vista que *U. foliosa* é possivelmente uma espécie poliplóide modificamos o parâmetro [max_alleles_consens] = 2 para que a análise assuma os valores de heterozigozidade calculados pelo pipeline. [Dados de simulações de trabalhos anteriores ainda não publicados do laboratório de sistemática vegetal a partir de *likelihood* dos números cromossômicos dos ancestrais de *Utricularia* nos permitem inferir que *U.foliosa* deve ser poliplóide (n=21)](https://drive.google.com/file/d/1lw_QrxxQZHKwkJOMcd1PjayRZkK33G2V/view?usp=sharing) ::: | População | #indivíduos | Código | Localidade | | -------- | -------- | -------- | -------- | | 3336 | 2 | MC_SP_APA | APA Várzea, Mogi das Cruzes, SP | | 3376 | 5 | CG_MG |Campos Gerais, Minas Gerais | | 3380 | 4 | MC_SP_CR | Cerâmica, Mogi das Cruzes, SP | | pop1 | 11 | UB_SP | Ubarana, São Paulo | | pop5/2209 | 5 | MC_SP_BOTU| Botujuru, Mogi das Cruzes, SP | #### Teste 1: Montagem *de novo* sem limitação de quantidade mínima de *loci* Para este teste realizamos as análises sem referência, ou seja, com montagem *de novo* e clusterização das *reads* ###### Arquivo params-Ufoliosa_T1.txt: ```python!= ------- ipyrad params file (v.0.9.84)--------------------------------------- Ufoliosa ## [0] [assembly_name]: Assembly name. Used to name output directories for assembly steps /srv/projects/GBS/Analyses_new ## [1] [project_dir]: Project dir (made in curdir if not present) /srv/projects/GBS/RAW/EM89_GBS_Saura_S1_L001_R1_001.fastq ## [2] [raw_fastq_path]: Location of raw non-demultiplexed fastq files /srv/projects/GBS/Barcodes/Barcode_file.csv ## [3] [barcodes_path]: Location of barcodes file ## [4] [sorted_fastq_path]: Location of demultiplexed/sorted fastq files denovo ## [5] [assembly_method]: Assembly method (denovo, reference) ## [6] [reference_sequence]: Location of reference sequence file gbs ## [7] [datatype]: Datatype (see docs): rad, gbs, ddrad, etc. TGCAG, ## [8] [restriction_overhang]: Restriction overhang (cut1,) or (cut1, cut2) 5 ## [9] [max_low_qual_bases]: Max low quality base calls (Q<20) in a read 33 ## [10] [phred_Qscore_offset]: phred Q score offset (33 is default and very standard) 6 ## [11] [mindepth_statistical]: Min depth for statistical base calling 6 ## [12] [mindepth_majrule]: Min depth for majority-rule base calling 10000 ## [13] [maxdepth]: Max cluster depth within samples 0.85 ## [14] [clust_threshold]: Clustering threshold for de novo assembly 0 ## [15] [max_barcode_mismatch]: Max number of allowable mismatches in barcodes 2 ## [16] [filter_adapters]: Filter for adapters/primers (1 or 2=stricter) 35 ## [17] [filter_min_trim_len]: Min length of reads after adapter trim 4 ## [18] [max_alleles_consens]: Max alleles per site in consensus sequences 0.05 ## [19] [max_Ns_consens]: Max N's (uncalled bases) in consensus 0.05 ## [20] [max_Hs_consens]: Max Hs (heterozygotes) in consensus 1 ## [21] [min_samples_locus]: Min # samples per locus for output 0.2 ## [22] [max_SNPs_locus]: Max # SNPs per locus 8 ## [23] [max_Indels_locus]: Max # of indels per locus 0.5 ## [24] [max_shared_Hs_locus]: Max # heterozygous sites per locus 0, 0, 0, 0 ## [25] [trim_reads]: Trim raw read edges (R1>, <R1, R2>, <R2) (see docs) 0, 0, 0, 0 ## [26] [trim_loci]: Trim locus edges (see docs) (R1>, <R1, R2>, <R2) * ## [27] [output_formats]: Output formats (see docs) /home/srsilva/GBS/Populations_ref_new/Pop_fileUfoliosa_T1.csv ## [28] [pop_assign_file]: Path to population assignment file ## [29] [reference_as_filter]: Reads mapped to this reference are removed in step 3 ``` #### Teste 2: Montagem *de novo* com limitação de quantidade mínima de *loci* Para este teste limitamos a quantidade de *loci* a serem considerados por população em 4 *loci* e 2 *loci* para a população identificada como <i>3336</i>, já que conseguimos amostrar somente 2 indivíduos dessa população. Com a modificação deste parâmetro restringimos mais a análise, permitindo a construção de matrizes com menos dados faltantes e possívelmente menor quantidade de *loci* com potencial de serem falsos positivos, já que ele deverá aparecer em pelo menos 4 indivíduos por população. ###### Arquivo params-Ufoliosa_T2.txt: Para agregar o parâmetro acima, fizemos a seguinte modificação na última linha do arquivo [pop_assign_file]: ```python!= # pop1:2 pop2:4 pop3:4 pop4:4 pop5:4 ``` #### Outros testes Também fora feito o teste sem a população 3336, haja vista que só há 2 indivíduos sequenciados até o momento, sontudo a retirada dessa população não permitiu grande aumento do resgate de loci das demais amostras, portanto optou-se por manter essa população para as análises atuais, sendo que serão realizados mais extrações de indivíduos desta mesma população para incorporar na análise numa próxima etapa. #### Teste 3: Montagem **com referência** sem limitação de quantidade mínima de *loci* :::danger Para as análises com genoma referência, utilizamos a montagem dos genomas nuclear (artigo em desenvolvimento) e cloropastidial (publicado em Silva et al., 2017) que foi feita a partir de sequenciamento *genome skimming* de dados produzidos no projeto FAPESP #18/02285-6 ::: ###### Arquivo params-Ufoliosa_T3.txt: Para agregar o genoma referência, modificamos os parâmetros no arquivo **param-Ufoliosa_T3.txt**: ```python!= reference ## [5] [assembly_method]: Assembly method (denovo, reference) /srv/projects/GBS/reference/Ufoliosa/Ufoliosa_nuclear.fas ## [6] [reference_sequence]: Location of reference sequence file ``` #### Teste 4: Montagem **com referência** com limitação de quantidade mínima de *loci* Para agregar o parâmetro acima, fizemos a seguinte modificação na última linha do arquivo [pop_assign_file]: ```python!= # pop1:2 pop2:4 pop3:4 pop4:4 pop5:4 ``` ###### Arquivo params-Ufoliosa_T4.txt: ##### Resultados da análise ## Análises realizadas em *Utricularia gibba* ![](https://i.imgur.com/EaGrEeF.jpg) Para as análises com referências, foram feitos testes tanto com o genoma nuclear de Ibarra-Laclette et al. (2013), que foi montado com *reads* curtos, como o genoma de Lan et al. (2017), que fora montado com *reads* longos. Os melhores resultados foram obtidos com o genoma de Lan et al. (2017), sendo estes os apresentados abaixo: | População | Número de indivíduos| Código | Localidade | | -------- | -------- | -------- | -------- | | 3301| 5|AT/MS|Aparecida do Taboado (MS)| | 3304| 1|CH/GO|Chapadão do Céu (GO)| | 3307| 2|POC_BR/MT|Poconé (MT) - Barrinha| | 3309| 5|SON/MS|Sonora (MS)| | 3321| 5|POC_PI/MT|Poconé (MT) - Pixaim| | 3322| 6|AQUI/MS|Aquidauana (MS)| | 3331| 3|NA/MS|Nova Andradina (MS)| | 3334| 2|PL/SP|Planalto (SP)| | 3335| 4|MC_APA/SP|Mogi das Cruzes (SP) - APA Várzea do Rio Tietê| | 3337| 5|SA/SP|Sales (SP)| | 3367| 4|CA/MG|Carrancas (MG) - Cachoeira da Zilda| | 3368| 1|CA2/MG|Carrancas (MG) - Cascata do Índio| | 3379| 5|MC_CR/SP|Mogi das Cruzes (SP) - Cerâmica| | 3382| 1|BI/SP|Biritiba Mirim (SP), entrada da trilha para a Pedra do Garrafão| | 3646| 6|SA2/SP|Sales (SP)| #### Arquivos "fundamentais" e comandos utilizados nas análises Para utilizar o pipeline do *ipyrad* para este trabalho utilizamos os arquivos: 1. com as referências dos barcodes [barcodes_path](https://drive.google.com/file/d/1IRSwgJgbU35-Y-7ngWW4YJLIwIzUhQfN/view?usp=sharing): 2. com identificação das amostras de acordo com as populações [pop_assign_file](https://drive.google.com/file/d/1abWfCRYVvplrnIv_h14U6oT1qjUzd9e3/view?usp=sharing): O comando básico para todas as análises fora realizado a partir do comando: ```python!= ipyrad -f -p params-Ugibba.txt -s 1234567 ``` Sendo que as variações dos parâmetros para cada Teste foram feitas no arquivo "params-Ugibba_T*N*.txt". :::info Haja vista que *U. gibba* é possivelmente uma espécie diplóide ([Ibarra-Laclette et al., 2013](https://www.nature.com/articles/nature12132)) modificamos o parâmetro [max_alleles_consens] = 2 para que a análise assuma os valores de heterozigozidade calculados pelo pipeline. ::: #### Teste 1: Montagem *de novo* sem limitação de quantidade mínima de *loci* Para este teste realizamos as análises sem referência, ou seja, com montagem *de novo* e clusterização das *reads* ###### Arquivo params-Ugibba_T1.txt: ```python!= ------- ipyrad params file (v.0.9.84)------------------------------------------- Ugibba ## [0] [assembly_name]: Assembly name. Used to name output directories for assembly steps /srv/projects/GBS/Analyses ## [1] [project_dir]: Project dir (made in curdir if not present) /srv/projects/GBS/RAW/EM89_GBS_Saura_S1_L001_R1_001.fastq ## [2] [raw_fastq_path]: Location of raw non-demultiplexed fastq files /srv/projects/GBS/Barcodes/Barcode_file.csv ## [3] [barcodes_path]: Location of barcodes file ## [4] [sorted_fastq_path]: Location of demultiplexed/sorted fastq files denovo ## [5] [assembly_method]: Assembly method (denovo, reference) ## [6] [reference_sequence]: Location of reference sequence file gbs ## [7] [datatype]: Datatype (see docs): rad, gbs, ddrad, etc. TGCAG, ## [8] [restriction_overhang]: Restriction overhang (cut1,) or (cut1, cut2) 5 ## [9] [max_low_qual_bases]: Max low quality base calls (Q<20) in a read 33 ## [10] [phred_Qscore_offset]: phred Q score offset (33 is default and very standard) 6 ## [11] [mindepth_statistical]: Min depth for statistical base calling 6 ## [12] [mindepth_majrule]: Min depth for majority-rule base calling 10000 ## [13] [maxdepth]: Max cluster depth within samples 0.85 ## [14] [clust_threshold]: Clustering threshold for de novo assembly 0 ## [15] [max_barcode_mismatch]: Max number of allowable mismatches in barcodes 2 ## [16] [filter_adapters]: Filter for adapters/primers (1 or 2=stricter) 35 ## [17] [filter_min_trim_len]: Min length of reads after adapter trim 2 ## [18] [max_alleles_consens]: Max alleles per site in consensus sequences 0.05 ## [19] [max_Ns_consens]: Max N's (uncalled bases) in consensus 0.05 ## [20] [max_Hs_consens]: Max Hs (heterozygotes) in consensus 1 ## [21] [min_samples_locus]: Min # samples per locus for output 0.2 ## [22] [max_SNPs_locus]: Max # SNPs per locus 8 ## [23] [max_Indels_locus]: Max # of indels per locus 0.5 ## [24] [max_shared_Hs_locus]: Max # heterozygous sites per locus 0, 0, 0, 0 ## [25] [trim_reads]: Trim raw read edges (R1>, <R1, R2>, <R2) (see docs) 0, 0, 0, 0 ## [26] [trim_loci]: Trim locus edges (see docs) (R1>, <R1, R2>, <R2) * ## [27] [output_formats]: Output formats (see docs) ## /home/srsilva/GBS/Populations_ref/Pop_fileUgibba.csv ## [28] [pop_assign_file]: Path to population assignment file ## [29] [reference_as_filter]: Reads mapped to this reference are removed in step 3 ``` ###### Resultados de Ugibba_T1: O programa ipyrad gera um relatório resumido dos resultados [Ugibba_T1_stats.txt](https://drive.google.com/file/d/1p-23K2KfFh3_pbZKQj_UCwpWgpD5B-Ew/view?usp=sharing). Os resultados das filtragem propostas no T1 originaram matrizes de 56 amostras (todos os indivíduos sequenciados) com **1,613,061 SNPs**, sendo que esta matriz de SNPs possui **93,46%** de dados faltantes (missing sites). E matriz de sequências com **35,920,916 nucleotídeos** com **93,46%** de dados faltantes. ###### Resultados de Ugibba_T2: O **teste T2** foi realizado com a modificação dos seguintes parâmetros: retirar as amostras com 1 indivíduo, sendo assim, das 56 amostras iniciais de *U. gibba* retiramos as amostras 3304, 3368 e 3382; e cada população deve indicar pelo menos 2 *loci* em comum entre os indivíduos para ser considerado válido Os resultados das filtragens propostas por T2 originaram matrizes de 53 amostras com **9,988 SNPs**, sendo que esta matriz possui **7,37%** de dados faltantes. E a matriz de sequências com **423,152 nucleotídeos**, com **6,02%** de dados faltantes ###### Resultados de Ugibba_T3: O **teste T3** foi realizado com a modificação dos seguintes parâmetros: retirar as amostras com 2 indivíduos ou menos, sendo assim, das 56 amostras iniciais retiramos as amostras 3304, 3368, 3382, 3307 e 3334; e cada população deve indicar pelo menos 2 *loci* em comum entre os indivíduos para ser considerado válido. Os resultados das filtragens propostas por T3 originaram matrizes de 49 amostras com **10,617 SNPs**, sendo que esta matriz possui **8,22%** de dados faltantes. E a matriz de sequências com **452,800 nucleotídeos**, com **6,91%** de dados faltantes ###### Resultados de Ugibba_T4: Os testes seguintes foram feitos com genoma de referência ([Lan et al., 2017](https://www.pnas.org/doi/10.1073/pnas.1702072114)). ### Para gerar o INPUT do Arlequin :::info Estes scripts foram retirados e modificados a partir do sítio: [Banta Labs](https://sites.google.com/site/thebantalab/tutorials) ::: Para calcularmos as Fst nós utilizamos o pragram Arlequin, contudo, a matriz de SNPs tem que ser formatada de acordo para realizar tal análise, sendo assim nós executamos o script em R no Rstudio: ```R! #set your working directory! #install.packages("ape") library(ape) #to get arlequin format # read in data dat <- read.dna("Ugibba_ref_nuclear.snps2.fas", format = "fasta") dat.matrix <- read.dna("Ugibba_ref_nuclear.snps2.fas", format = "fasta", as.character = TRUE) if(file.exists("output.arp")){file.remove("output.arp")} outfile <- cbind(1,rownames(dat.matrix)) colnames(outfile) <- c("group", "name") write.csv(outfile, "companion data initial.csv", row.names = FALSE) dat.matrix[dat.matrix == "-"] <- "?" dat.matrix[dat.matrix == "N"] <- "?" dat.matrix[dat.matrix == "n"] <- "?" x2 <- dat.matrix colnames(x2) <- paste("locus", seq(ncol(x2)), sep = "") x3 <- rbind(x2, x2) row.names(x3) <- NULL x3 <- cbind(x3, 1) colnames(x3)[ncol(x3)] <- "pop" for(i in 1:nrow(x2)){ x3[((2*i)-1), 1:(ncol(x3)-1)] <- x2[i,] x3[((2*i)), 1:(ncol(x3)-1)] <- x2[i, ] x3[((2*i)-1),"pop"] <- rownames(x2)[i] x3[((2*i)),"pop"] <- rownames(x2)[i] } x4 <- as.matrix(x3) is.odd <- function(x) x %% 2 != 0 is.even <- function(x) x %% 2 == 0 for(i in 1:(ncol(x4)-1)){ for(j in 1:nrow(x4)){ if(!is.na(x4[j,i])){ if(x4[j,i] == "y"){ if(is.odd(j)){ x4[j,i] <- "c" }else{ x4[j,i] <- "t" } } if(x4[j,i] == "r"){ if(is.odd(j)){ x4[j,i] <- "a" }else{ x4[j,i] <- "g" } } if(x4[j,i] == "w"){ if(is.odd(j)){ x4[j,i] <- "a" }else{ x4[j,i] <- "t" } } if(x4[j,i] == "s"){ if(is.odd(j)){ x4[j,i] <- "c" }else{ x4[j,i] <- "g" } } if(x4[j,i] == "k"){ if(is.odd(j)){ x4[j,i] <- "t" }else{ x4[j,i] <- "g" } } if(x4[j,i] == "m"){ if(is.odd(j)){ x4[j,i] <- "c" }else{ x4[j,i] <- "a" } } } } } rownames(x4) <- x4[,"pop"] x4 <- x4[order(rownames(x4)),] x5 <- x4[,-which(colnames(x4) == "pop")] x6 <- NULL for(i in 1:nrow(x5)){ x6 <- rbind(x6, noquote((paste(x5[i,], collapse = " ")))) } names(x6) <- rownames(x5) if(file.exists("companion data.csv")){cdata <- read.csv("companion data.csv")}else{cdata <- read.csv("companion data initial.csv")} crlf <- "\r\n" outfile = "output.arp" cat('[Profile]', file=outfile, append=FALSE, crlf) cat('', file=outfile, append=TRUE, crlf) cat('Title="data"', file=outfile, append=TRUE, crlf) write.table(paste("NBSamples=",length(table(cdata[,1])), sep = ""), append = TRUE, "output.arp", row.names = FALSE, col.names = FALSE, quote = FALSE, crlf) cat("", file=outfile, append=TRUE, crlf) cat('DataType=DNA', file=outfile, append=TRUE, crlf) cat('GenotypicData=1', file=outfile, append=TRUE, crlf) cat('GameticPhase=0', file=outfile, append=TRUE, crlf) cat('LocusSeparator=WHITESPACE', file=outfile, append=TRUE, crlf) cat("", file=outfile, append=TRUE, crlf) cat("[Data]", file=outfile, append=TRUE, crlf) cat("[[Samples]]", file=outfile, append=TRUE, sep = "") for(i in 1:length(names(table(cdata[,1])))){ cat("", file=outfile, append=TRUE, crlf) cat("", file=outfile, append=TRUE, crlf) cat('SampleName=', file=outfile, append=TRUE, sep = "") write.table(names(table(cdata[,1]))[i], append = TRUE, "output.arp", row.names = FALSE, col.names = FALSE, quote = TRUE, sep = "", crlf) write.table(paste('SampleSize=', length(which(tolower(cdata[,1]) == tolower(names(table(cdata[,1])))[i])), sep = ""), append = TRUE, "output.arp", row.names = FALSE, col.names = FALSE, quote = FALSE, sep = "", crlf) cat('SampleData={', file=outfile, append=TRUE, sep = "") cat("", file=outfile, append=TRUE, crlf) cdata.sub <- cdata[which(tolower(cdata[,1]) == tolower(names(table(cdata[,1]))[i])),] for(j in 1:nrow(cdata.sub)){ cat("", file=outfile, append=TRUE, crlf) x6.sub <- x6[which(names(x6) == cdata.sub[j,2])] write.table(paste(tolower(cdata.sub[j,2]), 1, toupper(x6.sub[1]), sep = " "), append = TRUE, "output.arp", row.names = FALSE, col.names = FALSE, quote = FALSE, sep = "", crlf) write.table(toupper(x6.sub[2]), append = TRUE, "output.arp", row.names = FALSE, col.names = FALSE, quote = FALSE, sep = "", crlf) } cat("", file=outfile, append=TRUE, crlf) cat('}', file=outfile, append=TRUE, sep = "") } cat('', file=outfile, append=TRUE, crlf) cat('', file=outfile, append=TRUE, crlf) cat('[[Structure]]', file=outfile, append=TRUE, crlf) cat('StructureName="Test"', file=outfile, append=TRUE, crlf) cat('NbGroups=1', file=outfile, append=TRUE, crlf) cat('', file=outfile, append=TRUE, crlf) cat('Group={', file=outfile, append=TRUE, crlf) cat('', file=outfile, append=TRUE, crlf) for(i in 1:length(names(table(cdata[,1])))){ write.table(names(table(cdata[,1]))[i], append = TRUE, "output.arp", row.names = FALSE, col.names = FALSE, quote = TRUE, sep = "", crlf) } cat('', file=outfile, append=TRUE, crlf) cat('}', file=outfile, append=TRUE, sep = "") ``` Após executar nós editamos o arquivo **companion data initial.csv** para atribuirmos as populações aos indivíduos e salvamos o arquivo com o nome **"companion data.csv"** e executamos novamente o mesmo script anterior. Que vai produzir um arquivo **.arp**. Este arquivo é o arquivo de entrada para o Arlequin. ### Cálculo do FST pairwise Para calcularmos o FST nós carregamos o arquivo de entrada no Arlequin e usamos as opções Settings -> Population comparisons. Mudamos a opção "Nos of permutations" para aumentarmos o número de permutas da análise para 10000: ![](https://i.imgur.com/5qr5gQ4.png) E apertamos **"Start"** ### Gráfico para visualizar os FSTs Para a fácil visualização dos resultados par-a-par nós geramos um HeatMap a partir do script R: ```R!= #This script comes from: https://nicolawongwaiyee.wordpress.com/2017/01/24/extract-fst-mat-data-from-arlequin-xml-output/ #pkg_list = c("XML","corrplot","magrittr","dplyr") #check_pkg <- function(pkg){ # if(!require(pkg)){ # install.packages(pkg) # } #} #lapply(pkg_list,check_pkg) #Load the packages lapply(pkg_list,require,character.only=TRUE) arqxml <- xmlParse("output.xml") arq_fstmat <- xpathSApply(arqxml,"//PairFstMat",xmlValue) %>% as.vector() arq_fstmat <-strsplit(arq_fstmat,"\n") arq_fstmat_mt <- do.call(cbind,arq_fstmat[1]) arq_fstmat_mt %<>% subset(arq_fstmat_mt[,1] != "") arq_fstmat_mt <- gsub(" + "," ",arq_fstmat_mt) arq_fstmat_mt <- strsplit(arq_fstmat_mt," ") try(arq_fstmat_mt <- do.call(rbind,arq_fstmat_mt)) arq_fstmat_mt <- arq_fstmat_mt[3:nrow(arq_fstmat_mt),3:ncol(arq_fstmat_mt)] #Full matrix arq_fstmat_mt[upper.tri((arq_fstmat_mt))] <- t(arq_fstmat_mt)[upper.tri(arq_fstmat_mt)] diag(arq_fstmat_mt) <-0 arq_rowname <- xpathSApply(arqxml,"//pairDistPopLabels",xmlValue) %>% strsplit("\n") arq_rowname <- do.call(cbind,arq_rowname) arq_rowname <- gsub("+\\d+:\t","",arq_rowname) arq_rowname <- arq_rowname[5:nrow(arq_rowname)] %>% as.vector() arq_fstmat_mt %<>% apply(c(1,2),as.numeric) rownames(arq_fstmat_mt) <- arq_rowname colnames(arq_fstmat_mt) <- arq_rowname #Now the matrix looks... arq_fstmat_mt[1:5,1:5] write.csv(arq_fstmat_mt, "arq_fstmat_mt.csv") arq_fstmat_mt[arq_fstmat_mt<0] <- 0 fstmat_plot <- corrplot(arq_fstmat_mt,method="color",type="lower",na.label = " ", tl.col="black",tl.srt=8,order="FPC",cl.lim = c(0,1)) #for p-values arq_fstp <- xpathSApply(arqxml,"//PairFstPvalMat",xmlValue) %>% as.vector() arq_fstp<-strsplit(arq_fstp,"\n") arq_fstp <- do.call(cbind,arq_fstp[1]) arq_fstp %<>% subset(arq_fstp[,1] != "") arq_fstp <- gsub(" + "," ",arq_fstp) arq_fstp <- strsplit(arq_fstp," ") try(arq_fstp <- do.call(rbind,arq_fstp)) arq_fstp <- arq_fstp[2:nrow(arq_fstp),3:ncol(arq_fstp)] arq_fstp[upper.tri(arq_fstp)] <-NA diag(arq_fstp) <- 0 #Remove the SD of pvalue arq_fstp <- gsub(" ","",arq_fstp) arq_fstp <- gsub("\\+.*","",arq_fstp) write.csv(arq_fstp, "arq_fstp.csv") #Full matrix arq_fstp[upper.tri(arq_fstp)] <- t(arq_fstp)[upper.tri(arq_fstp)] rownames(arq_fstp) <- arq_rowname colnames(arq_fstp) <- arq_rowname arq_fstp %<>% apply(c(1,2),as.numeric) #FstMat with insig p-value mark corrplot(arq_fstmat_mt,method="color",type="lower",na.label = " ", tl.col="black",tl.srt=10,order="FPC",cl.lim = c(0,1), p.mat = arq_fstp,sig.level = 0.05,insig="pch",pch.cex = 1,pch.col = "#6b717a") ``` :::info As vezes o Arlequin produz esse resultado junto com o correto: ``` <A NAME="27_01_23at17_28_21_gr_pairw_diff"></A> <data> ====================================================================================== == Comparisons of pairs of population samples ====================================================================================== List of labels for population samples used below: ------------------------------------------------- </data> <pairDistPopLabels time="27/01/23 at 17:28:21"> Label Population name ----- --------------- 1: Group1 </pairDistPopLabels> <data> ------------------------ Population pairwise FSTs ------------------------ </data> <PairFstMat time="27/01/23 at 17:28:21"> Distance method: Pairwise difference 1 1 0.00000 </PairFstMat> <data> ------------ FST P values ------------ Number of permutations : 10100 </data> <PairFstPvalMat time="27/01/23 at 17:28:21"> 1 1 * </PairFstPvalMat> <data> ------------ Matrix of significant Fst P values Significance Level=0.05000 ------------ Number of permutations : 10100 1 1 </data> ``` Caso acontecer, retirar esse pedaço do arquivo XML. :::