[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