BayPass - Identification of outlier SNPs

Published

May 3, 2024

In this document, we identify candidate SNPs using the gene-environment association analysis provided by the BayPass software.

In previous analyses based on a subset of the genomic data (i.e. only SNPs genotyped in the Infinium assay, that is 5,165 SNPs), we found that the results of the standard covariate model were more robust using the Important Sampling (IS) approximation (default) than with the MCMC algorithm. So we only use the IS approximation in this document.

Load and format data

Genomic data

We use the imputed genomic datasets, in which the imputation of missing data wad done using the most common allele at each SNP within the main gene pool of the clone (see report 1_FormattingGenomicData.Rmd).

Importantly, we estimate the population covariance matrix with the genomic dataset with minor allele frequencies (MAF) because MAF can be important to estimate the population genetic structure.

Then we identify the candidate SNPs with a genomic dataset without MAF.

The genomic data for BayPass needs to be allele counts for each SNP in each of the population and has to be stored in a .txt file.

Code
# Function to count the second allele
count_2nd_allele <- function(x) {2*length(x)-sum(x)}

# We generate the genomic data in BayPass format
lapply(c("withoutmaf","withmaf"), function(x){
  
geno <- read.csv(here(paste0("data/DryadRepo/ImputedGenomicData_AlleleCounts_",x,".csv")),
                          row.names = 1) %>% 
  t() %>% 
  as.data.frame() %>% 
  mutate(prov=str_sub(row.names(.),1,3)) %>% 
  dplyr::select(prov,everything()) %>% 
  group_by(prov) %>% 
  dplyr::summarize_all(.funs=c('sum', 'count_2nd_allele')) # calculate allele counts per population


# Counts of the minor allele
dfsum1  <- geno %>% 
  column_to_rownames(var="prov") %>% 
  dplyr::select(contains("sum")) %>%  
  t() 

# counts of the major allele
dfsum2  <- geno %>% 
  column_to_rownames(var="prov") %>% 
  dplyr::select(contains("count")) %>%  
  t() 

colnames(dfsum1) <- paste0(geno$prov,"1")
colnames(dfsum2) <- paste0(geno$prov,"2")

rownames(dfsum1) <- str_sub(rownames(dfsum1),1,-5)
rownames(dfsum2) <- str_sub(rownames(dfsum2),1,-18)

# identical(rownames(dfsum1), rownames(dfsum2)) # to check that the rownames (SNP names) are the same and in the same order

cbind(dfsum1,dfsum2) %>% 
  as_tibble %>% 
  dplyr::select(sort(tidyselect::peek_vars())) %>% 

# We save the files in the format required by BayPass
write.table(file = here(paste0("data/BayPassAnalysis/GenomicInputBayPass_",x,".txt")), 
            sep = " ",
            row.names = FALSE, 
            col.names = FALSE) # works either with .txt or no extension
  
})

Climatic data

We load the population-specific climatic information for the climatic variables of interest.

Code
# Which set of climatic variables are we going to use?
clim_var <- readRDS(here("data/ClimaticData/NamesSelectedVariables.rds"))

# we load the population-specific climatic data of the climatic variables of interest
source(here("scripts/functions/generate_scaled_clim_datasets.R"))
clim_ref <- generate_scaled_clim_datasets(clim_var)[["clim_ref"]]

extract_climatedt_metadata(var_clim = clim_var) %>% 
  dplyr::select(label,description,unit) %>% 
  set_colnames(str_to_title(colnames(.))) %>% 
  kable_mydf()
Label Description Unit
bio1 Mean annual temperature Celsius degrees (°C)
bio3 Isothermality (bio2/bio7) (×100) index
bio4 Temperature seasonality (standard deviation ×100) Celsius degrees (°C)
bio12 Annual precipitation Millimeters (mm)
bio15 Precipitation seasonality (coefficient of variation) index
SHM Summer heat moisture index °C / mm
Code
# We save one table per covariate
for(i in c(clim_var)){
  clim_ref %>% 
  dplyr::select(all_of(i)) %>% 
  pull() %>% 
  t() %>% 
  write.table(file = here(paste0("data/BayPassAnalysis/EnvironmentalVariables/",i,".txt")), 
              sep = " ",
              row.names = FALSE, 
              col.names = FALSE)
}

Population covariance matrix

The core model

We estimate the (scaled) covariance matrix of population allele frequencies \(\Omega\) resulting from their (possibly unknown and complex) shared history. For that, we use the core model mode of BayPass. According to BayPass manual, ‘The core model depicted in Figure 1A might be viewed as a generalization of the model proposed by Nicholson et al. (2002) and was first proposed by Coop et al. (2010).’ Here is the Figure 1A from the BayPass manual:

Estimation & visualization

We estimate the population covariance matrix using the genomic dataset not filtered for MAF.

Code
# ** Bash script **
# =================

# Working directory: data/BayPassAnalysis/outputs
# First row: directory where Baypass software is

~/Bureau/baypass_2.2/sources/g_baypass \ 
    -gfile ../GenomicInputBayPass_withmaf.txt \
    -outprefix anacore \
    -seed 44

We visualize the matrix.

Code
# Upload the estimated Omega matrix
omega <- as.matrix(read.table(here("data/BayPassAnalysis/outputs/anacore_mat_omega.out")))
pop_names <- clim_ref$pop
dimnames(omega)=list(pop_names,pop_names)

# Visualization of the matrix
# Using SVD decomposition
plot.omega(omega=omega,pop.names=pop_names)

Code
# as a correlation plot
cor_mat=cov2cor(omega)
# corrplot(cor_mat,method="color",mar=c(2,1,2,2)+0.1,
# main=expression("Correlation map based on"~hat(Omega)))

# as a heatmap and hierarchical clustering tree (using the average agglomeration method)
hclust_ave <- function(x) hclust(x, method="average")
heatmap(1-cor_mat,hclustfun = hclust_ave,
main=expression("Heatmap of "~hat(Omega)~"("*d[ij]*"=1-"*rho[ij]*")"))

Code
# We save the heatmap for the Supplementary Information
pdf(width = 6, height = 6, here("figs/BayPass/SI_Heatmap.pdf"))
heatmap(1-cor_mat,hclustfun = hclust_ave)
dev.off()

IS standard covariate model

Mathematical model

The standard covariate model is represented in the following figure (Figure 1B from the BayPass the manual):

From BayPass manual:

  • ‘This model allows evaluating to which extent a population covariable \(k\) is (linearly) associated with each marker \(i\) (which are assumed independent given \(\Omega\)) by the introduction of the regression coefficients \(\beta_{ik}\) (for convenience the indices \(k\) for covariables are dropped in Figure 1B).’

  • ‘Importance Sampling (IS) approximation allows estimating Bayes Factor to evaluate the support in favor of association of each SNP \(i\) with a covariable \(k\), i.e., to compare the model with association (\(\beta_{ik} \neq 0\)) against the null model (\(\beta_{ik} = 0\)). The IS based estimation was initially proposed by Coop et al. (2010) and is based on a numerical integration that requires the definition of a grid covering the whole support of the \(\beta_{ik}\) prior distribution. In BayPass, the grid consists of \(n_{\beta}\) (by default \(n_{\beta} = 201\)) equidistant points from \(\beta_{min}\) to \(\beta_{max}\) (including the boundaries) leading to a lag between two successive values equal to \(\frac{\beta_{max}-\beta_{min}}{n_{\beta}-1}\) (i.e., 0.003 with default values). Other values for \(n_{\beta}\) might be supplied by the user with the -nbetagrid option.’

Running the model

We run the standard covariate model using Important sampling on the genomic dataset filtered for MAF.

Code
# ** Bash script **
# =================

# Working directory before running the loop: data/BayPassAnalysis/outputs

for var in bio1 bio3 bio4 bio12 bio15 SHM
do
cd ISruns_${var}
for seed in {1..5}
do
~/Bureau/baypass_2.2/sources/g_baypass \
    -gfile ../../GenomicInputBayPass_withoutmaf.txt \
    -efile ../../EnvironmentalVariables/${var}.txt\
    -omegafile ../anacore_mat_omega.out \
    -outprefix anacovis${seed} \
    -seed ${seed}
done
cd ..
done
Code
# Number of iterations
nb_iter <- 5

# extract SNP names
snp_names <- read.csv(here(paste0("data/DryadRepo/ImputedGenomicData_AlleleCounts_withoutmaf.csv")),
                          row.names = 1) %>% 
  rownames()

list_out <- lapply(clim_var, function(var){

# Bayes factors
BF <- lapply(1:nb_iter, function(x){
  read.table(here(paste0("data/BayPassAnalysis/outputs/ISruns_",var,"/anacovis",x,"_summary_betai_reg.out")),
             h=T)$BF.dB.
}) %>% 
  setNames(paste0("BF",1:nb_iter)) %>% 
  as_tibble()

# Regression coefficients Beta_is
beta <- lapply(1:nb_iter, function(x){
  read.table(here(paste0("data/BayPassAnalysis/outputs/ISruns_",var,"/anacovis",x,"_summary_betai_reg.out")),
             h=T)$Beta_is
}) %>% 
  setNames(paste0("beta",1:nb_iter)) %>% 
  as.data.frame()


# Empirical Bayesian P-values eBPis
eBP <- lapply(1:nb_iter, function(x){
  read.table(here(paste0("data/BayPassAnalysis/outputs/ISruns_",var,"/anacovis",x,"_summary_betai_reg.out")),
             h=T)$eBPis
}) %>% 
  setNames(paste0("eBP",1:nb_iter)) %>% 
  as.data.frame()

out <- tibble(snp=snp_names,
              medianBF=apply(BF,1,median),
              medianBeta=apply(beta,1,median),
              medianEBP=apply(eBP,1,median)) %>% 
  mutate(variable=var)

eBP_out <- tibble("eBP_threshold"=c(3),
                  {{var}} :=c(length(which(out$medianEBP>3))))

BF_out <-tibble("BF_threshold" = c(20,10,5),
                {{var}} :=c(length(which(out$medianBF>20)),
                            length(which(out$medianBF>10)),
                            length(which(out$medianBF>5))))

list(snp_out = out,
     BF_out = BF_out,
     eBP_out = eBP_out,
     cor_BF = cor(BF),
     cor_beta = cor(beta),
     cor_eBP = cor(eBP))
}) %>% setNames(clim_var)

Checking convergence across runs

Checking convergence by running several independent runs:

  • From BayPass manual: ‘As for any MCMC analysis, it is recommended to run several independent MCMC (e.g., from 3 to 5), using different seeds for the random number generators (see -seed option). Comparing the estimates of parameters like \(\Omega\) and statistics like \(XtX\) or BF across runs allows ensuring (empirically) that the chains properly converged. For large enough data sets, estimations are generally reproducible for most parameters and statistics. Yet, for measures like the BF\(_{is}\) that are based on an Importance Sampling approximation, single run estimations may be unstable (in particular when the number of populations is small), it is then recommended to use as an estimate the median computed over several different independent runs. For a real life example, see Gautier et al. (2018).’

  • In Gautier et al. (2018): ‘Three independent runs (using the option -seed) were performed for each dataset. The estimated model hyper-parameters were highly consistent across both runs and datasets. Support for association of each SNP with the corresponding prevalence covariate was then evaluated using the median Bayes Factor (BF) computed over the three independent runs.’

To check convergence, we run 5 independent runs (different -seed options) for each climatic variable. Below, we use the median of the Bayes factors (\(BF\)) and of the empirical p-values (\(eBP\)) to identify the candidate SNPs.

Code
par(mfrow=c(1,3))

lapply(clim_var, function(var){
  
  lapply(c("BF","beta","eBP"), function(x){
    
list_out[[var]][[paste0("cor_",x)]] %>% corrplot(method = 'number',
                                                 type = 'lower', 
                                                 diag = FALSE,
                                                 title=paste0(var," - ",x),
                                                 mar=c(0,0,2,0),
                                                 number.cex=2,
                                                 tl.cex=1.5)
  })
})

Identification threshold

Which threshold do we use to select the set of candidate SNPs?

From Gautier (2015): ‘Jeffreys’rule (Jeffreys 1961) provides a useful decision criterion to quantify the strength of evidence (here in favor of association of the SNP with the covariable), using the following dB unit scale: ’strong evidence’ when \(10 < BF < 15\), ‘very strong evidence’ when \(15 < BF < 20\), and ‘decisive evidence’ when \(BF > 20\).’ From Jeffreys (1961), ‘barely worth mentioning’ when \(0 < BF < 5\) and ‘substantial’ when \(5 < BF < 10\).

  • Gautier (2015) uses \(BF > 20\) and \(eBP > 3\).

  • Vieira et al. (2022) uses \(eBFmc > 3\) (using MCMC algorithm).

  • Ahrens, Byrne, and Rymer (2019) uses \(eBPis > 3\) (using IS algorithm).

  • Mayol et al. (2020) uses \(BF > 30\).

  • Pina-Martins et al. (2019) uses \(BF > 15\) (using the AUX model).

  • Ruiz Daniels et al. (2019) uses \(eBPis > 3\).

  • Vendrami et al. (2019) \(BF > 10\) (using standard covariate model)

Number of candidates selected using different thresholds based on the Bayes Factors (\(BF > 5\), \(BF > 10\) and \(BF > 20\)) or \(eBP > 3\)) for each climatic variable:

Code
list_out %>% lapply(function(out)out$BF_out) %>%  
  reduce(left_join, by = "BF_threshold") %>% 
  kable_mydf()
BF_threshold bio1 bio12 bio15 bio3 bio4 SHM
20 0 0 0 0 9 0
10 1 1 3 0 32 10
5 14 11 34 1 75 32

Number of candidates selected using the \(eBP > 3\) threshold for each climatic variable:

Code
list_out %>% lapply(function(out)out$eBP_out) %>%  
  reduce(left_join, by = "eBP_threshold") %>% 
  kable_mydf()
eBP_threshold bio1 bio12 bio15 bio3 bio4 SHM
3 0 0 0 0 14 0

We finally use the following threshold to select the candidate SNPs:

Code
threshold <- 10 # in dB

Given this threshold, here are the candidate SNPs:

Code
cand <- list_out %>% 
  lapply(function(out)out$snp_out[which(out$snp_out$medianBF>threshold),]) %>%  
  bind_rows()

cand %>% kable_mydf()
snp medianBF medianBeta medianEBP variable
snp_10424 10.08 -0.03 2.15 bio1
snp_8956 11.96 -0.03 1.96 bio12
snp_106 10.61 -0.04 1.97 bio15
snp_387 13.19 0.04 1.64 bio15
snp_10187 12.69 0.03 1.69 bio15
snp_54 11.05 0.06 3.09 bio4
snp_79 11.48 0.05 2.45 bio4
snp_320 11.91 -0.05 2.12 bio4
snp_759 18.14 -0.07 3.93 bio4
snp_1270 23.23 -0.08 3.53 bio4
snp_1492 10.13 -0.04 2.20 bio4
snp_2611 24.07 -0.08 3.75 bio4
snp_2701 10.46 0.05 3.03 bio4
snp_2887 10.11 0.04 1.72 bio4
snp_2900 15.64 -0.06 2.79 bio4
snp_3862 22.57 -0.08 4.01 bio4
snp_4052 15.97 -0.06 2.29 bio4
snp_4663 25.87 -0.08 3.65 bio4
snp_5355 24.88 -0.08 4.33 bio4
snp_6406 20.34 -0.06 2.85 bio4
snp_6494 15.10 -0.06 3.33 bio4
snp_7435 11.00 0.06 2.82 bio4
snp_7552 15.30 -0.07 3.50 bio4
snp_7627 18.91 -0.07 2.92 bio4
snp_7653 15.32 -0.06 2.56 bio4
snp_7795 13.44 -0.05 2.83 bio4
snp_7797 16.13 -0.06 2.88 bio4
snp_8187 16.68 -0.07 3.50 bio4
snp_8475 10.75 0.05 2.44 bio4
snp_9032 23.26 -0.08 3.78 bio4
snp_9475 10.48 -0.05 2.15 bio4
snp_9946 20.55 -0.07 3.85 bio4
snp_11002 10.93 0.05 2.08 bio4
snp_11210 13.44 -0.06 2.56 bio4
snp_12579 25.67 -0.08 3.61 bio4
snp_13023 17.53 -0.05 2.25 bio4
snp_13753 14.04 -0.04 1.39 bio4
snp_794 10.52 0.04 1.98 SHM
snp_1357 10.24 0.04 2.21 SHM
snp_1632 11.99 -0.04 1.98 SHM
snp_1633 11.70 -0.04 2.08 SHM
snp_6579 11.13 0.05 2.30 SHM
snp_8956 10.99 0.05 2.32 SHM
snp_11864 10.43 0.05 2.07 SHM
snp_11865 10.10 0.04 1.72 SHM
snp_11866 11.87 0.04 1.73 SHM
snp_12040 11.67 0.05 1.77 SHM

Are there any SNPs associated with several climatic variables?

Code
# Identify duplicates
cand %>% group_by(snp) %>% filter(n()>1) %>% kable_mydf()
snp medianBF medianBeta medianEBP variable
snp_8956 11.96 -0.03 1.96 bio12
snp_8956 10.99 0.05 2.32 SHM

We export the list of candidate SNPs.

Code
unique(cand$snp) %>% saveRDS(here("outputs/BayPass/baypass_outliers.rds"))

Session information

Code
devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.4.0 (2024-04-24)
 os       Ubuntu 22.04.4 LTS
 system   x86_64, linux-gnu
 ui       X11
 language (EN)
 collate  fr_FR.UTF-8
 ctype    fr_FR.UTF-8
 tz       Europe/Paris
 date     2024-05-03
 pandoc   3.1.11 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/x86_64/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 package     * version date (UTC) lib source
 cachem        1.0.8   2023-05-01 [1] CRAN (R 4.4.0)
 cellranger    1.1.0   2016-07-27 [1] CRAN (R 4.4.0)
 cli           3.6.2   2023-12-11 [1] CRAN (R 4.4.0)
 colorspace    2.1-0   2023-01-23 [1] CRAN (R 4.4.0)
 corrplot    * 0.92    2021-11-18 [1] CRAN (R 4.4.0)
 devtools      2.4.5   2022-10-11 [1] CRAN (R 4.4.0)
 digest        0.6.35  2024-03-11 [1] CRAN (R 4.4.0)
 dplyr       * 1.1.4   2023-11-17 [1] CRAN (R 4.4.0)
 ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.4.0)
 evaluate      0.23    2023-11-01 [1] CRAN (R 4.4.0)
 fansi         1.0.6   2023-12-08 [1] CRAN (R 4.4.0)
 fastmap       1.1.1   2023-02-24 [1] CRAN (R 4.4.0)
 forcats     * 1.0.0   2023-01-29 [1] CRAN (R 4.4.0)
 fs            1.6.4   2024-04-25 [1] CRAN (R 4.4.0)
 generics      0.1.3   2022-07-05 [1] CRAN (R 4.4.0)
 ggplot2     * 3.5.1   2024-04-23 [1] CRAN (R 4.4.0)
 glue          1.7.0   2024-01-09 [1] CRAN (R 4.4.0)
 gtable        0.3.5   2024-04-22 [1] CRAN (R 4.4.0)
 here        * 1.0.1   2020-12-13 [1] CRAN (R 4.4.0)
 highr         0.10    2022-12-22 [1] CRAN (R 4.4.0)
 hms           1.1.3   2023-03-21 [1] CRAN (R 4.4.0)
 htmltools     0.5.8.1 2024-04-04 [1] CRAN (R 4.4.0)
 htmlwidgets   1.6.4   2023-12-06 [1] CRAN (R 4.4.0)
 httpuv        1.6.15  2024-03-26 [1] CRAN (R 4.4.0)
 janitor     * 2.2.0   2023-02-02 [1] CRAN (R 4.4.0)
 jsonlite      1.8.8   2023-12-04 [1] CRAN (R 4.4.0)
 kableExtra  * 1.4.0   2024-01-24 [1] CRAN (R 4.4.0)
 knitr       * 1.46    2024-04-06 [1] CRAN (R 4.4.0)
 later         1.3.2   2023-12-06 [1] CRAN (R 4.4.0)
 lifecycle     1.0.4   2023-11-07 [1] CRAN (R 4.4.0)
 lubridate   * 1.9.3   2023-09-27 [1] CRAN (R 4.4.0)
 magrittr    * 2.0.3   2022-03-30 [1] CRAN (R 4.4.0)
 memoise       2.0.1   2021-11-26 [1] CRAN (R 4.4.0)
 mime          0.12    2021-09-28 [1] CRAN (R 4.4.0)
 miniUI        0.1.1.1 2018-05-18 [1] CRAN (R 4.4.0)
 munsell       0.5.1   2024-04-01 [1] CRAN (R 4.4.0)
 pillar        1.9.0   2023-03-22 [1] CRAN (R 4.4.0)
 pkgbuild      1.4.4   2024-03-17 [1] CRAN (R 4.4.0)
 pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.4.0)
 pkgload       1.3.4   2024-01-16 [1] CRAN (R 4.4.0)
 plyr          1.8.9   2023-10-02 [1] CRAN (R 4.4.0)
 profvis       0.3.8   2023-05-02 [1] CRAN (R 4.4.0)
 promises      1.3.0   2024-04-05 [1] CRAN (R 4.4.0)
 purrr       * 1.0.2   2023-08-10 [1] CRAN (R 4.4.0)
 R6            2.5.1   2021-08-19 [1] CRAN (R 4.4.0)
 Rcpp          1.0.12  2024-01-09 [1] CRAN (R 4.4.0)
 readr       * 2.1.5   2024-01-10 [1] CRAN (R 4.4.0)
 readxl      * 1.4.3   2023-07-06 [1] CRAN (R 4.4.0)
 remotes       2.5.0   2024-03-17 [1] CRAN (R 4.4.0)
 reshape2    * 1.4.4   2020-04-09 [1] CRAN (R 4.4.0)
 rlang         1.1.3   2024-01-10 [1] CRAN (R 4.4.0)
 rmarkdown     2.26    2024-03-05 [1] CRAN (R 4.4.0)
 rprojroot     2.0.4   2023-11-05 [1] CRAN (R 4.4.0)
 rstudioapi    0.16.0  2024-03-24 [1] CRAN (R 4.4.0)
 scales        1.3.0   2023-11-28 [1] CRAN (R 4.4.0)
 sessioninfo   1.2.2   2021-12-06 [1] CRAN (R 4.4.0)
 shiny         1.8.1.1 2024-04-02 [1] CRAN (R 4.4.0)
 snakecase     0.11.1  2023-08-27 [1] CRAN (R 4.4.0)
 stringi       1.8.3   2023-12-11 [1] CRAN (R 4.4.0)
 stringr     * 1.5.1   2023-11-14 [1] CRAN (R 4.4.0)
 svglite       2.1.3   2023-12-08 [1] CRAN (R 4.4.0)
 systemfonts   1.0.6   2024-03-07 [1] CRAN (R 4.4.0)
 tibble      * 3.2.1   2023-03-20 [1] CRAN (R 4.4.0)
 tidyr       * 1.3.1   2024-01-24 [1] CRAN (R 4.4.0)
 tidyselect    1.2.1   2024-03-11 [1] CRAN (R 4.4.0)
 tidyverse   * 2.0.0   2023-02-22 [1] CRAN (R 4.4.0)
 timechange    0.3.0   2024-01-18 [1] CRAN (R 4.4.0)
 tzdb          0.4.0   2023-05-12 [1] CRAN (R 4.4.0)
 urlchecker    1.0.1   2021-11-30 [1] CRAN (R 4.4.0)
 usethis       2.2.3   2024-02-19 [1] CRAN (R 4.4.0)
 utf8          1.2.4   2023-10-22 [1] CRAN (R 4.4.0)
 vctrs         0.6.5   2023-12-01 [1] CRAN (R 4.4.0)
 viridisLite   0.4.2   2023-05-02 [1] CRAN (R 4.4.0)
 withr         3.0.0   2024-01-16 [1] CRAN (R 4.4.0)
 xfun          0.43    2024-03-25 [1] CRAN (R 4.4.0)
 xml2          1.3.6   2023-12-04 [1] CRAN (R 4.4.0)
 xtable      * 1.8-4   2019-04-21 [1] CRAN (R 4.4.0)
 yaml          2.3.8   2023-12-11 [1] CRAN (R 4.4.0)

 [1] /home/juliette/R/x86_64-pc-linux-gnu-library/4.4
 [2] /usr/local/lib/R/site-library
 [3] /usr/lib/R/site-library
 [4] /usr/lib/R/library

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

References

Ahrens, Collin W, Margaret Byrne, and Paul D Rymer. 2019. “Standing Genomic Variation Within Coding and Regulatory Regions Contributes to the Adaptive Capacity to Climate in a Foundation Tree Species.” Molecular Ecology 28 (10): 2502–16.
Gautier, Mathieu. 2015. “Genome-Wide Scan for Adaptive Divergence and Association with Population-Specific Covariates.” Genetics 201 (4): 1555–79.
Gautier, Mathieu, Junichi Yamaguchi, Julien Foucaud, Anne Loiseau, Aurélien Ausset, Benoit Facon, Bernhard Gschloessl, et al. 2018. “The Genomic Basis of Color Pattern Polymorphism in the Harlequin Ladybird.” Current Biology 28 (20): 3296–3302.
Jeffreys, H. 1961. Theory of Probability (3e). Oxford.
Mayol, Maria, Miquel Riba, Stephen Cavers, Delphine Grivet, Lucie Vincenot, Federica Cattonaro, Giovanni G Vendramin, and Santiago C González-Martı́nez. 2020. “A Multiscale Approach to Detect Selection in Nonmodel Tree Species: Widespread Adaptation Despite Population Decline in Taxus Baccata l.” Evolutionary Applications 13 (1): 143–60.
Pina-Martins, Francisco, João Baptista, Georgios Pappas Jr, and Octávio S Paulo. 2019. “New Insights into Adaptation and Population Structure of Cork Oak Using Genotyping by Sequencing.” Global Change Biology 25 (1): 337–50.
Ruiz Daniels, Rose, Richard S Taylor, Santiago C González-Martı́nez, Giovanni G Vendramin, Bruno Fady, Sylvie Oddou-Muratorio, Andrea Piotti, Guillaume Simioni, Delphine Grivet, and Mark A Beaumont. 2019. “Looking for Local Adaptation: Convergent Microevolution in Aleppo Pine (Pinus Halepensis).” Genes 10 (9): 673.
Vendrami, David LJ, Michele De Noia, Luca Telesca, William Handal, Grégory Charrier, Pierre Boudry, Luke Eberhart-Phillips, and Joseph I Hoffman. 2019. “RAD Sequencing Sheds New Light on the Genetic Structure and Local Adaptation of European Scallops and Resolves Their Demographic Histories.” Scientific Reports 9 (1): 7455.
Vieira, Lucas D, Orzenil B Silva-Junior, Evandro Novaes, and Rosane G Collevatti. 2022. “Comparative Population Genomics in Tabebuia Alliance Shows Evidence of Adaptation in Neotropical Tree Species.” Heredity 128 (3): 141–53.