[adegenet-commits] r1021 - pkg pkg/R pkg/man www

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Fri Jul 13 19:22:17 CEST 2012


Author: jombart
Date: 2012-07-13 19:22:17 +0200 (Fri, 13 Jul 2012)
New Revision: 1021

Added:
   pkg/R/simOutbreak.R
   pkg/man/simOutbreak.Rd
Modified:
   pkg/DESCRIPTION
   www/literature.html
Log:
Added simulation tool. Still under dev.


Modified: pkg/DESCRIPTION
===================================================================
--- pkg/DESCRIPTION	2012-07-11 16:09:53 UTC (rev 1020)
+++ pkg/DESCRIPTION	2012-07-13 17:22:17 UTC (rev 1021)
@@ -10,6 +10,6 @@
 Suggests: genetics, spdep, tripack, ape, pegas, seqinr, adehabitat, multicore, akima, maps, splancs, igraph
 Depends: R (>= 2.10), methods, MASS, ade4
 Description: Classes and functions for genetic data analysis within the multivariate framework.
-Collate: classes.R basicMethods.R handling.R auxil.R setAs.R SNPbin.R glHandle.R glFunctions.R glSim.R find.clust.R hybridize.R scale.R fstat.R import.R seqTrack.R chooseCN.R genind2genpop.R loadingplot.R sequences.R gstat.randtest.R makefreq.R colorplot.R monmonier.R spca.R coords.monmonier.R haploGen.R old2new.R spca.rtests.R dapc.R haploPop.R PCtest.R dist.genpop.R Hs.R propShared.R export.R HWE.R propTyped.R inbreeding.R glPlot.R gengraph.R zzz.R
+Collate: classes.R basicMethods.R handling.R auxil.R setAs.R SNPbin.R glHandle.R glFunctions.R glSim.R find.clust.R hybridize.R scale.R fstat.R import.R seqTrack.R chooseCN.R genind2genpop.R loadingplot.R sequences.R gstat.randtest.R makefreq.R colorplot.R monmonier.R spca.R coords.monmonier.R haploGen.R old2new.R spca.rtests.R dapc.R haploPop.R PCtest.R dist.genpop.R Hs.R propShared.R export.R HWE.R propTyped.R inbreeding.R glPlot.R gengraph.R simOutbreak.R zzz.R
 License: GPL (>=2)
 LazyLoad: yes

Added: pkg/R/simOutbreak.R
===================================================================
--- pkg/R/simOutbreak.R	                        (rev 0)
+++ pkg/R/simOutbreak.R	2012-07-13 17:22:17 UTC (rev 1021)
@@ -0,0 +1,365 @@
+###############
+## simOutbreak
+###############
+simOutbreak <- function(R0, infec.curve, n.hosts=200, duration=50,
+                        seq.length=1e4, mu.transi=1e-4, mu.transv=mu.transi/2,
+                        tree=TRUE){
+
+    ## CHECKS ##
+    if(!require(ape)) stop("The ape package is required.")
+
+
+    ## HANDLE ARGUMENTS ##
+    ## normalize gen.time
+    infec.curve <- infec.curve/sum(infec.curve)
+    infec.curve <- c(infec.curve, rep(0, duration)) # make sure dates go all the way
+    t.clear <- which(diff(infec.curve<1e-10)==1) # time at which infection is cleared
+
+    ## GENETIC FUNCTIONS ##
+    NUCL <- as.DNAbin(c("a","t","c","g"))
+    TRANSISET <- list('a'=as.DNAbin('g'), 'g'=as.DNAbin('a'), 'c'=as.DNAbin('t'), 't'=as.DNAbin('c'))
+    TRANSVSET <- list('a'=as.DNAbin(c('c','t')), 'g'=as.DNAbin(c('c','t')), 'c'=as.DNAbin(c('a','g')), 't'=as.DNAbin(c('a','g')))
+
+
+    ## AUXILIARY FUNCTIONS ##
+    ## generate sequence from scratch
+    seq.gen <- function(){
+        ##res <- list(sample(NUCL, size=seq.length, replace=TRUE)) # DNAbin are no longer lists by default
+        res <- sample(NUCL, size=seq.length, replace=TRUE)
+        class(res) <- "DNAbin"
+        return(res)
+    }
+
+    ## create substitutions for defined SNPs - no longer used
+    substi <- function(snp){
+        res <- sapply(1:length(snp), function(i) sample(setdiff(NUCL,snp[i]),1)) # ! sapply does not work on DNAbin vectors directly
+        class(res) <- "DNAbin"
+        return(res)
+    }
+
+    ## create transitions for defined SNPs
+    transi <- function(snp){
+        res <- unlist(TRANSISET[as.character(snp)])
+        class(res) <- "DNAbin"
+        return(res)
+    }
+
+    ## create transversions for defined SNPs
+    transv <- function(snp){
+        res <- sapply(TRANSVSET[as.character(snp)],sample,1)
+        class(res) <- "DNAbin"
+        return(res)
+    }
+
+    ## duplicate a sequence (including possible mutations)
+    seq.dupli <- function(seq, T){ # T is the number of time units between ancestor and decendent
+        ## transitions ##
+        n.transi <- rbinom(n=1, size=seq.length*T, prob=mu.transi) # total number of transitions
+        if(n.transi>0) {
+            idx <- sample(1:seq.length, size=n.transi, replace=FALSE)
+            seq[idx] <- transi(seq[idx])
+        }
+
+        ## transversions ##
+        n.transv <- rbinom(n=1, size=seq.length*T, prob=mu.transv) # total number of transitions
+        if(n.transv>0) {
+            idx <- sample(1:seq.length, size=n.transv, replace=FALSE)
+            seq[idx] <- transv(seq[idx])
+        }
+        return(seq)
+    }
+
+
+    ## MAIN FUNCTION ##
+    ## initialize results ##
+    dynam <- data.frame(nsus=integer(duration+1), ninf=integer(duration+1), nrec=integer(duration+1))
+    rownames(dynam) <- 0:duration
+    res <- list(n=1, dna=NULL, dates=NULL, id=NULL, ances=NULL, dynam=dynam)
+    res$dynam$nsus[1] <- n.hosts-1
+    res$dynam$ninf[1] <- 1
+    res$dates[1] <- 0
+    res$ances <- NA
+    res$dna <- matrix(seq.gen(),nrow=1)
+    class(res$dna) <- "DNAbin"
+
+    ## run outbreak ##
+    for(t in 1:duration){
+        ## individual force of infection
+        indivForce <- infec.curve[t-res$dates+1]
+
+        ## global force of infection (R0 \sum_j I_t^j / N)
+        globForce <- sum(indivForce)*R0/n.hosts
+
+        ## number of new infections
+        nbNewInf <- rbinom(1, size=res$dynam$nsus[t], prob=globForce)
+
+        ## dates of new infections
+        if(nbNewInf>0){
+            res$dates <- c(res$dates, rep(t,nbNewInf))
+
+            ## ancestries of the new infections
+            temp <- as.vector(rmultinom(1, size=nbNewInf, prob=indivForce))
+            newAnces <- rep(which(temp>0), temp[which(temp>0)])
+            res$ances <- c(res$ances,newAnces)
+
+            ## dna sequences of the new infections
+            newSeq <- t(sapply(newAnces, function(i) seq.dupli(res$dna[i,], t-res$dates[i])))
+            res$dna <- rbind(res$dna, newSeq)
+        }
+
+        ## update nb of infected, recovered, etc.
+        res$dynam$nrec[t+1] <- sum(res$dates>=t.clear)
+        res$dynam$ninf[t+1] <- sum(res$dates>=0 & res$dates < t.clear)
+        res$dynam$nsus[t+1] <- res$dynam$nsus[t] - nbNewInf
+    } # end for
+
+
+    ## SHAPE AND RETURN OUTPUT ##
+    res$n <- nrow(res$dna)
+    res$id <- 1:res$n
+    res$nmut <- sapply(1:res$n, function(i) dist.dna(res$dna[c(res$id[i],res$ances[i]),], model="raw"))*ncol(res$dna)
+    res$call <- match.call()
+    res$tree <- fastme.ols(dist.dna(res$dna, model="TN93"))
+    res$tree <- root(res$tree,"1")
+    class(res) <- "simOutbreak"
+    return(res)
+
+} # end simOutbreak
+
+
+
+
+
+
+
+
+##################
+## print.simOutbreak
+##################
+print.simOutbreak <- function(x, ...){
+
+    cat("\t\n=========================")
+    cat("\t\n=   simulated outbreak  =")
+    cat("\t\n=  (simOutbreak object) =")
+    cat("\t\n=========================\n")
+
+    cat("\nSize :", x$n,"cases (out of", x$dynam$nsus[1],"susceptible hosts)")
+    cat("\nGenome length :", ncol(x$dna),"nucleotids")
+    cat("\nDate range :", min(x$dates),"-",max(x$dates))
+
+    cat("\nContent:\n")
+    print(names(x))
+
+    return(NULL)
+} # end print.simOutbreak
+
+
+
+
+
+
+
+##############
+## [.simOutbreak
+##############
+"[.simOutbreak" <- function(x,i,j,drop=FALSE){
+    res <- x
+    res$dna <- res$dna[i,,drop=FALSE]
+    res$id <- res$id[i]
+    res$ances <- res$ances[i]
+    res$ances[!res$ances %in% res$id] <- NA
+    res$dates <- res$dates[i]
+    res$n <- nrow(res$dna)
+
+    return(res)
+}
+
+
+
+
+
+##################
+## labels.simOutbreak
+##################
+labels.simOutbreak <- function(object, ...){
+    return(object$id)
+}
+
+
+
+
+
+
+#########################
+## as.igraph.simOutbreak
+#########################
+as.igraph.simOutbreak <- function(x, ...){
+    if(!require(igraph)) stop("package igraph is required for this operation")
+    if(!require(ape)) stop("package ape is required for this operation")
+
+    ## GET DAG ##
+    from <- x$ances
+    to <- x$id
+    isNotNA <- !is.na(from) & !is.na(to)
+    dat <- data.frame(from,to,stringsAsFactors=FALSE)[isNotNA,,drop=FALSE]
+    vnames <- as.character(unique(unlist(dat)))
+    out <- graph.data.frame(dat, directed=TRUE, vertices=data.frame(names=vnames, dates=x$dates[vnames]))
+
+    ## SET WEIGHTS ##
+    D <- as.matrix(dist.dna(x$dna,model="raw")*ncol(x$dna))
+    temp <- mapply(function(i,j) return(D[i,j]), as.integer(from), as.integer(to))
+    E(out)$weight <- temp[isNotNA]
+
+    ## SET ARROW WIDTH ##
+    temp <- max(E(out)$weight) - E(out)$weight
+    temp <- temp/max(temp) * 4
+    E(out)$width <- round(temp)+1
+
+    return(out)
+}
+
+
+
+
+
+
+
+####################
+## plot.simOutbreak
+####################
+plot.simOutbreak <- function(x, y=NULL, cex=1, col=num2col(x$dates), label=x$id,
+                             edge.col=num2col(x$nmut[-1], col.pal=seasun), lwd=1, ...){
+    if(!require(igraph)) stop("package igraph is required for this operation")
+    if(!require(ape)) stop("package ape is required for this operation")
+    plot(as.igraph(x), vertex.size=15*cex, vertex.color=col, vertex.label=label,
+         vertex.label.cex=cex, edge.color=edge.col, edge.width=lwd, ...)
+} # end plot.simOutbreak
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## #####################
+## ## seqTrack.simOutbreak
+## #####################
+## seqTrack.simOutbreak <- function(x, best=c("min","max"), prox.mat=NULL, ...){
+##     myX <- dist.dna(x$dna, model="raw")
+##     x.names <- labels(x)
+##     x.dates <- as.POSIXct(x)
+##     seq.length <- ncol(x$dna)
+##     myX <- myX * seq.length
+##     myX <- as.matrix(myX)
+##     prevCall <- as.list(x$call)
+##     if(is.null(prevCall$mu)){
+##         mu0 <- 0.0001
+##     } else {
+##         mu0 <- eval(prevCall$mu)
+##     }
+##     res <- seqTrack(myX, x.names=x.names, x.dates=x.dates, best=best, prox.mat=prox.mat,...)
+##     return(res)
+## }
+
+
+
+
+
+
+## ########################
+## ## as.seqTrack.simOutbreak
+## ########################
+## as.seqTrack.simOutbreak <- function(x){
+##     ## x.ori <- x
+##     ## x <- na.omit(x)
+##     toSetToNA <- x$dates==min(x$dates)
+##     res <- list()
+##     res$id <- labels(x)
+##     res <- as.data.frame(res)
+##     res$ances <- x$ances
+##     res$ances[toSetToNA] <- NA
+##     res$weight <- 1 # ??? have to recompute that...
+##     res$weight[toSetToNA] <- NA
+##     res$date <- as.POSIXct(x)[labels(x)]
+##     res$ances.date <- as.POSIXct(x)[x$ances]
+
+##     ## set results as indices rather than labels
+##     res$ances <- match(res$ances, res$id)
+##     res$id <- 1:length(res$id)
+
+##     ## SET CLASS
+##     class(res) <- c("seqTrack", "data.frame")
+
+##     return(res)
+## }
+
+
+
+
+
+
+
+
+## ###################
+## ## sample.simOutbreak
+## ###################
+## sample.simOutbreak <- function(x, n){
+## ##sample.simOutbreak <- function(x, n, rDate=.rTimeSeq, arg.rDate=NULL){
+##     ## EXTRACT THE SAMPLE ##
+##     res <- x[sample(1:nrow(x$dna), n, replace=FALSE)]
+
+
+##     ## RETRIEVE SOME PARAMETERS FROM HAPLOSIM CALL
+##     prevCall <- as.list(x$call)
+##     if(!is.null(prevCall$mu)){
+##         mu0 <- eval(prevCall$mu)
+##     } else {
+##         mu0 <- 1e-04
+##     }
+
+##     if(!is.null(prevCall$dna.length)){
+##         L <- eval(prevCall$dna.length)
+##     } else {
+##         L <- 1000
+##     }
+
+##     ## truedates <- res$dates
+##     ## daterange <- diff(range(res$dates,na.rm=TRUE))
+
+##     ## if(identical(rDate,.rTimeSeq)){
+##     ##     sampdates <- .rTimeSeq(n=length(truedates), mu=mu0, L=L, maxNbDays=daterange/2)
+##     ## } else{
+##     ##     arg.rDate$n <- n
+##     ##     sampdates <- do.call(rDate, arg.rDate)
+##     ## }
+##     ## sampdates <- truedates + abs(sampdates)
+
+##     return(res)
+## } # end sample.simOutbreak
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Added: pkg/man/simOutbreak.Rd
===================================================================
--- pkg/man/simOutbreak.Rd	                        (rev 0)
+++ pkg/man/simOutbreak.Rd	2012-07-13 17:22:17 UTC (rev 1021)
@@ -0,0 +1,81 @@
+\name{simOutbreak}
+\alias{simOutbreak}
+\alias{print.simOutbreak}
+\alias{[.simOutbreak}
+\alias{labels.simOutbreak}
+\alias{simOutbreak-class}
+\alias{as.igraph.simOutbreak}
+\alias{plot.simOutbreak}
+\title{Simulation of pathogen genotypes during disease outbreaks}
+\description{
+  The function \code{simOutbreak} implements simulations of disease
+  outbreaks. This functions are currently under development. Please
+  email the author before using them.
+}
+\usage{
+simOutbreak(R0, infec.curve, n.hosts=200, duration=50,seq.length=1e4,
+            mu.transi=1e-4, mu.transv=mu.transi/2,tree=TRUE)
+\method{print}{simOutbreak}(x, \dots)
+\method{[}{simOutbreak}(x, i, j, drop=FALSE)
+\method{labels}{simOutbreak}(object, \dots)
+\method{as.igraph}{simOutbreak}(x, \dots)
+\method{plot}{simOutbreak}(x, y=NULL, cex=1, col=num2col(x$dates), label=x$id,
+        edge.col=num2col(x$nmut[-1], col.pal=seasun), lwd=1, \dots)
+}
+\arguments{
+  \item{R0}{the basic reproduction number}
+  \item{infec.curve}{a \code{numeric} vector describing the
+individual infectiousness at time t=0,1, \dots}
+  \item{n.hosts}{the number of susceptible hosts at the begining of the
+outbreak}
+  \item{duration}{the number of time steps for which simulation is run}
+  \item{seq.length}{an integer indicating the length of the simulated
+    haplotypes, in number of nucleotides.}
+  \item{mu.transi}{the rate of transitions, in number of mutation per site and per
+    time unit.}
+  \item{mu.transv}{the rate of transversions, in number of mutation per site and per
+    time unit.}
+  \item{tree}{a \code{logical} indicating whether a (minimum evolution)
+tree of the outbreak should be included in the output.}
+  \item{x,object}{\code{simOutbreak} objects.}
+  \item{i,j, drop}{\code{i} is a vector used for subsetting the object. For
+    instance, \code{i=1:3} will retain only the first three haplotypes of the
+    outbreak. \code{j} and \code{drop} are only provided for compatibility,
+    but not used.}
+  \item{cex}{a size factor for the vertices of the plotted graph.}
+  \item{col}{the color of the vertices of the plotted graph.}
+  \item{label}{the labels of the vertices of the plotted graph.}
+  \item{edge.col}{the color of the edges of the plotted graph.}
+  \item{lwd}{the width of the edges of the plotted graph.}
+  \item{\dots}{further arguments to be passed to other methods}
+
+}
+\author{
+Implementation by Thibaut Jombart \email{t.jombart at imperial.ac.uk}
+Epidemiological model designed by Anne Cori.}
+\value{
+  === simOutbreak class ===\cr
+  \code{simOutbreak} objects are lists containing the following slots:\cr
+  - n: the number of cases in the outbreak\cr
+  - dna: DNA sequences in the DNAbin matrix format\cr
+  - dates: infection dates\cr
+  - dynam: a data.frame containing, for each time step (row), the number
+of susceptible, infected, or recovered in the population. \cr
+  - id: a vector of integers giving the index of each case\cr
+  - ances: a vector of integers giving the index of each infector
+('ancestor')\cr
+  - tree: the (optional) phylogenetic tree of the outbreak\cr
+  - nmut: the number of mutations corresponding to each transmission event\cr
+  - call: the matched call
+
+}
+\examples{
+\dontrun{
+if(require(ape)&&require(igraph)){
+x <- simOutbreak(R0 = 2, infec.curve = c(0, 1, 1, 1), n.hosts = 200)
+x
+
+plot(x)
+}
+}
+}
\ No newline at end of file

Modified: www/literature.html
===================================================================
--- www/literature.html	2012-07-11 16:09:53 UTC (rev 1020)
+++ www/literature.html	2012-07-13 17:22:17 UTC (rev 1021)
@@ -57,7 +57,8 @@
 
 
 the
-bublisher's website</a><span style="color: rgb(0, 153, 0);">]</span>
+bublisher's
+website</a><span style="color: rgb(0, 153, 0);">]</span>
 <img style="width: 80px; height: 37px;" alt="" src="images/new.png"><br
  style="color: rgb(0, 153, 0);">
 <br>
@@ -79,16 +80,17 @@
 <br>
 - the paper presenting the <span style="font-style: italic;">spatial
 principal component analysis</span> (<span style="font-style: italic;">sPCA</span>,
-
 function
 <span style="font-family: monospace; color: rgb(255, 0, 0);">spca</span>),
 global
-and local tests (<span
+and
+local tests (<span
  style="font-family: monospace; color: rgb(255, 0, 0);">global.rtest</span>
 and <span style="font-family: monospace; color: rgb(255, 0, 0);">local.rtest</span>):<br>
 <b>Jombart T, </b>Devillard S, Dufour AB, Pontier D<b> </b>(2008)<b> </b>Revealing
 cryptic
-spatial patterns in genetic variability by a new multivariate
+spatial
+patterns in genetic variability by a new multivariate
 method.  <span style="font-style: italic;">Heredity</span> <span
  style="font-weight: bold;">101</span>: 92-103. doi:
 10.1038/hdy.2008.34 [<a
@@ -111,7 +113,8 @@
 
 
 simulations
-of genealoies of haplotypes (<span
+of
+genealoies of haplotypes (<span
  style="font-family: monospace; color: rgb(255, 0, 0);">haploGen</span>):<br>
 <b>Jombart T, </b>Eggo RM, Dodd PJ, Balloux F (2010) Reconstructing
 disease outbreaks from genetic data: a graph approach. <span
@@ -126,7 +129,8 @@
 
 
 of
-Principal Components</span> (<span style="font-style: italic;">DAPC</span>,
+Principal
+Components</span> (<span style="font-style: italic;">DAPC</span>,
 functions
 <span style="font-family: monospace;"><span
  style="color: rgb(255, 0, 0);">find.clusters</span> </span>and <span
@@ -336,7 +340,8 @@
  class="citation_author">Moazami-Goudarzi K, </span> <span
  class="citation_date">2010</span> <span class="citation_article_title">Insights
 into
-the Genetic History of French Cattle from Dense SNP Data on 47
+the
+Genetic History of French Cattle from Dense SNP Data on 47
 Worldwide Breeds. </span> <span style="font-style: italic;"
  class="citation_journal_title">PLoS ONE</span><span
  class="citation_issue"> <span style="font-weight: bold;">5(9)</span>:</span>
@@ -364,7 +369,8 @@
 J.-P., BRANCO, M. and KERDELHUÉ, C. , Incipient allochronic
 speciation in the pine processionary moth (<em>Thaumetopoea pityocampa</em>,
 Lepidoptera,
-Notodontidae). <span style="font-style: italic;">Journal
+Notodontidae).
+<span style="font-style: italic;">Journal
 of Evolutionary Biology</span>, no.
 doi: 10.1111/j.1420-9101.2010.02147.x<br>
 </p>
@@ -378,7 +384,8 @@
 <span class="citation_author">Van Dyck H, </span> <span
  class="citation_date">2010</span> <span class="citation_article_title">Population
 Genetic
-Differences along a Latitudinal Cline between Original and
+Differences
+along a Latitudinal Cline between Original and
 Recently Colonized Habitat in a Butterfly. </span> <span
  style="font-style: italic;" class="citation_journal_title">PLoS ONE</span><span
  class="citation_issue"> 5(11):</span> <span
@@ -388,7 +395,8 @@
 in a jar: genetic variation and differentiation among laboratory
 strains of the red flour beetle. <span style="font-style: italic;">Journal
 of
-Applied Entomology</span>, no.
+Applied
+Entomology</span>, no.
 doi: 10.1111/j.1439-0418.2010.01593.x<br>
 </p>
 <p class="authors">[28] Jessica A. Satkoski Trask, Ripan S. Malhi, Sree
@@ -431,7 +439,8 @@
  class="citation_author">Caccone A, </span> <span
  class="citation_date">2011</span> <span class="citation_article_title">Phylogeography
 and
-Taxonomy of <i>Trypanosoma brucei</i>. </span> <span
+Taxonomy
+of <i>Trypanosoma brucei</i>. </span> <span
  class="citation_journal_title">PLoS Negl Trop Dis</span><span
  class="citation_issue"> 5(2):</span> <span class="citation_start_page">e961.</span>
 <span class="citation_doi">doi:10.1371/journal.pntd.0000961<br>
@@ -476,7 +485,8 @@
 diversity of <span style="font-style: italic;">Toxoplasma gondii</span>:
 
 Example
-of the anthropized environment from French Guiana. <br>
+of
+the anthropized environment from French Guiana. <br>
 Infection, Genetics and Evolution.<br>
 </p>
 <p class="intro">[39] MONTANO, V., FERRI, G., MARCARI, V., BATINI, C.,
@@ -506,7 +516,8 @@
 HUGHES, J. M. (2011), Cytonuclear evidence for hybridogenetic
 reproduction in natural populations of the Australian carp gudgeon (<em>Hypseleotris</em>:
 Eleotridae).
-Molecular Ecology.
+Molecular
+Ecology.
 doi: 10.1111/j.1365-294X.2011.05206.x<br>
 </p>
 <p class="intro">[44] Kinziger, A. P., Nakamoto, R. J., Anderson, E. C.
@@ -559,7 +570,8 @@
 spiny lobster (<span style="font-style: italic;">Palinurus elephas</span>).
 
 Biological
-Journal of the Linnean Society. doi:
+Journal
+of the Linnean Society. doi:
 10.1111/j.1095-8312.2011.01728.x<br>
 </p>
 [52]* Farjadian S, Sazzini M, Tofanelli S, Castrì L, Taglioli L,
@@ -644,7 +656,8 @@
 management tool for rat eradication. Pages 426-431 In: Veitch, C. R.;
 Clout, M. N. and Towns, D. R. (eds.). <span style="font-style: italic;">Island
 invasives:
-eradication and management</span>. 426 Gland, Switzerland.<br>
+eradication
+and management</span>. 426 Gland, Switzerland.<br>
 <br>
 [68] Monteil, C. L., Guilbaud, C., Glaux, C., Lafolie, F., Soubeyrand,
 S. and Morris, C. E. (2011), Emigration of the plant pathogen
@@ -836,6 +849,13 @@
 SNP-Based Genomic Admixture Analysis of the Captive Rhesus Macaque
 Colony at the California National Primate Research Center. Am. J.
 Primatol., 74: 747–757. doi: 10.1002/ajp.22025<br>
+</p>
+<p class="intro">[103] Urška Demšar, Paul Harris, Chris Brunsdon, A.
+Stewart Fotheringham, Sean McLoone (2012) Principal Component Analysis
+on Spatial Data: An Overview. Annals of the Association of American
+Geographers. DOI:10.1080/00045608.2012.689236<br>
+</p>
+<p class="intro"><br>
 <br>
 </p>
 <p class="intro">* adegenet not or wrongly cited, but actually used in



More information about the adegenet-commits mailing list