adephylo/0000755000176200001440000000000013215766712012071 5ustar liggesusersadephylo/inst/0000755000176200001440000000000013215710501013027 5ustar liggesusersadephylo/inst/CITATION0000644000176200001440000000064412617071127014201 0ustar liggesuserscitHeader("To cite the adephylo package:") citEntry( entry="Article", title = "adephylo: exploratory analyses for the phylogenetic comparative method.", journal= "Bioinformatics", year = "2010", author = "T. Jombart, S. Dray", volume = "26", pages = "1907-1909", doi = "10.1093/bioinformatics/btq292", textVersion = "Jombart T., Dray S. (2008) adephylo: exploratory analyses for the phylogenetic comparative method." ) adephylo/inst/doc/0000755000176200001440000000000013215710501013574 5ustar liggesusersadephylo/inst/doc/adephylo.Rnw0000644000176200001440000005566713176115555016132 0ustar liggesusers\documentclass{article} % \VignettePackage{adephylo} % \VignetteIndexEntry{adephylo: exploratory analyses for the phylogenetic comparative method} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{array} \usepackage{color} \usepackage[utf8]{inputenc} % for UTF-8/single quotes from sQuote() \newcommand{\code}[1]{{{\tt #1}}} \title{\code{adephylo}: exploratory analyses for the phylogenetic comparative method} \author{Thibaut Jombart and St\'ephane Dray} \date{\today} \sloppy \hyphenpenalty 10000 \begin{document} \SweaveOpts{concordance=TRUE} \definecolor{Soutput}{rgb}{0,0,0.56} \definecolor{Sinput}{rgb}{0.56,0,0} \DefineVerbatimEnvironment{Sinput}{Verbatim} {formatcom={\color{Sinput}},fontsize=\footnotesize, baselinestretch=0.75} \DefineVerbatimEnvironment{Soutput}{Verbatim} {formatcom={\color{Soutput}},fontsize=\footnotesize, baselinestretch=0.75} \color{black} \maketitle \tableofcontents %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \SweaveOpts{prefix.string = figs/adephylo, fig = FALSE, eps = FALSE, pdf = TRUE, width = 6, height = 6} This document describes the \code{adephylo} package for the R software. \code{adephylo} aims at implementing exploratory methods for the analysis of phylogenetic comparative data, i.e. biological traits measured for taxa whose phylogeny is also provided. This package extends and replaces implementation of phylogeny-related methods in the ade4 package \url{http://pbil.univ-lyon1.fr/ADE-4/home.php?lang=eng}. Procedures implemented in \code{adephylo} rely on exploratory data analysis. They include data visualization and manipulation, tests for phylogenetic autocorrelation, multivariate analysis, computation of phylogenetic proximities and distances, and modelling phylogenetic signal using orthonormal bases. \\ These methods can be used to visualize, test, remove or investigate the phylogenetic signal in comparative data. The purpose of this document is to provide a general view of the main functionalities of \code{adephylo}, and to show how this package can be used along with \code{ape}, \code{phylobase} and \code{ade4} to analyse comparative data. %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \section{First steps} %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \subsection{Data representation: why we are not reinventing the weel} %%%%%%%%%%%%%%%%%%%%% Data representation can be defined as the way data are stored in a software (R, in our case). Technically, data representation is defined by classes of objects that contain the information. In the case of phylogeny and comparative data, very efficient data representation are already defined in other packages. Hence, it makes much more sense to use directly objects from these classes. \\ Phylogenies are best represented in Emmanuel Paradis's \code{ape} package (\url{http://ape.mpl.ird.fr/}), as the class \code{phylo}. As \code{ape} is by far the largest package dedicated to phylogeny, using the \code{phylo} class assures a good interoperability of data. This class is defined in an online document: \url{http://ape.mpl.ird.fr/misc/FormatTreeR_28July2008.pdf}. \\ However, data that are to be analyzed in \code{adephylo} do not only contain trees, but also traits associated to the tips of a tree. The package \code{phylobase} (\url{http://r-forge.r-project.org/projects/phylobase/}) is a collaborative effort designed to handling such data. Its representation of phylogenies slightly differs from that of \code{ape}; the class \code{phylo4} was originally an extension of the \code{phylo} class into formal (S4) class, but it has now evolved into something more original. The S4 class \code{phylo4d} (`d' for `data') can be used to store a tree and data associated to tips, internal nodes, or even edges of a tree. Classes of \code{phylobase} are described in a vignette of the package, accessible by typing: <>= vignette("phylobase") @ ~\\ As trees and comparative data are already handled by \code{ape} and \code{phylobase}, no particular data format shall be defined in \code{adephylo}. In particular, we are no longer using \code{phylog} objects, which were used to represent phylogenies in \code{ade4} in a very \textit{ad hoc} way, without much compatibility with other packages. This class is now deprecated, but all previous functionalities available for \code{phylog} objects have been re-implemented and -- in some cases -- improved in \code{adephylo}. %%%%%%%%%%%%%%%%%%%%% \subsection{Installing the package} %%%%%%%%%%%%%%%%%%%%% What is tricky here is that a vignette is basically available once the package is installed. Assuming you got this document before installing the package, here are some clues about installing \code{adephylo}. \\ First of all, \code{adephylo} depends on other packages, being \code{methods}, \code{ape}, \code{phylobase}, and \code{ade4}. These dependencies are mandatory, that is, you actually need to have these packages installed before using \code{adephylo}. Also, it is better to make sure you are using the latest versions of these packages. This can be achieved using the \texttt{update.packages} command, or by installing devel versions from R-Forge (\url{http://r-forge.r-project.org/}). In all cases, the latest version of \code{adephylo} can be found from \url{http://r-forge.r-project.org/R/?group_id=303}. \\ We load \textit{adephylo}, alongside some useful packages: <>= library(ape) library(phylobase) library(ade4) library(adephylo) search() @ %%%%%%%%%%%%%%%%%%%%% \subsection{Getting started} %%%%%%%%%%%%%%%%%%%%% All the material of the package is summarized in a manpage accessible by typing: <>= ?adephylo @ The html version of this manpage may be preferred to browse easily the content of \code{adephylo}; this is accessible by typing: <>= help("adephylo", package="adephylo", html=TRUE) @ To revert help back to text mode, simply type: <>= options(htmlhelp = FALSE) @ %%%%%%%%%%%%%%%%%%%%% \subsection{Putting data into shape} %%%%%%%%%%%%%%%%%%%%% While this is not the purpose of this document to go through the details of \code{phylo}, \code{phylo4} and \code{phylo4d} objects, we shall show briefly how these objects can be obtained. % % % % % % % % % % % \subsubsection{Making a \code{phylo} object} % % % % % % % % % % % The simplest way of turning a tree into a \code{phylo} object is using ape's function \code{read.tree}. This function reads a tree with the Newick (or `parentetic') format, from a file (default, argument \code{file}) of from a character string (argument \code{text}). <>= data(ungulates) ungulates$tre myTree <- read.tree(text=ungulates$tre) myTree plot(myTree, main="ape's plotting of a tree") @ It is easy to convert \code{ade4}'s \code{phylog} objects to a \code{phylo}, as \code{phylog} objects store the Newick format of the tree in the \code{\$tre} component. \\ Note that \code{phylo} trees can also be constructed from alignements (see \code{read.GenBank}, \code{read.dna}, \code{dist.dna}, \code{nj}, \code{bionj}, and \code{mlphylo}, all in \code{ape}), or even simulated (for instance, see \code{rtree}). \\ Also note that, if needed, conversion can be done back and forward with \code{phylo4} trees: <<>>= temp <- as(myTree, "phylo4") class(temp) temp <- as(temp, "phylo") class(temp) all.equal(temp, myTree) @ % % % % % % % % % % % \subsubsection{Making a \code{phylo4d} object} % % % % % % % % % % % \code{phylo4d} objects are S4 objects, and are thus created in a particular way. These objects can be obtained in two ways, by reading a Nexus file containing tree and data information, or by `assembling' a tree and data provided for tips, nodes, or edges. Nexus files containing both tree and data can be read by \code{phylobase}'s function \code{readNexus} (see corresponding manpage for more information). The other way of creating a \code{phylo4d} object is using the constructor, also named \code{phylo4d}. This is a function that takes two arguments: a tree (\code{phylo} or \code{phylo4} format) and a \code{data.frame} containing data, for tips by default (see \code{?phylo4d} for more information). Here is an example: <>= ung <- phylo4d(myTree, ungulates$tab) class(ung) table.phylo4d(ung) @ %% \noindent Note that the constructor checks the consistency of the %% names used for the tips of the tree and for the rows of the data.frame. %% Inconsistencies issue an error. %% To override this behaviour, one can specify %% \code{use.tip.names=FALSE}. %% However, this can be tricky: often, mismatches between names can %% indicate that data are not sorted adequately; moreover, object created %% with such mismatches will often be invalid objects, and may issue %% errors in further analyses. %% \\ Data are stored inside the \code{@data} slot of the object. They can be accessed using the function \code{tdata}: <<>>= x <- tdata(ung, type="tip") head(x) @ %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \section{Exploratory data analysis} %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \subsection{Quantifying and testing phylogenetic signal} %%%%%%%%%%%%%%%%%%%%% In this document, the terms `phylogenetic signal' and `phylogenetic autocorrelation' are used interchangeably. They refer to the fact that values of life-history traits or ecological features are not independent in closely related taxa. Several procedures are implemented by \code{adephylo} to measure and test phylogenetic autocorrelation. % % % % % % % % % % % \subsubsection{Moran's $I$} % % % % % % % % % % % The function \code{moran.idx} computes Moran's $I$, the most widely-used autocorrelation measure. It can also provide additionnal information (argument \code{addInfo}), being the null value of $I$ (i.e., the expected value in absence of phylogenetic autocorrelation), and the range of variation of $I$. It requires the degree of relatedness of tips on the phylogeny to be modelled by a matrix of phylogenetic proximities. Such a matrix can be obtained using different methods implemented by the function \code{proxTips}. <>= W <- proxTips(myTree, met="Abouheif") moran.idx(tdata(ung, type="tip")$afbw, W) moran.idx(tdata(ung, type="tip")[,1], W, addInfo=TRUE) @ From here, it is quite straightforward to build a non-parametric test based on Moran's $I$. For instance (taken from \code{?moran.idx}): <>= afbw <- tdata(ung, type="tip")$afbw sim <- replicate(499, moran.idx(sample(afbw), W)) # permutations sim <- c(moran.idx(afbw, W), sim) cat("\n=== p-value (right-tail) === \n") pval <- mean(sim>=sim[1]) pval plot(density(sim), main="Moran's I Monte Carlo test for 'bif'") # plot mtext("Density of permutations, and observation (in red)") abline(v=sim[1], col="red", lwd=3) @ \noindent Here, \code{afbw} is likely not phylogenetically autocorrelated. % % % % % % % % % % % \subsubsection{Abouheif's test} % % % % % % % % % % % The test of Abouheif (see reference in \code{?abouheif.moran}) is designed to test the existence of phylogenetic signal. In fact, it has been shown that this test amounts to a Moran's $I$ test with a particular proximity matrix (again, see references in the manpage). The implementation in \code{abouheif.moran} proposes different phylogenetic proximities, using by default the original one. The function can be used on different objects; in particular, it can be used with a \code{phylo4d} object. In such case, all traits inside the object are tested. The returned object is a \code{krandtest}, a class of object defined by \code{ade4} to store multiple Monte Carlo tests. Here is an example using the ungulates dataset: <>= ung.abTests <- abouheif.moran(ung) ung.abTests plot(ung.abTests) @ \noindent In this case, it seems that all variables but \code{afbm} are phylogenetically structured. \\ Note that other proximities than those proposed in \code{abouheif.moran} can be used: on has just to pass the appropriate proximity matrix to the function (argument \code{W}). For instance, we would like to use the correlation corresponding to a Brownian motion as a measure of phylogenetic proximity. First, we must estimate branch lengths, as our tree does not have any (ideally, we would already have a tree with meaningful branch lengths): <<>>= hasEdgeLength(ung) myTree.withBrLe <- compute.brlen(myTree) @ \noindent Now, we can use ape's function \code{vcv.phylo} to compute the matrix of phylogenetic proximities, and use this matrix in Abouheif's test: <<>>= myProx <- vcv.phylo(myTree.withBrLe) abouheif.moran(ung, W=myProx) @ \noindent In the present case, traits no longer appear as phylogenetically autocorrelated. Several explanation can be proposed: the procedure for estimating branch length may not be appropriate in this case, or the Brownian motion may fail to describe the evolution of the traits under study for this set of taxa. % % % % % % % % % % % \subsubsection{Phylogenetic decomposition of trait variation} % % % % % % % % % % % The phylogenetic decomposition of the variation of a trait proposed by Ollier et al. (2005, see references in \code{?orthogram}) is implemented by the function \code{orthogram}. This function replaces the former, deprecated version from \code{ade4}. \\ The idea behind the method is to model different levels of variation on a phylogeny. Basically, these levels can be obtained from dummy vectors indicating which tip descends from a given node. A partition of tips can then be obtained for each node. This job is achieved by the function \code{treePart}. Here is an example using a small simulated tree: <>= x <- as(rtree(5),"phylo4") plot(x,show.n=TRUE) @ <<>>= x.part <- treePart(x) x.part @ \noindent The obtained partition can also be plotted: <>= temp <- phylo4d(x, x.part) table.phylo4d(temp, cent=FALSE, scale=FALSE) @ \noindent What we would like to do is assess where the variation of a trait is structured on the phylogeny; to do so, we could use these dummy vectors as regressors and see how variation is distributed among these vectors. However, these dummy vectors cannot be used as regressors because they are linearly dependent. The orthogram circumvents this issue by transforming and selecting dummy vectors into a new set of variables that are orthonormal. The obtained orthonormal basis can be used to decompose the variation of the trait. Even if not necessary to get an orthogram, this basis can be obtained from \code{treePart}: <<>>= args(treePart) temp <- phylo4d(x, treePart(x, result="orthobasis") ) @ \noindent And here are the first 8 vectors of the orthonormal basis for the ungulate dataset: <>= temp <- phylo4d(myTree, treePart(myTree, result="orthobasis") ) par(mar=rep(.1,4)) table.phylo4d(temp, repVar=1:8, ratio.tree=.3) @ The decomposition of variance achieved by projecting a trait onto this orthonormal basis gives rise to several test statistics, that are performed by the function \code{orthogram}. Like the \code{abouheif.moran} function, \code{orthogram} outputs a \code{krandtest} object: <>= afbw.ortgTest <- orthogram(afbw, myTree) afbw.ortgTest @ \noindent Here again, \code{afbw} does not seem to be phylogenetically structured. %%%%%%%%%%%%%%%%%%%%% \subsection{Modelling phylogenetic signal} %%%%%%%%%%%%%%%%%%%%% % % % % % % % % % % % \subsubsection{Using orthonormal bases} % % % % % % % % % % % The previous section describing the orthogram has shown that testing phylogenetic signal underlies a model of phylogenetic structure. In the case of the orthogram, several tests are based on the decomposition of the variance of a trait onto an orthonormal basis describing tree topology. In fact, it is possible to extend this principle to any orthonormal basis modelling phylogenetic topology. Another example of such bases is offered by Moran's eigenvectors, which can be used to model different observable phylogenetic structures (see references in \code{me.phylo}). Moran's phylogenetic eigenvectors are implemented by the function \code{me.phylo} (also nicknamed \code{orthobasis.phylo}). The returned object is a data.frame with the class \code{orthobasis} defined in \code{ade4}; columns of this object are Moran's eigenvectors. An \code{orthobasis} can be coerced to a regular \code{data.frame} or to a matrix using \code{as.data.frame} and \code{as.matrix}. <<>>= me.phylo(myTree.withBrLe) @ \noindent Moran's eigenvectors are constructed from a matrix of phylogenetic proximities between tips. Any proximity can be used (argument \code{prox}); the 5 proximities implemented by the \code{proxTips} function are available by default, giving rise to different orthobases: <>= ung.listBas <- list() ung.listBas[[1]] <- phylo4d(myTree, as.data.frame(me.phylo(myTree.withBrLe, method="patristic"))) ung.listBas[[2]] <- phylo4d(myTree, as.data.frame(me.phylo(myTree, method="nNodes"))) ung.listBas[[3]]<- phylo4d(myTree, as.data.frame(me.phylo(myTree, method="Abouheif"))) ung.listBas[[4]] <- phylo4d(myTree, as.data.frame(me.phylo(myTree, method="sumDD"))) par(mar=rep(.1,4), mfrow=c(2,2)) invisible(lapply(ung.listBas, table.phylo4d, repVar=1:5, cex.sym=.7, show.tip.label=FALSE, show.node=FALSE)) @ \includegraphics[width=.8\textwidth]{figs/adephylo-figFourBas} \noindent In this case, the first Moran's eigenvectors are essentially similar. In other cases, however, the orthobases built from different proximities can be quite different. \\ One of the interests of Moran's eigenvectors in phylogeny is to account for phylogenetic autocorrelation in a linear model. This can be achieved using the appropriate eigenvector as covariate. Here is an example when studying the link of two traits in ungulate dataset. <>= afbw <- log(ungulates$tab[,1]) neonatw <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) names(afbw) <- myTree$tip.label names(neonatw) <- myTree$tip.label plot(afbw, neonatw, main="Relationship between afbw and neonatw") lm1 <- lm(neonatw~afbw) abline(lm1, col="blue") anova(lm1) @ \noindent Are the residuals of this model independent? <>= resid <- residuals(lm1) names(resid) <- myTree$tip.label temp <- phylo4d(myTree,data.frame(resid)) abouheif.moran(temp) table.phylo4d(temp) @ \noindent No, residuals are clearly not independent, as they exhibit strong phylogenetic autocorrelation. In this case, autocorrelation can be removed by using the first Moran's eigenvector as a covariate. In general, the appropriate eigenvector(s) can be chosen by usual variable-selection approaches, like the forward selection, or using a selection based on the existence of autocorrelation in the residuals. <<>>= myBasis <- me.phylo(myTree, method="Abouheif") lm2 <- lm(neonatw~myBasis[,1] + afbw) resid <- residuals(lm2) names(resid) <- myTree$tip.label temp <- phylo4d(myTree,data.frame(resid)) abouheif.moran(temp) anova(lm2) @ The link between the two variables is still very statistically significant, but this time the model is not invalid because of non-independence of residuals. % % % % % % % % % % % \subsubsection{Autoregressive models} % % % % % % % % % % % Autoregressive models can also be used to remove phylogenetic autocorrelation from residuals. This approach implies the use of a phylogenetically lagged vector, for some or all of the variates of a model (see references in \code{?proxTips}). The lag vector of a trait $x$, denoted $\tilde{x}$, is computed as: $$ \tilde{x} = Wx $$ \noindent where $W$ is a matrix of phylogenetic proximities, as returned by \code{proxTips}. Hence, one can use an autoregressive approach to remove phylogenetic autocorrelation quite simply. We here re-use the example from the previous section: <<>>= W <- proxTips(myTree, method="Abouheif", sym=FALSE) lagNeonatw <- W %*% neonatw lm3 <- lm(neonatw ~ lagNeonatw + afbw) resid <- residuals(lm3) abouheif.moran(resid,W) @ \noindent Here, this most simple autoregressive model may not be sufficient to account for all phylogenetic signal; yet, phylogenetic autocorrelation is no longer detected at the usual threshold $\alpha=0.05$. %%%%%%%%%%%%%%%%%%%%% \subsection{Using multivariate analyses} %%%%%%%%%%%%%%%%%%%%% Multivariate analyses can be used to identify the main biodemographic strategies in a large set of traits. This could be the topic of an entire book. Such application is not particular to \code{adephylo}, but some practices are made easier by the package, used together with \code{ade4}. We here provide a simple example, using the \code{maples} dataset. This dataset contains a tree and a set of 31 quantitative traits (see \code{?maples}). First of all, we seek a summary of the variability in traits using a principal component analysis. Missing data are replaced by mean values, so they are placed at the origin of the axes (the `non-informative' point). <>= f1 <- function(x){ m <- mean(x,na.rm=TRUE) x[is.na(x)] <- m return(x) } data(maples) traits <- apply(maples$tab, 2, f1) pca1 <- dudi.pca(traits, scannf=FALSE, nf=1) barplot(pca1$eig, main="PCA eigenvalues", col=heat.colors(16)) @ \noindent One axis shall be retained. Does this axis reflect a phylogenetic structure? We can represent this principal component onto the phylogeny. In some cases, positive autocorrelation can be better perceived by examining the lag vector (see previous section on autoregressive models) instead of the original vector. Here, we shall plot both the retained principal component, and its lag vector: <>= tre <- read.tree(text=maples$tre) W <- proxTips(tre) myComp <- data.frame(PC1=pca1$li[,1], lagPC1=W %*% pca1$li[,1]) myComp.4d <- phylo4d(tre, myComp) nodeLabels(myComp.4d) <- names(nodeLabels(myComp.4d)) table.phylo4d(myComp.4d) @ \noindent It is quite clear that the main component of diversity among taxa separates descendants from node 19 from descendants of node 24. Phylogenetic autocorrelation can be checked in `PC1' (note that testing it in the lag vector would be circulary, as the lag vector already otimizes positive autocorrelation), for instance using Abouheif's test: <>= myTest <- abouheif.moran(myComp[,1], W=W) plot(myTest, main="Abouheif's test using patristic proximity") mtext("First principal component - maples data", col="blue", line=1) @ \noindent To dig further into the interpretation of this structure, one can have a look at the loadings of the traits, to see to which biological traits these opposed life histories correspond: <>= ldgs <- pca1$c1[,1] plot(ldgs, type="h", xlab="Variable", xaxt="n", ylab="Loadings") s.label(cbind(1:31, ldgs), lab=colnames(traits), add.p=TRUE, clab=.8) temp <- abs(ldgs) thres <- quantile(temp, .75) abline(h=thres * c(-1,1), lty=2, col="blue3", lwd=3) title("Loadings for PC1") mtext("Quarter of most contributing variables indicated in blue", col="blue") @ \noindent As a reminder, species with a large black symbol would be on the top of this graph, while species with a large white symbol would lie on the bottom. %%%%%%%%%%%%%%%%%%%%% %\subsection{Performing a phylogenetic Principal Component Analysis} %%%%%%%%%%%%%%%%%%%%% \end{document} adephylo/inst/doc/adephylo.pdf0000644000176200001440000070276613215710501016116 0ustar liggesusers%PDF-1.5 % 72 0 obj << /Length 844 >> stream concordance:adephylo.tex:adephylo.Rnw:1 22 1 1 0 82 1 1 2 4 0 1 2 28 1 1 2 1 0 4 1 10 0 1 2 7 1 1 2 4 0 1 2 2 1 1 2 4 0 1 2 1 1 1 2 4 0 1 2 21 1 1 2 1 0 1 1 5 0 2 1 12 0 1 1 3 0 1 2 14 1 1 2 1 0 1 1 7 0 2 1 5 0 1 1 6 0 1 2 18 1 1 2 1 0 1 1 7 0 1 1 4 0 1 2 13 1 1 2 1 0 1 1 12 0 1 2 35 1 1 2 1 0 1 1 5 0 1 1 12 0 1 2 3 1 1 2 1 0 2 1 1 2 5 0 2 1 5 0 1 2 2 1 5 0 1 3 23 1 1 2 1 0 1 1 18 0 1 1 3 0 1 2 12 1 1 2 6 0 1 1 3 0 1 2 3 1 1 2 1 0 1 1 19 0 1 2 24 1 1 2 1 0 1 1 4 0 2 2 1 0 1 1 11 0 2 2 1 0 1 1 4 0 1 2 7 1 1 2 7 0 1 1 3 0 1 2 2 1 1 2 1 0 2 1 4 0 1 2 5 1 1 2 1 0 1 1 18 0 1 2 25 1 1 2 15 0 1 2 5 1 1 2 1 0 6 1 3 0 1 2 8 1 1 2 1 0 7 1 14 0 1 2 1 1 1 2 1 0 3 1 15 0 1 1 4 0 1 2 7 1 1 2 1 0 5 1 15 0 1 1 14 0 1 2 23 1 1 2 1 0 4 1 16 0 1 2 23 1 1 6 5 0 1 2 3 1 4 0 1 2 5 1 1 2 1 0 5 1 4 0 1 2 4 1 1 2 1 0 2 1 4 0 1 2 3 1 1 2 1 0 7 1 4 0 1 2 14 1 endstream endobj 92 0 obj << /Length 1894 /Filter /FlateDecode >> stream xYK6-2+| E<t{J{Pmƶ d;Re#A-CǙ3c><OYwu5` &ƒc rsEjh[w-?p"i 7޿3ERfU%㣓q x2Tky-q[b(,l'a?z#փ TCfM8aNofM78u/'=4!6+6BP{_@:;j}O=/F>>3iϥ;yC7NeP*;Ą&С46}[}YSl& D 'iFLê̌ rU%ryX܆3gH4 P.!wY 9^2 " ͑KP&Kj](O!EV^bp{:?~`:3Gv"QjB `!vQij^}h}x!;⩦ -[Hl07GF5EB=. )4b9&*.mEFc'w7~ԣNo}awO{/B68aMFAAP/| }j.Sy=l)|յ.2 i9唆|6ao"3+c $@(YP,6'?PdM?W EE,oMlH\N[W]FO]FgSc* c"Ri!1tpKeDU`W WpT B_Njdn"m>Ӏr]LJu6e_$O^*dA Qx0MUT`ɓ+m}tBj ebT<8Md`HKo`{ӰEipJ?z =_v пOaWG]x+"YDn?~ǢGڅ8)xd{L>ᬎvScփ 2ߛ]&tvukf+i`hDgg2#2s7WH:Lkih (rUl`m}89~.ξlu{&-3msy\fDGZ> stream xڵ˒_TՊK H:Urb'38s(${$Di| %c@@P,Woyͻ墊+"5&.\pyg&_<2rQ?~;;$/2]Tv?-25B}DZ>AY֕`=Ịз>J:utꖀ/~7zJӸx5.`Ő=MȚ z3}|YVQi V(u3T! }LgKm\YXe&R>ÖNܰ_Oc80G{ffc `aRf8D8UUͫ1 eT]똷@,@dqdKX:ˣI6}3$yJvLİf1@@2Q咄maiĽ!g`ddM4-kv>tMR^U  w O:o&]^NvŴQƦ~ԇS$Sjзj87P?~qIjJMJ#/vvg!Hr;(u=c/KtFz$Hƾ;glfYԑvnPi,m6VLQw bhŬ T0!)Bw&Q5?R|{e$ӏo`JnZ&mq1xA¢'b~Ergoh:Eؼk38hn\ X o.`Tv w" %D>]cUf#Bt#$MbY]?=;UO IKҦg}Mp6s@ m%O\BA #߇8i*سyVhғL޶~U`4&=m;FH1+RlsC]K'چ=c}MpE߱!f~6 } UC?&y96gd`d.N,bLp,H};y(|@~o|+ Nh(f'd*\NWCS7Cڢv;J&]Q-M{l8XrD]-6؂Q{dek1i# A s kb,Dwֳ7:VAGNfqZA}݊B/g}ǨJN9 7ni?N=Ϛ*uq^|j~ @< [4 %:FԴbqher(\Z*N?_VK?$^B7<<%bCgᙨB9w{d3q[?fz"Ƽ*_Pܨh*O ֽw3( 2/A\Fd?5~՛ YW*?bkf;Pt+칿q|Ĵ endstream endobj 119 0 obj << /Length 2200 /Filter /FlateDecode >> stream xY[~D֘sEl"QPWR,H9ېݍyj89s9s6l&X~\zsDk{o&VI6I|z12j#3km\3u x{;nfsٖ8 fVGgx٧_g\Ix2י~Uۢ*.vR03EtM tuPXʞ>|#M98iYۇr $*vXI.RW9ʇSjv9Ir< _`jx@\<5/\ðA}Dd%Q"l#J ᬒ !5Lk:t/=r\ րIBErf|OT |4jEG*.lV$\'NLƪ\^83gso]T=o#L78fxbӢ:ֵqzg 5MY }惏<[+g|8 c*2nd^2ZWi\WIkjÂ?%*\wF^'zrƢ޿hЩ$oyQ[xȃAXdfq7Yf+4vȥǣ/{Gڷ,aLO$P5Y2 3b{DG P@2AL<}qZavK#ylRïR=tLtauNFҧAjx[qE=h`K)ߩ?S)2˄ SD_ Abo r7G;=wA.c >k_n(~L`sꞒfqݕ|?QۭBo *5KQ-s?]a0p$ 5 ʆ z9W"M084K^ZOrH9AfP$ɬqqoM(iCE!ڔ~͝GP6P4ᖿゅ:4;Cy~q'C(G "$`zE:vBJ%"W!%jb;ɯ>Tp@# ѕfX=NQKE;$~$G~ lϙLw&j%tp]{-Kne[I{ JQ-ΝZ+I` 7UiڋHsxʨ~")&׼ ~yz->gSj1,z]]W9/Cg#!߲ж*ס(o_VA;5[ ySlBx7ǘ*Uz~nwM5Eu|*z=emMp9ړ >]a}M#A7lQtֶ떋!j/ D ;FLcÑTʤ/.Vi{n]]:x'N0IJoX{wm7N Y4`go] +̑O(=Ʒ16I,DY*z}{x_Yf endstream endobj 123 0 obj << /Length 2087 /Filter /FlateDecode >> stream xڵXnF}WBȀpi 8ib@"U4P)P*Rݯܖ"%*Ғ;;33k{pyfٳ7:DV;`z=Pk~8r\o0] >s54'Jp[2x x7tFx^eYa<р? '@'F[ؓGRY$D~~~DnfٞL7#b!L.uc40;!\ndUA[S$wH4`ۡ'l=^awDZ!>C,.ߧ6!"'!LRh6l{cف1lC.` ό_BA`E]70- '37#ct{a{MyۃIh9Qw5F#'ⷤ_m4cy:l~@>2yg2с ^[r[TB%lViA dy!=Qh\ir+P܂2)m)4h) b#C/qQT[$EEBa\/)5,C9w|p0;NK3lr-R2g[Ft PUE6f48u<%5wpNjbJj@1^u b+$DS=Ji+av.7NAN5_ Nt`M ҔJRl| MS"U g4 N M7vt$%^%4ƿ@mTږJ8_nFSP\ 3LM\BIAA-zj/t{k׳\hQk-Oi|*d8VPY~o8rNtk6mvnFq]Gz :nkffwzOוsO;}'ZCkN)%s%{Hk m\O|Wڲσ=lXn{FBI6$ 9Y3]pk9!Kշ@SUsQh9-|C!/eǟ돥ya7~'m!f]Y~?徐t}ߗ;rtR\c)z}zH&q<(F=Hkqԇ8n'y ч#G?\ĶHC08K?\l!6E:Nhe&*-t'Bim u5N0fD[<2ZSU~?:QJh׭> stream xڕWoDªΑ> B Q ȷp'-+]%ql}T?xP3óg5-y=4s= =#^;8|<lA֋xsJa\wONR6s# Km ƫW4A(9 i= 6&W%XFސ@D@1Gi5n5|>9^P#q`Q7XS_g= F3 V)s/\T]| #06cu\  io1-o@8*_#c(e2vBzq,pdyZE ge-^^ ;:-xȤ{C?{s,9v^࠳Ežb<9;JDBkH7p6Cʊ`MC>!B["szGKȣ_zv6Pp6]"}CU1{]K%!V]9!CxLݒi鰥&o`L3S hMJ2SXAwLcى(P~?SB;|N0X0ƜbN,/TwV| 59‚t,A Ulc* 2vP8ha%*u$%>%=H2gɻ$yo7-c$u!M lZ#g0O+f"$FF3ôs`M+@'zDJz$mYO/,^VWKlķ1R@8K΄yovu4,짞n4sUjw|Xl覙R`'e|@~-ϥ8D2z>Om  UatkL>x]򌵡oϳB9T<$PeW0G؍/K endstream endobj 126 0 obj << /Type /XObject /Subtype /Image /Width 480 /Height 480 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 2 131 0 R] /Length 5086 /Filter /FlateDecode >> stream x흉:EO?շ"ƒ<` f]u+ $yC!B!B!B!B!B!B!B!B!B!B!B!B!B!r A/| _EEEE/| _"""ٞz}QQz__9n77B;MWߝ|\w櫵|uS㫣+3=AvF'MK zC0|"ښo?x#::h%"4f/ʟKqSkkhͶ_ I-V.r #]4w,]|͟ٿ߃ b/|wqe h݆_؄v⫝̸u_لV^z˷ߔrϻ<\ܿ2<AW|*8EoɸﳷڮOWm:YPWt6t߮$FN5OC<;K|=zVF+ԥo>S~],gS ,LoY5fj_C;ٜ wS/| _ۧR6?>pۡTӬ8d9eKW8{a@R VX <V$`rAsIuлkc 6G*)xS8#=_ͺ;\wS/| _^[9|J0Shgݼuar (s*Q;ߨQl.=*|׀ ={l'd7jLgsaoY "lX]LOqtFj_Нs;w7,;p9*[竘EԀp"YX:ZjtE+0/ր5=#z2 7p^c++sPR6_ !~_v?aZ-O |9ևkޝXoc!iCf[\_'fd~|=NxM> {~a i ` pfeǠ~'#ގ_.ttޅ_w+=u-o[U]6FUadvA`]4Z |w vs_·n5|ͯ4|S-ą'.B'?U|+)4763@|z}_4>ЋSYJ>|>7v)˺݆o10!T{P. z CbWk/qڑ}n7%˭RlW7(3S>=*oek,o|Cջ#osrok11*|%ڀ!g#:oo0|W ;/[5`r}88 7J{PjGfI'( Tfx|پ,.wϵC˷5^\-6jz(U9*{ao?kWm_W7_/||ߕ>Z(W$몙;.(M;邖Np 齭IHbY԰GÓdOR F6AV_Kθ9a'ab# N4sycox# |rQQŴ{vٜ{u\41p 4 |9N᫰k4YduG|ohԛ FLzxUʟTs-, Z>àW0ʅ1!rggso?2^0:gɮߊ07 ;WuCPb-/^|?+ YΞ?cj'HMN/x9_m>|jh;j݁;w9lRg߳b$Ca7\xUqv`?lTCp-Jrxy{.[0PI uv5¤^!H+g9$فuI׽3"Njw(*_M νNL~Zg7/UTg%~;_)gkLخ#x/ }_Sy 2'9 _%.^^`kѽW55Z>_7ۓZ;_)ނ8˗7f |7_·g]U|~G~P+ kPÂf$B,\( D t_ ޔY~'ߛvÆ5LV~%GRb=L-ׇv.JR8 |ݍ7 ȆW*r]5~;b=Ig#_;;a||WAwN_[|^}(j d ܖ |2.&Fnb__iӳ~5+z%""6O߆TyǼZe(WؽC5kķ=Bßf^Q?n=')b3?()28s@]ӁUF-FYYGto(A&DՏMR~Wt-z?!ùWUbS_9,gR0(p ֿWV) 4,,kW|O+ua~~ntv5l/ɨ{UX#*t_qt)3C<0,q|[WDs=?p.3}'Y# b_5{EX,g'Jn}m]`F#_; K. ~_mv-#Yх/$}FzޛC[ՀHlW >h]Lj%U~|Z`=̾æ'RBQ~+<5~>lM9ӯkx̻~BE k2\M^oX g3;n|ݭW ״bulKߠ$ [ ъ ;̟|_;kkN;۹}$_ߍMN5 _QFSVKǿ|.+9ubø)3zaG|-ko2{^B) g7[8o_xtxB~K2ķRDsKr̳ 4Q=/~oi1roOsWiToƋotJ*^|s~C^jke.}EoLz Ŏd+ z e]Vw;s Gu_|{/;>rh3m >3&`Fwە={c0 0Gʗ|mڣ@vS'ͼp7|ͷ;s6| |&o%+g+5b]?φs5NSղ]f̯I͟&wwwĕ/].5Sgʗp.'w]<?_-;3>`Kn ߛB{]w};sW=r0q+!p>ԿW*s|{,_1RӠ/"4ֱxZtʟ>0Wom/|}׿=`8=///ZA|B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B<n endstream endobj 131 0 obj << /Length 17 /Filter /FlateDecode >> stream xc``طo%8 endstream endobj 134 0 obj << /Length 2271 /Filter /FlateDecode >> stream xڵYݿB(,'sqHq-PMT1\JTWIiwHJ&@$|zч7:~U`G o:yrUڌ&qN,We|18͜IR&W >?Lv0Xw{_5pgo9-- \`=H2R1p02F+(VY@~&+].NqM6-QJ%97U4gVxWSkK2ÉqR,>(V0{gYԎSEbBs)MY|$;)G! A"6ûL,@}|3)L!zK>)'yӹՅ2zXeٮMgD<^>MP&ZH Ղm3l>+|*uh8,)"<ʐ8xjlB.Dj 1B>j\Q1=(yBi ʉA\djob39ihԔKQM  Ah$yu%;D {}LX<%*i!~F QO9RޣI}&pV@8m~G=C³ ;GM~>DﮒEDG+RBH /Zɛ.  endstream endobj 139 0 obj << /Length 1554 /Filter /FlateDecode >> stream xڭWKs6WpC!HNMƝߒ(z$|$$MJ$ (T6B^yz0[r\u1zGbTiXI%6UQlֿYifX_%/ m? YI4DFEyʦ_U69źDC AMoS'`*E3W*j8 E/Rcnˆ"\(? \ln t22j>{&[ImY-c}ע'd骖eCn ,ڵ0Ve0^#(-)T׎|`A$*"/.VSğ~To(Vvx4#K0C͖LjϺGvVRF2ʭNuX5%*xq^37Ņ \a_k ($sJ$4TiM}J1ȝun?' `S*OLeZӛ_>gBX;%Ha{mE8&pqe~/(D$a `X=o9QAQM'*$ozR]4S*U0f)6MK!D;G 3FEc^ 4Й314z8A$-+%q NJxy2B^HNqJ`灎Zo.#N!p-90,:C-,،bb[Lr+l ΁MP]d׹E+* ;H 4U슍hK' V? y_ 8 ^ď5lbF 顯:HVʖS"F9˄*͍O"afnؓ+ǎO=t PvHCMՋTCg>'/3>%*V(T";_8%R)HLj{ /|:+)فZ-5&p BrLQp1۱]Lg4W>-Xw'E7+ =\H3OGyi拀m] S%t:*|iW۔ ȍcJ4q"meD5a(GuaM[9@\w di8e#WC 7*%f>tޥcx" 钞\0Jo9gu)r(PN_6EOd)w% zϋi+M41}#r8w^sF(s"n2kGIgaSZ*2c8to|A,=LlTܒE$SEЊ tEWԤmd65ߣ 쵸_k1β ӲO{1b%F*A&J(ݕX-C=s!oJ\L^TjE}fp D\rrsG?~8x: QL~\?.F endstream endobj 136 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpZb0GOz/Rbuild1f4c2690f2f2/adephylo/vignettes/figs/adephylo-011.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 142 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 143 0 R/F3 144 0 R>> /ExtGState << >>/ColorSpace << /sRGB 145 0 R >>>> /Length 3950 /Filter /FlateDecode >> stream xZKuϯH Ul<2@E!$2&9 I:SݷSUS/r|wߏ}v̸vDY?{vW|7}P,jfE'=^B([Fn Մ6QA4޸2єU-de -+[[-VFxtuZUr;;QL1:WʊeEsYq2F@5ќDwi|WB.7ou{焟M*4ae>o10— a}5l/vT62h n>3фxk+X4ڰ2;q밲aɨ GUr #bʖؕ36;-|rzxزYn֐ [R8; {%f`JAtC `q'(t48,T̶%ƃ6x8 an1DqrHY/(?.v0|`(Jx.a}MyBc}2ÌQnwǗ@hK_1&^FWɗxg!1f0R~itWbĵ>VL/f1pAv $͚>*êU2d# +`UNc%Qkf &E \಍7!^UajZ&@Up( Vg%?j=љx =~1HSzbTy5O"Y{yu/r ċG`3PVo8 ;jb\ ]_茘x [QHh - (W6P!&%Daw>^at#09$Z/E\Doz-%mĆo† d|JJ|E$H*#FBf>?HL}0?>HTg=x@?@q+01}%n 'v< Cx`Xx& |O|{ģy>o$Nͷ'MePx%"9T(Xk,b M׳`($:O&#f=[+>dO|f>j?ET#RXh=I8/>+(纔z)_c$&PMu!>r~,nte30E>Yw4$nROP['G_Ou6)ڋCBo]?|j%g)(~>|߯zoGb4qSI4R^M> ;Bq[JAǕU}oz{;)ϺO$A⬵[VAϲ|O}=m'*d17eTLZٿKsԃz%'ԃLhzc1f?|/e317~mcb$& ]M\9. "5-z.ܯ* \~%s땎ԇ2և4T=kGxǕzze.a0HVCzASAs 3bH o+"=D6Y,lMg[q<(D=񤽖A=H{ ~mNPG~;sfD\_#ܯkmZظ_+1k-jzUs~tZPx5zaײx_A|Zsi{|ke]Dܴޮ'f<#lܯ~>_CXܯ!lǮ">wb|^œۆ ׀]oJlli~9l_ǃzB=XޡFmBp{CmY3V [;> uίDqA'v?j4Ozp ? %*M""n6:b' %lR7*$1XRؿBKh*ѵ =ȉ_=) 6_Pcg`J iPA<6ƅzz0ԃ]zp 7}z6QV{)'!mx]PV7i?@eIXeV<˸k![3ߩO=]ٿ?Czj#)7'eLL,}>gPo_sgRj̋EA&d,ة3•:/Z-S+4r-Pɔ3Sɞ,H8t=:Y'nmYy܍\NLp%(dJp˔tGyuL9˚/5ɥ J섳u5F8ncPG'e.z}[!_&}#"W?6LrV}8Ӕ8wCk<8[>;'O{g/9}yŷGQ#>?x) ⻇~!6wU(^:1ιG|:POfpAȌȏ,3G% u%i܇>*8O#Q{x'M{7|2' ǩ>r㏫'􉛛o;_zߟ[gGzr^y"?\T{>~)f 'z&/32>" ykLΚ|g_yOv|_ǷQIdz7oOOxů$&AVtHǣc8>7oxOGct߽z; g< uC:P>ٯ /V* l`:7Sd7pǛcVqĀ:k8?=V~RgCǶx7 endstream endobj 147 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 150 0 obj << /Length 2253 /Filter /FlateDecode >> stream xˎ6@l`͈A )E4 Z==ȶl%Òi)&=5{&l''WQ `rw'O]$QYb3֪$N'q(cb=}r6fzZo<墀kK0v9l.%<7j1G'\lag.~& d|doqk 3Z2U8#rX;xmW>2k QtJP>—$eFZʴ8P )m% x SFf(x<H@t^Lm@jZRX$>;!^ #/$QHWyB&UI;"KbqF4mL:x E2_LC<- ἄ[~8[_wT$qINלy "UL+gQM3\36'J[530UQ%ۥ#eNښ0^R_442\Ffz 5՚w*ǙI|8m'xx]5G |T$ÒފR9Gnt"[ vH okaSe!5=< oOw2ANQB\P``QP d0Z[A!6^`ߘpѽLKzdw|eOnKiP @XӝӇP] EXx~sDE[ xE ˑy MJw_ $}䤡fj8!yxlŒ䓱IcS?61*?dkmhwNs(wpӘla|lڱQƃc4<`(*ihPu9hЈ$QIdhqeH=Nz|nLӞǏStDctS ِh*_7a<^bӣ 5=Ǽ2T--Jp_c~rʐGm4]R Stw\Ś >} ]˝T3E;wli΀_L mr5&1w⒞mU*J<P3w{nܵ':ڏ# 4!`N kx˖W4ވ/7T?Ri,zh^Vg c_;3]e~\D]?|L z^yۉR *mUޮW2l= jɐ3eLDtfoy endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 786 /Length 2325 /Filter /FlateDecode >> stream xڽY[S8~ϯ6-[w)g{jgL";k;L;v$@@*(w`)3L2mX`02PLH<IȤ#) IWL#dJ1m1h=&3<3L f|:ҒYn-ˬLClfReF10h!6&`- ܃#+Y3`w0)8Gj,s)FQ0!D$ٝJcf!5 vOT8q5{ `SLf{l#:y( U&R`HH &WJ2P4h$#銐t\O*~&.:N*%H  Z+aO$7 c%#3+0PҌ̒23Mv/tB;H XzO<_v$`E.դ@Q(IǬSfB i:E!a{IY>K>KŒ#6J.ߏm]MVbeM=XulbfYVGVV->唵bwiX-g4>Vkm#8m-E:V^k.7֯9J 26.*V4Cv˵~6/:k>+֣ZE]\w{ƦbcS0}0y$*Ұ!kW˘_` 1dON⸚ͫ&'*V]]eumqu+mT߳q_QeUV,+yf, 6NgM~ٌ{Lj}٢hqip|3Z?J\#K>FaU! pĦZPf~<{_}c)&,º l5VRJDRv=ܺB7zY쇞KP.lqNQyqv˯}UOb,=K~JSѽ㖝"sƤ2qG8Cn0cPHnQhibwajQpir/,[IyVZM'㲼*pD8$F@E$(AP YP @EPrTj 4٭[/ T8 JL[5P{FD).:+ P+j> stream xڝWێ6}Wy7Qb 4IӗnXl˗²\ۻ}B򮝢̜qUT~dtUYMV|QJcl2vZJܭֈౄ_q 8s\8jKՔҊ/+n`l+I ?fCܣI;kvBUlهވXwWAJMX⩳z{Ӆ^ bxq+aV<{ځ?}A_ݔMD?z$p<{4>g9/{F/Mo$ /? )К'~d4{޳vHz G!Ҿpw%Ogy.dgvı#p\)_w,waJBnmK'i dWlƶpVQ"*'%}I9pW%[}^ ԰ġuq~ AB Ee@tH 6'? y"  endstream endobj 153 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpZb0GOz/Rbuild1f4c2690f2f2/adephylo/vignettes/figs/adephylo-015.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 159 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 160 0 R>> /ExtGState << >>/ColorSpace << /sRGB 161 0 R >>>> /Length 320 /Filter /FlateDecode >> stream xMK@ +rKv2߽‚.L3bqjaBo:}H @û:phF5c{xj𩞞AEyL(&t4pL dRඤZ鳠1"XoBJT@r ~+ RyTXQ<#)+(}ϒ}gITﳱT,P8Ԥ +FHUjRBf$lBfNIwe֍75 Ґ ">^t̆w:# $nM1b݈ow; 21m2Mmݧ/= L endstream endobj 163 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 167 0 obj << /Length 1303 /Filter /FlateDecode >> stream xڥW[oT~ϯHk"T 8nvz73qZw3̙73>;'}{qB4[o$vR/OY:1^dN^hbgrpb4p~=>V'\=韋,Zq$ C/N,c[Q3cߴx6r'?ӟU;zgŜɽ< aMx!9!wE78 SmWrCM "5Ȉ4EVڶV+B38 }Ɖ[4Qtj^}*AS0%d;P:je #<֢03!T3rPIc{6vm}" ]r%Vw:$XUnK=pQ]HX.Z9Á=PvHЌ R] k¼${ʬ򠩯Vr`-gzۣI%{YbR{uK$ GxI:Gi-9KvIKؽX /L5Mz;.2,,8;,|7F[NEV!V<Qb߸ ia:%6[LXM邾NC͑g=(|:lhܲ통J q-H x) Vv 0j(19"ڜGYb ֆſ.cJ6v{(5H$[;Q##eXZۄ~؏i_Ki%ậvKY%Sy}I`$s1 'I(#͈bk kf 7~Ks8)`l+v({oµkry M&'{G<Z'LJ(osd רw(r:rP/2'Ft<W `,MALTߢ!w<7yqNVra*!xLj&&uf9cYyK=?׫OioCaeWLFb< nx?i 󳚓| 4Rg&ݒKu/~H>Ҵ-,!߃4&@G #HcRqDW:WXgHϋLxCnh$@#5V4sH'@Sjfqs(:a_{j{f$3\;-? )8d endstream endobj 154 0 obj << /Type /XObject /Subtype /Image /Width 480 /Height 480 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 2 169 0 R] /Length 1890 /Filter /FlateDecode >> stream xV:ӼCߵ Ud1](J$I$I$I$I$I$I$I$I$I$I$I$I$I$M^z˗/_++|W|W|[?;3kyC#Ыoe^QH|,JG˗^H|k- F7oXS>7X)[g)}_2EDyTksiP_ﱑ}z _Qͥn1}H_7o_|۩Ϗ/߁}}g?"oo4_]T7VY}~pu][>7|c_j?}#/\}=/_(W}?}6˗/_|˗/_|˗/_|wX+w~nwL߽C7V?of_t4g{}ϛC|Ko^8;}ΰ˗/_|˗/_|˗/_|˗ 5hj_g5wj_;VW߼Y57}^|<(Gm&?RgUVG7 yw Dvyj,n|N#^|7oۅKrc|ɻu-evg9W|6U?k_GVW~ˑZ>b o,~hp#h;2\}dGz6 |nO=ףZ72ُ"ߘW?d_3H1HS6> stream xc``طo%8 endstream endobj 172 0 obj << /Length 1410 /Filter /FlateDecode >> stream xڥVIoFWH昳p  6uS%QK,R.I[f(Raj7ۗTd6J]GiX0I#G{I2ZvJ(EzDXm3C%]wCE_/\%3~?\*V4ȥt uՐY}5x~'Mw3dWYhQX S2muxH~~iPc]ZQs0Yrk]SAYb"E1 =; ct%hP0E5]Б"5Ҫj4EqAM݂z޼F)}< fAWZu'buIE} ]\[_/5L¨q+\v|^f KQpl>Z$2|Xi=RbGE<˂oC+ GLtq'SIrpiV"3~@<\뎦xY0"<7SJƲ:M#wuC% 1!61H!QSĿLCm>х:N7ᣦ~RyW|H[0yJ<6/;̨Ok~wi?^ІXA}y&,"lJx;LN@O ak\~ 3r-kJ%DaҐfy^V&0TiMAUqGôM\ qZh endstream endobj 164 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpZb0GOz/Rbuild1f4c2690f2f2/adephylo/vignettes/figs/adephylo-orthobas1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 174 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 175 0 R/F2 176 0 R/F4 177 0 R>> /ExtGState << >>/ColorSpace << /sRGB 178 0 R >>>> /Length 2318 /Filter /FlateDecode >> stream xZMo9Ww$;@`bc AxҬeg뷊UTm*n!`YHGx+( B(;Bk-vxkrRJԿoo;/Pf[Ш h J EڊJxl}6A]EfsS,b14'*O`$Xcr5=˵2Tm`Ө a,g~nbAr~U&7TKL͠7d* + PeJrR JhIy@16b?&tRR'm(" ݭzrtR RcQ WXu'۝ H4,t;VqrO՘\'QArU`\kD/BrKSE˵F=NjxOl~>}5}ڜ}֜:Ҝi A7v0DX3 6r0p8X~!\@?$)՝x?W_KDeRl[8J(dc4Y pnJݜ! Y-OI&KvxY1s&dn#'8V)in-|Ýr_.E2?w gmߖ4k^LLyQh%0X2L}DuT VB@b1 @b``A, , HW6X+@HUou#ß! ƪ,\^t*/<+"@G" 5 gBËFEXPQl(ThT5 U(C&#CfLFqF!E'EܢѳܢQ(GѨH,s!%.*RFE⨬QhKѨ Zyd5:YM;Q@JK뽀EtAC'"ၫ(?#_=tm 5oKvFlN1/;RT~о]g?*Hqiۯq m:.ͽAJ1<in`7Srhpt#=͂}]3SX SQp c{N> xJ+Oh[h$SURV;/@ N# GZőҵzp^tőINGQFQGt;TwdXK'԰,ʘbagm~ҟb`_$em˹]l;h7-hC'H:} m| q G@Ox<jM̳4 Ɯ~o[ s-՛p`4ĈM <]q9m.-K pTX&)ks\bAOXyQ㖜65F[m1C 3aָԲ VMX(L*0g{hFl<ɶ T/KE')/.~~O _*ގ +hI8el N1 pRMOw'8m?I8q~v]'qxߐan,=l{Sby[KX/6n9q]?,;0C< |]?<5Hx(N}<\o76~QU~Rұ |?W? @[.[[>,tٙ9\cݬwa e;рX}3b 9,?\_n78c|z3=Ou<SjY='G~9[/f)lwCe:чi)x?m mQ΄%^4^.'g@dYDz"z&el]£g3úH6M>='5 Z< rZJ޷$/!%Go24zU#zlGN$T!2iZ] endstream endobj 180 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 184 0 obj << /Length 2253 /Filter /FlateDecode >> stream xXߏ۸~_a2"z)%p5 Zuk[egww,Z`Y"3|GQ<ɮR<^ȨpmƁm oA㻕/ouH,FO15/j&PbyςLwYtfxU 3V65sA8D"BDpZyޕި# l/5kq>p@VH9lX&[0qheW -NcuV=,Vwc ddBƚR8X%{)[J`cy,X&RMR-Z['qCk"dZV1Bὗ69?foe17iRX% Cvi^ "_5905K<3֔gB-A&/h.Al4/8&i5IhJc(.M>",j_ccbdĉ:F:[jJC$];+Jrf?5A % rII2l WD,؉5Y֟JQW >GMţOi&E .GUX $qvXaN̹5|Fƥv=Ȏ) "6)(G;*祈QnUT cM,k8*{paƩW$-< æ\u3;}BFİ+ua\Yl*,ZeXk)w.w$xZg\yUpDe7KN"&,fȣl ]7_K]x(i_JY,9ئZ @zSVp{K4[81"ceXoה>FדscX1c g=\Zʤ+nV+,~ c7dR/С[~?:qKP;.i};qI"}w5Ûi%*H}b3IINH-0qQry<Տ8@tG;Wt"gT'f0R3+`TLMp/|/R65а~oxU(=f˕>Z,NA~24u[=ntsut ͅ\\^$k)¥(+Oj.>S/ g|"a"|]PpA]a26}I~#o W{UVF-f*CSDi0RĸA纖 _+og/uue TQj?xmOg@McZ:!H{մ\0Y(}>罳Pye3Q7#VYT[M endstream endobj 189 0 obj << /Length 1234 /Filter /FlateDecode >> stream xڅVmoF _!"gEwm ]%ƾ&rbLˎ/Cr60|;ȇÓ|O#̚Fю2 @:va0#<Ȟ3_E?+Mo`2sr'ALC&f̹q4c/w3=d,:ZTc/^W_GZCe#[chNV*cjA>ʍU7zoj 7FQP?A'v;,!.Vc/>ǼN~LyZ<%t} o; ^ CnSNXm69R.e1f_(h7rdaEcyAbA=lچ Α=HQxAr(Sv.aޒ6R)a^Z~,WTȓa(K,6blLO,lRd' b;}vɨ9K6.GB%;h*1˖bmVD( h':<`<%gH2i&2@%\GR +TvlH%>fɹ`1|oAZ.:;!ѷ}Z{./:S-ȍj-Lx>)tk+XLȘ@$i]dӖl#[ a{ g*N^Ӌ>_}:T婯q][P}D|wyYՏ} h87\Lop[IM3}fxpv/Ꮤ7wkh9hV@-7Z@밊%;L'OS`+ɘJC$?r6knÿ0tT% c7/U0eߟteP@JM+>T)6 k؍ v'?N;-K,M 0 \}Ƴ. 5]ů5 ~1fcZ U= -Iqܛv S~Jc!1U_ `+U3|[g? TxGྯS+@g5x2Vg_I4v8W:3_'? endstream endobj 181 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpZb0GOz/Rbuild1f4c2690f2f2/adephylo/vignettes/figs/adephylo-figFourBas.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 192 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 193 0 R/F2 194 0 R>> /ExtGState << >>/ColorSpace << /sRGB 195 0 R >>>> /Length 6966 /Filter /FlateDecode >> stream x]K,qޟ_1xQMr+`] +%YK ԓ,ΰL p!>$o/pݷ$wo"T_7,mAjo|ݶ_=o^-|[57I=?ڽ5m9ޏQ̗6Z5pÔQ_)6gq7Q߲ԏ9:O!wl^!i%aK$jC%Jϗh/Q)+Ql%J_*=%:^ow{|]6uGM>m>GM~S9jw5Li_+rԼzLo>5;%:ꗷl/QmD׼brNc}59\\M.;c ojp۱\i0F,?۳/ x_3lC??ŐxNXxNPO|ٕ쿿\ 7[F@V"Aլǭtr0+q#񥞿z>$8-Cۿۧ!Oo />:7\B]_ѯ`/{\ϐ>`23y *r/ťfFOȑdie ?Bh_]}W"+BaW>LM͉Z{ö>>_KKáI ]@,[:!gW/^_rQFJ-갣8VWYHjN u${ꩳР]*`'( |8*7t43?xXº'P|W |V@U:ŝ[K!h-\Z?onsoR g`>~8-P)bc洀g뮗 (0K/P |V[B= ]KNߪ{0C-. 4@ qSr ޜ>l!CVlXF:l㒯@ugp]yL`kS&‰*"m.Ԭa+ pXkMJ85ñ3Ȇcߡ4,јI>YZRy=C{~D1gK֔uz9p5ynmc-/u]mmR6ժ ٶH֔uzc[oM+Ȥ(f-R֝=C9) ݥpBH̴E-1*۶{mmkYw7 ;t)O"nن,kk -S-u uW^ɃOkrޓ.ڊQwbbK4Tv 4l }),ńPS-z]I98Y;LUצZ҅)ayms~RK/' 405}~kuM=׵K] rUSpҜeϑ{I?53rXƋ!~# ) ot?SA{. =)+b臗_-V\HYW[+(C6/x9j+7PcKxθ>-Mċ3\SgsЄxbV$…$$4@[rV?LNʑ(.|gWsv]!S4 ȷ亶x^鳠[75 aG t%֣k>N8d=1㮔RGG3zӶPL9H@g/v Tߢ@9a*(p3OS^2컎٫ĸק(O5ȵ1UBUbS: jj^K&(`OStJ(PjnS=%L=f*(4EWq0}ʀ!t6!R Զ (VAXS`mM(AxϭPAA<<Tbs˙=͎YO3j?2͎l§sܕ:]Pǣ YYLݢC9l;z*,Rt>>rd0Z\> /cy<>\r6zjRltdv{*xr%[ĸl֔jQ8-gK֔uz3.׼(ZS*}EՂ(Z#RWՖX6F[8f"ZS֝}@K+Zr!~C' B_Z *5< ^XK@Z^f9[}c G~kz/(;ij/F aoT-60G Aj EiZ%_k*n 7 yq"c=x3-1½'ҳRyykMYw ؗ!,;y)jprlo`86r 18nq־YR4f)86JE-ՒqlvȱV'L@ғ)M,m x, DG6$J䇉Q3E}PUP8NDM~8%jā(QO5'D#L?hBES߬D+ɡDmDr(QDsԯN$5m"9h}}w#[-d%dmX*VK%s}ͤ Eo]*_0'=Eez~V}o]w}޼kXm]"y5p`p^vI)` Dr!\N!{1 9x#_黯7J9֗_.u}KuHXp;MQǂaX|qA/(;D]D>u!ܲA8>tIKsvV@ҜaUż5`ܐ-!grVF@kxipd'WYhX|`#AD-ϥYH2y[pw9K?'+/+x]woO`?BEЕMTZ7)Nv8'Ŧb|')Nuؑ*9:Tg]^V?6'1ax^އ_"7v@u|S:C1LN1LaHpqPI.3D~?pw/oݏ#LMr6g:)HB Gl!=~{g;r3~oOl] -k\~SMEso*GLS%#zw$CWTɕ%C৥7%'Z#&އ^}K.WP-DwTCS}ɕE٧vVzщǓPWKLaְ%6Rm]C, `mk/nr7]dAT'StU@wξʵz89ԣ$u z r=ɓ<>+ eEx6Ќo}=[װѧ cAݳf^BZ-R/֝-Kxi偳 -m+XP[9;(݁l˳%_kOs?ᙳBs{JKhZ]&WwK>Z~kOf|<=k\5 cz1^fxLw`w;T%wv丐7V8;2x`u`u8UULAߌQϱ:G=]=ˤjg&G&Fgҵ~d _,#%e) $p܍   @gj6 0淉n1i:MIP*ԉlo5|j @IB-C;XSx xMRL\90MiB :3o8My) :Ԕ8s_pIי- D%[i%*ϼSfJ@Q Āhkǩq5̬%fVJSQ Esj6PS[i,]gf4P9>$sz5XN0;&aᝏh392M ϧ;z`Ӡ^{5c;ijs-e`lb峈deHM|V@'@#)&6;TSɇGLU2j$߬9$M{Ɯq37k 5sufmli'/aP$Li}Hj3="S%' *aLHY!:CZ/:@hR" W;Rrx 3Xzvv /'XMaB  aӟQ!5kRkC6rDH DmXTDvsR߉^hc}xDJ7|R#@. [˅u}t(;~hiN~ { hDUޮм U.Z"?̹ IGs0~q/aĂ^sF`ˣ~?Zޟ?rL&ٮ#C$ +{`Ŵ_z9B s[VGJ}d8^דZ>e}} (䔯bUS]ZWBJ"vQ()_/ !KE|(d~bt|dRiPL%)2Y'JA2ԁgJ.FFfMB>yiԓ0OJg29j掔\tIgr˵=[W7Y endstream endobj 197 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 201 0 obj << /Length 798 /Filter /FlateDecode >> stream xuUMs0WpEBF@iiA6'xX}Iޭ' I<"Tac4ޯ8}ocm=~)cowԄ[)p&T4ZwOZilr0;xťЯׇxZ4c]wjO^2*SMÄ⼞\|H*Tb"/i,"d#暋x5 ":-]lH*09FL<%7J$}='n(12$"L X}aǼE^< 2Ʃb ǵƵ=Ljl]@bw0Q-cW=ئ~ m4a$VgU"Ut)zOE.7srHzH_>"Ċ ,lq䗲I!@RjG8ǎQmQQy ^4|ʂVHt-8}E)SH9tϡ;$8Ni] u`-G 8V҄W aS #I/nb&}CGd Xkx)5\^&/$GKN;3 gE!]c@T_ h endstream endobj 186 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpZb0GOz/Rbuild1f4c2690f2f2/adephylo/vignettes/figs/adephylo-lm1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 203 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 204 0 R/F2 205 0 R/F3 206 0 R>> /ExtGState << >>/ColorSpace << /sRGB 207 0 R >>>> /Length 731 /Filter /FlateDecode >> stream xVMOA =yJHCCB()MvPllb޾xy<@p dyzNw t3Lj:dg|2 5[ ސ=djlOj:U/isE#*VxԻ8g!pmT%qa~ćvZJOV A$o+]z|:JzBOv콧n|EuWһΚwa.Uu p q7̾h>N.k-jts˧r+X/׋mE4 b}?ՠ&gP &b9X /H{RoƳ/ endstream endobj 209 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 212 0 obj << /Length 1294 /Filter /FlateDecode >> stream xڕWnF}WRR-h 8i@4U)5/*IKsfv)ʖΙ33gg%9vOMOю^,T"gSMpK13UC3bGV?N8f2MK/t۩vgz%=) ݔ19`tٚM/c@vs?ts,f9f~4`vb`7Cyn^n6| nKmo~LJ'J\kD"!bm ,& Ƨ"K}WǬo p'S g&l6Mm1 s$j;^,%TUWxw#`%(cRNaͩƹ!r;pܦ,qS+4I" 3셾'KZ֕)@5D ։nАKNSȁ`S_ ')x em:7[hqP^1Z҄;fl͸ҰIGդ?>kP%4% -xk+7hwvsֹ _"*,YZɛ. .8Eg|qu+ 5y+'[jv-0p"DFCD~B|? VhjRd;Tجr, ht`G=nr0>4V~rT#eeT^9[1  <[Kh}Fg>(D\xh'egXD0FK3TH dU+EˬȑVb U㚴$oVZyTefg.UL"9X-Sk a袇joQ#c'K,> qyۦ|r9؁C+Ab0߳r(|vK_inP3FzۂJ64GS_MVDWBg'l̺CڙLGelAY?LzOΪ֬Y +@M^n^o4Lj9)F*.àeumQ*Үdឮ6 Q?7qmsrSq)eU{N9dp_x D E=TkΝn$R%_V%jܟqLvFr)|?HOtҋ'."> n8 _vkq|~F]|*&XWZ0WD8 i96ցj"s!> endstream endobj 198 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpZb0GOz/Rbuild1f4c2690f2f2/adephylo/vignettes/figs/adephylo-resid.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 214 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 215 0 R/F2 216 0 R/F4 217 0 R>> /ExtGState << >>/ColorSpace << /sRGB 218 0 R >>>> /Length 1703 /Filter /FlateDecode >> stream xXKo7W(1q @XȊ$i}gX M[Q %#k:10LJ%3\ްݒݰDp!Wlcߓ`^ljDc4W pg(Gl_(d(M(82U^yFkhJ”a.H Y%a ё0e4 G UB40y7J#aPT-;Qpb!xGSPfL f : `8 ## ;w etDtGF1@I21e8_9?cr~t^VϘ21٭VX8:?cZ-|)E]1eU6cbֶrmƔa|ڌ3`Wi>Uj 5Mᔤ 8NU &Ké@0+OqqFi0:*O{g/ w)=8/GpAٚMl 68m["o!^}%q1BD0#yq5Bz8919Jh˕t<$GLu\x)Оlo7чUaZ7%olISj T؉7.UQ,L5iFAܪNK?om w0c̔ƔQSFjL1eƄw5UԘ2J]c(]E)t5ט2JgRc(o ]jL1eƔQ17?2ip!7L7\;30WQ.^ o zëbzlRB*J#%AFH+R$y{h ǧƑns I !)#T`%f>EǛ?*#% =IA-Gq t 8PFIhB8qLA-V `Am7QG=2񨠫P.\) - A}!ٌ3e)pԝPdٮ,[ٽ< oJYHUȇk'̋#ʁp "G4'8kWCܣRҸ+NJbK#FA7xn&Y yEw~E\%q $g ؑjnnOQ(<h͡[m=mz Kiٴ[_ ]bnWI+ 9-W~=3 Q>8P~?_unn3Vhd;Bi;'j,pzZÇ<Qu݁ВːM1n}XCu-[\J>-޴Co,w9q1}Z,RagsO c=`W>_nh?vwݦk*>؉u}ZPkn1zڰg1h>zZC%ox?!-<3-[e.1onߔP*\JS(,GB#cz Q> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 223 0 obj << /Length 2738 /Filter /FlateDecode >> stream xڕْD}A@mTtz6vby"Ve%Xr/|;y[CudeefzgZ}Bp_ݾxuijTe6X͒8Ug;).yXiNY'X?"&d\,. &XyC·צ|m _ |ϗ|Un0BV'qV60Q:C(cHгy /x$64^FPMÉ /r*$b_%_^ j1/ L, iᒎf'6nw%jĪ@_uiD/R9/h]k3fٙ?*\"vLeIG*HHeFc@z fE@4@Q;D+慇8 )᳸(leDS?rYŔ8GE6/ɋŀXbqĝ'2Jصv=L+`JX|;lIu/P,R(^1H;6=zͧw5wZjV>s|Bv$75ZJʥ U.%7 ސP z )p Z'3|$oD Flax"r5>n -OJF 7gQzC.z}k@q;jCqC;(+6ba W4 asm'|$:T{!w+E4F!y],d:o|FlX̱(1 sG zY[`E1xKNϐ7!])ۺ̶$H}^ ⨶//IFBDe.(`\*LN66J(x c/ց{uȷ6f$S)1O*:b/5tWhVY>?*I~L5(<+᭹bye9qM1*d8%^O JŦc=xFM!*H6Gq^9nUؿs&Vu@ qd p1&=@={1b{yj L_氓6a8UQf zc4I8vAbMQ' _WA }d u~q]8TL|,Е~+EJGQU<ךQ\xpFŠj0&4h( ^L=1 |C*8Q+&7/|\<6Sbr<1ߦD:,wߞyDKNsŜDLDzoX/.Rן;ڮ?a=Ca__7 8=*߄ v?"zqQ|A%IO >3=ㇱW aY!t~]` kLOKFa~qDe#=٠x`QIm4>Gk+IDHrJ9hYSIĭ객' qdU_SS֌wrkR)]Q+ִ"f+=עF,J-rtzG4dע'D&F Y/$uO2 "E[P^zX- %m"fCTAgP):O:=\O%Ɨ*}Hy| d}KN$dXb;>jpT=I3(7L5S&MJv*(be]Nu(Cc߼3f/j#L4ʉ[h{7`k?Cb.&F-yRJ`ϛ aWP9Գoˠ ff?xHJtiIr_zQEPd\#rmm'SmTJ)Td)x)$HIGzcX>bҾɅv1y{0ꙪUeҽ#̳C'1aȂm~H(F{}:NyMIA"*أ$@U[ U'Eh!1v b崛hE E./Ɋ6297E^~t7)5Ԣ 7sa_y#*KpoT8 +.}MoytXeTVG||S:lZz<*)GcV҇sm c}XސA ́%a8ymėŔ0#9Im,=*x)7/aE' endstream endobj 229 0 obj << /Length 1385 /Filter /FlateDecode >> stream xڕW[D~ϯp z|7"ݖ"J öl6—vDι$v6lAx~|g=gxΫgg/S'Y֑a*;q?e\/]ïOA-J+g|ϩ/]06J0dVwHitfO3Z 9/HO(K]UfQ{>.t2Y(E?ME`eTFU#a&= M#ԋݟP0 B0h5Olʔ*i7=Q iΊA2ڪQ*D#LkX{+fzc2wU#_n1mDBEnFi"~2L<1O{)U+ i> wM4vb p3*ЊުR)Jʾ!TY2nl!{ڐEO`DGG>Wr/rn5jMu0`.>+|1mEUKf41 XRCœ0\>gji-k='<PIZ-ej96#@$q?qji" B1ґ3^WhnyL"R3ZU0|ح㢻Z3ڥ{Ҥ5!Xw} Ζb&5Xp*pT! }k+|3m֬wk24 jam K͝5fbW|d1 礛ٿGr kg\`j9 U`[&53'dpNbt*da}Qa NdZ &@\qMY\V31F'N9XOfdÚ> /ExtGState << >>/ColorSpace << /sRGB 234 0 R >>>> /Length 529 /Filter /FlateDecode >> stream xMo0 <Ƈj"ۀŷKm-GYN,)0`G^B~47r9~~cZ Gyk y(o?X l:4?MDb0(=zaVN3 "YP3$V h$ٚqllЌS 'I3)FLHIϘ5CHj? bX24Q5y^XP!Qh YQ"C3M-e%ur3%c(tl/gen5#w ☘l A.Ⱥ0Yc!Wqʭ$/ߠէ5kJ][p݂kl6ojse:GM*=cXXLz '$J΄nKX)~9%q;'ڝ|jV<*+|*ፓCN:IV '1a 0YivX\r(g\sG@-ik{ endstream endobj 236 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 240 0 obj << /Length 844 /Filter /FlateDecode >> stream xmUn@}WXyFw}Gĭ<4|=sfv{93 >Mb7k@:I"/2YPw_(O,e%y;'xq80Lϟix| M̗eAn8 4Qs~ʹ7׈^am7<:Kh;®zֳjB9a) gPзئT{ѲГNvgl0ZۍC)ng矉P2#-l'E\ =t@j@R(]9S5KCs]0T̽'ڤ,Y^+P=-plj6~EFq lR4΅aHąIA,/4A}OlXBB-ӠD-b>I N@[~x hIu~pNs sNҦn]ke7Ysn1,hXjWecQӽ1m5ix'<4]-l&1iqw>$qRғܢ|7])J~;CsmΤĸb|8x6OYPDUk:2D|3 D+07!K^ceo> /ExtGState << >>/ColorSpace << /sRGB 246 0 R >>>> /Length 2323 /Filter /FlateDecode >> stream xˎ>_t|GKHHG `dFWԳ;bgXdUX'Ǚƙ߻oߤfhNƹh}4>$ti37?͛wNdwo%_v`&ΙqmŸmڸ _w; 2)L:lr"'{b~2#|NaTm {mJ#ېf )ކ`h pNplK{lÈJ‰XLF0lwx+&>R; ]̎T`& pQ$*ܺ!3`R`q {j}5)<͝ a 9Y?)&F39bw﫳3S;091Sֱ[3S;0U;#4>&fP=F+f f9x6˝ cĆ`0=Vv= +7>T C^9i{z7[V1-}eC;^YЎWV;&ւ/$7/{8`X xqm^\|x?M<2meD"6PwDn 3xP׊Ba`kdyos6PkHΝ7P/$.[%5ޛl}p*ֶؚk[lM}$ԛlMM&1z5,`*M-.Bhb~'ȟyX4H~PHLҺ S¡!p31<{ +C%$bI1H0XR p+c.oOC)rJ1C0R -kC%~bI1^RKz -+C)Ōllq6t͆=@Z @FH|zEA/ʹ o– Oxʛ!–e]ڕ܇kX3Tm`zk(<ؐu />)o \d<~=f0sjffp܋ 锒[mʶ:>\ C u-NxzP0yr.>aQ-cVZ7cˌKh]" [UR]ɍVr!FV\ n_%5OEW>h}3d` z8W2VVb6 zԹf$e]o" ļgB2iA1..5-A-{˺%+ ҄(2H/#\@N@#ܓvoM $PI~rbTiA[%ϴ1o&Πw<_Zvj\B{͂MiFB z6+F+FH첡GJU`v`o]"-x]Fy'm$ u"4FoTyD|IO H#F$#P4@ `B(?>g7u3ŃY G@*J3ajDy4V ͞3a$PZ/J c\B{yʠ < W;MǛϟsxq0LT?˪Jx?z;n.f}{yTe^mRzG/u{qGH!?noꊩ΂}8~bb>GTr=f=߿#Ç=H }?J)B7J >]?0Kۛr ǃ^Çg 1dͥ`G0w H4˟ϼJE9]z%rُ𬠃Hi?z.n&rsBFQʟN*0|B6Fqe6=MA[>6hӀb:(6}SSrT$< \'a2ʓLj2̒0JqW(vi< 89TTL_ _3.|.şY.VNN:Nihѵ̰℔5*uƲ2 JdQ  endstream endobj 248 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 252 0 obj << /Length 777 /Filter /FlateDecode >> stream xڅUKs0+ȟ8_VKsбn B, E25[yyrDE#Ֆz M N[bE=_>Xҗ##tqҤrm3"ƶ1# uPP#XF{"L$^)?l23mMfJӾRES2`.?^Ƽ8rݳg-gێ^tg ;̚V%aRtK1t#(> |AEcrYK[iϾ_A ׇˆkb_, endstream endobj 237 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpZb0GOz/Rbuild1f4c2690f2f2/adephylo/vignettes/figs/adephylo-aboutest.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 255 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 256 0 R/F3 257 0 R>> /ExtGState << >>/ColorSpace << /sRGB 258 0 R >>>> /Length 685 /Filter /FlateDecode >> stream xKo0 -9Iɖk([P"%)Qb[]Q4!N|<~Χs >uqv)bCow0]â7hOzî9lwc`ś1~WWŇiZ q]_|+[0pW\籠&OuH r$.n%жBNbY8x<y+< oi 4cű'A;c,m46Svu6Ne'’3.q)N{YŢ7 Q۔ GzJDNbYIyrwLiI9ZKeyU$`I;]&j9]]H5wԊvtX,haoofgQD>5 u!—hˌQ@ZHFC95Z_I]C\؄Gg2,Z.RA:! ~U-N )m]2BȔG'UBNwyKQR\1*8ve-RҍG q TÒWiQ nпcyշQN[t.hUcMcY3eǩ,9.PIbu{޺IЄ%>E{YbD+> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 263 0 obj << /Length 332 /Filter /FlateDecode >> stream xmRn0{8CHC]/*d"=w sjSpU$mHyu`~Cjsc,ܷ+~c.E]ST歇|?uN"doⶓXcDǗ4jNq*Ѝ:E֋jK W{\DžXHA凊2 [iSHOC@քkq|c1Rrk.k|rO3@9/8% ?ˑ=:g5AM;4zrL{? :!3|Mg>M QcnCNZ<@0ޫtLUX =/, endstream endobj 249 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpZb0GOz/Rbuild1f4c2690f2f2/adephylo/vignettes/figs/adephylo-loadings.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 265 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 266 0 R/F3 267 0 R>> /ExtGState << >>/ColorSpace << /sRGB 268 0 R >>>> /Length 1670 /Filter /FlateDecode >> stream xYMW[7WhQ%$-MsHS,( )Lڞч$-b3ּyWW/kQ(tFܜo?LIh?ǿW?/Lx5Zz8~Vqz)`$q=z42q=LZ Pd04jdJKYX9F#4h| 'j4L&HY:CQ8HwF#d- cCVye k*6^ڐ5B!Ȥ5bCX4fN4Y|eFGƊ`b xߣB5䡘JƆ*5L8-]CXW1Š@m aEbIVdMF$>Q#zoY5[JڱǎY֎#S0VdP y/D" B0VdU9yI aE)B?69Xr6|9  @[bYJNYY-(.~),bd ޯgq\ YC׳8@uw*?=rOpڤ,_q(f.Vf?=<?_8G-?4M<|[ζ3j/HArv'UnTHk7sʉ?Pwb,脚wp՟JWwXdEmםڎ鴝3mԥ*7H4ZF> Nѩ3}VYw-^޾uoYd]Fyz`VP( (As$R!IjHk2b܎.Ft[嗫b=FD#T\KhY4 QpsSk'X!w MN`bu<"FpF>=Tt^S`M:ƝTt)06yJ9ޣ׸u@Ssy? f~b4K@<%m f i&tyK5qOX_o'g+V@삥%s9>(U>ăy#jEt:$<#B>Up[Lf`FsanY]u4[|;;:!U̦[,]ʑt뇫M38} Ի*f]mŋ;+xQ⹁CfԺ3r$ؤjvA>6yK# '4M)(2.ץO-Oo_D @?8lgʛH9jJt+{ =!9Ɠ&cG\,7g\D[mnV᭦}(/*SAU ^A3J8+f=.7g4ωek=45sg5g~`U7d7=2b+KEۛ5<|#W/:F8M,62YR̚w%݌:<8 )nqߜ+eXfX /nT(rW?f HGdqm<-&OoX9V?!j@ޕkۃןⅷ7z#׻[qv}uGq[CpO+wj}qvz{_ic} endstream endobj 270 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 271 0 obj << /Length 97 /Filter /FlateDecode >> stream x3632W0P04V02!#CB. L&9ɓK?\K(̥PRTʥ`ȥm``S: 6 endstream endobj 152 0 obj << /Type /ObjStm /N 100 /First 881 /Length 2074 /Filter /FlateDecode >> stream xZs6~_ÑX7.3צfz@K;Yr%[PHIe9CdDb?o4(9e<+C ke(GrO÷WD{Y!Uhk2 Nh`wVC YRa&DuLҤ`I %F ɋ""tGB\89,-S! PV0+(LVX jiޠaH㔵pGCkF/t 3mԲzBËFلqi'=^9 #VrA!# 2THZcc/2Z 0".YF4yIiX AYCp4"2xCC+"|$IHMKr9kF<s m U|e8 zdJhH64! h `S !F,=Г/T$m .Ѣ@*zs## %%r ?`9Y $,kxԅz @ek/r2,&˞ϦzZU&,g#ڬ>,`R|6ԅ~8;Wc])Sn 25r>jԹf'BC]bz o6^鼩v6=Fof0@}ug޷#?݇vPoݲ{/G\FmJzZk&]6Տ˫.J)[:Mkf[ӵ>&WG՛SK%23zE>kDKznrW.g]3i%bV7GˮF|4gj@S-Xκqs]ͱv5B&rzSϗzUٴo5E50y{At[fY04)~ϲhe| 8nC ^m!?f_3_4*N}{5i]6USϭ<yڔY&$> 98 ܷorvOkm:ҡu-ֵ}Am~ZV%UPRxnO*xȍ)~ ԧQ/Oۡd6;`DG#)M$6¦dvyW~/< EvPd!xJJOɒq~>bㄋ4}?8i;W돳gKVbx')Lpz 6هɅkCBeW"nRknvӎ~H;Sci8ygw;E6< }e\GBxvT`: ;/o^Ĕ^jM^>_#8yڌH:`g{#]HZpӄ> \̺5sMCi;$ bz{2ui{&8zBn߁(Q*e"e=}_Ҏ-جpM{ykG?m B1h{7rJkTM^&9Cؔ D.)_ endstream endobj 286 0 obj << /Length1 1920 /Length2 14316 /Length3 0 /Length 15506 /Filter /FlateDecode >> stream xڍP\ Aơq'  5#szjk69$ vpebcfH(벱XY9YYّ4]@#Qi]p]l@׷@%@`gge'[` mhl||<Af@ d6zO ZA+WWG~f 3RajPA?(1#Q4]rh-\= `rАS8 V+ؘ[? Y; 43;,v "+#`G tZMlSՅ,yf)s =$Afo:=|,-aȢ`;̈́ bee O3+?rdx!AWg7ϿfS? ;[{Y`77 Y%u_8 `bbqsx^*>+`>e5@2M ?B7`b5{{)TGWߎ[y\7׷)P͂ 5`;s͂Edjjf\k1hv UW ަpy.Rf`?턁@/C~C\q4yb -F`vFD,bB|"V?Mb [?警[$ `1g_A6 _b_9֠ '_)AnͿ[o] i|.6oo7o:~[Mxre8I|#/zlo\ty"q'mX\A& W( Qv:[=?~x> 2CZ Ԇ׈`L >u[nm)%z$'gVxbu}$L{/NA͐TNnh2u}eˣw˦b gL(\H.S_;&̷`ٓ_uT kGՐ~C n$q;_++GR#e;8iyu9{b-(IGsr>2e3Szl L$scȗ޳l~!w-"B$=}t#A`^R\ Laʊ-ϋSgdỞyOq!w KK9pҧ\#gLvcβ=JǕmtM62rrE@eI9I%^ &i26{QkS5MC%IZTH0js7)'{öKcs3iIER7E+婜ТN2K>o*Voo{sQOp\EvP2Ц\gHBb %~pFs55:y #ؚf t$ یݟ| I} Ӽv.'q$Lt{j5Ǐ4ԑJԵ<͘zO0$\)JM\u۫;HNkS$c[,lNt@ eQxvYQB.m,R# %H#2l: ܙ\=pKm>W13n$SJ$Qm(ptޡH6S Xgu/`@`{D6u+4-q~ݙ+fЊ*C:/hfW>H!!bL 7LVk_'Ԋn,Dt0΋74-<9&m4tH-[ӱu92CP_3%ӐaP$Z79r`@[R AcUN -: ,ֻ" &KCy/~Z w$ԢW$:~z8/]weKd }-H8CAwAFSZ. cѻ.*n-|3yd=\[z@sc^28tsz~e9"5b>N( wA^:ɬuSÁl߂cZ7?h MTӢ_ M9`YGn4k|ڪe㣌Av[[i$Ϝʗpfa!PN1Z$S i)AN,<a}5S(W !GLYlxy_}o\Ar1!eYoP<1ȷmG4x5I78㡠X*s-{sǙt %،s{eh2^9i1֕㶉|( "UHbBB7[]{Z]/!lS)]tҚѕX?c7>G 8גּ]e w/e 3VpݵbTt/񽨲mSmi&F ou}R'm:2k_cT"v]/ l_CP`t_io~ l%@SMg|R gFf^[A%""lZںB;`9h^ȩ_جHB?8nl :"8"@N\i]IWu[)k<Æ53N: =H'>ya.dt=!/brrZL4Bi$>l6uNTgb09/-џ:A~$!^l(i9`*G t&)j[ЉBU@ O,N'- 7x?mgM~FmlIJkoĀl-C}E wKB 'l5^D:A*O;wHוgV[B͆;3DA%hv}xc~"sjzpG3|xǣ$eehҡ$FT;Bh9除>]%gq˪ 5rp7z ɢ@ek*d?d4CR.& ׉VfҴmrXQ=ԏ^vt_(j7 yZ3EB34?} ~BAow7!d`Eta%_R[N:AT({¿ֱ;si4+ 3Jr!dFdL~ M;#5FE+QcMOǫS0 Va8C" 9`F>K Q'֝Ocѡ:?*}(S5s͢\g4AϪptoJPɒb=#qe DBV\x]^J8# %d7<;>YOlC௏;F_8_pIflHT^ %(|{=-a*CPcDV$yzFB՗/@䓋KO"+3Gt^N6ͻYaR x/{uwEB +(*oyEu~:A&ȴ$E!ڲ-8octGQ<(Iэս!荺9mnon85N3Uq70%=xfNzӺw gQBN_~|Ǒ-$[nS|74muwD+K0Ou@6){،!>Z*w sB9BdYN IMG,`dLUIU#Y,ڗ)cNgc )vNr6Ң[V :N )EtHȐ<r>& ׹YZ U,J&+c hdK)CQG nOGi0tq_ :VK>k4O( r\h - p. 74ƣ-(DŢ.Mp ouUH*]5., rYC#dud|, dׁN_b-  ~!Hֲ_/)cF-o/W ,d{57_+,0c>؜ 7KSS/Dqr0]C_-XrDL^"fJ6[r=0C\Rp1EB5:Iq\P?.uB4 ytZo{o7Q7x ?AQft}}q~9dҷ;6rJ7ЊPZR={NWŶjyS63e9/N @ftLJ@D/$l{$dz0[f)th)I-}*Hy"2'JM .t{G7NR"b gEFa"+xS~t~xAȹ-!.T9b\ZAHk>Ӯ<$#r.D]{α̋)ĘN}ϡr:ς=Qդ"Ԉ.!l()͍u ePY_;ujSm.Dr6Ⱦms 2* :ì*b֕imV9Uek `|3/᠛cC/jy t./YՓZJRjDzXpD'y=Z8keB m×@2i| Hmmiyީ!v"}3 LhD HݡfMP,AV/*ߔLZB 9ViyM<޿IxYm_xi*_3YJzI^ \D崿DCXVYs sxBmQ+(zBBoj ?r>GOq>ހ< i޿ B8df$r+6$y˗wxT+c.mmd]A%8or |V0*_&] %-8/-WSbW u:b=dY۴\"o/0 ʘ>#'"@܆Ǔt VՠW;2h|qo92$>;3M!> .rа-VSnvoXNƅun=SsO%W Dmbo\%8HV6ˮaUU6e٭?|tONSjaF WyFbpql-TzEu^з56ܟ/O@>N#8Ra=Ꙉ8xYYP 3 ]&m-ĝoER$:*| o/zdTߋA)7qI_jV&뚺i"=zEcܠa_%ϵd[wy_ӿ g;QCςC|eL1P8]DZ_5Dz&YZGd^ @}lО' :H[mCFLDc> d2Hs: "0_yea,"r㧑 ):^~wRMEOl!/y6{2NwUmS\[M!Cx͆xw/T:}(r퐍|]qVE&6p5~пMbQ-Yy}?7a^]GЎ]|xj*3rI($*$\<+_%$O.ȰEoȼ\L~֗7GXǧzߵM^ZtT:IAUo,ܹz &]mmc%#b٦[ShḳMi} 1zר#/bqtS;x"ydUH?, ]DEw49sc%~bH kU`nc7~yd94QMC+w~u{ Sr|p RcD`+BW3GPiXDK8b)[$'. a3u8? ٱirz6Zk+ ӄ9עirS, ;'5+mߨ%UJn%ʙ߻{\a1<턉븵"h2QpVⰥ*Kt´}g3ceQ9nܝm.EdVzS4k!IdߗL!}sjAJ $g?&#8at 7=o<&=SDK?Ԃf7{ 1+ 5!-3_ }V5pߚ4kN& *hW'Gvr s<!b-g`ueo֗x]=n7an3t.W Z!fT39Za$3Fʑ : }8 1#ͭXaE2* uc/hqZM -@G:kcRvdxw{?}Oq7JJE=;?hq-oZX=MzlbWK1OўVM DSMbw{%s]ua@tםL5ۏBC׮')Zi.ϓa=iO*?KyaeI}g#F/mtr[Մ| +\%AJ?V\`XV.l;\JOEsL ū)$b(CO# @17VM< \^ZdK헓Q[3{Fzt06~$GhΤ$C6PQ~w`MH8xsդ4ͻOQXϐb?س{ع~?n*𡆎LҜ0y0>;f(WczΣ6l.k>1Qn~p)e|?gKCrǂ+sPIa iEuvY{>Bot%-pl #f>faҥR39h\|6LM.&Luz0:Ou?#5 ޲p,Y*pW=&O" atQSZ*R?Fm$膸2FPcSt 9nWikgX;bCJh)[u^-eY /Ǡ[6:CWw|)Mpm=.7A0u4L[Z*߫s+"͏|-tbF"*PjT_CU-9T??w | z7k{泿o\@B@W27fƎG1g] ,8U# # s-%gjOQ09k dE[@*Hto];٣SB p=A+lA808?bAC?'웏Qm2CSG}R1_W̲ -Ëtpy6|IC%qw4eaz6A9z8Vٯ  #c`><۹H3ݑd0Pᚮ 2GWhcOE`PxDI5]B+haRgrNm_/e*u1vg|w2 *|E[@*5Nz/ݾ9LL6 V4gOzw(r0#Ydo_}n-[~'VqԊՓ~#6b+mX?ע1̾#a^:~pi).|h슸_;E6):W"7H.FqoǬ81G4(fE#ɣ< ,36pfqx́<`B !ZttBWq71Ʈ(O+| k 1OE>Bf7K@{DWt`HtJ[L*+ЫK)-(li6G A'68Qߔ(k&8BHkPagirmOxjYr_9Ҹvp#ݶȰUV>},_VIri MQ19(=w ]e m/uxȡjxo& ClcM@McKmareh1/hծmWñ'tV:+Åp%";7FyѦ,8j7-1#]J/TUO#sv&.KmU+>#:øP}ȏMl*Z ;R' Dx*`4nypȞZT+_./aEs#;X܆J2b?h|.R1%.T/K{luUT22$B=xp&QrN<@2isҳR_'%v pPt|G5#gH@axohpG_'_^y?jHj㱶>OuN\e˺}PRjQʹ]zӯ/'h>ua$J(ޟQ'y/,zυ@ZNa7}}+q`+_J{>;Yrj+N|#1]<1ߨN`p~4 TqkoQr0y{Q?] [yNuW?VipUt_ _m,5O tIa*zSlOM:o@ֹ!E.(3g7xl|tS~,OsmfU,M9N_Xz  k%'sּJ,X4e}*wDh!2M{@ڤ 3 _Npy?wWX y!e/1Ǜ.4Z䧫C+xmKup9%m%\iW*S1(i>Db~tnԓ]|)77 :Xłu׬[ xtNJdE[-*ɫ:D:{ :Զ1r,r\QH9 h kZW/CtiOCU_uԤ>CC]v !$@,2M:~:E|ZߴzO5fHLa&vdq=|NdlO)D1%+Xba\@|K/Ǡ&-j:H9`Fy*JWFԲM1¼Rls[UA|$*Ti<@zDn+m xha'hzp#*Y&BGsyD*>;,}K߫[>KIyr6& SDHQ$Yz:/&ڸncEJ %:װ!#Ɇ\FNH`PhEϝ~4zM-q{\"ܺr3$Ij'҉hZCܷP單$V<1 /좇p";;N=u=Il搗j [I`Fmӥs3N#HUm޲LDSX|pV1YdJZ*qW[AN$)f0' "8Fq2ҬQ+ {Ib+"qSh x^)T=1Wamh*ӧ,}d0' ,*n?u,g^* "b,t վ~$f_2jM=]Ha$oӜAnH!=˞UNhkIݛ|(\ISsc5 wXu+etY+ BP{ߝs*#Hktnpw#M^2F\hƫ8̺ ٷf$L֛FꌠOO4D*=WnM-^|p.R5C%q=[vf8ow*=չ1yr%z`E1j,)e:iN:\w|6!*fvew+xQ+Ok:7@ܣL.O} #@|4D==3[3md l}ԑhFݒK+M9]Νm3bbgl+kcCrn$l@ڛu 5}lkоԹj/"EQgmh7w"YDX*mv\Ssm3 q^MfGrgǘƛpϏ!lm7P7IUmoL6quv }">b !@[s.GeOk (B L jkWeZb||A9(D!w3|;yV3++w %Z*y,qͰVLpč^>.*G̗W2&wGr~x4op[j)!gjK]I2ck (J7k])ŭk2ZVxf1l;Yr *x&䝤{G>VOᑰ 6f<]﹖q5RQhpj gֆ\ BQq[ wDt圓Q5k`Oh?e_'a*S"A{ }%%:@X$Qɬ4/ovN(dS M יHjL+$p6 _a-"1y(ِ6x{?8"|SMC+.-t4\)eRI.E|vS͙z#)AZ&>t\wd̀A5b\sŭۚ~gr,:(PE-cޱM;XYڝ!h#:2g2N#uUGk[,":cf,I? @ kl3qw<!K < =8Ź_LA5,VoP6c j ~S+mX<j$YChW5}=$.VǐiPbp,A؞p`'=k:[l~G -? endstream endobj 288 0 obj << /Length1 1927 /Length2 12654 /Length3 0 /Length 13838 /Filter /FlateDecode >> stream xڍP\ #%H. 4. NBp8r9:c QVc1s0I:ػ202DYXl̬V)4A.Vs]m@@{- `efO3/@neP`:؃\),,]@mJ`3 br2 @[JP[:21yxx0\-iVU dcd"huK+j@g`ke wyOq79޻dJ }8F;BV&MM^Vs+[@IRӕ7#htZMH= 32Q%@.r/?14쭜@2ǼY\\<ijGu/GПN?38:8Y}\ ߎE,,3+SW f_;[y`'w9z+fPP{:EE<> lV uV`'Wse5@ûrAlYSU_I+;]n[ 7T :ؚ_+}D-l{V.V 3e+WS˿]E);XqX}LmޯwM/7u0cX98@gg,hS&F{p~sg?('I_$0Iq1$A,&I^SῈ=O0iAM8ޙ:ؾ,ٿ{eп +?-LĬߙ |gjdy/_/;3ܜ}+5;gy/Ϝ\-A4xÿgq|_?=_ןDh~yM+?{¯,:Z׆?T|`88JaYqp{BI|'<ҋ'A}+JsRњbYu ~y{p*DnA]W3K"ɍY9_ʳntm<|@尊St!V#F?h"$sڕen=kX3߯XmָruVnPQC⠯=5!H/LZ_CS^CFTQC['1r?v;^`$L_ŨtJ'Нxp5aF:i 1Wh2TTkʥ86T!67\,*Ա`}.'y "fPrAXh+Ք1=d`@eu mۆu$bL?hnSB)K#2㝶2ZL~{V`7pݯ~ڮm` WAbc$V2Bj0#1=K'{ g/H/_iX6 !X叆O'E*(nj>+C{]d& sMrɯAݲM ]e]ph2;Lz'֏< XJtiSz%+>Pq,njBq`_ je@WKŕu6/h`ⶦWf6Ϗ!h`$pKno}Z>$_7d{x[fƒ? XAVat&.HU64"qC{9]"'@A[39O/~ %TFa6_Sr6HыW%H |fWai f%ܠR`>Y끜pRO"#[I2\[P1H!2d~ExT˘(F{O`^d΃|@p%?U$,G.YhA d^D޵YEeDJBmt|iI^ daf|Ru֜CIvq&~7ت,߅,$1,3'h Fܢ])""X|Gpl#b/Y1 &V;K" M IPElQc?Ylm} G oNcv:yG'/ZGpdH+)MN`8]m;?GC#fşNw$k\#nJ&g/Fpb2BP.E~n) ˁ\: ڮ7>WW 4Dl9+rxypiz Lq9շȤ^uq2_C(^x/Tb2o _98"Vܱti [*)Hf俿n$#2i-{Mut^7ЬLi 9~f8$[2PL}H9b剕ǶM tMgނNi(p̕XQ6*vԊ U 瀬+7DղuVZ9M`/4]n5ntf ?KL]"ex'_c"h[ͯ%癊ƿ8N'HבvEzwd@o~QeJsf?9>Vx*N^X>qP\v+O9--5:W +'CGP&哨 ?ObF߳IQw  Bf/Re3d4 \|PPROwMSZԡtZRek6 %B4d2j`~Z00UR̩*yl@s(jl uyPU)F=m<$uVr=9sNol7ŒKxB~΢5\fw>%9M4/C D4r"XOPвԂ<}=o!P4G,!g˵%,P,BGu\AwOH~_7(޼X*w`tlĂH^y]^R\{F&:5ӵ#oY+K !JVi|AMP ){˔ChП/JR:((u~D$xgï(|ǾmUz&&w"ztFDb3Z(P!ec("sI)/xEEY/gǭsՉd| q6ʌi'3&+BڭOpl&1c(.)U.\}τ ɿ- dXNkD#; .7zT13<^0 :;l|91 c͞DŽg8FTe?#,'F(W,\ܕ@]SGW@|Ox=;CDߚܾl4jbBN118Gtn$βh2@^g'*9REܚvh*hIUQi?.~;ħ˶[ga<` Ap1v$.Xt=2'ުqPCύQAԻm3oS%Qˑ02)/H@5]JOW8;|J6;6ι.X]0o|/ &W`w3^YeB߫Y3&ܔL MD6k\ %MgtکJ&/j%iYOK}cSZYg洰V1:zj_Crg²R$k*C8T J1{v˼HtE_SuD4eL,6E[iX!H 8Vʡ84(Q.m>EƮ" $FHtODE o%t&߂d,Ռ*s+@w]C3ai^5 iϹM%e5rE蠼\~F,Kq@o4Vz8ZШV }ޱH_KeLK֋Ƥ FJNkm3;=ҤH Gb,>Fxqu`i<^-&Ѯ_%Y\ϱ1p ٢. 9-tԫl˫7?z3XbW1}d`RױyS;,'j:%BV⛘д Hh(4&A zX́a}}y~Lk80#{L~P_] 5EJU- aØ HZ<}vٔ`3? 42"#-X~]P"B_;aV(z9c%PܬjBGkgS(D3&V֩aZFHwO_7|s+ar͞/n50F;nb|}C=Fj@xJT^cߖ]`&-$#4>^@V#WmW :Uԏlwwfm?;=T)0np2ýE^4?l]sMɡ=@fO.F$:z+;|֔TzPblvFZk%5:7R YgXVGNSDkiCjҎ1?uPhszA5tLk mvSG}jt ȶ o_(\`kqƕLJڤf=9%Xc_b` D3@Ǫ󕷊*} WRIfz5ӁO:ʝ9| t#^4*Sͭˮp(+s̠ Q8~pwpu&#S{[g;C=)^V|h 7kA`O V-+4QӆGfhbf2cױk=h.`R2n1d;QDh mIn.pndSq9 4f wFqlM+`7^0N]Zf|SҀ$K K.*dCUv0 18?],kҎxVc u qX7.XXL԰;1p5D,"G +L\awTe6oFA1ה =jmDooZUF9uF=?@sG壐l``HI/=a`Tu 3e\7ѕ /(x_x>aLLC[ҭϗñL ZG{C=:4pQڿ EHu~妩eAEaXK4d LcQw( ń`R(VYυxەF]Q@ ?˲Z#_MoPOD.в!}k[O@l-nm n%^Q僦 TorG8SXCDX:p{G$%8n&9PPRWՙ2;4zKUo0`xȨM*W&)yv Wԟ"7 à)$)f܋Rש9Hdhso xY$*̎9.H3(۫A?d$y[ }2'̐Z8@2q 96#ZHs"aOS<- 9^+DZZ_G h7nهbx\0&\_M+T̵_Kِ&e826o0^b(ړ'w]; ks,dAurV [m+ݷNX?سc\Qx s,ϴĈL"w CpێHU<1I  reRF_ߜʄ~=("$A:Gp0-:Ò8ow?`=dLM<}/ϟB0 `YG+Ȗ]Hv,0QEJw].eӹȦ$#=N"S< rA}qtZ x(_c<<7 *pjT)x`qڃŏ.ۛmޖ;ĺ-Bc58:[Fba}t}V2Tm3 &:W@OLe+#%+xP!wў3[grXU>wp}͋:~ζHP+ zj oej׳ 0q/ʹ'_L3^6/lsfJߛgV[rѕq.Wl$ X6y!TU Ipps#r~qIhZ^kn@a9*G<J VLK)V#>ߗ+,ko6,ˌ7>*e}'miRA{(W怫_31}{N3 lG_$J 3z80_-居W*b)=m{zYu_z]eE™mt+6ӍxP _&v(;!k,ɐOy9t;|LI0WnU+ܪk('>X1BCJW-t6r:qb'UcQ^tKk}c[Sr96\]#

8 ;}C2R(ʭ=WZ Q n:IA7-(#W+ETg 㮍UI%c%GOn%ԴX3$prQqTVY2C1,7;|6\Ԫ+HP"@Jln c%pGT2=?cn$EW~ry7/et ;^VFF#[\,"wA=Z Ws)y&qF6 K/z3TL KkLϽi4)ƻ1 \1Exri霃m9\`3Bӝ^~H_e}0?1K+v' l\_i v 53B-G06+(PWPNYVva"ʰ:ErM(cMjhk> s.c=5?T%qz:q^[.:]YyMq5G'.,ڹ]0f'<1h]Dl,'1s~ёGtesEP<4JeݞdUOsx nEJ7p2-Ԉ {SC쭓VR饌{w?Lác <hn~9/֮^gNFr?ʔBd0xx#.<O54mr @(3rd&j0k9^5&Y0`%V'Mr6' ĩ {JaeH՝ӹq^IxV9NEy䢾mwĀՓaD p@𤃧P[MΛsNjt~%Y>j$ )t,2x/D]3$8;<4+ ڿ,>eS9&-=~鄢ǰX坶 LL]ULND,, SAxx+89,HD|G,H)b\8i#N"QvF{mDluAY^j(Bi{H{(\<M?g}C5L^1V#Ao}5y\B2C6B1q= n6k7RKa,\%*}6XE!ftrxAjVbfX -A^0ŸZ]0w{|))dӵ.(\qU$>?]c֙% +'Y Ds~Af|oŰɣNvIih4g1EPhR=Ҷ55APjʹX*< ZFAַ|!D~cQFg=nJ5Rf*ao^'niG7KAUbA:F1~:m`Q28#D2۹6(PVQ|&@.H\[$/x -?-ff" B?KC>uO&pu_*}ջvbg8g&80֊~3ӯ \:Ubb|C6\V/)_9NP:uTDm8ĕ@L j1v?.(Nr[ =?_kmFS`*D1 Ŀ䶬4 Ibfui,7jKZx|i/v[&_;(Zd 1ᷕ[goX혾ϩ+?iNSdOl:_>:6EuBy}u"Sh4!>jqbET/ I^eCATYz3aR~ɁMN$'D-Gw]l=uI?j\ўڰueQ=|bF+a(%[YK"Ohj2?UTpsW{o &uTt cħz2B_/^ƞkhGw˄ rO*?2J9x* T=P ضI"RWY&lglSd.Ӊ\3ҫ~Gt{|vٜ/ƿeP:ɤ.}&aEV y=˹8 qWuOMK !!}xѪX`z9 endstream endobj 290 0 obj << /Length1 1459 /Length2 6865 /Length3 0 /Length 7862 /Filter /FlateDecode >> stream xڍwT6{'KERUj$Az)Uzo"E(E)RTs=w3g<n{BJvH: *Z`Dȹ`X8o=9 !PAC!XNupXKJ@@$Z qtw([D}^xm;w$\h-Ѕ`.m!p!z##݅!.a$AO: ( jU2@S097`ǺCPNBc 0裠:+_`[[ !08#  _@C 08:tU>-b10Y atq"_P[ܹ{4tGx-vʰ{#`Z08uP,@$%)*%_y_j\ ($ `+ ^E?z9 b6Pqj_2h kec7w /2-$* 1)$n8 ?y W;g?$3!|C  q-oE_?y?v c,n ta@7B`]۪A ဣXL$Qy@/񯁃{H ˆ2[g5q/9Fgj[ݯ@h'98I ƍ7@asj#-) jR$@I8!p#_q)% [Gbh\oz@mɧ&2NmGJBòDiGD ,IjVK YڥS=`uK=eףO+ubB6qWY8'h񞙦(I{Fv)9rܮLta(QҦY]rgl̀Ѫ.O#R28eۏܫhvEu \S`Q#2}N}[축AmqUqˮl/Voqeg˂7S:>똕5ˠ_ c'hO<Ęt4_W|fu9==xX;U}_0nEWW1nSV6}탞qgxCME̤یf?rUS><xޮ3ZZ(xv MVrwY:XwAVx[D anଘY g+Ǐ++; `|ׇl%w+ >:董꽈J]1pK/?%xS5Uh@qa]9c I+4BWgxcm$R'poۉ촸G뽬ӔWA:0[} QeC 5qئ%n)Ǻ1 _àm[3SҏxGWo6PS%Of$Y@ЂCG6_ 91ʫ;r<ԉko/Q#l9[w5XX?1b;e:\BQ,t'V:^S\3=H5-LM0|r('[٪RQ\;c>;9M o"/nnL$X=!rW5$fL ~wS$>_(^n`1$R?U"؝P].\iy}NmG:Y2Q~8#;q3j-B)]4՚5&j&1'WkZ[ w68b<dTls>*i?gKRlb"W5%:i4qׯmͬ⣨[ 251-<rv==mV+B0rYC ,3g&c-/OkqՊ/QVKUhl+ʒbT WCG]RZd^"oY}k")C鉬lL'yj]5BM_׃J^>EWl.r*R#H7+3&?k0K,0 {>5b ż?kυ^8.흾ftS*PQX'= e\Ռ"37GDs)%/Yvz2+~L# %k7T4>V,IKv*-[[;I)={ya\"l>ۨ8/vs^4¿oý"+U-i:2.Yؚ5VSed1[:\ui-7 ڳLNP.}kaT0(6?q iw,,S/P\bz.u<DUX& q.gհK_g?/_S jX9Nn9WeȤl1׏<4.CIiC3E}wZVg0m@%i0S}O/4wu#k֞ -wmlG Tv?7F~e>:S(-amwxeUGk5/&ZLPσiy,tWn|!e8 \{SeK\-:EyРa$+h Eȫpk/Z4y.V2['g/+މHC+$BR- _i:n:4 R|idyC|HR|WmW7Vb֊̍>#ACrkjUI"B\^VMrqOς}]L6~6.) {a16q9SݘfEDL?5gY=#F?AuY*{Լ͕TAF΀*׌]"βK} :ܓA%ֱ5qtE?HeȫZxG}-޽=(i̦; 쏷 MN=w>z/o$!3?}GPJ.5fIX 58GiBN+(9bGJߊ*-)'v/w1r*?)o}"HlC,j&VEgݻ*/$5b[Ҏ0K+'ٿĕ$2"cˬR j\Җ +1HRW檲 + YW 9“ڍ'2F-b=]$nwZ[rT*/H@:}Zk~Qy00b׌:cscE8Iw>m發tv{ۭaK^3t3J<>/)]\H^r~h[+J75ܼaMN4!T$_u(cI[2uN=oNVE0 NB5G~B -K~TTQ[ZfCǍX0d]+xE,:I:֯ ţ(pO ˘jkt /.Ԏ״33yv#\"d\f(v5[/(*{q( %1ZܹFq_`wH >!>1xїƤQЭ2K9(5v9#jrZwIzg=GA&>";eM dtW"mͶx97k|IT'm8vb0ss\^aމ] =MsBfb_Q7cUY>m/$OוHהaĵ{!(en긕+g-q(KuuX-:qrVn\p69LB'Oh% (Zwˤ EiQ])nT}fKIԀR߆lg[pJ%Kϗ-l%,Z땻L=Hտ;̜bӒFP*̘΅gaNR ! _VU^ųy&MuYJ\iY/Tt H敐l#耒"Ϛo!)HSM }!F~mVGen} +u3S`NR4ckMQlKr{BYng||M߫z/b2[lzXXCV7U&lؐG3&JArsQ5|W,|5V):LXHM tinU =ɝC>,%=Hա% ޫ7"7@Guɬsr3TrBCQ`rtBdǦ\3)?Pdߓ[i}Rk{_5;=m*cysi(烍fMM0&xѤgOo t=B ΖٕЪ=I<}8IW\pDEXT?'qyZ/PjQX,kSHBakGF֡,?Ą=<<=z|#|AJ[;#`Udch&Ol&C]q6aD5̨1P=#m0-=PZРc'MIx*Գ|E |+6#&uH ~?429|Kx7Lw5(rX@[ +By'd%_Dַ[}wY߿8gEg$bLuA UpVRq ~kw%Tc7Q  v>0]yAK7-z3rfWzFn7Jlpn-ǝ]kjٖ8<2 ̜ xE3kY4u̱`,izڎD:l-b!U EQyOEM53h#[gs?Ԩ-@B_xuM&"hmYrP@n 0Re~\Cbl|r}N2{xԓ2KƁ( { gx4 8[$ݗ /%cu[a:V͸]nuԲ:OE*BV]LV6^N#=,^V40D<zw6NPڿL/h"sLcz/G=%!l>>JjR0$ڹU<%;'+czlǒaI}Aj/oE(X.~VFP޽u$سy'~kvb L8p؅HF+, A3M 9d?^ 5an;Um4 =`W4mb61h>.;HVǎlr1Ga(odu>YWH(9yjSyڙgRqͽub{Wޡ#0`yDRMßN"%2%eTv1SEq.ƺ+^P-s'޼4^D$??w%Qa9efu@}ܔT{TG\Q,A8=YUJ‡jq<)GNWK^o [)ġt bf[6>K`b[uk4h6+P2oA Vmo݆bN - o 4UITq*S]e葢$~`,]ζ Ϣ?IJ(I+Q? SKI2x$2oM:Ŝ 5+FSAԆ8ĶcH1h~.&coXB~#ᔤeoNزNU6*F0{\>Sҷ7ĽFg&{-2fS}n`^7(P a ϸUSKJ=ɚKsma uwM["cӦ%6c̥xOהrk?\ Iơ>19[ endstream endobj 292 0 obj << /Length1 2511 /Length2 21808 /Length3 0 /Length 23248 /Filter /FlateDecode >> stream xڌP\- '@ wwݝ@ wMwI*ޫHil 6֎t \!/ f:&xRR%3GK*@{3k #N d `d0q1s108ƞ lfHXIllLLAi#N/wP h e4Է(+-=  /% w~7 շ<)@=X@NF@{(9@QB g X01'ܿ2 stu[6Էt;Y U>@T@j9ڛ::9Ynw"FB6VV@kG  A3Y kkc3k#M9+[9%m jhJ;-_JbP^6cP@/3c 3h[`df0Yۛ4@`Oڠ2tcK(JISt6Z-+>xwy}񗯄 jA4O^%cڀZ _ϫ/  Q'K),mZZ'G؀9ZJ8A?49 Mٖʿ(o`@ehzt8V_* r;cbe BF-]z:kG ԞDXE 68'^?@/1 & @ P>?O@ P/(W@+AA j1@t6ADZǀ T6hc?a@  ohWLYC?U0 l  (X@\ٚj/b/@[?YA֠KO1 gR-8gaFk|3 #ώ8+3翥bDßnAN@+^26@fq4' KhjfF"Gbv W<_@!hOz:ك+ 4_14l!B3ytG5c &2V ~ "QS-LpsB˓nɝ #>|8Sjٗ0놞*瑅vx@ 9n?vlUq=FencXpV<oW`Qȷneg?[]^|}|x&.T"K\P%@ 4PA<8y P=#xY^u(s.oloyئ"zi_)SEeF+pWJ1鄋c6Y/HY$zv*B8sNUʕ[XshGz9o7oKKu0lT]B"6tK(ۚ3t$LdqkمDB<AO'sA{^8/?淛_6{ iV"Hv}mjPxUT3kthxrò\=e4ܖogơ.xUHO0m c‼bU|j MtGZի7XpMY$( euBIjZHr Lұǃ: DD̬ nU}O$9bQָH 7?DI=ztFbO7چ!լ_غ?R0tG4ۯ8\yXg>;ߋ-"#r%75zK910?( A`֊;WONyݺa̾zjٝj57ȱ8iI48|5 aX/|Tg(t`[Êպ@g 3c{K]nY pO)! A6x|% P)=Lr S*l$$Oe5;Ca8R#sdL&qw#4N62eLXN1YlT)-T}݈ocEk|RqXwZ&d|[OJG.m$YFZBycrLvDF*pmU ~毺~R62hS(kxmn2olYU:mwrG`qn ed&4^V4Y5C,y(%BΫF yPFA.+.ad}Alok xW&N& 9zY9qZ!QI9 &u'41 "*Pn6J#3;(Q~RFpH[߯+%#p~ ̘**٭!SHrtrf4=_L2?k}^']W6xJnW񋰤4J_4UBԸ_203ϢLj7sN%p$cq`j S5'Ꭽr^bS,+&#I"!mJ+0oam, )*Ww#s$?'! k/{Z10ʼn?)+6F /'8 n!x^wLfpx7K,צGFt,L.qԆSY )H Bq2v)75V+6 H~,*^rSX/{SFe'+'ӭ+^sIRxʵ,w I(بkW:WEtbOXΗ]_o9`X7 1>:+ 5ŝy8k'H0]*{}#赬<Uk(OAvVZ Z;N:HD! ^R 1|I6If;y9cp`prrcE.ٸAB~hi:+AdL,.Ŗ$Lgh.+Aro;rh?GU{DQW J+T i)wR,)a^ntse**6KGVRI=ִO}TC;QzVWW9z~>%9,\C Ybaݑ4w-!S9t:}:~wRZ2u;IlLX~꽬:Y|)ѺsTnCo=\m%T3k$4{+SxKkwT-~:ܜۤ{D" y|4SѨ?>#ehn`d dDB;u[96J&cڈl޳;cn7xlݭ9pCZнgpk&>VXhë֛5p\"<+`,"x{Q8u~7EmLKكX8„tg"P8+k"k!,AY0ϵKbшYw7ĵJ5ƒO Ye9Kly%[_ߝ֛P\b( 9jVlrƊ95q~!fC' yr4u:0U- "EP߲ȵF7kN=Urmt ,-ק_7,b󖣀,4uBX"*nВ zLwf$w")s6`o}2aet#:@$~&';4APƽ\=v)蜍T dy\ȔϏ5'PdGl9V:\~Y/-zaKUZHh{OKzsKz̞zY/>UD;7S?=rE*> ͛YKo8Mݲ|_LbroehCM={yLSEk%~.ԻDQ ;Ui-s_ ٸuJ"T>q#@pZ w#UlgUvj.sI;xo5'οg<b(řw|Tq[ed=3ͬPMyAN}X*}c#isuoU!O¼^Ի%&$E}g2z:ĤnYK\Z %Q̜|W{.&ώ8 _4"n+$rY$otsSs VqS*;WIX_dd(^.@s5 n R"taDa)A'I&xwKz8uK^x^_cew\cv9d6_g >mIO<`1Tr,ޯn.c}fQ qE=SIޱvHbB@(v ۸qBhK+=I6LJW[Dڭs1P<ү*cEFqRkj` 1\B2\ɡɨvDShd2OڣJcI#U+Ġ vwKxhNeNׄ4Ц:-I]~L;1eUuTDsQ;/ nuNSI.)#u.TC/!Zؗ|O]&A6{͹ZGIۧ% 7=Tq㻞яF*bҳ4{eby:v=C43QSR3ey)yTMeZCxr޼7'*’3j^B^ rc佸BZn>E+e5 =jLǾy y (42DvT}؋MQ과 ߷:%@B;9U9:r~}{RB ܤ#A-Pԍ]hģc₟  D#J!ebt^o? ϻ 53+Xonӌ jb !eez^j}b TAPY2+{&'O,nfdyj:7Li߼1VR$h{B@NCtk:2 ?ѭK`H 7nR9֬4YdLĻۇAAspޣ&O!+w$ah9%ΡOo0**sC4{ &L~@L֦y!HAq<%hZ``g n)ǩuÈ3 8N ,,إ/:=q3H,Շ Ĭk؉$EnY̰A&21SIΘ j*l0m8$nqROgg{\dPxg uFt'EPXF)L7|Y|,JP)m9C>\Ymak`|pf\uiwo_\-syb?-:Q[^b_uz+&WI%TnvxAo ̉ ӔW06ZE "ِH Onch1WʯL|HH Am& ]S~څJdETܴq.ve5AGAU^`#WLF!+vИ@q( l 黝Wė4laSV>wu1sM)8xCbBoD$MDD?͛/v$/_/s$Uϕhӝ^\`&~bMT㘬I+1SgF䗍rOizԚqo¡(-UyEfrk?72KԌ>NyXq.K"xűptĕ2+`|ǛYEjuA6u?D5\? o@X~7ev2vTG)1Œm%)54fʑXeگ/GEe}Z"V Z;.qTCbD`v%vϫ'"ߒ+R)#^Jd7hI*wWs܄8_g#Ba'yqcgd){Ķj'y58Tr@Xs~~P14u%;:5NOm7233+OOҖvA$]) W#K1Ew^UlUBV:i wcbj"uF3t_=gz&Y\NXMX!K8&nxy=a0Ome|v& _`~Z]X\@ۄO]E*TD_U܇ 7Zdxy`?`]rt b_CDKռ1]].ܓ{\8~1[cIXYo+;¿nlp,_5]HlVrmI(OeXRԁ8^A|<㩥q\zYP5r33W)q`W@C; 6ƣy xʄKji6 1PO=bj@ Wv/XT; ז6q26]>5BԞDMwX}RA)4I)jܠm@>%)A|bO.(ȼ"j|W=% <:#<,U Ss4W1RW|Om",Q_{~"9wkcQ^-2[3B\GД.SN?p8ea3[_ٙA4lK0uB-4!7Gݪ&B#Շ1qPos\%h@,eĶlv4=uoYcg.G? FIE$Ry714:|ck0%=}cTװWҹ]ᓚm,_7KuF`9<rE9":8eb06P(wXsxXNWLIf3{r9Ƙ0/hvjFVE>#L叶߆qھ"vba 5MY^Kl3dj͑{;RO79I8jid$p2%PMDCLy"0B*2vh?$S9&yaB0\@˗AZ@"ynޅ}Co?\Ͷ5 g7T\?Y!Hpe]%TU=ePJoE]I'~F:"njpNbUu熪YWY#@yc[FVxla_M1,kt+9W#4WLcNg5ϰL<αʭpɑlH6- u_c}/v[c!`X+݄NPnN'4!OъEvgWkdts5hݓg̽ފ& 'dO*?#Hͪ-qуpk 0ptw<ǥFL~W-6,Itq^)3:6F;fQo[l"#sx[vtZ..GCޑ;9A$qBIDT$nw?z)WJ0;q"竖 YV4f7?Tۗ>|ޝ~- 2qhOQ\x35BE,u.+!7z*)0nq6_a 8;QWdTf @޴"am?sWkw3nD[ʑlbqOO_T 20| " (͑\0R8i8*Vhş-FnIbO+G-thG~NT9>&W*QfAԔ:_v!= #u|d[ ;izѱ,D1Ac!Eu/U0E}M0^&*5r,!==?ZuRR]f45,A\P!/&n-vx'yUn4q6_+h!Fxb]$ B7W2t}-8hbE ++0!(Ʀ]F#Bjdihpj3l0 zB{ IBs"a@mciM=sһZ+XKHiC[L (D7D":9 2q,XFd)7%07R"Dm':PS7̰[G cqARoaN3 EXM7? Mw{deG l#ZGVH BɽUnrܧ! Ŕ)"4!E_ IG75ddQ>hjaNzWY*i^&_cW~w.ֆG0):#"!%xXgS~/VCzm#*ݥ[ӞVXMvzWېuc3?wWI\ IF|#Od untT:Vtn̳Z$k V2d9ũR. Cc"Of( ZŧbO g"_l.e+K($[Fݒ =\Iޓ#?|/*@} Hjh ~5y#5 1:/8ziʈ -+\$?q ߮bR$[4a繃KY57r6[5YP KrsE6yx?N)h7`281#%ٴ,K/6..wvd-o?ML0]]CjO4~ š( xFyw .fO/,Wԕׯ,?xxID 7G~o}``&7Fnj19CjTy*jJ@҅Wb26tCgSΡŗ1K}!tord>XjAlgz -]Q&tf1=WujQRi=㽝I`z41Èr %kw_EmeSR[,u4TBja P;#AN)ﳚ$Ӏc /e⎙9 $7eb3H[jjT4x7ɡj#!2 l/tV`)D *dL fzh{|MoKK"=yҖ a%*Q:nЕ*x1J ؤs1յBڴ`̟, QEζt)DUrd#bH )(*zn`DT.F+rd}nMƸfac T yAg N&[[/  ;\mȑQ,W"rYT UcgdTK9:5ͧ{jYA}wG|0Ajb sEN\l9бY,zVVݒ _]׊th׿Mb5ikt|'DŽjv3vwFubZ%9"Wv_&4`($Iܾê}`(' Ft/mwZU!!/$]^5jbVSc@<(n|ք.CsSJwPףP-3y o`{D^x\Tu>ydۡ6VhhmT%ne*jCo@ ė/aHʰnSy_n?Fj=ȢmU񴋩fxW+=˓n/9~F2׺-Ǟ&vp UbCTl&BgAU#?%*$lmm,1ޘi#x?oԦ}my,;~7 -BU݇c͙f1[xhxh^3\h*]"o#|4 pq+F lހA/T1|3KIM(ZoUJb%;eZ]h@Yl~P_܏=m~GX05о)=u9]Jْ́iq.A" OKw@FZƜ z"[&snlJ|~VVU$DQ-C{TQͨf|z:{>?.t˪#4kޕP C=z2TMi^0Xk}1$$Y-^󢕺cQUDp9ci9zǛaUKba;зy}HϵSK!뜘\^<ֿ4ThM&>kxP`h?xvw.ӘG'lfQ8opЌK9엘CHVSBv }'@B0-,ޒi]AI@!= x䟼JG6Xy䕕p}NRtS_N +~ׯ3 }SUS@>S Ӭ/EIo@H<,dx` JxǺ<*]YW'oesaz0_J:N)Do| St:K]Ie-k a704ev cGsR41 _!KJOx~gyѐDW6*駜tY׾2q h-vn;AL~Q|w2,h率uUh_a695+BiK\L2 ~/,[!VE}!Gw~%Er 2Vk: tY'!b Xt'lo:I~f4k-RFo71}XlC(6N\ 'hYf]\7w>KJ;åPKi55ߐVSr')V?.lőiWrp MսLCџΦLSY3̺5[땑$^viwS.k#0X/V&HV52 kuLċ$=pݛ PrmX[*v L3ό؀R~zn4 2**?bwf|ODwz[d (>hfUV\캗 rJn%q4EQxU:p%<42 ʎ|=y-h-UK i -Q1J]$ ēVV3> I#7e;N(5i k\V-4E %P&UD^xIvi_.;^c6t7) ˻3`(T<&P2mMv WV|bt cOC8?-q><<)\OJ{$gm*&-wɵW{wO>$ˁNDKVhN<r0&˸/l >jr΄4iJC f}=:~Up޴sj>J[<iRiڣu"Pk|dk|efQLgId&.:tߋ8! 7̆h/VTi7XHJ,|8R'.?`5;`to$>1M-I@r?@,CJ8KU㲙ilP!Ǣ}va<{CBvDfaXy[Xt,H D8N ߖ?s%A+F-}l-Nsj%^ቛz͙KjvyV5,ӧt/tqbkzf|Nw6]vqqa,|'6c8 ߲伂H!8HlO3H!PO,Vv5NcQ4_L |12$ˎhRA_̡m?!wF@"4$z2܍ K?eZI>U@, &zޙ{"8 A `Wcr]t9gvGq4]rT IwH(xtYSÝ%Q HTX[rV=ڒyyzxnԃk?_Br Reo2c4~#/V yN ]<9J%{ûji -u2*)?QJ8IgɃ~g߃K!Fur`D_988)GQ7b i5Q9hKB`w yXE}փjtӀŸWFͳb P26ګG4ЕGͣUDf!"1o8ֱ?;|OZ(鑫crM}>L;ɍ3:w@0w5Wy=ԣd[vh "]۟bJ>@1&Du[*Zoһ9*doI҈ zqe*};}) 4zj}VEVߵH^( 0KW2HӶ= ,^s:s: ]F}h 1ED][$9- ـgM1|?@˙W΋: $|gU˛:H`%|0]/3/[߁RzGL7H Qߢ-yN{yF -K;JM]^FJ[|4FWN}g\N7deaֽ[LNU$.F.O{*܌iu-߅ *?Z8.=ّpSӵTB7m4D&9B]4 c^|.džQudꆆg128L[*#oa W7P06tFf@iVZϳMk,4zdJcthVIXjǢ pFv|'^!"&`wIɟH%OCnyXvԮg Az4O<K rƍպ O*=ozǒ5ku(;/aM}N}ν.lN"g-kc]e/WKySrJ7gz\>6G]|⒨IXy|@W@@y\ Sz( 5vAI9\لL@vIY(YH\S'YfZ.`=+` ݡ֙s"4f Mox!yE_k~4O"rX gr &xl]ubLuҧJES#Wrm{Q6{9ǔ&B`r0ۮ 륐Hn %rl[> >A/ sf42r8D þ ||c N6(]UV͵"苀@IzƖC$Ic sZA>9 r oSQ/*3 `"2߁.`7BFXLY2H>.u>2Y'nG\[q,`82 =@hgHBL]ѠO/s9*\g>;Jwp]9\ v֒9HО+Yv>1=قf4;Eź쟞P预8x4'IJ}=? `&Qjk.H\ڮ Dn}0%(3ߔ#LιJ r>g[[mlo;ռa>tf(yxm*/v+"B˂ `B a=Բ9O}0Y`#. E(;\{-o\;7̰պ%j9ά`8cOj)Dg:^Wp 4YLh깠 ^*쀼4r-Vg01KYJ 1'N \ :9R 83ejk@WSH^6%X3Hȣp.G1 qU ߡǙ{+މ3([]3>.M 1d@P3b^qzD"y/lnYfPгA+? w:LB"}1EЏ:!>ʯH}⥪ܱ/g {;a~. eg;ηn0]sP76YZ]5*ZvH&ŨUykf}2)ym 44 "1Y.[Fl+8 To#CSc xL` CP"DY 宒*2l͇];2*o.6&o vֆW:b߫ET**OywmؐʰJ2id!gtF9A .w26f˾%(sOBCΕ/|w"daT@ Gڊ m@IE4BS;R.I?]n֒$>@\)7jg;K)ĝw@*y/;[j0*8CY4𜍬1K1tHS C3{/#|L$LR2}9&>/Nn6Mf59--T;@co%yF7i2Uy~4u:y<Ȭgj"yA쌯kqߪj: $Ө5J=-3f"!k=Y|!*,vet/<(b1plŵGZ+cr+ڧRfj}?.i}=ڍw tGU\`oW8R6RON6ӑ=~.7(J5M^N߾gݕ1u\)[UPwCjUNBO/tvXdKIevj!x} N".i"Jl 6j55__j+dp+`aABy`^ &&nS1yci}ICjSWÎ9gN= *HiFuu%PUC:oї8c͵Os]5E`h42&(zAth["f<iQ[-eXx:Y8I/\Vz?G˹qASԀ%P{0lƢ;$m3k$'*5LJ˕*[GB։ 8çb*Vl~A?<\}Ve} ˴@l0^c{;++6Ij=o%#\ gOn`"YArFwz?)jkK J62-Eo<,=İyx\Z߰:ҁA9K> stream xڍT.Lt#0Htwt#!  104Hww7H RCIIҡ g}ufyyc吱r):A`<ܢ9u^77'77/#Kh 2,`2y أrsxEc['Q =_ #""w# Z@0[cD@ a .a2N,F-O5 < @bt ȟj<'ty&Cp- ` h*q<`߆.Nn` G?2(h, <  st;.7c VrN w~`(vO?'kqrx+EX:sCo\A<ـ`nnn!~ M C[X3/b _+a@d`(Y{Lw?r8xc|4啕uo+ p|EW*C"&إ$Y Vsi8=.-ώ>~?o. j?#/ǝu=@%ϛUY]W xm(=@VZ`eS e_ǍCz<:Y0^AjHoSy.NX/ {.ߢ??Ko$=F"B.#>#?Q?2=> _ca\G A_1?/HO2Լ.HRy r12{_Fy{K^ 5W+qyC<@@EP,خ>Vʝc tVEh\֚5LhMK%{öF$펟>wt;>M4 Rc>Гc`܆ح˜UW}@ɣa|y<S#}W>*t2goj0oV%(x7vkRץ˜p|[v/Ul޻d :6G5⵭s?3cbe B&V^kXJƟsEeCLf"AAA@[dG^: I![-IJ-_ 1 7hf.l0pelU\Mv{SpM6 `P΄#b cSS^m{J<6;UiCH*e }Jvf~_kCl֬AwMr|lbq-HaJ7DW 6Tc;pݴ[FWG!8W3^LAHc?/Rv6ToX0r5ܟo:$<S1Dt)pF()'!VH*p257lQ݌T!<.fnEѹٜJNߊIf~rF%_в.DsךQ|R10xmZۿyLjnC yHJ,8$QՃf5/z=rosJ^1CN lc: H ~7ӛ&OJ;4ix`5W1;e3ƂZ6|63ZCӱ[IST'RÉ6eOm]f pS؃?z|n䫳;i3->lA])sT5ڍOK…RP4j>x)rHJuS%7A&5SzE&ZG%q&~D=rKV<3"a2@TD)S0" /6:/uV I9Q_![$J">*Ն\"j`I,d>+X% FO2=}gik{e~IӶ&kMih/2:tj0 :WPJ0uZ`V^.O@[ ,hKMSD IMo +eyHǖ~@ 9gI|) 0Ak;m\96aZ/5N#M 4kk*ɋgcj?u^~!ǙeKݦs03C]jx#">zXŔ=']=$Y"a@K)~TŸCCՌ?|[dS /ADA8M蘪Pn2];2"IuMn`C]Cj!-^3JQi S_+PĶ*Ak09A{q~#5]H9hwɬs=Li7V/cG8I5n~-;7M@2X,5>Pad1WS&φTY;\|U - 4,ahh2Yc- [؎/OCLR?"` FjiR/>{:ׂ$̩۳4T7Y0eQ:QsE|)A5U>Ҩ1\~ɹ|+>s-F:Q}8I+~c1>HM:[3;畍q>FIOxDA.~;qm" 7 Lnj)"#O*iC5DL GY?ű= 'k!Avz[)a{La۳y^u9JN"=Ȫnu<|>+X[Mm;>dSqYVk<1Sf\!.mwThN gd6tJ{Q3+;ZgE4迧%PXxӅYu`#&gg6toV[/S&Z208-7 V_hC^T)8Kz,\ODM炱aPμ}.+wV@@ ~b8J&6+e QDJ96v Aa䫚f֏?԰7Y%̀QC C#D+d@j&OB ,,+mg(8c%M۫I^A=@||d Y6*$)(_vuh|H߀5R/нt XAKp7'MK/4'tE-y]BQuUO>g Xڧ}E9Tes!lm$!V=bIVjg22n 1'BU!c5gE); !L.џp l!Va&I[`4Y'!GN+HuO!фy+wau]T0XoqZ> "H.^̑FL^b`%:NvOİp ?Jݫ)A!~CBF@8 G@RMmL W#+?]YBMO>Y{'aQAwQ,gA=|8HGc5qx#R7%mÓr&@'<{LT*QǍVhd&_ݗ hb!e su@^Rvq9&w J28rc w< MtTD;'%s|QY&tYGRiP+5YVA& 1>{rCN%`hUi Ck뚁 >0Z 4#rjD(Xcq]H9_]9*NkeP~Ta~2yl[9Nv/W`ITv>0P oKFl/[ݚ{!"5fRL |1 - l>)XN5C#tJb1," ߸+`>R|}k *& E)2p'1d F\NI uy7=bBcˮ/,Mek`>qnxZ{5۶:B\y*OA;pVauH>E!;$t F~[l|*X8!]7,GYw;zhziZUuߝg ̽1ge{D|'aLH&M6(;:%_ v8 ٕ_1ʧl1L2Zb\؀6 oWƆC<s63#B.  9T6jU4;y6o&ug,Nh6 xGI-`vh? C8yCWZ\%6K^u$PՓ6XgCMf/MKJ-3Maf/ 9/nNOVR)yTg`ʕ;kzDm|9 q2h>6@ h6^ L\1g^(R 6r6*y|OB[L}O*zZ{NM={"QGu:ь Eo3Xɿ#4y_16Q" tj{x\ӅO\,hYߓ.LgQ?2Ne 13=ltTWP1V꜖6\uӒ+B;_hjiڣ '=ByM17.HNX>uAI.} r~e z DQeKW ۧC ed 6hB0xLIr-ƚ`m~ SuBUz}nC&xYCmeƍ#'k=/ԡC$E!#}1m֎ߊ4^DM,>ҍaȀ?i%>>`L~Zǎ=D ~ Jo΀_% QQһ*2%"ʑ]7 *|'W. Muwr󠩺t18msw'a}qd7R"MKfk- հ(86.J^ *PqOc>yWqMI2z̬=>.rgb@,?_E|V=YZ;6dބ})Y١=+qϱJnXg 9WmRƊr)_Դ$Hk$^}jXg(wCRa)[e<(6Fޓ5$``:C$ślViH4+^MyU7W O(1=Wlu}_|G`*cs9k2#z$Fmħj{5lM5U0>8۰';T\i@73 NCMOSvDd} '_;he. YĜ+y>^i:՜|i$Mw\TVm׼RФUIv_ixM=բ+QJ?7Fg׌!Hq/gfgZuУql665w3˱ 緟Z8fVNr6__Ro\ G))n>R-|[E 6Rv=b.(.M,oᗑ;fc] 4E2kmSUeģV?TkAqY|Cc(owhx2T Jw\ӿX#4Lxܘܝ[SqLN Uѓ@Ioz`\GoEl֫czaOzJT`y!F4upWOcXsѮ} iQ]gIE&䨐ՍU(*>ĴpLC.W$m 68ZxwFȗlwi>ן_wM,izcP̋KI]$MtoL76B'TDC-(Shc]b c6w"$}O]tv.tZKmxM6_>ͫVsc{3βaHx̾Gmځ;TIe+a?AfAtP0I=+ )5L+{?_q(,VUuR kQDo#~17•4q\CZx@i5v4<8EQ$E@qpU*n D W緄 9" ~ҭb3 "E6|5El`H;jK('vF9 JMg>%/„>x $ZWmuoH4';ϝ x^u)'O!?N/)9#$TCZo@٣bŸ)`P/3uvwxW9h BnA쬱Tqu5˧iRNͩ#hVt|[nJ51SDuټO: ^OVޟ[-zαlb%m<=3(:A6G5Pa}ۋ?p^|pgnϠM319W_!A-ϾRXF#b~?ďԞIA:~I5eD Ѿ(pE`M=[`Ǝ]`*Z7gNzqt`u/fDIV<&dLRV ޢk5}K;YBy+@Q f8|F%=oLn.ǥQu\ (l4e痰n聏]yy;bF;F}!~2{lU8s9bovJDi)U?R>8$juqhv__MoovbB!2X Aw*MFk s]ɫ5:AC`dnCd|g2<uv>$㽷$fnW;r IWժ՗QQx.֘E]餧|^}l|z躈LQ'_SŪS5y3b.iJFx%k. y=R ' ],>9X6WiFE-h3qEةu3N誎Td49Ɗs\ʵRr"cK tݚ/0I|Ni{N ti艵.h%O:>p$ Ekd|+yf{Ti9䤹)p\TD֝wl-=*hţ]UU4 μH kOFyO,Z2g =u.B6UJbodtl>`rNїjOC38ss+|-y=y';r6_$NoVF54F2}4ͫ+1 x#i700@%hI秳lj kt7] A֧ Jp+L9L"Ll"=n6"Zρ"_S u_O*5&v>W`BQ{*ì*>LA;131 lxz̀\.+ y}kl-j%#G)B&3-H:{ endstream endobj 296 0 obj << /Length1 1649 /Length2 9644 /Length3 0 /Length 10711 /Filter /FlateDecode >> stream xڍT6 04  J30CwwJw4 % o=k\}PVc5`Pf6 @\Ar44`1*& a n2rxI9<)9G؁@FN`S @٣҈l\Oi 3r3فM# SF#@ f9W: >VVggg#k{=`Pك@ AwƂJP-W98فOpOj%oc pxldb130Pgqpq`AMAaOFNF`_DUFO Ӟ "0OSìAP{I@&Ocwed0g? 55݄ lI9 y9 [ĂwxuW_JM̒hO&G#\P:1l% l?S1Һ6 PNZ[q"1"VoG4?)PsՕn79P^I4͐Cs^~*r%tfMkj˪x:RYDo/ڶ3P=:_K:g1\.HҪj 9% w!QbU6N _$qwEެ0i:*6WC~hfqOXG88*yZ.%ւΓdD3Rf`Cyޚ~|!܏5g90G7C 6BL,6hCRl~;cD$zxV]"f6$P0F$?ZaT1[˰K) U5N\53%-vqkKBszbρʼn#2 /+g 'l}EnK&%duǐƹw=** ڲl}bƛa-6# ;NВ=`V׵ϙ'#W1]ʼ}a" ($=薲yJ9='S#zx|C篕|]"H=f.@zaҺI朂N:%41*1q3ItY-jdA`:\˰@1\UB*$lwK ga)S C G].확vd;VyFXnS cu{|{M3 i!9ck'Zm WqϸE$Xu尮+:B#-1҇†L94ᝲ9NJ$s7h_siq:ߏs,92˄(C<-r35ғ.JoZ .cAwEn$ԗ; B(Ld8ݐ(,09iy\^bE}e.5b!!fNNc6\#b:vN;tST.ުgq:wydցz _-=/9 |ktlTN"o-f|ּ"dH*Vo=yOk%KJ ހm[ngdϧ*ϣU(] v:/aWN}g.eV[;wnM׉} Qњteli^r`^,RǣmIM)*EV"b3aܿscQHj鳂),O Qas3S&{uڤmlWm.ڏY kB 9RzdgN1?6kbGqXˈavR)尧A49vl@K~,k!я7_s}NT զki'{Nd=;B޷XK]ڎ+zK' ~<< 7I i2|R s1>:pwnAf(R\B>:"p |6C]T%ԙcL={Ec]qla ?X*(=w?h[fKU`=k+Ez@>Y(&$p̏?tʲ5iF7EԸV;KBcA5IЫ%+kRP!Z. B4_ g,}mW(#tb^ӯ}g&FFmH| )~O1$OST|Nej8g}ТziuYɠD0l D{VKK%aj4n]E';B&$͵ĨSH3uKgxƫ9]cW~ l=sL0,ʀ䯽VC[՘p M?#! }JBU}5$֢Y|0 ^[KS$W] |II9I%՜UDf/S?&Wa+d(|Mo^$:|F12qaz1e ^&/P2˄O]X#LHk_MyOsjEZϺH$ak mzK]G]!ottCϜ"&Ό t e^; ]KgmQ9SwNqJH͡_W4u=ƾՖުvzDLg\ bT*cD{R =x^4$.\״җN4TJ@O!feܣ[񛙱VQZcoXϰ=tFo _^CU @;PdXt?o(X\W?|nC )\A|Ox< uڏ p/2vu/ve2QMɫ.Zư,LE,EZ;c[f²rmӽ#c3-cU~Q5ۋxbқW>ݦǬrNL;Κqj)jn}νI%ax:+iݫܔ$UHOih(sXk #tZ6݆2uk,kx#N9 䓻v%C6vqZI[z(]K1M:F17e */3?m w,Q 2A L&Ƭ^W}Kg9^+RN|C_7\$ kmU͊lۤJ~6^PE"xv Q絛=*¬ BO1-Ck|_& 8&B}*1\7…Ԩ0^Eywe,G4#{rOnr!RݚV|wCܩ]:b!i W+ENF6)h5*~EQts~xs*Tc\уp)7l&ATiabHUg}z?=JƯ")Lc ~WO{civ2 Zԡ>/le;6AEK/&B23ƿm˴1=/&ϯz+[!j]Zct>)kcf8tIopɣq(v:J3kútfLdB7.&$;/"7 f=e-\IZf3G2Niv#ꆎd8'z'DKN7T.+Xȱ@1cU߾Wf-ʫC[?NcsסS޸KبdB4,Tpw1o*ʣ3󮡛cLjh}yqT IX\,bެL4uVr-/Sʥ5)Ap-A`.?3(VR /U<8jQ^K!@q)pNsn EĜ#`$d6w jr'Z"Tc31nx%(AY}znF={V6#U$&ҥdSC!4wAzf2"r#C_.:~s-9x.;F63=]apl)ZP`N3AJGkupS7]4ޢ,xtl{[@XwUnKiKe̛)0D*EU8Gd ݠB ^-Q|# B./.XUAڭEH+\ pB/W:RpMp *tji54BhGaTPNcˉ%[62RIxF,52ݎUthoy.q&MBC~YudNVb~>ȏ lA|!> Ȫcd 0>+W+ë7YJ&}0"~2x> _1d[+E}. GQڊԣC/RLyش{ܠ LZTpJQ. Y 2N&c/M@KN,9fZHzOޫ V~Pq}RXCϮe@+5>󣤡tXm?]mTTuEW8ڤ|C#{rTU5q+nGg_uvMzԤAe^ {bGj3g*,_o^\zO~w3Ex=]h$5ņzi4H!6 >,YԑR Iau_"sF%ž?3{{a){ y:e~*,/f Tq>6if->#ao/itYcm]}]&[]ik7-q[Fsp+μүOIC_qGt2 7mV'D)b2I3o/'cHtu9:gɐr}BS_ ;i癗1;eNXc)ۮ$ܼP$0p#;0AsyIV<&].koU{w $QLtUi9I6fGB"V |X񱫗Vʲ't {CYcihE(ȹ X 0Hn2bidŒL!aJd~џ.,oye8ꨏ:vpYA"SyS}bBD{BMGQ7WI1ۜ&9b055x{*%gH‚==jb`ݐ8g4(~"2k+^8m.^' oh.(5>& vC~hyl:FvC]yE$Z!:.9˱Teͭf 7ErRvfiVEr回=#E<蟎0/K&]9Q%.sd$ ͆j?XY)74f0 ; (H]B}afP\ k!LZj3%s1jIDˮ#U%́!\u}]:^]&]K/g1$m棪O̝$!8IZb-/{ ,pVǬ|(S&Q^(طLY:ݧ_#2ƚ+ry]m ]_YގE,iUxԟ9դ J2Q=v72C1?!@klpr9ei@0gjp-N'ԐuK=ElamJ'2y:Å/{m~TސY[=٫-ex(xl/{fz/x0@2ΪEX"uуD4&wXjTWdfRXh ׌mo= ?BP"bvIoey,HP?9}p9Wpd/=SdSIKMzZN;Xe%39^ 7g͊+z+ugNX=s}" Ƿ [z_6ĖdJ`d*t d^62`$LI~^z7bPƭevZ v^ښt8>竮@)x™i;>IcJ!b1{W/)qL(6Q.b;~[6l*L`*lx%V1\,s2۞w}rZJ/:ljE,i'6`M)QwaSU9Bյe*"4F nh2 _u ^b)%顑蓉O铵񹍼zcTl9oNgzp-yew8|&q}gu%y%G.8.p6spFK>ߔkGv4~@G!U?eCe7QYhlKNt f't[br;en[5I 9 =J7/yG2"@eur LW70nk=nbmvN*ڐ̟[:vn~AYnĨ9sm,y+GG݀HʤybkG Mf(4ѝ&*U-ozuAB&θ*?;y`;!~j\v_ 2Z.@ K~N*+nLN'Y#|h5Q60R3wq Y*@ܸAG'Y:wQ?4AD\Ӂie𒳽R<5nX %^IFdNLګ%-Dbu:A)]-fsD-r}|'SPo,bH&3y*ݹWt;g[El p(XD(!X GM8k/kš0,ɩYW;QȂ6dk"0N)P&xPfF$$oa2Sz.F&,QE~k(Zcf"N~ym8#dU~Sʼn4YS T #:`[:w/_ NUgڊ&ߘB mtJR|7N8?Fi~⺦~VzaxkxÙ l"xhёOPuEw,aXqY~}5 YS?G*N'82;PP(f`G5ɺd|h[W}үjv򢫘vtQ8U%kDvw(f;5 ڡ5 & dMc49DX `Ɖs|7Zg#dhD }o{9vuTjYTD@!MQ,3"l{)ao~ _* y䶋kjڈ\$&HQJr$./ vaMY_ "/dKSe.E"sSdh w+%D:( endstream endobj 298 0 obj << /Length1 1495 /Length2 8542 /Length3 0 /Length 9542 /Filter /FlateDecode >> stream xڍT]6LH7HJ R3 R HҩtJHKtOYs}}>ڇ^G[fRA<|M5~> 63 ێlrC`P1A@ăMx j g~A@Oo"]4y`PYw@<f# rM ->Mpy`2\/=Av-.Zf8@:a`x08ClAPCxvA$kIu8~+w"`-@`3FpPD3B6?JunqEy=NpJP; cO}8w޿. wvPHM/΃ = o[p6? s@?l?8@{o"6 {fOpos~xP +}dWq>} q BчEB_jP0 gwɞiaw.-؃rAn'g!**H?۟q\hfTcП xW |yxCoaj7gC~0Q||{2[W ?\}0& ,} /(u k/\h 11A\jL#D˴s%\Ȑ'x'2o7;EԭGkJoBN^e%3FTbTQ{RQ0,caa)ѦX9j6 WPTDZ {KyWX"uKxrxZ>@:I4-@t{,i j^( igŐDa^s*3=A5cQޠ8$4u𚷙 qRe_Ulx JUvgJ +U*"~eiEΏ%xt4:R ;>N46RByE{S ry`zNcX9) v z@3pI6~[UIw)SR J5v;F;HHGEJ<<s~~ZM?m[dҔ.)] jSǭ)"{A. Շ4P-\u@7k~d:cbJ>36IO*Gw2,;CI| I7a@ 4 ^6Sǂd`kwؓ d41,\:uz|+ `(]o[׉sKZ^*~Z_|w8ŕ=<3*DefW4N&<ϓwk={dZSR'Jƌ!=]wœx7!<otxQJ-w8+2d^J>P#[b.W +l\ь(H@k;E9*~fR;}Z\Vɒd}lWg^e Jesk5%.s`Jf|a02}Lk9YOV0g>@6(%>EJq9bʻZ9B?ta̮xhŢ8״H怣up:ʀ]wy@ rqF|dEC >>ـ"qm<%B?7^'c,*rDD%be Oñb9-v[{z}z3qg$mkO.880t!-XxC昬QqfYL#,>z'Rslv*[+1G&7$ 2.׈M};,خK|eKHp0 D05:čm~NQ}:jwzJ Pi{ny 2Q(W)mUs#Ήa<+tMO`9XHG[5uTYq^Y nɬ3(Jye ?M&n[o*L3zO̷A5/#s4rT~՞]ג- I*-ɍ>I.d`oIr-+ 16NtNjjfZ|- If|7j 3((Ux<ӒUW&z.+ѧ֫0v6!HVsЙcPRhU##dv$Яlk2A[c.ȳZ7ps 0 2"<>~ɦcfcj(6X*@O^9˭@7OQW|c y?镝 px+*d^I2dNλ (Ɣ,j! j$ŀ..cM'GgVyDNES*,1N#)b+B:G'5>7l*vOg.E?XvTȢ<5}L^=xlm4"PjE׆[vxд!x@~G<5^u`DwOw[ 1TeEvl*%t5ǡ0Y'8ip|QS쟀k=[$vi X/Ŝy.w; qyK/I XHa@+'.ͻnf%rW^gsC|IAIt kȑ*Tnd(`O2qvoC9‘1I8x3€l5_j lZ/ZPL ^{' &Ro7e+f {Њ궅8;Z[#%dAWS ,&\r^8w*J|4.l&1Ql}Nk֓L)gBDW#Ī*L{۱76=7Z?QcjX&390D"7^_*dO {ɧz@SJN,$,IG LY(#[y)|n$[Ѧf'DÔ:15=['ܩ,=qZ ?38a_nU6@r A]Y8on(f'%gEf{(LR3/Ee?{LŎĥcKc0lŶ@~,I&AUNmU^iumzěxAYuhdE<%S\iA7`× 5ڍ#'I/!_J:[lCm,Xƈ-? o?(}@ʧ{nƠe6-ذe{h>rts6Hc:$UZVyu>}F[.2pc!O2t:m1O0z:HyWⵐ-QRJ'WZ3xpo̎l3V2Fr)P9wT>) L0ؠAp{|n z$97{cq a`˧S4}/G( J=T{sT5zG- 0Pޑqgk-I%@Зkd.>w-{4ˡ/hd1Cw.#CR}NC ̺Td3]P>joL;블 Cߟ/qruR M Jxkfo1cQ=^lu734ї=$U5?ez"H.C},VZ> h 촓}vtW$Jm\E\VO8Miɢ$NIyk;G-oמk}I#vh&Wv A [VgR+ivUcE5aWv̨Z2'X폆DGNbr7g\n) (;[BZOK<0W}&1Ǧv&O.8/$j+Ʃ&ejIP"i$t%EqQz""zY/C8Тm=KSg(G@"KGr^ 0bL^f&{lH&ΘH,;yQ7]UIʤفUK(%~}5<9XD{|(`?)ٞF~cqِ* B0'?UmĸN+FJD:5 Ⱦ0H{u[`xVTi Y+{  m^ɉ@7eq/Z4lzSڈ}w1> } 1R7K' rV5qqe̼əJcz |ãz?$* CH3VL(ɠz$͉?M,? _k{gg$)Zxt9+NO3s `I-룎oؤr1CWۄe; *e }J-W"o~:lo6QןjTúFf FfNDBXcvI%9΅oTH0*M$V; i`Ӟv:DBAXp7M~f YѦz0]؛j֑yats_6(={F6B5Gr}B}Q +^ǨCAz䏮eNm~M`RŠlΏcD>%ݓ{M*;Ʃ cʹBy)8@6!ZҢ!YbK A.%7JMِlFO.EfBAjrOʛӆwf^ዥFdnI"F}KjHs#=2n8xw7Ki3dwϐH*%',%-jԚwzDg=( ~Gy6%Irۢtcq*~8aG>KobK'g[b0U>n60VNTgMWD5BV5xiѷ[2Fv ?\sT-wkZܽ'\]J ,Յb&yv$t&ZoY;b!Ta KN!l1X +P{wIvY//TNpYL;SY}{PQBT?_^-Gs0uL$8aΧb!&HtjjAVw; EolB7Y9V}T?-/ֵV#| F+=BV$j!_ !} TLr"A @?-dȀYe`piY1'<c ,򷲝Vm@*K=KTW6j1;*K20 K9*\ Gpt@&xѮa'u<?6$ٕRRY};np!3M|ʢ_̱U ޛ}#ʐʲT:/l::&Z$1}Q;(a^8Ò}rsCJ#aknԾUfeRzeZYGV R }4Y&4x1{oE)BbbkH_*'=b].z_֤xO`jɌNhFrW#{i Q!zgpCA˙{YgkWY]8.=#T Fx)MƪUF9S( 3n5 r9Ck4;,"@rrp`{W=^;H@>cԆvZQ;)cl!x)ڼZ*Mk]OL'a-^=4ΧI5ה['ϯ𤊆]*vyڢ<hzO|p&Ol܎eb `4hE(ܘAL뭁e9:JY^i2F\e u#4 g_.1g@Ȓzo}P?zboJ٘rr[k`;y.uvͧ1 /xRV}F*H;cbXp$cQwEA҃(e}Ú!3]kpohqqR2# ^iP+$ ŗDgkY!kc#k:+lT~#k#I40P޼jFKYW̠_ʣPoyEH7ܢr lcg/0+^_Z])|ϡ:=emu+C)s%s}nu+5ݡ/L|=P2K!UI"(R4ST^P'I[؆mܸ'9ѷ*H43n0#2Q~'`7@oBU/ITpLq2 ^2ODo6 amngV2PyBTP_(̷ujiW'UهT>ێ$ {?niԺov_ȘK5sQ{ADhO\L]Lܥ\Jw^.ײ~T>7j☜?N>>bjj{=jBps4i|6} E# "E9hM I~72Iw9Ғ>'x~8/$sUMKegIMWa4G9Nn{.s|jѷnNrd%y,6s> stream xڍP .ww . 0 Aw܂Kpns+`Vj{b@i{03; @BIS ƁDM #Gtv9 Bh~I vN;;?I79@ `tApptYZ#Ό;@ 23(voLlf (脬`GVVwww;gLw t: P64$j_  3&]\\́΀ 9E#_Ɗ2`9v/"&ffv& {KPVd{&غ8lML N -0y9.,. ۿjdRvv@{ _Ifo}d;{Y-*Ց=('o7% fcc@3+ֿhz:V%~`Vd|b]T/BbgS%h/v ' 3wck+2*<\fNN7'/,&gO9{ }v{=˥6@ݟ1gf3{yv7Ho=ݿ &v [[ͭ+m6jJ@sʁMvAH< ߳/dTupumln[|۝(eo`גqpLM<&@b~sU ppFHybxUJX v `6Л `/C&2{4Q06/~ә9ؾu?j_s[[XUCfoNo?.!RB3t37- ~UdZ` `~X~}{~-:[)oW3t]lM\aFo+% vwS~r1spgop|x#|'7W/BΙ:;=<_o +z͐jĈܙw'gwR陽;\37oĒ{߭H].={jmmKPd> iq wpX "1ϳV.y\'W>4|;~]j䧲Q"gL)$ g739dqHQ޺s^k.T$טc4x %E l,cd>]'zrxlK2cTYP3w5-3ZK䫴 "ކ93++{zm-\VuR75g,&䋭G|S`QJUg=y81X. ) VAz/pu->b57SDzae+,N{/\'yc| ^čErܦdfq'8PhiL 9e w+Uߤ!ǕBo{1(-~ 73jҜE|.˭ú#[7XpP:K$5^7:A%u0w{.Ƣ9LY2WixZWR=Mxƌj`K+zLEuٶq_’A 1ݙEȺZ4zq34ms>vmtM\[=OD.ʒ5E (50xصT`?^EeqŪuf-948bb+VYQ˴1\ZNjXMڜl'OvZNՐE<6+I7WWWlUQE-E0z-6Rv]-[g=}-ZN7ǕXqp Si.ZGlי1NG_rznGxHȆḼ%(*$Bp*g_Q林G|>,iw_%X{7k[+\=~HTۚH5wkr:lTb)aml+{"Xj2GZ(t?;A:iCud欤"'`xLH(vK}<.֢ܜ.m^ivC/,igR:mCeGaf~֝spf(QOwc9r=-uc?Q-JW"v΋K,,@d*tޥ1suh/{ Z>izɉ=_[J,CߺE9pȿ^ib+C USleh ;r) oK:Ƨ1 I!*ghHhgPi`dJm*3 (xkppl0jG\I8Y\<-)W}p/6NW⯅i-oԝ|;eݥ?`DG"Dd7iఀh0[AA) |$n!\/f\Ϧ|۾\c̵T5m c0L{M]%*H4t ,Ǡq.f,mY.#nҰݘܥ~bm[nZQ5'dJBn,8iyDΫYsVh(xO ɘ[m#]@lǻF$u tɧbS.J;$" Q_w>%?ٻr Ŭc?\p  dH/CF}JB$#T^;0QA*/^yJ}3L8-%"TUyaU0T@g[9-2A:o~ P&/z? I'ۙ qpq~#I+IRq={ĸ;a=g!UFՋ9@S*DڢD_Tft̠h! jEuۏX[6#AiO\u_j9|}*˙r_~i@9Xc;9FO?BH9됸4nDBqEFox~ K'&HCrv"hJC& _gntQ6?plv7_A jߢ>6_>X_q4Uu#Snec$;kdA(ѧLK`/HY_l~S+#yT$v=N0Nߙx_5,la?Q*Wפ ަhīwK}lP¡r.bEG3*n"&9- YIh Z ҫ} 1@Khz˳LU i*2Mi8 ]4J5h$tUG#?FQ^ ~W5nF6S$Q>#]{Ċ!F <׌W0iQ䎏0cb[c ki^APlL_[y=ݏ + N`JZJ,4[6Ng<%r *ѩ=_{C/eoq3m뼡 l IEpi; ۳Yl y۫?l,Ox1y+]iSQ\{ѩbݕAX$r)UA_v|ٳ _&|4ḛΜR^WKaHb ôxL¬yj&ǹYSiJN¤p/s$Ѱ#x9YU#֋1k{?"MJ2Rh%Șd5d6w@ #{ߘ? ^m*ݡ!$&heX8cfji0b-h܋hGn<U3%Bj45@x;F*>c~MPQF+p@1J)9SQjкg=)ѐ!D9mvY!<*R,s18?7&ȅk R?!-j<:BCC-uOiҥ>UD 5W7bwAPZ-G F@$4Gymͯ,:e5ά~StRŞgiPj6V3;. t'$sďDw`O\2Sq{O7aC4B(q:'aJ^d ]h[9(d<Ѷ\›ScQe7?2.y?'*hÒ5[^ KjؔH:r zaL3bcd6 [-M݄X_a xt۱Mo}6MqR!\\:XGדųDZ{De&\ se)=nPGm@~I uf3aUԫKvK씝]TeQAOFBoMmh3z nxw z>u}`"X >| X𻧋A\G]* 2\/fIDX`XN$NƬeNѷٗ3"#Fp"{1>gQ]04Uv>92Lma,'4z_3uMybߧI󷿕N%J9:a^S ^;4 ӕ[7P=3W^%y,9@qגH-bK= l)vQ3ЇStgէyg ÖιbKKMoSD?Vxᐢ2l"~σ)BiWB*KU5 t" =(#(zBET5܊Jr_p~CSfbILY h2c&XR*eo;f X閾o&bddíﰆ$>En'OØrVX @Ia5@,);OlrpKtz;>E&<;sרZ-LP*7_ԎWoZ:b \L~'bRT~aڕX@bmꠐ!g?!ء}Β3g.'NӉD㬜}RaAn~?h^r("JhC:K"wAu 2;R5<[$RE0tLiVIJqm 0eP~$s785FWXk9X:Vo~i|YxΡޖ0., @RoTy7F!;T/&/5j??4-Wq5k%&#Kgӣ*My,KjBBnǷ-c^WBCS_ ǜ(2MMi#TSeyZ?f]aƸ#S-ob ѕW>GV?g81\=t%avw'EN*ƛ}5D,?h{CY]r Κ"B˭Si-i.D*$tS^~Rn9L_1 a:є/@=_@:yi}9[*Oի'=R@0F״Oi+BCm cL8, y.3Z*g ps/}0M֘,"o}es@ex\KXw T36z M/q5]F*4Jy#mL6gv?3r_r ~Ǯ (yK% 4cOCM(k r d0,<4zQ[@ 7pEq4Asnky G%11'Ot?0k~Â|yPVTf @!:G*DapL޺D++םK;7q}C.dʟ~Ŧ|r ٝW㛖߱_3J:Q6,X\?;+i9a2wS͆w"Zz N= N7wش95]5DhWVz[Ю(aऐuU,=-?} *DX{Me{3gU@ڭ`fȰX&aFeჁJRC |Sn2#Wۅ}Vu‡Er*}x3,wKn^j/jSŌ^ SuJ:#Z]dCl}elͥi$O|;\gPMjhzۥal`vXpKѲQGOM\2do=37ļUX`f:.uM/w|/J;G-dtH7?l.$*!_v':WʪflH6&D8d|0{~5O/(MIjI%q-ı4v=i5dL:sKz :޶%JWPO媾xe-:M˓HbDeAI)ybPfGhA dqc4DkK$o)9Fkm]Q쟿e;2r9}&y,' \M}6U#5sԉ%| Mվ((-[ɏ/hև vyUO\Yk/PkJEbV#v,f+BV, Bt?oJb&&ͪ6ů}=VQuXRls]22 )щ55m4;VART1~~u>U:K 94C=w]pHl"ǗQTǾV 3ޅ'p@cr Um:+ۋ2ԜVarTn]5׍{9%d#Ԧ'm ֜U>r;*#ʥl+Z4ՔXwT<}!5?,^ ;8.iV&:ݚ̺}^0"2bYM͋-ސ`\>A!JXL^4j?==d1ft9"|n>. `94*o=]y/*dń$k tMBcw9 7w1HkU]}+%q_R 1/f3CT1QgvՆy'Q}cbAaœxr"WԳ.]濾#iH]/yH9IJ!{{x/0I6A2[VE!^" cJO->\>ι.hBAGN;-qu\q5t^{%e1Wώ[Sθ.bIf% FCJ0IbWaYU&类M7۫8zX1&7aЗ棹{ZJ&$Nzm]!Wd bl>goaޥ4Y |ylD_xrP?R 1 !`Υ+CCJ??ڤ[[C(NvΞ\M~hlio7=\qvd 5,֮b ^EO)# ]ɖDsDlZkUj: +gfI9iZi_ ^U]kg+GV>f EGL4 “]=۱- u{ ,Wth.hx2TNdNX/M~JU,J;Ly:IF(li%acj5 R&zjrsa{>U;r#F )fxKb)j$OP˕DBڦť~n]SIhE"&.njo, v{S#?Xb5n9pB~+A3/U[v1'tM%22M{,w"$AjؼA?[;2f|,\&wuf_PkP㕯zssMow孙'|ijxXY4ڙc,|4PѪ)^S(u9rC |XjB R12?{@&Kz5 n/բ} e ȁ97"1dI'Zqzİ&ট|3soti]M'Y$n ?o}؜dZɫK"&0Ȉp~v$}El90$7@ݍ(|7E, pJXKXThC?Q6mhl2̇+6=r @tjIl1?)y5SZuB @jtCv^'Φ Pbe.c Ɉz,`^">i%I{{0k ,PX^M!G, 'Ue&\a2]`аgBعw-p~ځ퐞Y(A  Z.ڴ*^c#8>9f5(ʟD?C b+(= #+NfU~`ֲ9G.C YmTݖr8}@Ӏ*[D#:SL|_R TIn?"cEβcy%&B$`l>dH#-Wb̨T\@"Z_nD]tݷ1: t'4ρ٭Y /7W#=vag㢕1BmƋ\"ݖ[ůF( {Og[ܲ#Xj-Zv*c^v ğ|$W/]K5h#m[V4DQi3vrV+1Њ .zB5FEĻ;&&5!0gBϧV ne.P2s_)Ȏ{ŵr #[ݷ,8"3bq`Ksu.k',&ᣂ$?Hy]-K!GJNآφ4M2F_Yxg4?,96:0醓JV¸68C4>)?($Gr]G*S=_Ikc.#HzfO4CdpdgNڠbږ-=DHO J rh)BnU!JW =e8 S{o&[]#j`U׻֮;ה,z ̟!Es\>B{<[Wf4sLV6 <+Ji)B &c "q)Ŗ/\DgY1&tY!""b?L{*"'֛nu&CkNZ={4qy ~F{+[A.sw4{xp/-CEW |UVq"l[ XbP>{unM zE*t%-ӧ!Q#L:*" u`f&Z6ZJ}?Fr7Y[KZX2[ ¦ɌǮD|} j%'ĥ]vc-j =5W4)a#CUV5'89UrMK0[<~-dD;)&$9>BZf~yh$& #% y]KWL6(%Tp4g7x6Rvr6B)9O;A洸i6nn0m̖)[P: ՌLqbwb{ { T%bVF'ֺbJut Xc3J2ő*{GLyXgOQ,^pZ7 |;\ V;9Ytro @@vț)ȶ-}Cm .Pk5ԙ]wi$]B"Oj,²[LIN]w娠o [!uUgL *BWa8C&9]v |~vй%R-+*zc @H*Je܄ f# wT統LZ)RU6Q^&?5>@;iBydPڍ _N2J ObO2~LȠ1Ld7xMGmurOf^u% 8;>' 4 s*`G{gVu5hAe2g״Ы"uaٚrHK]&>=(OX6L`?c s J퐻Gh'nF)kopӋ=% aOM:5D5)Y!VH{-~du.my޺G۳{MC8=PZaYz0 ah^eyd00O׏Ǖ)4XJABq=1lw-H|U;?u[";1?7<$ [9D0KN{|z1?ġM-np4čeݻ'):5gbhlE=B-/iU[=dkpGu*۹WYρ. WNbBڃ.jMt͸԰tGQV0TC>*Pn~?].;؇ RDBCxbvWw>˭XDSy|Iu) 9\ i յkds];ӑ.9(~J5D4W2ǏԊ02޶rۈSB=*]h g D%yրS{ ÞI*+xmTƛrZ-J1~"mWRw8~Ure,!io,q5Y Xѝ+--+ 1ٞx00rpSHTdg]M/G\M٭/Ol_q7ZFW&˥rc>C9gKs9P9Jd%jdI WvƒOª_EfA2{ɶFCZ7a{gFDk:HV0l M9/5c*cX˙XSoeO5]=9R&V]>'qD3<61B88J"h8=bU endstream endobj 302 0 obj << /Length1 1473 /Length2 2346 /Length3 0 /Length 3290 /Filter /FlateDecode >> stream xڍV 8TmТ|^fVX2fΘΌY,IK)-W%%KBքP髾u9>{pM0G FV8<ŪXab0h`VQ!  #{hh`Ov ǛQ@pa*;s`o`7*9RB!^L&S( &`W) d$H>ً ]bd #.Ǧ &fC 3b lS a3X w_ oE`*ma *C\x P?| b >:fa{_&- &@C!P~lpX\ Qqo6r,8E _GQcY2"X p^]kZ:UlR0|k٥ {-1@yI*2ނ;a5}1q|?;2庻/ƕ#N}oDV D ?oµQsvu{#!)Rm ȍo :s`Іn@ #l!ί+uAdxM-b}QXIxMM ,aIZ8RZ:P2q0LmDhad G/S,"E!}o ) ^{r5Dk&lz/HfR=%PWLa|b7iѮa/ -U=ٸv0[;:TWZoa:UW+dMgV*W >W"Zz`.Ϟ0|6tp&)^U&~А(Ӓuhw@FKFEd\r ^0OمM-4[\mk}QYEǓt}N R"s^x31vr0bO~:IDD'*\TnYr(K0q{m}>MmQF'zmul[I#ޕ}%-{$U\Iָ>?zzьLBUpԾS*ѫ_m- tLH$^4ؓlUgc'<ߒonJ~>Hqg`13|=vm.qJc[v-q6۬ɐ`ڕ`OdN1]);-k(]=/¿suWu#aS*pVq"_ͳC^nYITkqz>5g-RwV/5jaV\9<#TGA4.]8b l/e^t`:ekGsMf0y/l]6xq>NfPRGߺ-;_6\3ԪcEm  F1tK~0]f!<۷ke:-4+!q=L۰5??}(,Pŗ)Jak7VWZRn:\Aʙ qGלjQ/1[=)]mG.M q~w1&S!N$yVo b9(n9\$܇Km=5H/1vҷlו.EO[f{W\k=^/Ȥ{XO1age,ٸe%[D&xM3CRyXK7MC |q~uk0'+9}"|M`Dnbϸ+F$G# .-S3C 8QBAQ6Λٝ#^d g)YNя|,k͐#[I[uf<R^M#`n2@3n_7飘kiͲ_Ss>t뽎N7Gϛ7hvqNޓ0Gj"J>?hMgЕ'./Mw.+N15lSκQ-1Ob}ɢ/kkAfۖ]v" zCF*XI`L9R:s8P&L+uRm/(=\m(qA GfgLD:{<y23$7:bQc OZȺ.p ?ETdGuީ4?WgnԗϜ|hB5k1I")(Gr3 Uy4\fWv]4 endstream endobj 304 0 obj << /Length1 2763 /Length2 12951 /Length3 0 /Length 14511 /Filter /FlateDecode >> stream xڍT t#9twwwwPCwI(H Jtw#%-4 H9}kݻX x3tT:lR6V ygS +aFCAAn`g 2n &Bazj#/% ?Eg7a,lPc(;C@ht2.>n`;{(, `fp erjrE:t \0C.^^^@'wvg7;q&Vj"XG ~Dx:`="Gb`\ EB3࿈fthW[ ã)̑#X8qrZA?|ޡp-vA/ `Y;;&_⼿%NNE!,agGG0Æ]=` hFƀ=z~XA?Vvq؃ hd? ? @Xqê{atz\0P|0_> dp~$ ,QcX  Oy<0 . 7K*_2cCyauq#1؇#_ӿy  #;esG`y3r9;|u@t4 ,Y(.ǰWjc`5z9a,_ܭl l:<0^+̩k#g'_ s[{ Ʌ]y札E_Ԅ]UIzmqb9G1ؒ# >ɋى^=.~ht0$t0+LP׆hk?+vsil#8i:f"du= JX|,2 vR3J?$ǎ^]X,ecg틧}'QLm&10Zh&?&cE0UiáԥTީJ̏EvPK].`1PpK^,nGq=5 jM_/TZ|CfA_&piְ+SG#מ=Qٌ%49semK!9ڴu>ؔ%TH; nxWiVԨ60/7T"HZ>jBQ(FBHXHE8U3S+8ʳ3{"O$bb}gx-TɬH;r2+5Αb%Q&/pmL' AJa[*xSgmI0m)|j +{pnkNɋ!.,?h [m曒/,'|Ћ*fX_M8 CQGwǤlX^CL%yGAk$1~R[Eds.~V-^;4nUd}$a5tzqAt5WCCa LFؤN4B$Ƶ cN.P2>aدKʀIBULfoB81vkxmsե4%9QTxR+bU٩@6ֺu GE #ۺIӇWYfp?N^nʿh= bkJ'2;JY7Hro&'zGnr˞sm佝{j^~+V㺢dG&GoҎhmw.2\IS\S(@ ,;WG&&lmb ɣ⟼-/RsҚ=^z;7wWme FVФڹU&J9Ip_UxJ.Lcwnm; #RΟP[xs zYRYiKgܘCÏKRH\CT]WKd9l32f%K=deME׊a{Eo'weO-~ӌhdXc,ǭ3DsPmhj^$Mqa ?hK i"Y<9o}5Tiqm Bog6wm3ː~,I2rs1ACsoqP$(ztwbNM[s& J+[ŝdmB݋tW͡9Pt:뫔^B=EyQD1=Od38Q{[Vhb/^vM0Oq9ln-LxlaI/ HgC)aa}1QZQk'V"U a+,Z-/\s*6];be׺ M镍5\z]cEah% {҆ƥ@6=L 3xTFă1e%XUnNs#jy*DH׾b#u^ȿc r]CD8/N>2ϸ]z7,o4=@18V-fA߅YXSɇ{!71|w>69zN(؍*]<+D:KjPcx4Ѩb7u2zU|FO&肕XeO6+m45h2h0C[1>g$H={&sNt"`zxFoWR >\{& q>wycq=AFJQ*e(g=SnUi˒"Uq]!կ_6ʺTJ{ȯQ" d,0`͝0DUزl+0ud,sc_HߦiI8 sGz7r6Df#FN(8^{lF"6o|*"\̖dT-"O(ee9~K|3YT+L*# J%)0_gd`  tu?a0Cźܜ V_O@SO]tJHERhD;N~37RXbYh~-p eq+И`bsh+#y4 ;c \0WHBw4~8G|mFx;Dd3|zXQ :i ʓv*wҠ2hb :E1S]Q #F۷#0oɏzm{Fؿo=Д@&abD\ȿ_L3d';~`bd^5 ho천3{SͭӢr̉ 96+.9~(ʝh{ɲojQ}N+ȱ>RG;SÇc._6H:2+^{ծ0[*<~Y T?q@dCr-Y &&P/9;3OY8/TV F&qў$ ^yގy≸ܘbl(K1XxJ~SeQǃgh9"/0R+x􍜥zWQܰ-RD JvP9~˞N\GBnRȔܷ72~LŨ~#΃@CהeHiWv+Լ'hyoqֿc:|jBlz2ܱ2>(YmX­8zψĺF{ן}GGE)bbwSC܆Ȧ*΅<| X3U\ֵFp@FvEZoBHNnmB[{ٯ:;h>i<-^MW-nF݄'*sק@GӮ(݅OMmfLQDĊBx" 5/ӼYHU CԫaկJa!LK~&gnj*_Aso {d_J>iȀ $G9;5m5 iKNhͬN*(Š) 48ŗ E?dȓR1D5 9_To†(8ӨTT, d\(Q[RW[.o~E7׍ Y5t)ٛSYgK;W׫g[q0(6ȹ 1+CK,]@r/6cn0֐\.M:x? h"L .SwsPWKr hp߫MZ{}Uk/x"v,2f)xJN>W36]BݕJhc{;]Q!jڴ鮉y疠zW_ 3ܦVa19 v7(=qirG;\s ~s]N?e2>)MԼ喪Wo"Hf馛*u k:.:5(1ou˧N0V Z=w룔yJ UeTz>|(vKLĔzU?+a82׽+$2d`)_{@j̎pR񌵄j87@5.Ŋkg\BީZ0ZeP)(⠋-qDV/܎r|7,%),^:I\0& {eR!jV AR!q\(fAmx6&8# Jy):}5W\'GO35ݶ!̫kKp_zpMI?uDg?'}}.c԰Z@2M2)k?7=eRC^a@eܗc="bowjbkhF_Lun T-} SJN/ޢ%]43XD^b>)(ȱP-@Mk[hF2@XyG+PKBvm|+fy>r S3#MxC[ΝWgo2^hEV˰d_NjZ7PpXPI`q%jn#g޽C`)EAQ:tr2>uiZvgp$[븥TD罛D9BSЅRZRuT:}" 3ݭa#{!hUe(efKW^j8'_nLm+TfvH XӒ{T(/9ȩVEH^ZkeHĮo {En98b\_Є aV|9[χ0Oq]G `*tƣRy!"(vAsݑ w;,T'!-p4,9]okyDohX9([8*?c]YP aΣ}YTƸKb8Ʈ挗hnHNhF|6͹d)I=(Y#N dA&ĩ.҆7CNN)pc۳+jU4JI88i3͏I͑3Fǜ\5D)r#K!FQda2%do/5`ӨRQ"#58HM~4_][Eer7T-U\*l ej2e>:ӟNPyW_bHvSZ'y n2US~۶%ѯ"Z;S3] jL¢rLBk޾)uRxR\MXcfpYrA<ȌA ^bpTœB_MhTG5|{w&eu Gf{_i/p4P&k*ikfI2_< [@ ጬ=Xf_e"LiJt71LQwaW E¶gY=%4?1 hK>h^ Ikxưhw7F٠-P݉44dU3B(Yč mBC6bOO0>S7K[*1ɛف ~ǷA Ok~`q &/s N$1 ͈ @V_  q-=u\˶~Xeuw?W'yNJth {NR&9) G aY!PPd}F] Fr 3+0w|upq}7O;=VXfIMrBs-&Hd?%U$uggy>+]齀'0zƽF rYaM wz3ΔNvAbl\?6u!yDtHB[G]1wŢbDR.Ds,1[HԞwo<-nPqGŃ7F2&$i}> 1vM2F&\K~˲M$:I2{z~G* \=@♰>UcmDn|~rᨠqsy0IJ_/#Ѷ]R!:H降OƆ'JqځWH2go/Cռb@,;l8'`Tq B(gC|xJA#ZQAoȊNrz =/Z HI\RE[/syU[gD71хy:YCo:!{l*;tI_wJvک6"+DُcnDwK SjAKBCN ռEFXE)I;ێٕq" xV5w3(7M}]S 燏rFA 9Om+R%J&V4b23#F*~w9 ڳ>=km*=T4f^zlۨQ'59q"2\m>SʲHR#W":\^2މL7ř> h jrmٲә~d 1#R[amm3;gɁjhì2Ue#8/}]^kʔ N-s%O"}+ߒws-&Ǒ9dz1ͮu+p p'}GH Ńf-A-fOXo؄:514BNgT,?|y· ާNO]}@n4n[py.΋"%ny2Ǵ+/`)u'NS8U5K.26xpk֬%ke=$ζ on:nS}D.5 KsYBTHA"Cg\K3WԂ,{ ۼT,{lÕq<"'u~wcf]'D?)|AsB^F1>H"hiqy^UA#vBrI1/2FSqs~p_U?+9Ű}L/_`|RjЩPSɣSXȔ%Q "orcI g_(J@jjnk)^Kk{m<4{0}3=AX$S\t]<˺@}z2sYO(SfыhX˜9%?]Q6oKjאpvm EQt c.t _KDK Aqu 4[^*\{ ]TDD 983w%E.*Vur) ߦC_;AG#^?Ì8O|G\8CҏqDDJ6hZ"KLSlYDIKu2bwLף_4 z&1#Ȭ[~}] _jk|̦`LQ`{T w^1?sji ՅO7mTyB 뜧dp6Ar^ s#`ܭ~LoEڀȲ-bD7pƐ2yFRl\%3KXc=:aX";M UpRv~s?gT 3/MTr4㎮#`*a l¬PIΑ/oZ! ;tfz5!St!L|uVdh/Ӱ3ᴌb+UEN+C.]AēX8^oh{vP-6JvSi)VN]~C"6||rs]XW Fg,a8d6"2%'ڹ4 xM\M~d`VxG&cQŞ< ;v2g ҋRidRz5oi4ޞnfQO'Ō0}c9aW&!eX8dL88k[_k&~yQKIL|=WwK;\.ˮer"z7S7,:#oW3IbnCC K?p(SipJ~1"K'*<}εY+W߉MA^=9@cǀџDK6L[ŇM(]b[iȏLOWgTĮf6UJuY1a4z1Wς-7 ;Ӭ}׿ a P :bIvmm"'h8ȐTq{#0d$w|NWGq1},y (Dc2 !nf_؍-m =8NP}'"!S}R,ʆbQZ7glPhV?[x{'P>p5a>DOsØs> ,v MacAkv$r E5˵tZ YTc5fLGɳO{esMrn5,!Nr9. c0MΧkYWN4٦PS :cn.ZgOgbjNe$ma2U?2)[RH/#'_ mE׌5p^)}=q><Ԙ1am7هݟ5A(?1.)2GjþE7L"S5hv&V"R0 0J[nZ?4o<^K;]>23"xS!rl:|>}nWJ]ָs4#UC-5mG斯&i7i~1'E=om8%ށ%݇> #eR^5 fī`Mw5 8.9ÖhH;]Y+I` _J.X6u FSv dvxx{SUĀTRQ H/:6e>Puw稙! ⠇+A}4)i dz[Gʽ&?0)]{FUM*)B}RtyʠWOk>re*mJ?G^Վ`ᅍۭ#j)0eҗ%K;kDv'J׼ Im7x ^:{Fz)"iUE:w(mrjDj]Fw1DoIõ[uXk⥝ 2Ը._].UV)'le<#By[d;o{h[ 7iO&jIΧsy79(]-X+8Sj' rx& !r@$dpo2'9t^ΙE(Y2;V?J' endstream endobj 320 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.17)/Keywords() /CreationDate (D:20171218105825+01'00') /ModDate (D:20171218105825+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016/Debian) kpathsea version 6.2.2) >> endobj 281 0 obj << /Type /ObjStm /N 60 /First 512 /Length 2801 /Filter /FlateDecode >> stream xZYs8~ׯc[*I;sTh%H_?HXq*F_7n3n9S$<%aR*(,7019`@; )ň;C xDƈ` Rh E,#qULÄ NiFNec(QIKA*Zr a0Ga1%60S#%1@1 O !IbO8>-,{| 8cA9>'2lf,Lt# <032 I3ȣCqR`]0"37@̘Qq&8ǵ~tUuB>,b5rXf"&ֲ 0LgJ彤3Ɛ?jj>za%ÌYO^d|l:wRE10\(%{Z`R&] X?b61P:=qsY Ïnu yh{zc*8HhƸ59mQ[Xf,  3aFmM5IH#RcJ2_P&#S℉kް.!ABZ@(1{R(ܓci4k8Ean?qd0F5ⵎ7~kL`ԀD]+jBk_+Z/J*79D/HFwn7yQζno&c=m{ O wK4\aNnʄKS2|aI1PNh' 7n6hf .\#4,j%:G^:_0n!o!˪EQ[}&tRfa)s¶xl1eMuzb{X9j(u_G6go B.AQNj 98?>[,* {{o*v8)l }rR+pӫ oH#fpmaϦլ *nlDF!)Qu<-*')=N%-'iZ+zM3: ZT0tIKZNъVˢ]/8t Nqz{2{g.>@4ݯ naCpسkڄN|.N_7 n) u|8TXp w!2;8p{Ykrsy@i>YUEX;WmHU=m{w~#bktFD DH"gՍ6v{O~! +U\~`!仆P1Np[5㓓_IeIhB&4u'WУ|ʫE]l/=nNwAl7̰ŵOXŲX7Vg!p{F=luG  EXO}XvQ7 ߻Ge= [,r2s#/)?C]ϡ.$C~!~. =>*LEv7uVn.W\]ෳUq^^̶;_3zY\]T,peKG/ɨ>. Nt<0Χu?+oo{w]Rۛތ;|ڵ.~`]';wua}8b{{MF);h'ʾ{ߨ;g%mueob׼'_]'`+_WE 'bޗx˒|0bQY|<>X|LD҅>F%p/"nу5ommj2K#=*%A, )~j|Ae}Z FqG[8v;Ovv^a%~V=bsZ1 ?G^ E=mJfZ<(t)(UBx4V ǮgaA>T k@- PV)(\%5V~0T S/0v:!r@(F?nx=LAL!;$0'MChS &LKuQ.om:˩U"6G⺎'Nu7H+z"mc\-3()"Hʍt덱|ΔZZaW-:!N";P0qWh_u,]΄zN@@oyWp ^ߜ m}*,jfzȿd瓂x켼-9bS_M[} endstream endobj 321 0 obj << /Type /XRef /Index [0 322] /Size 322 /W [1 3 1] /Root 319 0 R /Info 320 0 R /ID [<2A6E9ECC2BFF4F91229EFC1C49E5A598> <2A6E9ECC2BFF4F91229EFC1C49E5A598>] /Length 809 /Filter /FlateDecode >> stream x%KlUeFw.}Ӈ, TbyT[Jy@ 8$Q b6Ht ̘;p11gG !!zdۻFDWD-HI;*`Eo T)zI5:ԃizH `1Oo-4H͠Kz c^#-K<56 :Jd-N^W)W- ^7+[ңfo_S/{%ޕz=600hKA+M$`;x`L0`xo^0hqIp( PrT=qyH;`,tyD1{}p\)OV'=8{gEҧc~rbg]"pb{b{xV+Ľ'''O%ʇ2aסeq" O]ؙ'N^v+i*oYaR%%&&&&&&&&&ZųC\/U%N&N&N&N&Nzs[r,߹ I}\` ^^Kˏyn\  rJ>P~[> Js<꼵`'d̓ ;fɜGQp K԰000)p psy; P/UלN*.TnS?rjPhi*U}J A0:UQU)qg endstream endobj startxref 229837 %%EOF adephylo/inst/doc/adephylo.R0000644000176200001440000002046313215710501015531 0ustar liggesusers### R code from vignette source 'adephylo.Rnw' ### Encoding: UTF-8 ################################################### ### code chunk number 1: adephylo.Rnw:106-107 (eval = FALSE) ################################################### ## vignette("phylobase") ################################################### ### code chunk number 2: load ################################################### library(ape) library(phylobase) library(ade4) library(adephylo) search() ################################################### ### code chunk number 3: adephylo.Rnw:153-154 (eval = FALSE) ################################################### ## ?adephylo ################################################### ### code chunk number 4: adephylo.Rnw:159-160 (eval = FALSE) ################################################### ## help("adephylo", package="adephylo", html=TRUE) ################################################### ### code chunk number 5: adephylo.Rnw:164-165 (eval = FALSE) ################################################### ## options(htmlhelp = FALSE) ################################################### ### code chunk number 6: readTree ################################################### data(ungulates) ungulates$tre myTree <- read.tree(text=ungulates$tre) myTree plot(myTree, main="ape's plotting of a tree") ################################################### ### code chunk number 7: adephylo.Rnw:211-216 ################################################### temp <- as(myTree, "phylo4") class(temp) temp <- as(temp, "phylo") class(temp) all.equal(temp, myTree) ################################################### ### code chunk number 8: phylo4d ################################################### ung <- phylo4d(myTree, ungulates$tab) class(ung) table.phylo4d(ung) ################################################### ### code chunk number 9: adephylo.Rnw:256-258 ################################################### x <- tdata(ung, type="tip") head(x) ################################################### ### code chunk number 10: moranI ################################################### W <- proxTips(myTree, met="Abouheif") moran.idx(tdata(ung, type="tip")$afbw, W) moran.idx(tdata(ung, type="tip")[,1], W, addInfo=TRUE) ################################################### ### code chunk number 11: adephylo.Rnw:305-317 ################################################### afbw <- tdata(ung, type="tip")$afbw sim <- replicate(499, moran.idx(sample(afbw), W)) # permutations sim <- c(moran.idx(afbw, W), sim) cat("\n=== p-value (right-tail) === \n") pval <- mean(sim>=sim[1]) pval plot(density(sim), main="Moran's I Monte Carlo test for 'bif'") # plot mtext("Density of permutations, and observation (in red)") abline(v=sim[1], col="red", lwd=3) ################################################### ### code chunk number 12: abouheif ################################################### ung.abTests <- abouheif.moran(ung) ung.abTests plot(ung.abTests) ################################################### ### code chunk number 13: adephylo.Rnw:361-363 ################################################### hasEdgeLength(ung) myTree.withBrLe <- compute.brlen(myTree) ################################################### ### code chunk number 14: adephylo.Rnw:369-371 ################################################### myProx <- vcv.phylo(myTree.withBrLe) abouheif.moran(ung, W=myProx) ################################################### ### code chunk number 15: adephylo.Rnw:398-400 ################################################### x <- as(rtree(5),"phylo4") plot(x,show.n=TRUE) ################################################### ### code chunk number 16: adephylo.Rnw:403-405 ################################################### x.part <- treePart(x) x.part ################################################### ### code chunk number 17: adephylo.Rnw:408-410 ################################################### temp <- phylo4d(x, x.part) table.phylo4d(temp, cent=FALSE, scale=FALSE) ################################################### ### code chunk number 18: adephylo.Rnw:420-422 ################################################### args(treePart) temp <- phylo4d(x, treePart(x, result="orthobasis") ) ################################################### ### code chunk number 19: orthobas1 ################################################### temp <- phylo4d(myTree, treePart(myTree, result="orthobasis") ) par(mar=rep(.1,4)) table.phylo4d(temp, repVar=1:8, ratio.tree=.3) ################################################### ### code chunk number 20: orthogram ################################################### afbw.ortgTest <- orthogram(afbw, myTree) afbw.ortgTest ################################################### ### code chunk number 21: adephylo.Rnw:468-469 ################################################### me.phylo(myTree.withBrLe) ################################################### ### code chunk number 22: figFourBas ################################################### ung.listBas <- list() ung.listBas[[1]] <- phylo4d(myTree, as.data.frame(me.phylo(myTree.withBrLe, method="patristic"))) ung.listBas[[2]] <- phylo4d(myTree, as.data.frame(me.phylo(myTree, method="nNodes"))) ung.listBas[[3]]<- phylo4d(myTree, as.data.frame(me.phylo(myTree, method="Abouheif"))) ung.listBas[[4]] <- phylo4d(myTree, as.data.frame(me.phylo(myTree, method="sumDD"))) par(mar=rep(.1,4), mfrow=c(2,2)) invisible(lapply(ung.listBas, table.phylo4d, repVar=1:5, cex.sym=.7, show.tip.label=FALSE, show.node=FALSE)) ################################################### ### code chunk number 23: lm1 ################################################### afbw <- log(ungulates$tab[,1]) neonatw <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) names(afbw) <- myTree$tip.label names(neonatw) <- myTree$tip.label plot(afbw, neonatw, main="Relationship between afbw and neonatw") lm1 <- lm(neonatw~afbw) abline(lm1, col="blue") anova(lm1) ################################################### ### code chunk number 24: resid ################################################### resid <- residuals(lm1) names(resid) <- myTree$tip.label temp <- phylo4d(myTree,data.frame(resid)) abouheif.moran(temp) table.phylo4d(temp) ################################################### ### code chunk number 25: adephylo.Rnw:522-529 ################################################### myBasis <- me.phylo(myTree, method="Abouheif") lm2 <- lm(neonatw~myBasis[,1] + afbw) resid <- residuals(lm2) names(resid) <- myTree$tip.label temp <- phylo4d(myTree,data.frame(resid)) abouheif.moran(temp) anova(lm2) ################################################### ### code chunk number 26: adephylo.Rnw:555-560 ################################################### W <- proxTips(myTree, method="Abouheif", sym=FALSE) lagNeonatw <- W %*% neonatw lm3 <- lm(neonatw ~ lagNeonatw + afbw) resid <- residuals(lm3) abouheif.moran(resid,W) ################################################### ### code chunk number 27: pca1 ################################################### f1 <- function(x){ m <- mean(x,na.rm=TRUE) x[is.na(x)] <- m return(x) } data(maples) traits <- apply(maples$tab, 2, f1) pca1 <- dudi.pca(traits, scannf=FALSE, nf=1) barplot(pca1$eig, main="PCA eigenvalues", col=heat.colors(16)) ################################################### ### code chunk number 28: pca2 ################################################### tre <- read.tree(text=maples$tre) W <- proxTips(tre) myComp <- data.frame(PC1=pca1$li[,1], lagPC1=W %*% pca1$li[,1]) myComp.4d <- phylo4d(tre, myComp) nodeLabels(myComp.4d) <- names(nodeLabels(myComp.4d)) table.phylo4d(myComp.4d) ################################################### ### code chunk number 29: aboutest ################################################### myTest <- abouheif.moran(myComp[,1], W=W) plot(myTest, main="Abouheif's test using patristic proximity") mtext("First principal component - maples data", col="blue", line=1) ################################################### ### code chunk number 30: loadings ################################################### ldgs <- pca1$c1[,1] plot(ldgs, type="h", xlab="Variable", xaxt="n", ylab="Loadings") s.label(cbind(1:31, ldgs), lab=colnames(traits), add.p=TRUE, clab=.8) temp <- abs(ldgs) thres <- quantile(temp, .75) abline(h=thres * c(-1,1), lty=2, col="blue3", lwd=3) title("Loadings for PC1") mtext("Quarter of most contributing variables indicated in blue", col="blue") adephylo/src/0000755000176200001440000000000013215710501012641 5ustar liggesusersadephylo/src/adesub.h0000644000176200001440000000346013215710501014260 0ustar liggesusers#include #include #include #include int dtodelta (double **data, double *pl); void initvec (double *v1, double r); double alea (void); void aleapermutvec (double *a); void aleapermutmat (double **a); void aleapermutmat (double **a); void aleapermutvec (double *a); void DiagobgComp (int n0, double **w, double *d, int *rang); void freeinttab (int **tab); void freeintvec (int *vec); void freetab (double **tab); void freevec (double *vec); void getpermutation (int *numero, int repet); void matcentrage (double **A, double *poili, char *typ); void matcentragehi (double **tab, double *poili, int *index, int *assign); void matmodifcm (double **tab, double *poili); void matmodifcn (double **tab, double *poili); void matmodifcp (double **tab, double *poili); void matmodifcs (double **tab, double *poili); void matmodiffc (double **tab, double *poili); void matpermut (double **A, int *num, double **B); double maxvec (double *vec); void prodmatAAtB (double **a, double **b); void prodmatABC (double **a, double **b, double **c); void prodmatAtAB (double **a, double **b); void prodmatAtBC (double **a, double **b, double **c); void prodmatAtBrandomC (double **a, double **b, double **c, int*permut); double traceXtdLXq (double **X, double **L, double *d, double *q); void sqrvec (double *v1); void taballoc (double ***tab, int l1, int c1); void tabintalloc (int ***tab, int l1, int c1); void trild (double *x , int *num, int gauche, int droite); void trildintswap (int *v, int i, int j); void trildswap (double *v, int i, int j); void trirap (double *x , int *num); void trirapideint (int *x , int *num, int gauche, int droite); void trirapideintswap (int *v, int i, int j); void vecalloc (double **vec, int n); void vecintalloc (int **vec, int n); void vecpermut (double *A, int *num, double *B); adephylo/src/misc.c0000644000176200001440000000167613215710501013752 0ustar liggesusers#include #include #include #include #include #include /* interpolate values in a density */ /* x contais n values for which we want y=f(x) */ void predict_density(double *densx, double *densy, int *densn, double *x, double *y, int *n){ int i, idx; for(i=0;i<*n;i++){ idx=0; while(idx < *densn && x[i]>densx[idx]){ idx++; } if(idx==0){ y[i] = densy[idx]/2.0; /* printf("\nx: %.5f, idx: %d, x.chosen: %.5f, %.5f = %.5f / 2.0", x[i], idx, densx[idx], y[i], densy[idx]); */ } else if(idx==*densn){ y[i] = densy[idx-1]/2.0; /* printf("\nx: %.5f, idx: %d, x.chosen: %.5f, %.5f = %.5f / 2.0", x[i], idx, densx[idx-1], y[i], densy[idx-1]); */ } else { y[i] = (densy[idx-1] + densy[idx])/2.0; /* printf("\nx: %.5f, idx: %d, x.before: %.5f, x.after: %.5f, %.5f = %.5f + %.5f / 2.0", x[i], idx, densx[idx-1], densx[idx], y[i], densy[idx-1], densy[idx]); */ } } } adephylo/src/sptips.c0000644000176200001440000002470413215710501014336 0ustar liggesusers/* Coded by Thibaut Jombart (tjombart@imperial.ac.uk), March 2010. Distributed with the adephylo package for the R software. Licence: GPL >=2. Notes: these functions are used to find the shortest path between specified pairs of tips. The algorithm proceeds as follows: 1) find the paths (pathA, pathB) to the root 2) find the MRCA, defined as the first term of pathA in pathB (same as the converse) 3) from A, go back to MRCA, adding crossed nodes to the result, not including the MRCA 4) from B, go back to MRCA, adding crossed nodes to the result, not including the MRCA 5) add the MRCA to the output 6) return the output */ #include #include #include #include #include #include #include "adesub.h" #include /* ============================= UTILITARY (INTERNAL) FUNCTIONS ============================= */ /* === REPLICATE %IN% / MATCH OPERATOR FOR INTEGERS === == for internal use only == - *b has to be a vector created using vecintalloc - returns 0 if there are no matches, and the index of the first match otherwise */ int intAinB(int a, int *b, int lengthB){ if(lengthB == 0) return(0); /* avoid comparison with empty vector */ int i=1; /* printf("\n AinB debugging: a=%d", a); */ while(i <= lengthB){ /* printf("\t i=%d \t bi=%d ", a, b[i]); */ if(b[i]==a) { return(i); } else { i++; } } return(0); } /* intAinB */ /* === REPLICATE SETDIFF MATCH OPERATOR FOR INTEGERS === == for internal use only == - *b has to be a vector created using vecintalloc - finds (possibly duplicated) elements of a not in b */ void intANotInB(int *a, int *b, int lengthA, int lengthB, int *res, int *resSize){ int i; /* a few checks */ if(lengthA==0) return; if(lengthB==0){ *resSize = 0; return; } /* main code */ *resSize = 0; for(i=1; i<=lengthA; i++){ if(intAinB(a[i], b, lengthB)==0){ *resSize = *resSize+1; res[*resSize] = a[i]; } } } /* intANotInB */ /* === UNION OF TWO INTEGER VECTORS === == for internal use only == - a, b, and res have to be created by vecintalloc - returns unique(c(a,b)) */ void unionInt(int *a, int *b, int lengthA, int lengthB, int *res, int *resSize){ if(lengthA==0 && lengthB && 0) { *res = 0; *resSize = 0; return; } int i, idx; res[1] = a[1]; /* initialization of temp results */ *resSize = 1; /* For a */ for(i=1;i<=lengthA;i++){ idx = intAinB(a[i], res, *resSize); /* check if element is in res */ if(idx==0) { *resSize = *resSize + 1; res[*resSize] = a[i]; } } /* For b */ for(i=1;i<=lengthB;i++){ idx = intAinB(b[i], res, *resSize); /* check if element is in res */ if(idx==0) { *resSize = *resSize + 1; res[*resSize] = b[i]; } } } /* unionInt */ /* === INTERSECTION OF TWO INTEGER VECTORS === == for internal use only == - a, b, and res have to be created by vecintalloc */ void intersectInt(int *a, int *b, int lengthA, int lengthB, int *res, int *resSize){ if((lengthA * lengthB) ==0) { *res = 0; *resSize = 0; return; } int i, idx; *resSize = 0; /* store elements of a present in b */ for(i=1;i<=lengthA;i++){ idx = intAinB(a[i], b, lengthB) * intAinB(a[i], res, *resSize); /* a in b and not already in res */ if(idx != 0) { *resSize = *resSize + 1; res[*resSize] = a[i]; } } } /* intersectInt */ /* === FIND THE PATH FROM A TIP TO THE ROOT === == for internal use only == - ances, desc and path must have been created using vecintalloc; their indices start at 1. - N is the number of edges in the tree, i.e. number of rows of $edge */ void pathTipToRoot(int tip, int *ances, int *desc, int N, int *res, int *resSize){ int i, curNode=0, keepOn=1, nextNodeId; curNode = tip; *resSize = 0; /* printf("\nInput inside pathTipTo...: \n"); */ /* for(i=1; i<= N;i++){ */ /* printf(" %d", res[i]); */ /* } */ while(keepOn==1){ nextNodeId = intAinB(curNode, desc, N); /* printf("\n%d in desc: %d", curNode, nextNodeId); */ if(nextNodeId > 0){ *resSize = *resSize + 1; curNode = ances[nextNodeId]; res[*resSize] = curNode; } else { keepOn = 0; } } /* /\* debugging *\/ */ /* printf("\nOutput from pathTip... :"); */ /* printf("\nresSize: %d \n", *resSize); */ /* for(i=1; i<= *resSize;i++){ */ /* printf(" %d", res[i]); */ /* } */ } /* pathTipToRoot */ /* === FIND THE MRCA BETWEEN TWO TIPS === == for internal use only == - a and b are two tips - ances and desc must be created using vecintalloc - N is the number of edges */ int mrca2tips(int *ances, int*desc, int a, int b, int N){ int i, res, idx; int *pathAroot, *pathBroot, *lengthPathA, *lengthPathB; /* allocate memory */ vecintalloc(&pathAroot, N); vecintalloc(&pathBroot, N); lengthPathA = (int *) calloc(1, sizeof(int)); lengthPathB = (int *) calloc(1, sizeof(int)); /* printf("\n N: %d", N); */ /* printf("\nEmpty res passed to pathTip...:\n"); */ /* for(i=1; i<= N;i++){ */ /* printf(" %d", pathAroot[i]); */ /* } */ /* find paths to the root */ pathTipToRoot(a, ances, desc, N, pathAroot, lengthPathA); pathTipToRoot(b, ances, desc, N, pathBroot, lengthPathB); /* debugging*/ /* printf("\n Information found within mrca2tips:\n"); */ /* printf("\nlengthPathA: %d \n", *lengthPathA); */ /* printf("\nlengthPathB: %d \n", *lengthPathB); */ /* printf("\nPath from %d to the root:\n", a); */ /* for(i=1; i<= *lengthPathA;i++){ */ /* printf(" %d", pathAroot[i]); */ /* } */ /* printf("\nPath from %d to the root\n", b); */ /* for(i=1; i<= *lengthPathB;i++){ */ /* printf(" %d", pathBroot[i]); */ /* } */ /* initialization */ i = 0; idx = 0; /* printf("\n - marker within mrca2tips - \n"); */ while(idx==0){ if(i == *lengthPathA){ /* that would indicate an error */ /* printf("\n Likely error: no MRCA found between specified tips."); */ /* free memory */ freeintvec(pathAroot); freeintvec(pathBroot); free(lengthPathA); free(lengthPathB); return(0); } i++; idx = intAinB(pathAroot[i], pathBroot, *lengthPathB); /* printf("\ni: %d idx: %d node: %d", i, idx, pathAroot[i]); */ } /* store the result in a local variable */ res = pathBroot[idx]; /* free memory */ freeintvec(pathAroot); freeintvec(pathBroot); free(lengthPathA); free(lengthPathB); return(res); } /* end mrca */ /* === FIND SHORTEST PATH BETWEEN TWO TIPS === == for internal use only == - ances and desc must be created using vecintalloc - N is the number of edges to represent the tree */ void sp2tips(int *ances, int *desc, int N, int tipA, int tipB, int *res, int *resSize){ /* declarations */ int *pathAroot, *pathBroot, *lengthPathA, *lengthPathB; int k, myMrca; /* allocate memory */ vecintalloc(&pathAroot, N); vecintalloc(&pathBroot, N); lengthPathA = (int *) calloc(1, sizeof(int)); lengthPathB = (int *) calloc(1, sizeof(int)); /* find paths to the root */ pathTipToRoot(tipA, ances, desc, N, pathAroot, lengthPathA); pathTipToRoot(tipB, ances, desc, N, pathBroot, lengthPathB); /* find the MRCA between both tips */ myMrca = mrca2tips(ances, desc, tipA, tipB, N); /* go back the paths and stop at MRCA (exclude MRCA) */ /* for A */ k = 1; *resSize = 0; while(pathAroot[k] != myMrca){ *resSize = *resSize + 1; res[*resSize] = pathAroot[k]; k++; } /* printf("\nsp step a:"); */ /* int i; */ /* for(i=1; i<=*resSize; i++){ */ /* printf(" %d", res[i]); */ /* } */ /* for B */ k = 1; while(pathBroot[k] != myMrca){ *resSize = *resSize + 1; res[*resSize] = pathBroot[k]; k++; } /* printf("\nsp step b:"); */ /* for(i=1; i<=*resSize; i++){ */ /* printf(" %d", res[i]); */ /* } */ /* add the MRCA */ *resSize = *resSize + 1; res[*resSize] = myMrca; /* printf("\nsp step mrca (%d):", myMrca); */ /* for(i=1; i<=*resSize; i++){ */ /* printf(" %d", res[i]); */ /* } */ /* free memory */ freeintvec(pathAroot); freeintvec(pathBroot); free(lengthPathA); free(lengthPathB); } /* end sp2tips */ /* ========================== MAIN (EXTERNAL) FUNCTION ========================== */ /* === FIND SHORTEST PATH BETWEEN ALL PAIRS OF TIPS === == for internal/external uses == - all arguments are passed from R - N is the number of edges to represent the tree - nTips is the total number of tips in the tree - resSize is the total size of the output vector; it can't be known in advance, so a fake value has to be passed - resId indicates how the final result should be cut */ void spalltips(int *ances, int *desc, int *N, int *nTips, int *res, int *resId, int *resSize){ /* declarations */ int i, j, k, m, idPair; int *ancesLoc, *descLoc, *tempRes, *tempResSize; /* must use dynamic allocation */ /* allocate memory for local variables */ vecintalloc(&ancesLoc, *N); vecintalloc(&descLoc, *N); vecintalloc(&tempRes, *N); tempResSize = (int *) calloc(1, sizeof(int)); /* create local vectors for ancestors and descendents */ ancesLoc[0] = *N; descLoc[0] = *N; for(i=0; i< *N; i++){ ancesLoc[i+1] = ances[i]; descLoc[i+1] = desc[i]; } /* perform computations for all pairs of tips (indexed 'i,j') */ *tempResSize = 0; *resSize = 0; m = 0; /* used to browse 'res' and 'resId' */ idPair = 0; /* printf("\ngot to 1"); */ /* debugging*/ /* printf("\nancesLoc:\n"); for(i=1; i<= *N;i++){ printf(" %d", ancesLoc[i]); } printf("\ndesc:\n"); for(i=1; i<= *N;i++){ printf(" %d", descLoc[i]); } printf("\nN: %d", *N); */ for(i=1; i<=(*nTips-1); i++){ for(j=(i+1); j<=(*nTips); j++){ /* temp results are save in tempRes and tempResSize */ idPair++; sp2tips(ancesLoc, descLoc, *N, i, j, tempRes, tempResSize); /* i and j are tips id */ /* copy temp results to returned results */ *resSize = *resSize + *tempResSize; for(k=1; k <= *tempResSize; k++){ res[m] = tempRes[k]; resId[m] = idPair; m++; } } } /* printf("\ngot to 4"); */ /* free memory */ freeintvec(ancesLoc); freeintvec(descLoc); freeintvec(tempRes); free(tempResSize); } /* end sptips */ /* TESTING */ /* library(adephylo) tre=rtree(10) plot(tre) nodelabels() tiplabels() res <- resId <- integer(1e5) resSize=as.integer(1e5) # void spalltips(int *ances, int *desc, int *N, int *nTips, int *res, int *resId, int *resSize){ toto <- .C("spalltips", as.integer(tre$edge[,1]), as.integer(tre$edge[,2]), nrow(tre$edge), as.integer(nTips(tre)), res, resId, resSize) toto[[5]] <- toto[[5]][1:toto[[7]]] toto[[6]] <- toto[[6]][1:toto[[7]]] res <- split(toto[[5]], toto[[6]]) res */ adephylo/src/distPhylo.c0000644000176200001440000002305313215710501014767 0ustar liggesusers/* Coded by Thibaut Jombart (tjombart@imperial.ac.uk), March 2010. Distributed with the adephylo package for the R software. Licence: GPL >=2. Notes: These functions implement several different phylogenetic distances between all pairs of tips in a phylogeny. These functions require sptips.c and adesub.c. */ #include #include #include #include #include #include #include "adesub.h" #include "sptips.h" #include /* ============================= UTILITARY (INTERNAL) FUNCTIONS ============================= */ /* === FIND THE LENGTH OF AN EDGE === == for internal use only == - the edge is identified by the descending node - ances, desc, and brlength must be created using vecintalloc - N is the number of edges to represent the tree */ double findedgelength(int *desc, double *brlength, int N, int myNode){ int posi=0; /* find the edge */ posi = intAinB(myNode, desc, N); if(posi==0){ Rprintf("\n Likely error in findedgelength: edge not found"); /* printf("\n Likely error in findedgelength: edge not found"); */ return(0.0); } /* return corresponding length */ return(brlength[posi]); } /* end findedgelength */ /* === FIND THE NUMBER OF DIRECT DESCENDENTS (DD) OF A NODE === == for internal use only == - ances, desc, and brlength must be created using vecintalloc - N is the number of edges to represent the tree */ int findNbDD(int *ances, int *desc, int N, int myNode){ int i, nbDD=0; /* browse the ances vector */ for(i=1; i<=N; i++){ if(ances[i] == myNode) { nbDD++; } } if(nbDD==0){ Rprintf("\n Likely error in findNbDD: no direct descendent found.\n"); /* printf("\n Likely error in findNbDD: no direct descendent found.\n"); */ } /* return corresponding length */ return(nbDD); } /* end findedgelength */ /* === DISTANCE(s) BETWEEN TWO TIPS === == for internal use only == - ances, desc, and brlength must be created using vecintalloc - N is the number of edges to represent the tree - 'method' indicates the type of distance: 1) patristic 2) nNodes 3) Abouheif 4) sumDD - edges are identified by their descending node - for patristic distances, the set of edge used is: {output of sp2tips} U {tipA, tipB} \ {output of mrca2tips} - for all others: {output of sp2tips} */ double dist2tips(int *ances, int *desc, double *brlength, int N, int tipA, int tipB, int method){ /* declarations */ int *path, *lengthPath, *myMrca; int i; double res; /* allocate memory */ vecintalloc(&path, N); lengthPath = (int *) calloc(1, sizeof(int)); vecintalloc(&myMrca, 1); /* has to be this way, not a simple pointer, to be used in intANotInB */ /* /\* debugging *\/ */ /* printf("\n-- Input to dist2tips --\n"); */ /* printf("\nances:"); */ /* for(i=1;i<=N; i++){ */ /* printf(" %d", ances[i]); */ /* } */ /* printf("\ndesc:"); */ /* for(i=1;i<=N; i++){ */ /* printf(" %d", desc[i]); */ /* } */ /* printf("\nedge length:"); */ /* for(i=1;i<=N; i++){ */ /* printf(" %f", brlength[i]); */ /* } */ /* find the shortest path between the two tips */ sp2tips(ances, desc, N, tipA, tipB, path, lengthPath); /* printf("\nShortest path found in dist2tips:"); */ /* for(i=1;i<=*lengthPath; i++){ */ /* printf(" %d", path[i]); */ /* } */ /* compute the distance */ switch( method ) { case 1: /* patristic distance */ /* find the mrca */ myMrca[1] = 0; myMrca[1] = mrca2tips(ances, desc, tipA, tipB, N); /* remove mrca from the path */ /* printf("\nMRCA: %d", myMrca[1]); */ intANotInB(path, myMrca, *lengthPath, 1, path, lengthPath); /* add tips to the path */ *lengthPath = *lengthPath + 1; path[*lengthPath] = tipA; *lengthPath = *lengthPath + 1; path[*lengthPath] = tipB; /* printf("\nPath used in patristic distance:"); */ /* for(i=1;i<=*lengthPath; i++){ */ /* printf(" %d", path[i]); */ /* } */ /* compute length */ res=0.0; for(i=1; i<=*lengthPath; i++){ res = res + findedgelength(desc, brlength, N, path[i]); /* printf("\nlength of edge terminating by %d: %f", path[i], findedgelength(desc, brlength, N, path[i])); */ /* printf("\n value of res: %f", res); */ } break; case 2: /* number of nodes */ res = *lengthPath; break; case 3: /* prod DD (Abouheif) */ res=1.0; for(i=1; i<=*lengthPath; i++){ res = res * findNbDD(ances, desc, N, path[i]); } break; case 4: /* sum DD */ res=0.0; for(i=1; i<=*lengthPath; i++){ res = res + findNbDD(ances, desc, N, path[i]); } break; default : res=0.0; Rprintf("\n\n Likely error in dist2tips: unknown method (%d):", method); /* printf("\n\n Likely error in dist2tips: unknown method (%d):", method); */ break; } /* free memory */ freeintvec(path); free(lengthPath); freeintvec(myMrca); /* printf("\nDistance between %d and %d: %f", tipA, tipB, res); */ return(res); } /* end dist2tips */ /* ========================== MAIN (EXTERNAL) FUNCTION ========================== */ /* === FIND DISTANCES BETWEEN ALL PAIRS OF TIPS === == for internal/external uses == - all arguments are passed from R - N is the number of edges to represent the tree - nTips is the total number of tips in the tree - 'method' indicates the type of distance: 1) patristic 2) nNodes 3) Abouheif 4) sumDD */ void distalltips(int *ances, int *desc, double *brlength, int *N, int *nTips, double *res, int *resSize, int *method){ /* declarations */ int i, j, k, temp; int *ancesLoc, *descLoc; /* must use dynamic allocation */ double *brlengthLoc; /* must use dynamic allocation */ /* check resSize */ temp = (*nTips) * (*nTips-1) / 2; if(*resSize != temp) { Rprintf("\n Likely error in distalltips: resSize is %d, and should be %d.\n", *resSize, temp); /* printf("\n Likely error in distalltips: resSize is %d, and should be %d.\n", *resSize, temp); */ return; } /* allocate memory for local variables */ vecintalloc(&ancesLoc, *N); vecintalloc(&descLoc, *N); vecalloc(&brlengthLoc, *N); /* create local vectors for ancestors, descendents and branch lengths */ ancesLoc[0] = *N; descLoc[0] = *N; brlengthLoc[0] = *N ; /* implicit casting int->double */ for(i=0; i< *N; i++){ ancesLoc[i+1] = ances[i]; descLoc[i+1] = desc[i]; brlengthLoc[i+1] = brlength[i]; } /* perform computations for all pairs of tips (indexed 'i,j') */ k = 0; /* used to browse 'res' */ for(i=1; i<=(*nTips-1); i++){ for(j=(i+1); j<=(*nTips); j++){ res[k] = dist2tips(ancesLoc, descLoc, brlengthLoc, *N, i, j, *method); /*printf("\nDistance between tip %d and %d in main function: %f", i, j, res[k]);*/ k++; } } /* free memory */ freeintvec(ancesLoc); freeintvec(descLoc); freevec(brlengthLoc); } /* end distalltips */ /* /\* === FIND DISTANCES BETWEEN GIVEN PAIRS OF TIPS === *\/ */ /* /\* === THIS HAS NOT BEEN TESTED === *\/ */ /* void distpairtips(int *ances, int *desc, double *brlength, int *N, int *nTips, double *res, int *resSize, int *method, int *tipsA, int *tipsB){ */ /* /\* declarations *\/ */ /* int i, j, k, temp; */ /* int *ancesLoc, *descLoc; /\* must use dynamic allocation *\/ */ /* double *brlengthLoc; /\* must use dynamic allocation *\/ */ /* /\* check resSize *\/ */ /* temp = (*nTips) * (*nTips-1) / 2; */ /* if(*resSize != temp) { */ /* printf("\n Likely error in distalltips: resSize is %d, and should be %d.\n", *resSize, temp); */ /* return; */ /* } */ /* /\* allocate memory for local variables *\/ */ /* vecintalloc(&ancesLoc, *N); */ /* vecintalloc(&descLoc, *N); */ /* vecalloc(&brlengthLoc, *N); */ /* /\* create local vectors for ancestors, descendents and branch lengths *\/ */ /* ancesLoc[0] = *N; */ /* descLoc[0] = *N; */ /* brlengthLoc[0] = *N ; /\* implicit casting int->double *\/ */ /* for(i=0; i< *N; i++){ */ /* ancesLoc[i+1] = ances[i]; */ /* descLoc[i+1] = desc[i]; */ /* brlengthLoc[i+1] = brlength[i]; */ /* } */ /* /\* perform computations for all pairs of tips (indexed 'i,j') *\/ */ /* k = 0; /\* used to browse 'res' *\/ */ /* for(i=0; i<*resSize; i++){ */ /* res[k++] = dist2tips(ancesLoc, descLoc, brlengthLoc, *N, tipsA[i], tipsB[j], *method); */ /* /\*printf("\nDistance between tip %d and %d in main function: %f", i, j, res[k]);*\/ */ /* } */ /* /\* free memory *\/ */ /* freeintvec(ancesLoc); */ /* freeintvec(descLoc); */ /* freevec(brlengthLoc); */ /* } /\* end distpairtips *\/ */ /* TESTING */ /* library(adephylo) tre=rtree(5) #tre$edge.length <- round(tre$edge.length*10) #tre$edge.length[tre$edge.length<1] <- 1 plot(tre) nodelabels() tiplabels() edgelabels(text=tre$edge.length) n <- as.integer(nTips(tre)) resSize=as.integer(n*(n-1)/2) res <- numeric(resSize) # void distalltips(int *ances, int *desc, double *brlength, int *N, int *nTips, double *res, int *resSize, int *method){ ## patristic toto <- .C("distalltips", as.integer(tre$edge[,1]), as.integer(tre$edge[,2]), as.double(tre$edge.length), nrow(tre$edge), n, res, length(res), as.integer(1)) res <- toto[[6]] res ## nNodes toto <- .C("distalltips", as.integer(tre$edge[,1]), as.integer(tre$edge[,2]), as.double(tre$edge.length), nrow(tre$edge), n, res, length(res), as.integer(2)) res <- toto[[6]] res ## Abou toto <- .C("distalltips", as.integer(tre$edge[,1]), as.integer(tre$edge[,2]), as.double(tre$edge.length), nrow(tre$edge), n, res, length(res), as.integer(3)) res <- toto[[6]] res ## sumDD toto <- .C("distalltips", as.integer(tre$edge[,1]), as.integer(tre$edge[,2]), as.double(tre$edge.length), nrow(tre$edge), n, res, length(res), as.integer(4)) res <- toto[[6]] res */ adephylo/src/sptips.h0000644000176200001440000000136013215710501014334 0ustar liggesusers#include #include #include #include #include #include #include "adesub.h" int intAinB(int a, int *b, int lengthB); void intANotInB(int *a, int *b, int lengthA, int lengthB, int *res, int *resSize); void unionInt(int *a, int *b, int lengthA, int lengthB, int *res, int *resSize); void intersectInt(int *a, int *b, int lengthA, int lengthB, int *res, int *resSize); void pathTipToRoot(int tip, int *ances, int *desc, int N, int *res, int *resSize); int mrca2tips(int *ances, int*desc, int a, int b, int N); void sp2tips(int *ances, int *desc, int N, int tipA, int tipB, int *res, int *resSize); void spalltips(int *ances, int *desc, int *N, int *nTips, int *res, int *resId, int *resSize); adephylo/src/phylog.c0000644000176200001440000003575413215710501014325 0ustar liggesusers#include #include #include #include #include #include #include "adesub.h" void gearymoran (int *param, double *data, double *bilis, double *obs, double *result, double *obstot, double *restot); void VarianceDecompInOrthoBasis (int *param, double *z, double *matvp, double *phylogram, double *phylo95,double *sig025, double *sig975, double *test1, double *test2, double*test3, double *test4, double *test5); void MVarianceDecompInOrthoBasis (int *param, double *z, int *nvar, double *inertot, double *matvp, double *phylogram, double *phylo95,double *sig025, double *sig975, double *test1, double *test2, double*test3, double *test4, double *test5); void gearymoran (int *param, double *data, double *bilis, double *obs, double *result, double *obstot, double *restot) { /* Declarations des variables C locales */ int nobs, nvar, nrepet, i, j, k, krepet, kvar ; int *numero; double provi; double *poili; double **mat, **tab, **tabperm; /* Allocation memoire pour les variables C locales */ nobs = param[0]; nvar = param [1]; nrepet = param [2]; vecalloc(&poili,nobs); taballoc(&mat,nobs,nobs); taballoc(&tab,nobs,nvar); taballoc(&tabperm,nobs,nvar); vecintalloc (&numero, nobs); /* Dfinitions des variables C locales */ k = 0; for (i=1; i<=nvar; i++) { for (j=1; j<=nobs; j++) { tab[j][i] = data[k] ; k = k+1 ; } } k = 0; provi = 0; for (j=1; j<=nobs; j++) { for (i=1; i<=nobs; i++) { mat[i][j] = bilis[k] ; provi = provi + bilis[k]; k = k+1 ; } } for (j=1; j<=nobs; j++) { for (i=1; i<=nobs; i++) { mat[i][j] = mat[i][j]/provi ; } } /* mat contient une distribution de frquence bivarie */ for (j=1; j<=nobs; j++) { poili[j] = 1/(double)(nobs); } /* poili contains uniform weights*/ matmodifcn(tab,poili); /* data are standardized using uniform weights */ for (kvar=1; kvar<=nvar; kvar++) { provi = 0; for (j=1; j<=nobs; j++) { for (i=1; i<=nobs; i++) { provi = provi + tab[i][kvar]*tab[j][kvar]*mat[i][j] ; } } obs[kvar-1] = provi; } k=0; /* les rsultats se suivent par simulation */ for (krepet=1; krepet<=nrepet; krepet++) { getpermutation (numero, krepet); matpermut (tab, numero, tabperm); for (kvar=1; kvar<=nvar; kvar++) { provi = 0; for (j=1; j<=nobs; j++) { for (i=1; i<=nobs; i++) { provi = provi + tabperm[i][kvar]*tabperm[j][kvar]*mat[i][j] ; } } result[k] = provi; k = k+1; } } /* libration mmoire locale */ freevec(poili); freetab(mat); freeintvec(numero); freetab(tab); freetab(tabperm); } void VarianceDecompInOrthoBasis (int *param, double *z, double *matvp, double *phylogram, double *phylo95,double *sig025, double *sig975, double *R2Max, double *SkR2k, double*Dmax, double *SCE, double *ratio) { /* param contient 4 entiers : nobs le nombre de points, npro le nombre de vecteurs nrepet le nombre de permutations, posinega la nombre de vecteurs de la classe posi qui est nul si cette notion n'existe pas. Exemple : la base Bscores d'une phylognie a posinega = 0 mais la base Ascores a posinega prendre dans Adim z est un vecteur nobs composantes de norme 1 pour la pondration uniforme. matvp est une matrice nobsxnpro contenant en colonnes des vecteurs orthonorms pour la pondration uniforme. En gn La procdure placera dans phylogram les R2 de la dcomposition de z dans la base matvp dans phylo95 les quantiles 0.95 des R2 dans sig025 les quantiles 0.025 des R2 cumuls dans sig975 les quantiles 0.975 des R2 cumuls Ecrit l'origine pour les phylognies peut servir pour une base de vecteurs propres de voisinage */ /* Declarations des variables C locales */ int nobs, npro, nrepet, i, j, k, n1, n2, n3, n4; int irepet, posinega, *numero, *vecrepet; double **vecpro, *zperm, *znorm; double *locphylogram, *modelnul; double a1, provi, **simul, *copivec, *copicol; /* Allocation memoire pour les variables C locales */ nobs = param[0]; npro = param [1]; nrepet = param [2]; posinega = param[3]; vecalloc (&znorm, nobs); vecalloc (&zperm, nobs); vecalloc (&copivec, npro); vecalloc (&copicol, nrepet); taballoc (&vecpro, nobs, npro); taballoc (&simul, nrepet, npro); vecalloc (&locphylogram, npro); vecalloc (&modelnul, npro); vecintalloc (&numero, nobs); vecintalloc (&vecrepet, nrepet); /* Dfinitions des variables C locales */ for (i = 1 ; i<= nobs; i++) znorm[i] = z[i-1]; for (i = 1 ; i<= npro; i++) modelnul[i] = (double) i/ (double) npro; k = 0; for (j=1; j<=npro; j++) { for (i=1; i<=nobs; i++) { vecpro[i][j] = matvp[k] ; k = k+1 ; } } /* calcul du phylogramme observ */ for (j = 1; j<= npro; j++) { provi = 0; for (i=1; i<=nobs; i++) provi = provi + vecpro[i][j]*znorm[i]; provi = provi*provi/nobs/nobs; locphylogram[j] = provi; } for (i =1 ; i<= npro ; i++) phylogram[i-1] = locphylogram[i]; /* calcul des simulations Chaque ligne de simul est un phylogramme aprs permutation des donnes */ for (irepet=1; irepet<=nrepet; irepet++) { getpermutation (numero, irepet); vecpermut (znorm, numero, zperm); provi = 0; for (j = 1; j<= npro; j++) { provi = 0; for (i=1; i<=nobs; i++) provi = provi + vecpro[i][j]*zperm[i]; provi = provi*provi/nobs/nobs; simul[irepet][j] = provi; } } /* calcul du test sur le max du phylogramme */ for (irepet=1; irepet<=nrepet; irepet++) { for (j=1; j<=npro; j++) copivec[j] = simul[irepet][j]; R2Max[irepet] = maxvec(copivec); provi=0; for (j=1; j<=npro; j++) provi = provi + j*simul[irepet][j]; SkR2k[irepet] =provi; if (posinega>0) { provi=0; for (j=1; j0) { provi=0; for (j=1; j0) { provi=0; for (j=1; j0) { provi=0; for (j=1; j // for NULL #include /* FIXME: Check these declarations against the C/Fortran source code. */ /* .C calls */ extern void distalltips(void *, void *, void *, void *, void *, void *, void *, void *); extern void gearymoran(void *, void *, void *, void *, void *, void *, void *); extern void MVarianceDecompInOrthoBasis(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void VarianceDecompInOrthoBasis(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); static const R_CMethodDef CEntries[] = { {"distalltips", (DL_FUNC) &distalltips, 8}, {"gearymoran", (DL_FUNC) &gearymoran, 7}, {"MVarianceDecompInOrthoBasis", (DL_FUNC) &MVarianceDecompInOrthoBasis, 14}, {"VarianceDecompInOrthoBasis", (DL_FUNC) &VarianceDecompInOrthoBasis, 12}, {NULL, NULL, 0} }; void R_init_adephylo(DllInfo *dll) { R_registerRoutines(dll, CEntries, NULL, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } adephylo/src/adesub.c0000644000176200001440000007057513215710501014266 0ustar liggesusers#include #include #include #include #include "adesub.h" #include /***********************************************************************/ double traceXtdLXq (double **X, double **L, double *d, double *q) /* Produit matriciel XtDLXQ avec LX comme lag.matrix */ { /* Declarations de variables C locales */ int j, i, lig, col; double **auxi, **A, trace; /* Allocation memoire pour les variables C locales */ lig = X[0][0]; col = X[1][0]; taballoc(&auxi, lig, col); taballoc(&A, col, col); /* Calcul de LX */ prodmatABC(L, X, auxi); /* Calcul de DLX */ for (i=1;i<=lig;i++) { for (j=1;j<=col;j++) { auxi[i][j] = auxi[i][j] * d[i]; } } /* Calcul de XtDLX */ prodmatAtBC(X,auxi,A); /* Calcul de trace(XtDLXQ) */ trace=0; for (i=1;i<=col;i++) { trace = trace + A[i][i] * q[i]; } /* Lib?ration des r?servations locales */ freetab (auxi); freetab (A); return(trace); } /***********************************************************************/ void tabintalloc (int ***tab, int l1, int c1) /*-------------------------------------------------- * Allocation de memoire dynamique pour un tableau * d'entiers (l1, c1) --------------------------------------------------*/ { int i, j; *tab = (int **) calloc(l1+1, sizeof(int *)); if ( *tab != NULL) { for (i=0;i<=l1;i++) { *(*tab+i)=(int *) calloc(c1+1, sizeof(int)); if ( *(*tab+i) == NULL ) { for (j=0;jj) k=j; for (n=1; n<=col; n++) { z = a[j][n]; a[j][n]=a[k][n]; a[k][n] = z; } } } /*************************/ void aleapermutvec (double *a) { /* permute au hasard les ?l?ments du vecteur a Manly p. 42 Le vecteur est modifi? from Knuth 1981 p. 139*/ int lig, i,j, k; double z; lig = a[0]; for (i=1; i<=lig-1; i++) { j=lig-i+1; k = (int) (j*alea()+1); /*k = (int) (j*genrand()+1);*/ if (k>j) k=j; z = a[j]; a[j]=a[k]; a[k] = z; } } /***********************************************************************/ void DiagobgComp (int n0, double **w, double *d, int *rang) /*-------------------------------------------------- * Diagonalisation * T. FOUCART Analyse factorielle de tableaux multiples, * Masson, Paris 1984,185p., p. 62. D'apr?s VPROP et TRIDI, * de LEBART et coll. --------------------------------------------------*/ { double *s, epsilon; double a, b, c, x, xp, q, bp, ab, ep, h, t, u , v; double dble; int ni, i, i2, j, k, jk, ijk, ij, l, ix, m, m1, isnou; vecalloc(&s, n0); a = 0.000000001; epsilon = 0.0000001; ni = 100; if (n0 == 1) { d[1] = w[1][1]; w[1][1] = 1.0; *rang = 1; freevec (s); return; } for (i2=2;i2<=n0;i2++) { b=0.0; c=0.0; i=n0-i2+2; k=i-1; if (k < 2) goto Et1; for (l=1;l<=k;l++) { c = c + fabs((double) w[i][l]); } if (c != 0.0) goto Et2; Et1: s[i] = w[i][k]; goto Etc; Et2: for (l=1;l<=k;l++) { x = w[i][l] / c; w[i][l] = x; b = b + x * x; } xp = w[i][k]; ix = 1; if (xp < 0.0) ix = -1; /* q = -sqrt(b) * ix; */ dble = b; dble = -sqrt(dble); q = dble * ix; s[i] = c * q; b = b - xp * q; w[i][k] = xp - q; xp = 0; for (m=1;m<=k;m++) { w[m][i] = w[i][m] / b / c; q = 0; for (l=1;l<=m;l++) { q = q + w[m][l] * w[i][l]; } m1 = m + 1; if (k < m1) goto Et3; for (l=m1;l<=k;l++) { q = q + w[l][m] * w[i][l]; } Et3: s[m] = q / b; xp = xp + s[m] * w[i][m]; } bp = xp * 0.5 / b; for (m=1;m<=k;m++) { xp = w[i][m]; q = s[m] - bp * xp; s[m] = q; for (l=1;l<=m;l++) { w[m][l] = w[m][l] - xp * s[l] - q * w[i][l]; } } for (l=1;l<=k;l++) { w[i][l] = c * w[i][l]; } Etc: d[i] = b; } /* for (i2=2;i2= h) { l = m; h = d[m]; } } if (l == i) { goto Etb; } else { d[l] = d[i]; d[i] = h; } for (m=1;m<=n0;m++) { h = w[m][i]; w[m][i] = w[m][l]; w[m][l] = h; } Etb:; } /* for (ij=2;ij<=n0;ij++) */ *rang = 0; for (i=1;i<=n0;i++) { if (d[i] / d[1] < epsilon) d[i] = 0.0; if (d[i] != 0.0) *rang = *rang + 1; } freevec(s); } /* DiagoCompbg */ /***********************************************************************/ void freeintvec (int *vec) /*-------------------------------------------------- * liberation de memoire pour un vecteur --------------------------------------------------*/ { free((char *) vec); } /***********************************************************************/ void freetab (double **tab) /*-------------------------------------------------- * Allocation de memoire dynamique pour un tableau (l1, c1) --------------------------------------------------*/ { int i, n; n = *(*(tab)); for (i=0;i<=n;i++) { free((char *) *(tab+i) ); } free((char *) tab); } /***********************************************************************/ void freevec (double *vec) /*-------------------------------------------------- * liberation de memoire pour un vecteur --------------------------------------------------*/ { free((char *) vec); } /***********************************************************************/ void getpermutation (int *numero, int repet) /*---------------------- * affectation d'une permutation al?atoire des n premiers entiers * dans dans un vecteur d'entiers de dimension n * vecintalloc pr?alable exig? * *numero est un vecteur d'entier * repet est un entier qui peut prendre une valeur arbitraire * utilise dans le germe du generateur de nb pseudo-aleatoires * si on l'incremente dans des appels repetes (e.g. simulation) garantit * que deux appels donnent deux resultats distincts (seed=clock+repet) ------------------------*/ { int i, n, seed; int *alea; n=numero[0]; vecintalloc (&alea,n); /*------------- * numerotation dans numero -----------*/ for (i=1;i<=n;i++) { numero[i]=i; } /*------------- * affectation de nombres aleatoires dans alea ----------------*/ /* seed = clock(); */ /* seed = seed + repet; */ /* srand(seed); */ GetRNGstate(); for (i=1;i<=n;i++) { alea[i]= (int) (unif_rand() * RAND_MAX); } PutRNGstate(); trirapideint (alea , numero, 1, n); freeintvec (alea); } /***********************************************************************/ void matcentrage (double **A, double *poili, char *typ) { if (strcmp (typ,"nc") == 0) { return; } else if (strcmp (typ,"cm") == 0) { matmodifcm (A, poili); return; } else if (strcmp (typ,"cn") == 0) { matmodifcn (A, poili); return; } else if (strcmp (typ,"cp") == 0) { matmodifcp (A, poili); return; } else if (strcmp (typ,"cs") == 0) { matmodifcs (A, poili); return; } else if (strcmp (typ,"fc") == 0) { matmodiffc (A, poili); return; } else if (strcmp (typ,"fl") == 0) { matmodifcm (A, poili); return; } } /***********************************************************************/ void matmodifcm (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, m colonnes * disjonctif complet * poili est un vecteur n composantes * la procedure retourne tab centre par colonne * pour la ponderation poili (somme=1) * centrage type correspondances multiples --------------------------------------------------*/ { double poid; int i, j, l1, m1; double *poimoda; double x, z; l1 = tab[0][0]; m1 = tab[1][0]; vecalloc(&poimoda, m1); for (i=1;i<=l1;i++) { poid = poili[i]; for (j=1;j<=m1;j++) { poimoda[j] = poimoda[j] + tab[i][j] * poid; } } for (j=1;j<=m1;j++) { x = poimoda[j]; if (x==0) { for (i=1;i<=l1;i++) tab[i][j] = 0; } else { for (i=1;i<=l1;i++) { z = tab[i][j]/x - 1.0; tab[i][j] = z; } } } freevec (poimoda); } /***********************************************************************/ void matmodifcn (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, p colonnes * poili est un vecteur n composantes * la procedure retourne tab norme par colonne * pour la ponderation poili (somme=1) --------------------------------------------------*/ { double poid, x, z, y, v2; int i, j, l1, c1; double *moy, *var; l1 = tab[0][0]; c1 = tab[1][0]; vecalloc(&moy, c1); vecalloc(&var, c1); /*-------------------------------------------------- * calcul du tableau centre/norme --------------------------------------------------*/ for (i=1;i<=l1;i++) { poid = poili[i]; for (j=1;j<=c1;j++) { moy[j] = moy[j] + tab[i][j] * poid; } } for (i=1;i<=l1;i++) { poid=poili[i]; for (j=1;j<=c1;j++) { x = tab[i][j] - moy[j]; var[j] = var[j] + poid * x * x; } } for (j=1;j<=c1;j++) { v2 = var[j]; if (v2<=0) v2 = 1; v2 = sqrt(v2); var[j] = v2; } for (i=1;i<=c1;i++) { x = moy[i]; y = var[i]; for (j=1;j<=l1;j++) { z = tab[j][i] - x; z = z / y; tab[j][i] = z; } } freevec(moy); freevec(var); } /***********************************************************************/ void matmodifcs (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, p colonnes * poili est un vecteur n composantes * la procedure retourne tab standardise par colonne * pour la ponderation poili (somme=1) --------------------------------------------------*/ { double poid, x, z, y, v2; int i, j, l1, c1; double *var; l1 = tab[0][0]; c1 = tab[1][0]; vecalloc(&var, c1); /*-------------------------------------------------- * calcul du tableau standardise --------------------------------------------------*/ for (i=1;i<=l1;i++) { poid=poili[i]; for (j=1;j<=c1;j++) { x = tab[i][j]; var[j] = var[j] + poid * x * x; } } for (j=1;j<=c1;j++) { v2 = var[j]; if (v2<=0) v2 = 1; v2 = sqrt(v2); var[j] = v2; } for (i=1;i<=c1;i++) { y = var[i]; for (j=1;j<=l1;j++) { z = tab[j][i]; z = z / y; tab[j][i] = z; } } freevec(var); } /***********************************************************************/ void matmodifcp (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, p colonnes * poili est un vecteur n composantes * la procedure retourne tab centre par colonne * pour la ponderation poili (somme=1) --------------------------------------------------*/ { double poid; int i, j, l1, c1; double *moy, x, z; l1 = tab[0][0]; c1 = tab[1][0]; vecalloc(&moy, c1); /*-------------------------------------------------- * calcul du tableau centre --------------------------------------------------*/ for (i=1;i<=l1;i++) { poid = poili[i]; for (j=1;j<=c1;j++) { moy[j] = moy[j] + tab[i][j] * poid; } } for (i=1;i<=c1;i++) { x = moy[i]; for (j=1;j<=l1;j++) { z = tab[j][i] - x; tab[j][i] = z; } } freevec(moy); } /***********************************************************************/ void matmodiffc (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, m colonnes * de nombres positifs ou nuls * poili est un vecteur n composantes * la procedure retourne tab centre doublement * pour la ponderation poili (somme=1) * centrage type correspondances simples --------------------------------------------------*/ { double poid; int i, j, l1, m1; double *poimoda; double x, z; l1 = tab[0][0]; m1 = tab[1][0]; vecalloc(&poimoda, m1); for (i=1;i<=l1;i++) { x = 0; for (j=1;j<=m1;j++) { x = x + tab[i][j]; } if (x!=0) { for (j=1;j<=m1;j++) { tab[i][j] = tab[i][j]/x; } } } for (i=1;i<=l1;i++) { poid = poili[i]; for (j=1;j<=m1;j++) { poimoda[j] = poimoda[j] + tab[i][j] * poid; } } for (j=1;j<=m1;j++) { x = poimoda[j]; if (x==0) { /*err_message("column has a nul weight (matmodiffc)");*/ } for (i=1;i<=l1;i++) { z = tab[i][j]/x - 1.0; tab[i][j] = z; } } freevec (poimoda); } /***********************************************************************/ void matpermut (double **A, int *num, double **B) { /*--------------------------------------- * A est une matrice n-p * B est une matrice n-p * num est une permutation al?atoire des n premiers entiers * B contient en sortie les lignes de A permut?es * ---------------------------------------*/ int lig, col,lig1, col1, lig2, i, j, k; lig = A[0][0]; col = A[1][0]; lig1 = B[0][0]; col1 = B[1][0]; lig2 = num[0]; if ( (lig!=lig1) || (col!=col1) || (lig!=lig2) ) { return; } for (i=1; i<=lig; i++) { k=num[i]; for (j=1; j<=col; j++) { B[i][j] = A[k][j]; } } } /***********************************************************************/ void prodmatABC (double **a, double **b, double **c) /*-------------------------------------------------- * Produit matriciel AB --------------------------------------------------*/ { int j, k, i, lig, col, col2; double s; lig = a[0][0]; col = a[1][0]; col2 = b[1][0]; for (i=1;i<=lig;i++) { for (k=1;k<=col2;k++) { s = 0; for (j=1;j<=col;j++) { s = s + a[i][j] * b[j][k]; } c[i][k] = s; } } } /***********************************************************************/ void prodmatAtAB (double **a, double **b) /*-------------------------------------------------- * Produit matriciel AtA --------------------------------------------------*/ { int j, k, i, lig, col; double s; lig = a[0][0]; col = a[1][0]; for (j=1;j<=col;j++) { for (k=j;k<=col;k++) { s = 0; for (i=1;i<=lig;i++) { s = s + a[i][k] * a[i][j]; } b[j][k] = s; b[k][j] = s; } } } /***********************************************************************/ void prodmatAtBC (double **a, double **b, double **c) /*-------------------------------------------------- * Produit matriciel AtB --------------------------------------------------*/ { int j, k, i, lig, col, col2; double s; lig = a[0][0]; col = a[1][0]; col2 = b[1][0]; for (j=1;j<=col;j++) { for (k=1;k<=col2;k++) { s = 0; for (i=1;i<=lig;i++) { s = s + a[i][j] * b[i][k]; } c[j][k] = s; } } } /***********************************************************************/ double maxvec (double *vec) /*-------------------------------------------------- * calcul le max d'un vecteur --------------------------------------------------*/ { int i, len; double x; x = vec[1]; len = vec[0]; for (i=1;i<=len;i++) { if (vec[i] > x) x = vec[i]; } return(x); } /***********************************************************************/ void prodmatAAtB (double **a, double **b) /*-------------------------------------------------- * Produit matriciel B = AAt --------------------------------------------------*/ { int j, k, i, lig, col; double s; lig = a[0][0]; col = a[1][0]; for (j=1;j<=lig;j++) { for (k=j;k<=lig;k++) { s = 0; for (i=1;i<=col;i++) { s = s + a[j][i] * a[k][i]; } b[j][k] = s; b[k][j] = s; } } } /***********************************************************************/ void prodmatAtBrandomC (double **a, double **b, double **c, int*permut) /*-------------------------------------------------- * Produit matriciel AtB * les lignes de B sont permut?es par la permutation permut --------------------------------------------------*/ { int j, k, i, i0, lig, col, col2; double s; lig = a[0][0]; col = a[1][0]; col2 = b[1][0]; for (j=1;j<=col;j++) { for (k=1;k<=col2;k++) { s = 0; for (i=1;i<=lig;i++) { i0 = permut[i]; s = s + a[i][j] * b[i0][k]; } c[j][k] = s; } } } /***********************************************************************/ void sqrvec (double *v1) /*-------------------------------------------------- * Racine carree des elements d'un vecteur --------------------------------------------------*/ { int i, c1; double v2; c1 = v1[0]; for (i=1;i<=c1;i++) { v2 = v1[i]; /* if (v2 < 0.0) err_message("Error: Square root of negative number (sqrvec)");*/ v2 = sqrt(v2); v1[i] = v2; } } /***********************************************************************/ void taballoc (double ***tab, int l1, int c1) /*-------------------------------------------------- * Allocation de memoire dynamique pour un tableau (l1, c1) --------------------------------------------------*/ { int i, j; if ( (*tab = (double **) calloc(l1+1, sizeof(double *))) != 0) { for (i=0;i<=l1;i++) { if ( (*(*tab+i)=(double *) calloc(c1+1, sizeof(double))) == 0 ) { return; for (j=0;j t) { dernier = dernier + 1; trildswap (x, dernier, j); trildintswap (num, dernier, j); } } trildswap (x, gauche, dernier); trildintswap (num, gauche, dernier); trild (x, num, gauche, dernier-1); trild (x, num, dernier+1, droite); } /**************************/ void trildintswap (int *v, int i, int j) { int provi; provi=v[i]; v[i]=v[j]; v[j]=provi; } /***********************************************************************/ void trildswap (double *v, int i, int j) /*-------------------------------------------------- * Echange les valeurs de deux double --------------------------------------------------*/ { double provi; provi=v[i]; v[i]=v[j]; v[j]=provi; } /***********************************************************************/ void trirap (double *x , int *num) /*-------------------------------------------------- * Tri d'un tableau de double par ordre croissant * avec conservation du rang dans un tableau entier. --------------------------------------------------*/ { int i, n, *num2, gauche, droite; double *x2; n = x[0]; gauche = 1; droite = n; vecalloc(&x2, n); vecintalloc(&num2, n); for (i=1;i<=n;i++) num[i] = i; trild(x, num, gauche, droite); for (i=1;i<=n;i++) { x2[i] = x[n - i + 1]; num2[i] = num[n - i + 1]; } for (i=1;i<=n;i++) { x[i] = x2[i]; num[i] = num2[i]; } freevec(x2); freeintvec(num2); } /***********************************************************************/ void trirapideint (int *x , int *num, int gauche, int droite) { int j, dernier, milieu, t; if ( (droite-gauche)<=0) return; milieu = (gauche+droite)/2; trirapideintswap (x, gauche, milieu); trirapideintswap (num, gauche, milieu); t=x[gauche]; dernier=gauche; for (j = gauche+1; j<=droite; j++) { if (x[j] < t) { dernier = dernier + 1; trirapideintswap (x, dernier, j); trirapideintswap (num, dernier, j); } } trirapideintswap (x, gauche, dernier); trirapideintswap (num, gauche, dernier); trirapideint (x, num, gauche, dernier-1); trirapideint (x, num, dernier+1, droite); } /***********************************************************************/ void trirapideintswap (int *v, int i, int j) { int provi; provi=v[i]; v[i]=v[j]; v[j]=provi; } /***********************************************************************/ void vecalloc (double **vec, int n) /*-------------------------------------------------- * Allocation de memoire pour un vecteur de longueur n --------------------------------------------------*/ { if ( (*vec = (double *) calloc(n+1, sizeof(double))) != 0) { **vec = n; return; } else { return; } } /***********************************************************************/ void vecintalloc (int **vec, int n) /*-------------------------------------------------- * Allocation de memoire pour un vecteur d'entiers de longueur n --------------------------------------------------*/ { if ( (*vec = (int *) calloc(n+1, sizeof(int))) != NULL) { **vec = n; return; } else { return; } } /***********************************************************************/ void vecpermut (double *A, int *num, double *B) { /*--------------------------------------- * A est un vecteur n elements * B est une vecteur n elements * num est une permutation al?atoire des n premiers entiers * B contient en sortie les elements de A permut?es * ---------------------------------------*/ int lig, lig1, lig2, i, k; lig = A[0]; lig1 = B[0]; lig2 = num[0]; if ( (lig!=lig1) || (lig!=lig2) ) { /*err_message ("Illegal parameters (vecpermut)"); closelisting();*/ } for (i=1; i<=lig; i++) { k=num[i]; B[i] = A[k]; } } adephylo/NAMESPACE0000644000176200001440000000255513176117334013313 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(dibas,dist) S3method(dibas,matrix) S3method(dibas,phylo) S3method(dibas,vector) S3method(plot,ppca) S3method(print,ppca) S3method(scatter,ppca) S3method(screeplot,ppca) S3method(summary,ppca) export(.tipToRoot) export(abouheif.moran) export(bullseye) export(dibas) export(distRoot) export(distTips) export(listDD) export(listTips) export(me.phylo) export(moran.idx) export(orthobasis.phylo) export(orthogram) export(ppca) export(proxTips) export(sp.tips) export(table.phylo4d) export(treePart) import(ade4) import(methods) import(phylobase) importFrom(adegenet,any2col) importFrom(adegenet,spectral) importFrom(adegenet,transp) importFrom(ape,.PlotPhyloEnv) importFrom(ape,plot.phylo) importFrom(grDevices,grey) importFrom(grDevices,heat.colors) importFrom(graphics,abline) importFrom(graphics,arrows) importFrom(graphics,axis) importFrom(graphics,barplot) importFrom(graphics,box) importFrom(graphics,dotchart) importFrom(graphics,layout) importFrom(graphics,par) importFrom(graphics,points) importFrom(graphics,rect) importFrom(graphics,segments) importFrom(graphics,strheight) importFrom(graphics,strwidth) importFrom(graphics,symbols) importFrom(graphics,text) importFrom(graphics,title) importFrom(stats,dnorm) importFrom(stats,median) importFrom(stats,rnorm) importFrom(stats,screeplot) importFrom(stats,sd) useDynLib(adephylo) adephylo/data/0000755000176200001440000000000012617071127012774 5ustar liggesusersadephylo/data/carni19.RData0000644000176200001440000000121312617071127015154 0ustar liggesusers uOh@ƳZq EBS?nFdWb-Ncd'a6.P$EDDū'O"JEjdF)2{N˧R$ɒWaHHR&7+WX:H= KN/Cj&s'9!>[þȝ:DXKlp.R_b?iwP~ +ϩ>(_~e >13>}S޹}[ѽS;(`qOܶy$̑t~o%]cy/܀%ЏCNBnv8$gϑ<8۶˟ܻ-{r?8pvX x{C & yϳgܜp6Nl7ӓ{jFbQ(6 fd}(C}h҇@Za^08 |H|OuaӸV(@l +(OtQuVP.z?Xl^ݸqXOv"ӿ_of'[Wʀ zMϰ'7n7Sg&a=f vҷ3yDL'v?Юff7FO?f;70$$Q'ݴ޾!/]]ׄ:%c'΢tnJCV`[RRGH6+Xv0Cg^sҗ%xͨW lE>?B=cW7.u27QKmķ}79A$q%N9̼cy8D^{DN$K0~=~q">4'8LO˘`~OWBM{.1|/1ȝxf\7y Q;PIɧz&8WO3Ο@!Q?{7صץoukoJ])vk+,qKꪞO,<{$x9K1EEu[@sĜ}}>\ǀO}^E!(o_{TAYEg qőz̃zI6.pxXsFmK,ڸz_= } B6B { <+<1U]8D~Lu }O!E!/ yP@nT}ʀ]Bx jqlc?(\nb\n6'tJ^kMh-"ZD5Z3&q/#5Թւ1"ךEo ZS_ !bxjc0Epε@4[Sޏ/Iezx&38=}z_<}s >{ 3[6 9%vm}>m*}/܇qȿ}}^Kw@KU czxO"g>G^ !m-}yf9p ޓ}C~#o# =s[w9Mgny֥:㾤6%#xT_9sOo=<-59)z~wD&%|\γ_"_)x0S]}-DZmh͹Ocޓ voUbҔ g'0LLueZ+Nky0ͯhHf"0& vl7#-::yr$394[7fux=͙ zzZ@n2(7AtOg&g OJ|mk& 4Ҧ_5|j{ݣfcݳ&V;/~RwK&ds~x{o7' 3}fZf;DSSg+"=p j9Zݎadephylo/data/mjrochet.RData0000644000176200001440000000452012617071127015525 0ustar liggesusers u pT?"P AH`0, Uݽ}v釩LvZڊVaZPu(6XP>D~U*Qs#s9s99K7JMJh%kE*,Ϯrdz8B1k>|sss[.4x4n:qd2}wZvnIt۔3ġ4[w'eH6$C69i`=4rL1mPYbfɴh1M1Ea|gO$9rq4mn.1wIRv,`4=⺖]e{aXfwXfOK'|whuO$L6ڎ0eg8.hUļ usVMV6A70Iz'HqCGpC3yj]D~̸4G)|qoRN)>"[EnwH|K36 234D0m,P0,+\`$!ҍ$5\]'ISa\h{ P, xiye3&|zm %` e)w,VLEtZYY.2!a4m<`9#M2Yƻ 3);{&l0h'kenۤ.w%FEf&'n#OyaV%˽c"as%,K . KE( 1}vbeW?٧}Zjb(r_cl>`n> RK6˸?j  -}JҋxO)4к)G;uyn'W|5quxnԐ)'KjfoIy7N)5! (g!o@=S Fs,yCHb7Zo6݂&m[ފ3q=\[O9+9*0j}߮䋡WJ`}YaCc*Vޖ~h_)w.w3-C|]r= Lx߉'~ ҿ>)B U~TZ"[ Hq6mB=dyo|uvA~*&UW'A4 ȯ)אaꛈt1~kBF"TnC{Uuѿ cW@msSˡrZ0½ϝXrq;`s/Bo]9U׵.ܻ*юAjLحPuvC>M/fw*o U0.mpCǏAЯ7:tI_'k0))ۜu+Uh\eiw|el |1[SNnaPл!և (/Sk^1cPν|ʸ3^(?)hP=ctB5v[ -\42Wd.~&7@?,RvkrɿOwqꃒYF[OIs?|վ؀=RމMpGӏ3I?,?v%`~R~&k~ -?_<>.^-7X@3)Oۭsu_Lu]t%e'q~ߐ#L 00T} PY\#"d-/f 5gQS/t'YI鐖 Z=mXr#A*o$(P•ŸǯoHkseҀ  tčNHQfW wuP.0h-b%8\]X+EE ۡ:p5\#x@&@) P;HG@+P-P (i _@(5@ZMA@h!_6 TMnG2__A/\2ǠR.jrXAo:NC0;ʒP#"'MvSV" V䖒ϐ$xLIBrjadephylo/data/procella.RData0000644000176200001440000000220412617071127015510 0ustar liggesusers UMlE:ihMR*(]xul/Њ41"zXZ6 r)JBq@ *^rB Pν& ^C[8`3y٩j&^Bb$6@B!1x!dd?ڞk1ۦ&B {A(w[h-wlR]%mX F&깔2t" /DxB/n|d|o\OQ?,TѾGW%on_9Ѯqa>e9'!G CWǡxac_C9FȁG? 5/@|쯭룯o]Y[H:ƙ6̣]]:i*k ʭ̌XX7"p5̽$hݢփ-|S469X|frD*CrN6<sϩw@fwWYoBSHר;[BӢԯK!`VhOA聾=wȬoB6_kF t`G[vPߖ*7ޢ^c8 <_9t{R adephylo/data/ungulates.RData0000644000176200001440000000132412617071127015720 0ustar liggesusers SMHQGbQtA̯3%=%b]_ΓXM:tҡCԡCD=c agͮ;n~y7312 x%A2N[ 8Lgo}yKtɑ,eCP10؊tV0n0i2)u}Wv5sJS$<}Wxy6hٵ_S&ٺiYLEa Y0%5e]=5mSlf̰9MUH2<ϙ%p,ä`iSX~PjT + iW/r'mJsUeajfP͌h+0=K64CNѯT"! <9א|_skn-pq 8 x>EpN'g@7dn|M@;0 4Z O2 m=ToV>@i{FVF6+~s4]ɋdHҪ*jr a"I0d#V{w!]u)ZJ<JsCнa?چcWXihE\ WgqX\!sT8vS_ywxYQR;|kadephylo/data/carni70.RData0000644000176200001440000000351412617071127015157 0ustar liggesusersuV=Ev.$I$$![l6gE$@R$pHz194!AAEC Q"$H7f<޾.=vxyh,4Nkv4K{a02cqĻ4t@F m4Q*F[ƈM%gBs)1-2Z_EۮJ7m"6Q,bsļ΢ds!=lZ._LFn "djģUi8屻C=8vbTLLF,X@gj&Hhܝ@D*"|$i W<qժfH\aP1##9{e.dbtjb0)5HO ȍT8bϩ.&\ (=#ЂB@6j@K-4ϰ8fp@mAqO57p}X#aa#L)&Ntc{=oDQn [7:Y\i}ٹ~i=}ú}AxE[sn7TUZ{gM]żfuf}'i]#ܡ/~el?-l OkdɯteZOOL{R<޷_!{Z{xKoo2{J%c'GPgVQm>z׊IkE}[_Do` CQX\L#^ګn^ : 8adephylo/data/lizards.RData0000644000176200001440000000156312617071127015366 0ustar liggesusers T]HQ׿u ٜgWYfl*QAXAAK/=PPAdoJ`I79=g~l6A,PA(@ei=ˀ\ )[Uj6 -5^a^t]Q;g~g~PR2߻1u X|h; * `7 hH: hBvފz=`/`^U=tzm>@'͹q͟ 3&TE߃༽Ńuu7y]E>_|3N\W :TO/{$8GX39#iVrѝɫKzcIlU&/1Ás淫wl >Ne]k.ΜW Snb[0nG_@@.FrJ7!`|+b.6>8Jȕ#6쨳/a2E䥵>?GxMK`I*95JS16~췖Ѝh"Mk&'e}$jyr{ޙGU ~ݴ 'B23B#e ziesk0kZ*eMPntCwWV{د+GOա͒+11Ud)8TPBip6HpyNwA4sR FI W$ En:EqpJ`dO5)ZFidW.1' 3F$Ekju/j% ey'mmsn)+ۜGM݁kH *{>_2adephylo/data/palm.RData0000644000176200001440000000656712617071127014660 0ustar liggesusers uX X6QdY ("*)G!к H!' EXTlݪ(*jݪ**Vkݪ] ; |s3dl)qx|N\Eb6nC+sz׈a^X רH%NM 쿸i=3 Z<44Tax.U`VMitx"2F܌+2j^O{ǓJ%ک ْAo2(22?W["q ڬIu j.Hڃ JQJВE@((\M Бk0Y"NSF:E;Bf#%h`OPdYKMΊ K48etR>p#&05Qͨu[F)X:i6оXSii}UdudTӍp`)SㄊXD:2`q^4 4Kx\k%ڍԤn+"GяKa&:Pґ5J4@ҝ>v)'*K =p ASpU#4f l u)0:JZK!v Ϛn)A>:RFvf<gwшk Ktc윁@rv'76WfҺ_`+A498 c܁?Ǩ) g Bne9öIO<勏A}4wLlYKI'%~EL~ ,"7/{Z۾LYx}Cɘ\{B.S_jfB <_1sK wZBNNrɤkW /WN ? rʏp`XbpqhjOFU"nj* km ZD~a)8rlpM ]I0?OIŐ fZ58.; g';E;+%n\P0H*jC(,7ts皅5^iҔ\ /e?m }/ݮ?<!/NU"͆c bV~1!*M !SB2@@x+Nȯ3o_> a^}!t,wL`vnwO-l]Wm[?; ۚdWˡ;{xF=mxhXOL{Yw(7/yǤ2.T_ >"Y=i&}n%21uv{=u7/YWֶ:;ά犯ȏcp#Սv}*ݚmDB~P3檙P5ӄkяiIcd< 7v5j:Pda}8ʛ0={2;*l'SAjT< ,=XF'`"r0ԑ1Hgʠ"l hPF+U0 #;6Tݰ2V9J’9(AHmNA2xP%<Ata , $j CVJdcPV}v4Qg]*%Pv>B^Y$!D&!6N eG+T,K(&kbC9vJPHPɎ- RHccإmmX m:W]IUFчb%@VsNd@ji?`&Badephylo/R/0000755000176200001440000000000012620357263012266 5ustar liggesusersadephylo/R/adephylo-package.R0000644000176200001440000005326613023605367015622 0ustar liggesusers #' The adephylo package #' #' This package is devoted to exploratory analysis of phylogenetic comparative #' data. It re-implements and extends phylogenetic procedures from the #' \code{ade4} package (which are now deprecated).\cr #' #' Comparative data (phylogeny+traits) are handled as \linkS4class{phylo4d} #' objects, a canonical class implemented by the \code{phylobase} package. #' Trees are handled as \code{\link[ape:read.tree]{phylo}} objects (from the #' \code{ape} package) or as \linkS4class{phylo4} objects (\code{phylobase}'s #' extension of \code{phylo} objects).\cr #' #' Main functionalities of \code{adephylo} are summarized below.\cr #' #' === TOPOLOGICAL INFORMATION ===\cr Several functions allow one to retrieve #' topological information from a tree; such information can be used, for #' instance, as a basis to compute distances or proximities between tips.\cr #' #' - \code{\link{listDD}}: lists the direct descendants from each node of a #' tree.\cr #' #' - \code{\link{listTips}}: lists the tips descending from each node of a #' tree.\cr #' #' - \code{\link{.tipToRoot}}: finds the set of nodes between a tip and the #' root of a tree.\cr #' #' - \code{\link{sp.tips}}: finds the shortest path between tips of a tree.\cr #' #' - \code{\link{treePart}}: defines partitions of tips reflecting the topology #' of a tree. This function can output non-independent dummy vectors, or #' alternatively an orthonormal basis used by the orthogram procedure.\cr #' #' === PHYLOGENETIC PROXIMITIES/DISTANCES ===\cr Several phylogenetic #' proximities and distances are implemented. Auxiliary function easing the #' computation of other distances/proximities are also provided:\cr #' #' - \code{\link{distRoot}}: computes different distances of a set of tips to #' the root.\cr #' #' - \code{\link{distTips}}: computes different pairwise distances in a set of #' tips.\cr #' #' - \code{\link{proxTips}}: computes different proximities between a set of #' tips.\cr #' #' === MEASURES/TESTS OF PHYLOGENETIC AUTOCORRELATION ===\cr Several procedures #' allow one to measure, and/or test phylogenetic signal in biological #' traits:\cr #' #' - \code{\link{abouheif.moran}}: performs Abouheif's test, designed to detect #' phylogenetic autocorrelation in a quantitative trait. This implementation is #' not based on original heuristic procedure, but on the exact formulation #' proposed by Pavoine et al. (2008), showing that the test is in fact a #' Moran's index test. This implementation further extends the procedure by #' allowing any measure of phylogenetic proximity (5 are proposed).\cr #' #' - \code{\link{orthogram}}: performs the orthonormal decomposition of #' variance of a quantitative variable on an orthonormal basis as in Ollier et #' al. (2005). It also returns the results of five non parametric tests #' associated to the variance decomposition.\cr #' #' - \code{\link{moran.idx}}: computes Moran's index of autocorrelation given a #' variable and a matrix of proximities among observations (no test).\cr #' #' === MODELLING/INVESTIGATION OF PHYLOGENETIC SIGNAL ===\cr Rather than #' testing or measuring phylogenetic autocorrelation, these procedures can be #' used for further investigation of phylogenetic signal. Some, like #' \code{\link{me.phylo}}, can be used to remove phylogenetic autocorrelation. #' Others can be used to understand the nature of this autocorrelation (i.e., #' to ascertain which traits and tips are concerned by phylogenetic #' non-independence).\cr #' #' - \code{\link{me.phylo}}/\code{\link{orthobasis.phylo}}: these synonymous #' functions compute Moran's eigenvectors (ME) associated to a tree. These #' vectors model different observable phylogenetic signals. They can be used as #' covariables to remove phylogenetic autocorrelation from data.\cr #' #' - \code{\link{orthogram}}: the orthogram mentioned above also provides a #' description of how biological variability is structured on a phylogeny.\cr #' #' - \code{\link{ppca}}: performs a phylogenetic Principal Component Analysis #' (pPCA, Jombart et al. 2010). This multivariate method investigates #' phylogenetic patterns in a set of quantitative traits.\cr #' #' === GRAPHICS ===\cr Some plotting functions are proposed, most of them being #' devoted to representing phylogeny and a quantitative information at the same #' time.\cr #' #' - \code{\link{table.phylo4d}}: fairly customisable way of representing #' traits onto the tips of a phylogeny. Several traits can be plotted in a #' single graphic.\cr #' #' - \code{\link{bullseye}}: an alternative to \code{\link{table.phylo4d}} #' based on fan-like representation, better for large trees.\cr #' #' - \code{\link{scatter.ppca}}, \code{\link{screeplot.ppca}}, #' \code{\link{plot.ppca}}: several plots associated to a phylogenetic #' principal component analysis (see \code{\link{ppca}}).\cr #' #' === DATASETS ===\cr Several datasets are also proposed. Some of these #' datasets replace former version from \code{ade4}, which are now deprecated. #' Here is a list of available datasets: \code{\link{carni19}}, #' \code{\link{carni70}}, \code{\link{lizards}}, \code{\link{maples}}, #' \code{\link{mjrochet}}, \code{\link{palm}}, \code{\link{procella}}, #' \code{\link{tithonia}}, and \code{\link{ungulates}}.\cr #' #' To cite adephylo, please use the reference given by #' \code{citation("adephylo")}. #' #' \tabular{ll}{ Package: \tab adephylo\cr Type: \tab Package\cr Version: \tab #' 1.1-7\cr Date: \tab 2014-11-10 \cr License: \tab GPL (>=2) } #' #' @name adephylo-package #' @aliases adephylo-package adephylo #' @docType package #' @author Thibaut Jombart \cr with contributions #' Stephane Dray and Anders Ellern Bilgrau #' . \cr Parts of former code from \code{ade4} by Daniel #' Chessel and Sebastien Ollier. #' @seealso The \code{ade4} package for multivariate analysis. #' @keywords manip multivariate NULL #' Phylogeny and quantative trait of carnivora #' #' This data set describes the phylogeny of carnivora as reported by #' Diniz-Filho et al. (1998). It also gives the body mass of these 19 species. #' #' #' @name carni19 #' @docType data #' @format \code{carni19} is a list containing the 2 following objects : #' \describe{ \item{tre}{is a character string giving the phylogenetic tree in #' Newick format.} \item{bm}{is a numeric vector which values correspond to the #' body mass of the 19 species (log scale).} } #' @note This dataset replaces the former version in ade4. #' @source Diniz-Filho, J. A. F., de Sant'Ana, C.E.R. and Bini, L.M. (1998) An #' eigenvector method for estimating phylogenetic inertia. \emph{Evolution}, #' \bold{52}, 1247--1262. #' @keywords datasets #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' #' data(carni19) #' tre <- read.tree(text=carni19$tre) #' x <- phylo4d(tre, data.frame(carni19$bm)) #' table.phylo4d(x, ratio=.5, center=FALSE) #' } #' } #' NULL #' Phylogeny and quantitative traits of carnivora #' #' This data set describes the phylogeny of 70 carnivora as reported by #' Diniz-Filho and Torres (2002). It also gives the geographic range size and #' body size corresponding to these 70 species. #' #' #' @name carni70 #' @docType data #' @format \code{carni70} is a list containing the 2 following objects: #' \describe{ \item{tre}{is a character string giving the phylogenetic tree in #' Newick format. Branch lengths are expressed as divergence times (millions #' of years)} \item{tab}{is a data frame with 70 species and two traits: size #' (body size (kg)) ; range (geographic range size (km)).} } #' @note This dataset replaces the former version in ade4. #' @source Diniz-Filho, J. A. F., and N. M. Torres. (2002) Phylogenetic #' comparative methods and the geographic range size-body size relationship in #' new world terrestrial carnivora. \emph{Evolutionary Ecology}, \bold{16}, #' 351--367. #' @keywords datasets #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' #' data(carni70) #' rownames(carni70$tab) <- gsub("_", ".", rownames(carni70$tab)) #' tre <- read.tree(text=carni70$tre) #' x <- phylo4d(tre, carni70$tab) #' table.phylo4d(x) #' #' par(mar=rep(.1,4)) #' table.phylo4d(x,cex.lab=.5, show.n=FALSE, ratio=.5) #' #' #' ## transform size in log and test for a phylogenetic signal #' size <- log(carni70$tab)[,1] #' names(size) <- row.names(carni70$tab) #' orthogram(size, tre) #' #' ## transform range and test for a phylogenetic signal #' yrange <- scale(carni70$tab)[,2] #' names(yrange) <- row.names(carni70$tab) #' orthogram(yrange, tre) #' } #' } #' NULL #' Phylogeny and quantitative traits of lizards #' #' This data set describes the phylogeny of 18 lizards as reported by Bauwens #' and D\'iaz-Uriarte (1997). It also gives life-history traits corresponding #' to these 18 species. #' #' Variables of \code{lizards$traits} are the following ones : mean.L (mean #' length (mm)), matur.L (length at maturity (mm)), max.L (maximum length #' (mm)), hatch.L (hatchling length (mm)), hatch.m (hatchling mass (g)), #' clutch.S (Clutch size), age.mat (age at maturity (number of months of #' activity)), clutch.F (clutch frequency). #' #' @name lizards #' @docType data #' @format \code{lizards} is a list containing the 3 following objects : #' \describe{ \item{traits}{is a data frame with 18 species and 8 traits.} #' \item{hprA}{is a character string giving the phylogenetic tree (hypothesized #' phylogenetic relationships based on immunological distances) in Newick #' format.} \item{hprB}{is a character string giving the phylogenetic tree #' (hypothesized phylogenetic relationships based on morphological #' characteristics) in Newick format.} } #' @note This dataset replaces the former version in ade4. #' @references Bauwens, D., and D\'iaz-Uriarte, R. (1997) Covariation of #' life-history traits in lacertid lizards: a comparative study. #' \emph{American Naturalist}, \bold{149}, 91--111. #' #' See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps063.pdf} #' (in French). #' @keywords datasets #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' #' ## see data #' data(lizards) #' liz.tr <- read.tree(tex=lizards$hprA) # make a tree #' liz <- phylo4d(liz.tr, lizards$traits) # make a phylo4d object #' table.phylo4d(liz) #' #' ## compute and plot principal components #' if(require(ade4)){ #' liz.pca1 <- dudi.pca(lizards$traits, cent=TRUE, #' scale=TRUE, scannf=FALSE, nf=2) # PCA of traits #' myPC <- phylo4d(liz.tr, liz.pca1$li) # store PC in a phylo4d object #' varlab <- paste("Principal \ncomponent", 1:2) # make labels for PCs #' table.phylo4d(myPC, ratio=.8, var.lab=varlab) # plot the PCs #' add.scatter.eig(liz.pca1$eig,2,1,2,posi="topleft", inset=c(0,.15)) #' title("Phylogeny and the principal components") #' #' ## compute a pPCA ## #' ## remove size effect #' temp <- lapply(liz.pca1$tab, function(e) residuals(lm(e~-1+liz.pca1$li[,1])) ) #' temp <- data.frame(temp) #' row.names(temp) <- tipLabels(liz) #' #' ## build corresponding phylo4d object #' liz.noSize <- phylo4d(liz.tr, temp) #' ppca1 <- ppca(liz.noSize, method="Abouheif", scale=FALSE, scannf=FALSE) #' plot(ppca1) #' #' } #' } #' } #' NULL #' Phylogeny and quantitative traits of flowers #' #' This data set describes the phylogeny of 17 flowers as reported by Ackerly #' and Donoghue (1998). It also gives 31 traits corresponding to these 17 #' species. #' #' #' @name maples #' @docType data #' @format \code{tithonia} is a list containing the 2 following objects : - #' tre: a character string giving the phylogenetic tree in Newick format.\cr - #' tab: a data frame with 17 species and 31 traits.\cr #' @note This dataset replaces the former version in ade4. #' @references Ackerly, D. D. and Donoghue, M.J. (1998) Leaf size, sappling #' allometry, and Corner's rules: phylogeny and correlated evolution in Maples #' (Acer). \emph{American Naturalist}, \bold{152}, 767--791. #' @keywords datasets #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' #' data(maples) #' #' ## see the tree #' tre <- read.tree(text=maples$tre) #' plot(tre) #' axisPhylo() #' #' ## look at two variables #' dom <- maples$tab$Dom #' bif <- maples$tab$Bif #' plot(bif,dom,pch = 20) #' abline(lm(dom~bif)) # a strong negative correlation ? #' summary(lm(dom~bif)) #' cor.test(bif,dom) #' #' ## look at the two variables onto the phylogeny #' temp <- phylo4d(tre, data.frame(dom,bif, row.names=tre$tip.label)) #' table.phylo4d(temp) # correlation is strongly linked to phylogeny #' #' ## use ape's PIC (phylogenetic independent contrasts) #' pic.bif <- pic(bif, tre) #' pic.dom <- pic(dom, tre) #' cor.test(pic.bif, pic.dom) # correlation is no longer significant #' } #' } #' NULL #' Phylogeny and quantitative traits of teleos fishes #' #' This data set describes the phylogeny of 49 teleos fishes as reported by #' Rochet et al. (2000). It also gives life-history traits corresponding to #' these 49 species. #' #' Variables of \code{mjrochet$tab} are the following ones : tm (age at #' maturity (years)), lm (length at maturity (cm)), l05 (length at 5 per cent #' survival (cm)), t05 (time to 5 per cent survival (years)), fb (slope of the #' log-log fecundity-length relationship), fm (fecundity the year of maturity), #' egg (volume of eggs (\eqn{mm^{3}}{mm^3})). #' #' @name mjrochet #' @docType data #' @format \code{mjrochet} is a list containing the 2 following objects : #' \describe{ \item{tre}{is a character string giving the phylogenetic tree in #' Newick format.} \item{tab}{is a data frame with 49 rows and 7 traits.} } #' @note This dataset replaces the former version in ade4. #' @references Rochet, M. J., Cornillon, P-A., Sabatier, R. and Pontier, D. #' (2000) Comparative analysis of phylogenic and fishing effects in life #' history patterns of teleos fishes. \emph{Oikos}, \bold{91}, 255--270. #' @keywords datasets #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' #' data(mjrochet) #' tre <- read.tree(text=mjrochet$tre) # make a tree #' traits <- log((mjrochet$tab)) #' #' ## build a phylo4d #' mjr <- phylo4d(tre, traits) #' #' ## see data #' table.phylo4d(mjr,cex.lab=.5,show.node=FALSE,symb="square") #' #' ## perform Abouheif's test for each trait #' mjr.tests <- abouheif.moran(mjr, nrep=499) #' mjr.tests #' #' } #' } #' NULL #' Phylogenetic and quantitative traits of amazonian palm trees #' #' This data set describes the phylogeny of 66 amazonian palm trees. It also #' gives 7 traits corresponding to these 66 species. #' #' Variables of \code{palm$traits} are the following ones: \cr - rord: specific #' richness with five ordered levels\cr - h: height in meter (squared #' transform)\cr - dqual: diameter at breast height in centimeter with five #' levels \code{sout : subterranean}, \code{ d1(0, 5 cm)}, \code{ d2(5, 15 #' cm)}, \code{ d3(15, 30 cm)} and \code{ d4(30, 100 cm)}\cr - vfruit: fruit #' volume in \eqn{mm^{3}}{mm^3} (logged transform)\cr - vgrain: seed volume in #' \eqn{mm^{3}}{mm^3} (logged transform)\cr - aire: spatial distribution area #' (\eqn{km^{2}}{km^2})\cr - alti: maximum altitude in meter (logged #' transform)\cr #' #' @name palm #' @docType data #' @format \code{palm} is a list containing the 2 following objects: \describe{ #' \item{tre}{is a character string giving the phylogenetic tree in Newick #' format.} \item{traits}{is a data frame with 66 species (rows) and 7 traits #' (columns).} } #' @note This dataset replaces the former version in ade4. #' @source This data set was obtained by Clementine Gimaret-Carpentier. #' @keywords datasets #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' #' ## load data, make a tree and a phylo4d object #' data(palm) #' tre <- read.tree(text=palm$tre) #' rord <- as.integer(palm$traits$rord) # just use this for plotting purpose #' traits <- data.frame(rord, palm$traits[,-1]) #' x <- phylo4d(tre, traits) #' #' ## plot data #' par(mar=rep(.1,4)) #' table.phylo4d(x, cex.lab=.6) #' #' ## test phylogenetic autocorrelation #' if(require(ade4)){ #' prox <- proxTips(x, method="sumDD") #' phylAutoTests <- gearymoran(prox, traits[,-3], nrep=499) #' plot(phylAutoTests) #' } #' } #' } #' NULL #' Phylogeny and quantitative traits of birds #' #' This data set describes the phylogeny of 19 birds as reported by Bried et #' al. (2002). It also gives 6 traits corresponding to these 19 species. #' #' Variables of \code{procella$traits} are the following ones: \cr - site.fid: #' a numeric vector that describes the percentage of site fidelity\cr - #' mate.fid: a numeric vector that describes the percentage of mate fidelity\cr #' - mass: an integer vector that describes the adult body weight (g)\cr - ALE: #' a numeric vector that describes the adult life expectancy (years)\cr - BF: a #' numeric vector that describes the breeding frequencies\cr - col.size: an #' integer vector that describes the colony size (no nests monitored) #' #' @name procella #' @docType data #' @format \code{procella} is a list containing the 2 following objects: #' \describe{ \item{tre}{is a character string giving the phylogenetic tree in #' Newick format.} \item{traits}{is a data frame with 19 species and 6 traits} #' } #' @note This dataset replaces the former version in ade4. #' @references Bried, J., Pontier, D. and Jouventin, P. (2002) Mate fidelity in #' monogamus birds: a re-examination of the Procellariiformes. \emph{Animal #' Behaviour}, \bold{65}, 235--246. #' #' See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps037.pdf} #' (in French). #' @keywords datasets #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' #' ## load data, make tree and phylo4d object #' data(procella) #' tre <- read.tree(text=procella$tre) #' x <- phylo4d(tre, procella$traits) #' par(mar=rep(.1,4)) #' table.phylo4d(x,cex.lab=.7) #' } #' } #' NULL #' Phylogeny and quantitative traits of flowers #' #' This data set describes the phylogeny of 11 flowers as reported by Morales #' (2000). It also gives morphologic and demographic traits corresponding to #' these 11 species. #' #' Variables of \code{tithonia$tab} are the following ones : \cr morho1: is a #' numeric vector that describes the seed size (mm)\cr morho2: is a numeric #' vector that describes the flower size (mm)\cr morho3: is a numeric vector #' that describes the female leaf size (cm)\cr morho4: is a numeric vector that #' describes the head size (mm)\cr morho5: is a integer vector that describes #' the number of flowers per head \cr morho6: is a integer vector that #' describes the number of seeds per head \cr demo7: is a numeric vector that #' describes the seedling height (cm)\cr demo8: is a numeric vector that #' describes the growth rate (cm/day)\cr demo9: is a numeric vector that #' describes the germination time\cr demo10: is a numeric vector that describes #' the establishment (per cent)\cr demo11: is a numeric vector that describes #' the viability (per cent)\cr demo12: is a numeric vector that describes the #' germination (per cent)\cr demo13: is a integer vector that describes the #' resource allocation\cr demo14: is a numeric vector that describes the adult #' height (m)\cr #' #' @name tithonia #' @docType data #' @format \code{tithonia} is a list containing the 2 following objects : #' \describe{ \item{tre}{is a character string giving the phylogenetic tree in #' Newick format.} \item{tab}{is a data frame with 11 species and 14 traits (6 #' morphologic traits and 8 demographic).} } #' @note This dataset replaces the former version in ade4. #' @source Data were obtained from Morales, E. (2000) Estimating phylogenetic #' inertia in Tithonia (Asteraceae) : a comparative approach. \emph{Evolution}, #' \bold{54}, 2, 475--484. #' @keywords datasets #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' #' data(tithonia) #' tre <- read.tree(text=tithonia$tre) #' traits <- log(tithonia$tab + 1) #' rownames(traits) <- gsub("_", ".", rownames(traits)) #' #' ## build a phylo4d object #' x <- phylo4d(tre, traits) #' par(mar=rep(.1,4)) #' table.phylo4d(x) #' #' } #' } #' NULL #' Phylogeny and quantitative traits of ungulates. #' #' This data set describes the phylogeny of 18 ungulates as reported by #' Pelabon et al. (1995). It also gives 4 traits corresponding to these 18 #' species. #' #' Variables of \code{ungulates$tab} are the following ones : \cr #' #' - afbw: is a numeric vector that describes the adult female body weight (g) #' \cr - mnw: is a numeric vector that describes the male neonatal weight (g) #' \cr - fnw: is a numeric vector that describes the female neonatal weight (g) #' \cr - ls: is a numeric vector that describes the litter size \cr #' #' @name ungulates #' @docType data #' @format \code{fission} is a list containing the 2 following objects : #' \describe{ \item{tre}{is a character string giving the phylogenetic tree in #' Newick format.} \item{tab}{is a data frame with 18 species and 4 traits} } #' @note This dataset replaces the former version in ade4. #' @source Data were obtained from Pelabon, C., Gaillard, J.M., Loison, A. and #' Portier, A. (1995) Is sex-biased maternal care limited by total maternal #' expenditure in polygynous ungulates? \emph{Behavioral Ecology and #' Sociobiology}, \bold{37}, 311--319. #' @keywords datasets #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' ## load data #' data(ungulates) #' tre <- read.tree(text=ungulates$tre) #' plot(tre) #' #' ## look at two traits #' afbw <- log(ungulates$tab[,1]) #' neonatw <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) #' names(afbw) <- tre$tip.label #' names(neonatw) <- tre$tip.label #' plot(afbw, neonatw) # relationship between traits #' lm1 <- lm(neonatw~afbw) #' abline(lm1) #' x <- phylo4d(tre, cbind.data.frame(afbw, neonatw)) # traits on the phylogeny #' #' ## test phylogenetic inertia in residuals #' orthogram(residuals(lm1), x) #' } #' } #' NULL adephylo/R/utils.R0000644000176200001440000002167412620502434013553 0ustar liggesusers#' Low-level auxiliary functions for adephylo #' #' These hidden functions are utils for adephylo, used by other functions. #' Regular users can use them as well, but no validity checks are performed for #' the arguments: speed is here favored over safety. Most of these functions #' handle trees inheriting \linkS4class{phylo4} class.\cr #' #' \code{.tipToRoot} finds the set of nodes between a tip and the root of a #' tree.\cr #' #' #' @rdname miscUtils #' @aliases .tipToRoot #' @param x A valid tree of class \linkS4class{phylo4}. #' @param tip An integer identifying a tip by its numbers. #' @param root An integer identifying the root of the tree by its number. #' @param include.root a logical stating whether the root must be included as a #' node of the path from tip to root (TRUE), or not (FALSE, default). #' @return \code{.tipToRoot}: a vector of named integers identifying nodes.\cr #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @keywords manip #' @examples #' #' if(require(ape) & require(phylobase)){ #' ## make a tree #' x <- as(rtree(20),"phylo4") #' plot(x,show.node=TRUE) #' #' ## .tipToRoot #' root <- rootNode(x) #' .tipToRoot(x, 1, root) #' lapply(1:nTips(x), function(i) .tipToRoot(x, i, root)) #' } #' #' @import phylobase #' @export .tipToRoot <- function(x, tip, root, include.root=FALSE){ E <- x@edge path <- NULL curNode <- tip while(curNode != root){ curNode <- E[(curNode==E[,2]),1] # one node <- its ancestor path <- c(path, curNode) } # end while if(!include.root) { path <- path[-length(path)] # exclude the root } return(getNode(x, path)) } # end tipToRoot ########## # sp.tips ########## #' Find the shortest path between tips of a tree #' #' The function \code{sp.tips} finds the shortest path between tips of a tree, #' identified as \code{tip1} and \code{tip2}. This function applies to trees #' with the class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or #' \linkS4class{phylo4d}. Several tips can be provided at a time. #' #' The function checks if there are cases where tip1 and tip2 are the same. #' These cases are deleted when detected, issuing a warning (unless #' \code{quiet} is set to TRUE). #' #' @param x A tree of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' @param tip1 A vector of integers identifying tips by their numbers, or a #' vector of characters identifying tips by their names. Recycled if needed. #' @param tip2 A vector of integers identifying tips by their numbers, or a #' vector of characters identifying tips by their names. Recycled if needed. #' @param useTipNames a logical stating whether the output must be named using #' tip names in all cases (TRUE), or not (FALSE). If not, names of \code{tip1} #' and \code{tip2} will be used. #' @param quiet a logical stating whether a warning must be issued when #' tip1==tip2, or not (see details). #' @param include.mrca a logical stating whether the most recent common #' ancestor shall be included in the returned path (TRUE, default) or not #' (FALSE). #' @return A list whose components are vectors of named nodes forming the #' shortest path between a couple of tips. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso \code{\link[phylobase]{shortestPath}} which does the same thing as #' \code{sp.tips}, for any node (internal or tip), but much more slowly. \cr #' @keywords manip #' @examples #' #' \dontrun{ #' if(require(ape) & require(phylobase)){ #' ## make a tree #' x <- as(rtree(20),"phylo4") #' plot(x,show.node=TRUE) #' ## get shortest path between tip 1 and all other tips. #' sp.tips(x, "t1", "t2") #' sp.tips(x, 1, 2:20, TRUE) #' } #' } #' #' @import phylobase #' @export sp.tips sp.tips <- function(x, tip1, tip2, useTipNames=FALSE, quiet=FALSE, include.mrca=TRUE){ ## if(!require(phylobase)) stop("phylobase package is not installed") ## conversion from phylo, phylo4 and phylo4d x <- as(x, "phylo4") ## some checks if (is.character(checkval <- checkPhylo4(x))) stop(checkval) t1 <- getNode(x, tip1) t2 <- getNode(x, tip2) if(any(is.na(c(t1,t2)))) stop("wrong tip specified") if(any(c(t1,t2) > nTips(x))) stop("specified nodes are internal nodes") if(length(t1) != length(t2)) { # recycle tip1 and tip2 maxLength <- max(length(t1), length(t2)) t1 <- rep(t1, length.out=maxLength) t2 <- rep(t2, length.out=maxLength) } toRemove <- (t1==t2) if(sum(toRemove)>0) { t1 <- t1[!toRemove] t2 <- t2[!toRemove] if(length(t1)==0) stop("tip1 and tip2 are the same vectors") if(!quiet) warning("tip1 and tip2 are sometimes the same; erasing these cases") } ## some global variables N <- nTips(x) root <- getNode(x, N+1) E <- x@edge allTips <- unique(c(t1,t2)) ## ## tipToRoot -> call to .tipToRoot ## tipToRoot <- function(E, tip){ ## path <- NULL ## curNode <- tip ## while(curNode != root){ ## curNode <- E[(curNode==E[,2]),1] # one node <- its ancestor ## path <- c(path, curNode) ## } # end while ## path <- getNode(x, path) ## return(path) ## } # end tipToRoot ## function pathTwoTips (takes two path-to-root as args) pathTwoTips <- function(path1, path2){ cpath <- c(path1, rev(path2)) temp <- factor(cpath, levels=unique(cpath)) CA <- temp[table(temp)==2][1] # most recent common ancestor (MRCA) CA <- as.integer(as.character(CA)) # retrieve integer type path1 <- path1[1:(which(path1==CA))] # cut path1 after MRCA (keep MRCA) temp <- which(path2==CA) if(temp==1) return(path1) path2 <- path2[1:(temp-1)] # cut path2 after MRCA (erase MRCA) return(c(path1,path2)) } # end pathTwoTips pathTwoTips.no.mrca <- function(path1, path2){ cpath <- c(path1, rev(path2)) temp <- intersect(path1, path2) res <- setdiff(cpath, temp) return(res) } # end pathTwoTips ## main computations allPathToRoot <- lapply(allTips, function(i) .tipToRoot(x, i, root, include.root=TRUE)) names(allPathToRoot) <- allTips allPath1 <- allPathToRoot[as.character(t1)] allPath2 <- allPathToRoot[as.character(t2)] if(include.mrca) { res <- lapply(1:length(allPath1), function(i) pathTwoTips(allPath1[[i]], allPath2[[i]]) ) } else { res <- lapply(1:length(allPath1), function(i) pathTwoTips.no.mrca(allPath1[[i]], allPath2[[i]]) ) temp.names <- names(res) temp <- sapply(res, function(vec) length(vec)>0) res[temp] <- lapply(res[temp], function(vec) getNode(x, vec) ) # name the nodes names(res) <- temp.names } if(useTipNames) { names(res) <- paste(names(t1), names(t2), sep="-") } else { names(res) <- paste(t1,t2,sep="-") } return(res) } # end sp.tips # examples # source("/home/master/dev/adephylo/pkg/R/utils.R") #phy <- as(rtree(15),"phylo4") ## plot(phy,show.n=T) ## tip1 <- "t1" ## tip2 <- "t2" ## sp.tips(phy, "t1", "t2") ## sp.tips(phy, rep(1,15), 1:15) ## sp.tips(phy, rep(1, 15), 1:15, TRUE) ## heavier tree # x <- as(rtree(1000), "phylo4") # system.time(sp.tips(x,1,1:1000)) ############ # listDD ############ #' List direct descendants for all nodes of a tree #' #' The function \code{listDD} lists the direct descendants from each node of a #' tree. The tree can be of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' #' #' @param x A tree of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' @param nameBy a character string indicating whether the returned list must #' be named by node labels ("label") or by node numbers ("number"). #' @return A list whose components are vectors of named nodes (or tips) for a #' given internal node. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso \code{\link{listTips}} which lists the tips descending from each #' node. \cr #' #' \code{\link{treePart}} which defines partitions of tips according to the #' tree topology. #' @keywords manip #' @examples #' #' if(require(ape) & require(phylobase)){ #' ## make a tree #' x <- as(rtree(20),"phylo4") #' plot(x,show.node=TRUE) #' listDD(x) #' } #' #' @import phylobase #' @export listDD listDD <- function(x, nameBy=c("label","number")){ ## if(!require(phylobase)) stop("phylobase package is not installed") ## conversion from phylo, phylo4 and phylo4d x <- as(x, "phylo4") nameBy <- match.arg(nameBy) ## check phylo4 object if (is.character(checkval <- checkPhylo4(x))) stop(checkval) ## computations nodIdx <- nTips(x)+1 nodIdx <- nodIdx:(nodIdx+nNodes(x)-1) res <- lapply(nodIdx, function(i) children(x, i)) if(hasNodeLabels(x) & nameBy=="label") { names(res) <- nodeLabels(x) } else { names(res) <- nodIdx } return(res) } # end listDD adephylo/R/orthobasis.R0000644000176200001440000001316712620510401014557 0ustar liggesusers#' Computes Moran's eigenvectors from a tree or a phylogenetic proximity matrix #' #' The function \code{orthobasis.phylo} (also nicknamed \code{me.phylo}) #' computes Moran's eigenvectors (ME) associated to a tree. If the tree has 'n' #' tips, (n-1) vectors will be produced. These vectors form an orthonormal #' basis: they are centred to mean zero, have unit variance, and are #' uncorrelated. Each vector models a different pattern of phylogenetic #' autocorrelation. The first vectors are those with maximum positive #' autocorrelation, while the last vectors are those with maximum negative #' autocorrelation. ME can be used, for instance, as regressors to remove #' phylogenetic autocorrelation from data (see references).\cr #' #' ME can be obtained from a tree, specifying the phylogenetic proximity to be #' used. Alternatively, they can be obtained directly from a matrix of #' phylogenetic proximities as constructed by \code{\link{proxTips}}. #' #' #' @aliases orthobasis.phylo me.phylo #' @param x A tree of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' @param prox a matrix of phylogenetic proximities as returned by #' \code{\link{proxTips}}. #' @param method a character string (full or abbreviated without ambiguity) #' specifying the method used to compute proximities; possible values are:\cr - #' \code{patristic}: (inversed sum of) branch lengths \cr - \code{nNodes}: #' (inversed) number of nodes on the path between the nodes \cr - #' \code{oriAbouheif}: original Abouheif's proximity, with diagonal (see #' details in \code{\link{proxTips}}) \cr - \code{Abouheif}: Abouheif's #' proximity (see details in \code{\link{proxTips}}) \cr - \code{sumDD}: #' (inversed) sum of direct descendants of all nodes on the path (see details #' in \code{\link{proxTips}}). #' @param f a function to change a distance into a proximity. #' @return An object of class \code{orthobasis}. This is a data.frame with #' Moran's eigenvectors in column, with special attributes:\cr - #' attr(...,"values"): Moran's index for each vector - attr(...,"weights"): #' weights of tips; current implementation uses only uniform weights #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso - \code{\link{proxTips}} which computes phylogenetic proximities #' between tips.\cr #' #' - \code{\link{treePart}} which can compute an orthobasis based on the #' topology of a phylogeny.\cr #' @references Peres-Neto, P. (2006) A unified strategy for estimating and #' controlling spatial, temporal and phylogenetic autocorrelation in ecological #' models \emph{Oecologica Brasiliensis} \bold{10}: 105-119.\cr #' #' Dray, S.; Legendre, P. \& Peres-Neto, P. (2006) Spatial modelling: a #' comprehensive framework for principal coordinate analysis of neighbours #' matrices (PCNM) \emph{Ecological Modelling} \bold{196}: 483-493.\cr #' #' Griffith, D. \& Peres-Neto, P. (2006) Spatial modeling in ecology: the #' flexibility of eigenfunction spatial analyses \emph{Ecology} \bold{87}: #' 2603-2613.\cr #' @keywords manip #' @examples #' #' if(require(ape) && require(phylobase)){ #' #' ## SIMPLE EXAMPLE ## #' ## make a tree #' x <- rtree(50) #' #' ## compute Moran's eigenvectors #' ME <- me.phylo(x, met="Abouheif") #' ME #' #' ## plot the 10 first vectors #' obj <- phylo4d(x, as.data.frame(ME[,1:10])) #' table.phylo4d(obj, cex.sym=.7, cex.lab=.7) #' #' #' \dontrun{ #' ## REMOVING PHYLOGENETIC AUTOCORRELATION IN A MODEL ## #' ## use example in ungulates dataset #' data(ungulates) #' tre <- read.tree(text=ungulates$tre) #' plot(tre) #' #' ## look at two traits #' afbw <- log(ungulates$tab[,1]) #' neonatw <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) #' names(afbw) <- tre$tip.label #' names(neonatw) <- tre$tip.label #' plot(afbw, neonatw) # relationship between traits #' lm1 <- lm(neonatw~afbw) #' abline(lm1) #' #' lm1 #' resid1 <- residuals(lm1) #' orthogram(resid1, tre) # residuals are autocorrelated #' #' ## compute Moran's eigenvectors (ME) #' myME <- me.phylo(tre, method="Abou") #' lm2 <- lm(neonatw ~ myME[,1] + afbw) # use for ME as covariable #' resid2 <- residuals(lm2) #' orthogram(resid2, tre) # there is no longer phylogenetic autocorrelation #' #' ## see the difference #' table.phylo4d(phylo4d(tre, cbind.data.frame(resid1, resid2))) #' } #' } #' #' @rdname orthobasis #' @import phylobase ade4 #' @export orthobasis.phylo <- function(x=NULL, prox=NULL, method=c("patristic","nNodes","oriAbouheif","Abouheif","sumDD"), f=function(x) {1/x} ){ ## if(!require(phylobase)) stop("phylobase package is not installed") ## if(!require(ade4)) stop("ade4 package is not installed") ## handle arguments method <- match.arg(method) if(is.null(prox)){ # have to compute prox x <- as(x, "phylo4") if (is.character(checkval <- checkPhylo4(x))) stop(checkval) W <- proxTips(x, tips="all", method=method, f=f, normalize="row", symmetric=TRUE) } else { # prox is provided W <- as.matrix(prox) if(!is.matrix(W)) stop("W is not a matrix") if(ncol(W) != nrow(W)) stop("W is not a square matrix") diag(W) <- 0 W <- 0.5 * (t(W) + W) # re-symmetrization } n <- nrow(W) ## main computation -> call to orthobasis.mat res <- orthobasis.mat(W, cnw=FALSE) ## build output row.names(res) <- rownames(W) names(res) <- paste("ME", 1:ncol(res)) names(attr(res,"values")) <- names(res) attr(res,"call") <- match.call() attr(res,"class") <- c("orthobasis","data.frame") return(res) } # end orthobasis.phylo ########### # me.phylo ########### #' @export me.phylo <- orthobasis.phylo adephylo/R/orthogram.R0000644000176200001440000003416612767533627014441 0ustar liggesusers#' Orthonormal decomposition of variance #' #' This function performs the orthonormal decomposition of variance of a #' quantitative variable on an orthonormal basis. It also returns the results of #' five non parametric tests associated to the variance decomposition. It thus #' provides tools (graphical displays and test) for analysing phylogenetic, #' pattern in one quantitative trait. This implementation replace the #' (deprecated) version from the \code{ade4} package.\cr #' #' Several orthonormal bases can be used. By default, basis is constructed from #' a partition of tips according to tree topology (as returned by #' \code{\link{treePart}}); for this, the argument \code{tre} must be provided. #' Alternatively, one can provide an orthonormal basis as returned by #' \code{\link{orthobasis.phylo}}/\code{\link{me.phylo}} (argument #' \code{orthobas}), or provide a proximity matrix from which an orthobasis #' based on Moran's eigenvectors will be constructed (argument \code{prox}). #' #' The function computes the variance decomposition of a quantitative vector x #' on an orthonormal basis B. The variable is normalized given the uniform #' weight to eliminate problem of scales. It plots the squared correlations #' \eqn{R^{2}}{R^2} between x and vectors of B (variance decomposition) and the #' cumulated squared correlations \eqn{SR^{2}}{SR^2} (cumulative decomposition). #' The function also provides five non parametric tests to test the existence of #' autocorrelation. The tests derive from the five following statistics : #' #' - R2Max=\eqn{\max(R^{2})}{max(R^2)}. It takes high value when a high part of #' the variability is explained by one score.\cr - #' SkR2k=\eqn{\sum_{i=1}^{n-1}(iR^{2}_i)}{sum_i^(n-1) i*(R^2)_i}. It compares #' the part of variance explained by internal nodes to the one explained by end #' nodes.\cr - Dmax=\eqn{\max_{m=1,...,n-1}(\sum_{j=1}^{m}R^{2}_j - #' }{max_(m=1,...,n-1)(sum_(j=1)^m(R^2_j) - (m/n-1))}\eqn{ #' \frac{m}{n-1})}{max_(m=1,...,n-1)(sum_(j=1)^m(R^2_j) - (m/n-1))}. It examines #' the accumulation of variance for a sequence of scores.\cr - #' SCE=\eqn{\sum_{m=1}^{n-1} (\sum_{j=1}^{m}R^{2}_j - #' }{sum_(m=1)^(n-1)(sum_(j=1)^m(R^2_j) - (m/n-1))^2}\eqn{ #' \frac{m}{n-1})^{2}}{sum_(m=1)^(n-1)(sum_(j=1)^m(R^2_j) - (m/n-1))^2}. It #' examines also the accumulation of variance for a sequence of scores.\cr - #' ratio: depends of the parameter posinega. If posinega > 0, the statistic #' ratio exists and equals \eqn{\sum_{i=1}^{posinega}R^{2}_i}{sum_i (R^2)_i with #' i < posinega + 1}. It compares the part of variance explained by internal #' nodes to the one explained by end nodes when we can define how many vectors #' correspond to internal nodes. #' #' @param x a numeric vector corresponding to the quantitative variable #' @param tre a tree of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' @param orthobas an object of class \code{'orthobasis'} #' @param prox a matrix of phylogenetic proximities as returned by #' \code{\link{proxTips}}. #' @param nrepet an integer giving the number of permutations #' @param posinega a parameter for the ratio test. If posinega > 0, the function #' computes the ratio test. #' @param tol a tolerance threshold for orthonormality condition #' @param cdot a character size for points on the cumulative decomposition #' display #' @param cfont.main a character size for titles #' @param lwd a character size for dash lines #' @param nclass a single number giving the number of cells for the histogram #' @param high.scores a single number giving the number of vectors to return. If #' > 0, the function returns labels of vectors that explains the larger part #' of variance. #' @param alter a character string specifying the alternative hypothesis, must #' be one of "greater" (default), "less" or "two-sided" #' @return If (high.scores = 0), returns an object of class \code{'krandtest'} #' (randomization tests) corresponding to the five non parametric tests. \cr #' \cr If (high.scores > 0), returns a list containg : \item{w}{: an object of #' class \code{'krandtest'} (randomization tests)} \item{scores.order}{: a #' vector which terms give labels of vectors that explain the larger part of #' variance} #' @note This function replaces the former version from the ade4 package, which #' is deprecated. Note that if ade4 is not loaded BEFORE adephylo, then the #' version from ade4 will erase that of adephylo, which will still be #' available from adephylo::orthogram. In practice, though, this should never #' happen, since ade4 is loaded as a dependence by adephylo. #' @author Original code: Sebastien Ollier and Daniel Chessel.\cr #' #' Current maintainer: Stephane Dray #' @seealso \code{\link{orthobasis.phylo}} #' @references Ollier, S., Chessel, D. and Couteron, P. (2005) Orthonormal #' Transform to Decompose the Variance of a Life-History Trait across a #' Phylogenetic Tree. \emph{Biometrics}, \bold{62}, 471--477. #' @examples #' #' \dontrun{ #' if(require(ape) && require(phylobase)){ #' #' ## a phylogenetic example #' data(ungulates) #' tre <- read.tree(text=ungulates$tre) #' plot(tre) #' #' ## look at two traits #' afbw <- log(ungulates$tab[,1]) #' neonatw <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) #' names(afbw) <- tre$tip.label #' names(neonatw) <- tre$tip.label #' plot(afbw, neonatw) # relationship between traits #' lm1 <- lm(neonatw~afbw) #' resid <- residuals(lm1) #' abline(lm1) #' #' ## plot the two traits and the residuals of lm1 #' x <- phylo4d(tre, cbind.data.frame(afbw, neonatw, residuals=resid)) #' table.phylo4d(x) # residuals are surely not independant #' #' ## default orthogram for residuals of lm1 #' orthogram(resid, tre) #' #' ## using another orthonormal basis (derived from Abouheif's proximity) #' myOrthoBasis <- orthobasis.phylo(tre, method="oriAbouheif") # Abouheif's proximities #' orthogram(resid, ortho=myOrthoBasis) # significant phylog. signal #' #' ## Abouheif's test #' W <- proxTips(tre, method="oriAbouheif") # proximity matrix #' abouheif.moran(resid, W) #' } #' } #' #' @import phylobase #' @import ade4 #' @importFrom graphics par layout segments barplot abline title box points #' arrows #' @importFrom grDevices grey #' @export orthogram orthogram <- function (x, tre=NULL, orthobas = NULL, prox = NULL, nrepet = 999, posinega = 0, tol = 1e-07, cdot = 1.5, cfont.main = 1.5, lwd = 2, nclass, high.scores = 0,alter=c("greater", "less", "two-sided")){ ## some checks and preliminary assignements ## if(!require(ade4)) stop("The ade4 package is not installed.") nobs <- length(x) alter <- match.arg(alter) if(is.numeric(x)&is.vector(x)){ type <- "numeric" ## } else if(is.factor(x)){ ## type <- "factor" ## } else if (inherits(x, "dudi")){ ## type <- "dudi" } else { ## stop("x must be a numeric vector, a factor or a dudi object") stop("x must be a numeric vector") } ## if(type == "dudi") { ## nobs <- nrow(x$tab) ## } else { ## nobs <- length(x) ## } ## if (!is.null(neig)) { ## orthobas <- scores.neig(neig) ## } else if (!is.null(phylog)) { ## if (!inherits(phylog, "phylog")) stop ("'phylog' expected with class 'phylog'") ## orthobas <- phylog$Bscores ## } ## if (is.null(orthobas)){ ## stop ("'orthobas','neig','phylog' all NULL") ## } ## retrieve the orthobasis from a proximity matrix if(is.null(orthobas)){ if(is.null(prox)) { # both orthobas and prox are not given -> default orthobasis ## check that tre is provided and valid if(is.null(tre)) stop("tre, orthobasis or prox must be provided") tre <- as(tre, "phylo4") if (is.character(checkval <- checkPhylo4(tre))) stop(checkval) orthobas <- treePart(tre, result="orthobasis") } else { # else orthobasis from the proxi matrix. orthobas <- orthobasis.phylo(prox=prox) } } if (!inherits(orthobas, "data.frame")) stop ("'orthobas' is not a data.frame") if (nrow(orthobas) != nobs) stop ("non convenient dimensions") if (ncol(orthobas) != (nobs-1)) stop (paste("'orthobas' has",ncol(orthobas),"columns, expected:",nobs-1)) vecpro <- as.matrix(orthobas) npro <- ncol(vecpro) w <- t(vecpro/nobs)%*%vecpro if (any(abs(diag(w)-1)>tol)) { stop("'orthobas' is not orthonormal for uniform weighting") } diag(w) <- 0 if ( any( abs(as.numeric(w))>tol) ) stop("'orthobas' is not orthogonal for uniform weighting") if (nrepet < 99) nrepet <- 99 if (posinega !=0) { if (posinega >= nobs-1) stop ("Non convenient value in 'posinega'") if (posinega <0) stop ("Non convenient value in 'posinega'") } if(type!="dudi"){ if (any(is.na(x))) stop("missing value in 'x'") } if(type == "factor"){ dudi1 <- dudi.acm(data.frame(x), scannf = FALSE, nf = min(nobs, nlevels(x))) } if(type == "dudi") { if (!all.equal(x$lw, rep(1/nobs, nobs))) stop("not implemented for non-uniform row weights") dudi1 <- redo.dudi(x, newnf = x$rank) if(any(colMeans(dudi1$li)>tol)) stop("not implemented for non-centered analysis") } if(type == "numeric") { z <- x - mean(x) et <- sqrt(mean(z * z)) if ( et <= tol*(max(z)-min(z))) stop ("No variance") z <- z/et w <- .C("VarianceDecompInOrthoBasis", param = as.integer(c(nobs,npro,nrepet,posinega)), observed = as.double(z), vecpro = as.double(vecpro), phylogram = double(npro), phylo95 = double(npro), sig025 = double(npro), sig975 = double(npro), R2Max = double(nrepet+1), SkR2k = double(nrepet+1), Dmax = double(nrepet+1), SCE = double(nrepet+1), ratio = double(nrepet+1), PACKAGE="adephylo" ) } else { w <- .C("MVarianceDecompInOrthoBasis", param = as.integer(c(nobs,npro,nrepet,posinega)), observed = as.double(as.matrix(dudi1$li)), nvar = as.integer(ncol(dudi1$li)), inertot = as.double(sum(dudi1$eig)), vecpro = as.double(vecpro), phylogram = double(npro), phylo95 = double(npro), sig025 = double(npro), sig975 = double(npro), R2Max = double(nrepet+1), SkR2k = double(nrepet+1), Dmax = double(nrepet+1), SCE = double(nrepet+1), ratio = double(nrepet+1), PACKAGE="adephylo" ) } ##return(w$phylogram) ## multiple graphical window (6 graphs) ## 1 pgram ## 2 cumulated pgram ## 3-6 Randomization tests def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout (matrix(c(1,1,2,2,1,1,2,2,3,4,5,6),4,3)) par(mar = c(0.1, 0.1, 0.1, 0.1)) par(usr = c(0,1,-0.05,1)) ylim <- max(c(w$phylogram, w$phylo95)) names(w$phylogram) <- as.character(1:npro) phylocum <- cumsum(w$phylogram) lwd0=2 fun <- function (y, last=FALSE) { delta <- (mp[2]-mp[1])/3 sel <- 1:(npro - 1) segments(mp[sel]-delta,y[sel],mp[sel]+delta, y[sel],lwd=lwd0) if(last) segments(mp[npro]-delta,y[npro],mp[npro]+delta, y[npro],lwd=lwd0) } sig50 <- (1:npro)/npro y0 <- phylocum - sig50 h.obs <- max(y0) x0 <- min(which(y0 == h.obs)) par(mar = c(3.1, 2.5, 2.1, 2.1)) if(type == "numeric"){ z0 <- apply(vecpro, 2, function(x) sum(z * x)) mp <- barplot(w$phylogram, col = grey(1 - 0.3 * (sign(z0) > 0)), ylim = c(0, ylim * 1.05)) } else { mp <- barplot(w$phylogram, ylim = c(0, ylim * 1.05)) } scores.order <- (1:length(w$phylogram))[order(w$phylogram, decreasing=TRUE)[1:high.scores]] fun(w$phylo95,TRUE) abline(h = 1/npro) if (posinega!=0) { verti = (mp[posinega]+mp[posinega+1])/2 abline (v=verti, col="red",lwd=1.5) } title(main = "Variance decomposition",font.main=1, cex.main=cfont.main) box() obs0 <- rep(0, npro) names(obs0) <- as.character(1:npro) barplot(obs0, ylim = c(-0.05, 1.05)) abline(h=0,col="white") if (posinega!=0) { verti = (mp[posinega]+mp[posinega+1])/2 abline (v=verti, col="red",lwd=1.5) } title(main = "Cumulative decomposition",font.main=1, cex.main=cfont.main) points(mp, phylocum, pch = 21, cex = cdot, type = "b") segments(mp[1], 1/npro, mp[npro], 1, lty = 1) fun(w$sig975) fun(w$sig025) arrows(mp[x0], sig50[x0], mp[x0], phylocum[x0], angle = 15, length = 0.15, lwd = 2) box() if (missing(nclass)) { nclass <- as.integer (nrepet/25) nclass <- min(c(nclass,40)) } plot(as.randtest (w$R2Max[-1],w$R2Max[1],call=match.call()),main = "R2Max",nclass=nclass) if (posinega !=0) { plot(as.randtest (w$ratio[-1],w$ratio[1],call=match.call()),main = "Ratio",nclass=nclass) } else { plot(as.randtest (w$SkR2k[-1],w$SkR2k[1],call=match.call()),main = "SkR2k",nclass=nclass) } plot(as.randtest (w$Dmax[-1],w$Dmax[1],call=match.call()),main = "DMax",nclass=nclass) plot(as.randtest (w$SCE[-1],w$SCE[1],call=match.call()),main = "SCE",nclass=nclass) w$param <- w$observed <- w$vecpro <- NULL w$phylo95 <- w$sig025 <- w$sig975 <- NULL if (posinega==0) { w <- as.krandtest(obs=c(w$R2Max[1],w$SkR2k[1],w$Dmax[1],w$SCE[1]),sim=cbind(w$R2Max[-1],w$SkR2k[-1],w$Dmax[-1],w$SCE[-1]),names=c("R2Max","SkR2k","Dmax","SCE"),alter=alter,call=match.call()) } else { w <- as.krandtest(obs=c(w$R2Max[1],w$SkR2k[1],w$Dmax[1],w$SCE[1],w$ratio[1]),sim=cbind(w$R2Max[-1],w$SkR2k[-1],w$Dmax[-1],w$SCE[-1],w$ratio[-1]),names=c("R2Max","SkR2k","Dmax","SCE","ratio"),alter=alter,call=match.call()) } if (high.scores != 0) w$scores.order <- scores.order return(w) } # end orthogram adephylo/R/bullseye.R0000644000176200001440000001654512620503157014243 0ustar liggesusers## ## PLOT A FAN TREE, WITH BULLSEYE LEGEND AND AXIS, AND OPTIONAL COLORS ## FOR TIPS ## ## Author: Thibaut Jombart, May 2013. ## t.jombart@imperial.ac.uk ## ############ ## bullseye ############ #' Fan-like phylogeny with possible representation of traits on tips #' #' This function represents a phylogeny as a fan, using circles to provide a #' legend for distances and optionally colored symbols to represent traits #' associated to the tips of the tree. This function uses and is compatible #' with ape's \code{\link[ape]{plot.phylo}}. #' #' #' @param phy a tree in \code{phylo}, \linkS4class{phylo4} or #' \linkS4class{phylo4d} format. #' @param traits an optional data.frame of traits. #' @param col.tips.by an optional vector used to define colors for tip labels; #' if unamed, must be ordered in the same order as \code{phy$tip.label}. #' @param col.pal a function generating colors according to a given palette; #' several palettes can be provided as a list, in the case of several traits; #' the first palette is always reserved for the tip colors; this argument is #' recycled. #' @param circ.n the number of circles for the distance annotations. #' @param circ.bg the color of the circles. #' @param circ.unit the unit of the circles; if NULL, determined automatically #' from the data. #' @param legend a logical specifying whether a legend should be plotted; only #' one legend is displayed, with priority to tip colors first, and then to the #' first trait. #' @param leg.posi,leg.title,leg.bg position, title and background for the #' legend. #' @param traits.inset inset for positioning the traits; 1 corresponds to the #' circle crossing the furthest tip, 0 to the center of the plot. #' @param traits.space a coefficient indicating the spacing between traits. #' @param traits.pch,traits.cex type and size of the symbols used for the #' traits; recycled if needed. #' @param alpha alpha value to be used for the color transparency, between 0 #' (invisible) and 1 (plain). #' @param axis a logical indicating whether an axis should be displayed. #' @param \dots further arguments to be passed to plot methods from \code{ape}. #' See \code{\link[ape]{plot.phylo}}. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso \code{\link{table.phylo4d}} for non-radial plots.\cr #' #' The \linkS4class{phylo4d} class for storing \code{phylogeny+data}.\cr #' #' \code{\link[ape]{plot.phylo}} from the \code{ape} package.\cr #' #' \code{\link[ade4]{dotchart.phylog}}. #' @keywords hplot multivariate #' @examples #' #' if(require(ape) && require(phylobase) && require(adegenet)){ #' #' data(lizards) #' tre <- read.tree(text=lizards$hprA) # make a tree #' #' ## basic plots #' bullseye(tre) #' bullseye(tre, lizards$traits) #' #' ## customized #' par(mar=c(6,6,6,6)) #' bullseye(tre, lizards$traits, traits.cex=sqrt(1:7), alpha=.7, #' legend=FALSE, circ.unit=10, circ.bg=transp("black",.1), #' edge.width=2) #' #' } #' #' @importFrom adegenet spectral transp any2col #' @importFrom ape .PlotPhyloEnv #' @import phylobase #' @export bullseye bullseye <- function(phy, traits=NULL, col.tips.by=NULL, col.pal=spectral, circ.n=6, circ.bg=transp("royalblue",.1), circ.unit=NULL, legend=TRUE, leg.posi="bottomleft", leg.title="", leg.bg="white", traits.inset=1.1, traits.space=0.05, traits.pch=19, traits.cex=1, alpha=1, axis=TRUE, ...){ ## CHECKS ## if(inherits(phy, c("phylo4","phylo4d"))) phy <- as(phy, "phylo") if(!is.list(col.pal)) col.pal <- c(col.pal) leg.info <- NULL ## REORDER DATA BY TIP LABEL ## ## make sure traits is a data.frame if(!is.null(traits)) traits <- as.data.frame(traits) if(!is.null(traits) && !is.null(row.names(traits))){ if(!all(phy$tip.label %in% row.names(traits))){ warning("tip labels and names of the traits matrix do not match") } else { traits <- traits[phy$tip.label,,drop=FALSE] } } ## col.tips.by if(!is.null(col.tips.by) && is.data.frame(col.tips.by)){ old.names <- row.names(col.tips.by) col.tips.by <- unlist(col.tips.by) names(col.tips.by) <- old.names } if(!is.null(col.tips.by) && !is.null(names(col.tips.by))){ col.tips.by <- col.tips.by[phy$tip.label] } ## recycle col.pal pal.length <- 0 if(!is.null(traits)) pal.length <- pal.length + ncol(traits) if(!is.null(col.tips.by)) pal.length <- pal.length + 1 col.pal <- rep(col.pal, length=pal.length) ## PLOT THE PHYLOGENY ## window setting oxpd <- par("xpd") par(xpd=TRUE) on.exit(par(oxpd)) ## handle color info if(!is.null(col.tips.by)){ tip.col.info <- any2col(col.tips.by, col.pal=col.pal[[1]]) plot(phy, type="fan", tip.col=transp(tip.col.info$col,alpha), ...) } else{ plot(phy, type="fan", ...) } ## HANDLE THE 'BULLSEYE' ## ## annot info if(is.null(circ.unit)){ annot.max <- 0.5*diff(par("usr")[1:2]) annot.dist <- seq(from=0, to=annot.max, length=circ.n) } else { annot.dist <- seq(from=0, by=circ.unit, length=circ.n) annot.max <- max(annot.dist) } ## trace the disks symbols(rep(0,circ.n), rep(0,circ.n), circles=annot.dist, inches=FALSE, bg=circ.bg, fg=NA, add=TRUE) ## axis annotation if(axis){ segments(-annot.dist[2],0,-annot.dist[3],0) text(-mean(annot.dist[2:3]),-annot.dist[2]/5, label=format(annot.dist[2], scientific=TRUE, digits=3),cex=.7) } ## PLOT TRAITS ## if(!is.null(traits)){ ## recycle pch and cex traits.pch <- rep(traits.pch, length=ncol(traits)) traits.cex <- rep(traits.cex, length=ncol(traits)) ## get tips coordinates tips.x <- get("last_plot.phylo", envir = .PlotPhyloEnv)$xx[1:length(phy$tip.label)] tips.y <- get("last_plot.phylo", envir = .PlotPhyloEnv)$yy[1:length(phy$tip.label)] ## use furthest tip from the root to define new base coords vec.length <- sqrt(tips.x^2 + tips.y^2) x.base <- (tips.x/vec.length) * max(vec.length) * traits.inset y.base <- (tips.y/vec.length) * max(vec.length) * traits.inset ## plot traits for(i in 1:ncol(traits)){ col.info <- any2col(traits[,i], col.pal=col.pal[[i]]) temp.x <- x.base * (traits.inset + i*traits.space) temp.y <- y.base * (traits.inset + i*traits.space) points(temp.x, temp.y, pch=traits.pch[i], col=transp(col.info$col,alpha), cex=traits.cex[i]) ## save info for legend if needed if(is.null(col.tips.by) && i==1){ leg.info <- list(col=transp(col.info$leg.col,alpha), txt=col.info$leg.txt) } } } ## ADD LEGEND ## ## legend info if(!is.null(legend)){ ## legend for tip colors if(!is.null(col.tips.by)){ leg.col <- transp(tip.col.info$leg.col,alpha) leg.txt <- tip.col.info$leg.txt leg.info <- list(col=transp(tip.col.info$leg.col,alpha), txt=tip.col.info$leg.txt) } ## plot legend if(!is.null(leg.info) && legend){ leg.info$posi <- leg.posi legend(x=leg.info$posi, legend=leg.info$txt, fill=leg.info$col, title=leg.title, bg=leg.bg) return(invisible(leg.info)) } } return(invisible()) } # end bullseye adephylo/R/proximities.R0000644000176200001440000001752612620502473014773 0ustar liggesusers########### # proxTips ########### #' Compute some phylogenetic proximities between tips #' #' The function \code{proxTips} computes a given proximity between a set of #' tips of a phylogeny. A vector of tips is supplied: proximities between all #' possible pairs of these tips are computed. The proximities are computed #' from the shortest path between the tips. \cr #' #' Proximities are computed as the inverse (to the power \code{a}) of a #' phylogenetic distance (computed by \code{\link{distTips}}. Denoting #' \eqn{D=[d_{ij}]} a matrix of phylogenetic distances, the proximity matrix #' \eqn{M=[m_{ij}]} is computed as: \deqn{m_{ij} = \frac{1}{d_{ij}^a} \forall i #' \neq j}{ m_{ij} = (1/d_{ij})^a for all i different from j} and \deqn{m_{ii} #' = 0} #' #' Several distances can be used, defaulting to the sum of branch lengths (see #' argument \code{method}). Proximities are not true similarity measures, #' since the proximity of a tip with itself is always set to zero.\cr #' #' The obtained matrix of phylogenetic proximities (M) defines a bilinear #' symmetric form when M is symmetric (default):\cr \deqn{f(x,y) = x^{T}My} #' #' In general, M is not a metric because it is not positive-definite. Such a #' matrice can be used to measure phylogenetic autocorrelation (using Moran's #' index): \deqn{I(x) = \frac{x^TMx}{var(x)}}{I(x) = (x^{T}Mx)/(var(x)) } #' #' or to compute lag vectors (Mx) used in autoregressive models, like: \deqn{x #' = Mx + ... + e} where '...' is the non-autoregressive part of the model, and #' 'e' are residuals. #' #' \code{Abouheif} proximity refers to the phylogenetic proximity underlying #' the test of Abouheif (see references). Let P be the set of all the nodes in #' the path going from \code{node1} to \code{node2}. Let DDP be the number of #' direct descendants from each node in P. Then, the so-called 'Abouheif' #' distance is the inverse of the product of all terms in DDP. #' \code{oriAbouheif} returns a matrix with non-null diagonal elements, as #' formulated in Pavoine \emph{et al.} (2008). This matrix is bistochastic (all #' marginal sums equal 1), but this bilinear symmetric form does not give rise #' to a Moran's index, since it requires a null diagonal. \code{Abouheif} #' contains Abouheif's proximities but has a null diagonal, giving rise to a #' Moran's index.\cr #' #' \code{sumDD} refers to a phylogenetic proximity quite similar to that of #' Abouheif. We consider the same sets P and DDP. But instead of taking the #' inverse of the product of all terms in DDP, this proximity computes the #' inverse of the sum of all terms in DDP. This matrix was denoted 'M' in #' Pavoine \emph{et al.} (2008), who reported that it is related to May's index #' (May, 1990). #' #' @param x a tree of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' @param tips A vector of integers identifying tips by their numbers, or a #' vector of characters identifying tips by their names. Distances will be #' computed between all possible pairs of tips. #' @param method a character string (full or abbreviated without ambiguity) #' specifying the method used to compute proximities; possible values are:\cr - #' \code{patristic}: (inversed sum of) branch length \cr - \code{nNodes}: #' (inversed) number of nodes on the path between the nodes \cr - #' \code{oriAbouheif}: original Abouheif's proximity, with diagonal (see #' details) \cr - \code{Abouheif}: Abouheif's proximity without diagonal (see #' details) \cr - \code{sumDD}: (inversed) sum of direct descendants of all #' nodes on the path (see details) \cr #' @param f a function to change a distance into a proximity. #' @param normalize a character string specifying whether the matrix must be #' normalized by row (\code{row}), column (\code{col}), or not (\code{none}). #' Normalization amounts to dividing each row (or column) so that the marginal #' sum is 1. Hence, default is matrix with each row summing to 1. #' @param symmetric a logical stating whether M must be coerced to be symmetric #' (TRUE, default) or not. This is achieved by taking (denoting N the matrix of #' proximities before re-symmetrization): \deqn{M = 0.5 * (N + N^{T})} Note #' that \eqn{x^{T}Ny = x^{T}My}, but the latter has the advantage of using a #' bilinear symmetric form (more appropriate for optimization purposes). #' @param useC a logical indicating whether computations of distances (before #' transformation into proximities) should be performed using compiled C code #' (TRUE, default), or using a pure R version (FALSE). C version is several #' orders of magnitude faster, and R version is kept for backward #' compatibility. #' @return A matrix of phylogenetic proximities. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso \code{\link{distTips}} which computes several phylogenetic #' distances between tips. #' @references == About Moran's index with various proximities == \cr Pavoine, #' S.; Ollier, S.; Pontier, D.; Chessel, D. (2008) Testing for phylogenetic #' signal in life history variable: Abouheif's test revisited. #' \emph{Theoretical Population Biology}: \bold{73}, 79-91.\cr #' #' == About regression on phylogenetic lag vector == \cr Cheverud, J. M.; Dow, #' M. M.; Leutenegger, W. (1985) The quantitative assessment of phylogentic #' constaints in comparative analyses: sexual dimorphism in body weights among #' primates. \emph{Evolution} \bold{39}, 1335-1351.\cr #' #' Cheverud, J. M.; Dow, M. M. (1985) An autocorrelation analysis of genetic #' variation due to lineal fission in social groups of Rhesus macaques. #' \emph{American Journal of Phyisical Anthropology} \bold{67}, 113-121.\cr #' #' == Abouheif's original paper ==\cr Abouheif, E. (1999) A method for testing #' the assumption of phylogenetic independence in comparative data. #' \emph{Evolutionary Ecology Research}, \bold{1}, 895-909.\cr #' #' == May's index ==\cr May, R.M. (1990) Taxonomy as destiny. \emph{Nature} #' \bold{347}, 129-130. #' @keywords manip #' @examples #' #' if(require(ape) & require(phylobase)){ #' ## make a tree #' x <- as(rtree(10),"phylo4") #' plot(x, show.node=TRUE) #' axisPhylo() #' ## compute different distances #' proxTips(x, 1:5) #' proxTips(x, 1:5, "nNodes") #' proxTips(x, 1:5, "Abouheif") #' proxTips(x, , "sumDD") #' #' ## see what one proximity looks like #' M <- proxTips(x) #' obj <- phylo4d(x,as.data.frame(M)) #' table.phylo4d(obj,symbol="sq") #' } #' #' @import phylobase #' @export proxTips proxTips <- function(x, tips="all", method=c("patristic","nNodes","oriAbouheif","Abouheif","sumDD"), f=function(x){1/x}, normalize=c("row","col","none"), symmetric=TRUE, useC=TRUE){ ## if(!require(phylobase)) stop("phylobase package is not installed") ## handle arguments x <- as(x, "phylo4") method <- match.arg(method) normalize <- match.arg(normalize) N <- nTips(x) if(tips[1]=="all") { tips <- 1:N } tips <- getNode(x, tips) ## some checks if (is.character(checkval <- checkPhylo4(x))) stop(checkval) if(any(is.na(tips))) stop("wrong tips specified") ## compute distances distMethod <- method if(length(grep("Abouheif", distMethod)>1)){ distMethod <- "Abouheif" } D <- distTips(x, tips=tips, method=distMethod, useC=useC) D <- as.matrix(D) ## compute proximities res <- f(D) diag(res) <- 0 ## handle Abouheif with diagonal (Abouheif1) if(method=="oriAbouheif"){ sumMarg <- apply(res,1,sum) diag(res) <- (1-sumMarg) normalize <- "none" # not needed (already bistochastic) symmetric <- FALSE # not needed (aleady symmetric) } ## standardization if(normalize=="row") { res <- prop.table(res, 1) } if(normalize=="col") { res <- prop.table(res, 2) } ## re-symmetrize if(symmetric){ res <- 0.5 * (res + t(res)) } ## set the output return(res) } # end proxTips adephylo/R/moran.R0000644000176200001440000000574112620510442013522 0ustar liggesusers#' Computes Moran's index for a variable #' #' This simple function computes Moran's index of autocorrelation given a #' variable and a matrix of proximities among observations. #' #' #' @aliases moran.idx #' @param x a numeric vector whose autocorrelation is computed. #' @param prox a matrix of proximities between observations, as computed by the #' \code{\link{proxTips}}. Off-diagonal terms must be positive or null, while #' diagonal terms must all equal zero. #' @param addInfo a logical indicating whether supplementary info (null value, #' minimum and maximum values) should be returned (TRUE) or not (FALSE, #' default); if computed, these quantities are returned as attributes. #' @return The numeric value of Moran's index. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso \code{\link{proxTips}} which computes phylogenetic proximities #' between tips of a phylogeny. #' @references Moran, P.A.P. (1948) The interpretation of statistical maps. #' \emph{Journal of the Royal Statistical Society, B} \bold{10}, 243--251. #' #' Moran, P.A.P. (1950) Notes on continuous stochastic phenomena. #' \emph{Biometrika}, \bold{37}, 17--23. #' #' de Jong, P. and Sprenger, C. and van Veen, F. (1984) On extreme values of #' Moran's I and Geary's c. \emph{Geographical Analysis}, \bold{16}, 17--24. #' @keywords manip #' @examples #' #' \dontrun{ #' ## use maples dataset #' data(maples) #' tre <- read.tree(text=maples$tre) #' dom <- maples$tab$Dom #' bif <- maples$tab$Bif #' #' #' ## get a proximity matrix between tips #' W <- proxTips(tre, met="Abouheif") #' #' ## compute Moran's I for two traits (dom and bif) #' moran.idx(dom, W) #' moran.idx(bif, W) #' moran.idx(rnorm(nTips(tre)), W) #' #' ## build a simple permutation test for 'bif' #' sim <- replicate(499, moran.idx(sample(bif), W)) # permutations #' sim <- c(moran.idx(bif, W), sim) #' #' pval <- mean(sim>=sim[1]) # right-tail p-value #' pval #' #' hist(sim, col="grey", main="Moran's I Monte Carlo test for 'bif'") # plot #' mtext("Histogram of permutations and observation (in red)") #' abline(v=sim[1], col="red", lwd=3) #' #' } #' @rdname moranIdx #' @export moran.idx <- function(x, prox, addInfo=FALSE){ ## handle arguments if(any(is.na(x))) stop("NA entries in x") if(!is.numeric(x)) stop("x is not numeric") W <- as.matrix(prox) if(!is.matrix(W)) stop("prox is not a matrix") if(ncol(W) != nrow(W)) stop("prox is not a square matrix") if(any(is.na(W))) stop("NA entries in prox") diag(W) <- 0 n <- nrow(W) ## main computations x <- x - mean(x) sumW <- sum(W) num <- n * sum(x * (W %*% x) ) denom <- sumW * sum(x*x) if(denom < 1e-14) stop("denominator equals zero") res <- num/denom if(addInfo){ I0 <- -1/(n-1) matToDiag <- .5 * (t(W) + W) rangeI <- range(eigen(matToDiag)$values) attr(res, "I0") <- I0 attr(res, "Imin") <- rangeI[1] attr(res, "Imax") <- rangeI[2] } return(res) } # end moran.idx adephylo/R/ppca.R0000644000176200001440000005226312767534227013355 0ustar liggesusers#' Phylogenetic principal component analysis #' #' These functions are designed to perform a phylogenetic principal component #' analysis (pPCA, Jombart et al. 2010) and to display the results. #' #' \code{ppca} performs the phylogenetic component analysis. Other functions #' are:\cr #' #' - \code{print.ppca}: prints the ppca content\cr #' #' - \code{summary.ppca}: provides useful information about a ppca object, #' including the decomposition of eigenvalues of all axes\cr #' #' - \code{scatter.ppca}: plot principal components using #' \code{\link{table.phylo4d}}\cr #' #' - \code{screeplot.ppca}: graphical display of the decomposition of pPCA #' eigenvalues\cr #' #' - \code{plot.ppca}: several graphics describing a ppca object\cr #' #' The phylogenetic Principal Component Analysis (pPCA, Jombart et al., 2010) is #' derived from the spatial Principal Component Analysis (spca, Jombart et al. #' 2008), implemented in the adegenet package (see #' \code{\link[adegenet]{spca}}).\cr #' #' pPCA is designed to investigate phylogenetic patterns a set of quantitative #' traits. The analysis returns principal components maximizing the product of #' variance of the scores and their phylogenetic autocorrelation (Moran's I), #' therefore reflecting life histories that are phylogenetically structured. #' Large positive and large negative eigenvalues correspond to global and local #' structures.\cr #' #' @aliases ppca print.ppca summary.ppca scatter.ppca screeplot.ppca plot.ppca #' @param x a \linkS4class{phylo4d} object (for \code{ppca}) or a ppca object #' (for other methods). #' @param prox a marix of phylogenetic proximities as returned by #' \code{\link{proxTips}}. If not provided, this matrix will be constructed #' using the arguments \code{method} and \code{a}. #' @param method a character string (full or abbreviated without ambiguity) #' specifying the method used to compute proximities; possible values are:\cr #' - \code{patristic}: (inversed sum of) branch lengths \cr - \code{nNodes}: #' (inversed) number of nodes on the path between the nodes \cr - #' \code{oriAbouheif}: original Abouheif's proximity, with diagonal (see #' details in \code{\link{proxTips}}) \cr - \code{Abouheif}: Abouheif's #' proximity (see details in \code{\link{proxTips}}) \cr - \code{sumDD}: #' (inversed) sum of direct descendants of all nodes on the path (see details #' in \code{\link{proxTips}}). #' @param f a function to change a distance into a proximity. #' @param center a logical indicating whether traits should be centred to mean #' zero (TRUE, default) or not (FALSE). #' @param scale a logical indicating whether traits should be scaled to unit #' variance (TRUE, default) or not (FALSE). #' @param scannf a logical stating whether eigenvalues should be chosen #' interactively (TRUE, default) or not (FALSE). #' @param nfposi an integer giving the number of positive eigenvalues retained #' ('global structures'). #' @param nfnega an integer giving the number of negative eigenvalues retained #' ('local structures'). #' @param \dots further arguments passed to other methods. Can be used to #' provide arguments to \code{\link{table.phylo4d}} in \code{plot} method. #' @param object a \code{ppca} object. #' @param printres a logical stating whether results should be printed on the #' screen (TRUE, default) or not (FALSE). #' @param axes the index of the principal components to be represented. #' @param useLag a logical stating whether the lagged components (\code{x\$ls}) #' should be used instead of the components (\code{x\$li}). #' @param main a title for the screeplot; if NULL, a default one is used. #' @return The class \code{ppca} are given to lists with the following #' components:\cr \item{eig}{a numeric vector of eigenvalues.} #' \item{nfposi}{an integer giving the number of global structures retained.} #' \item{nfnega}{an integer giving the number of local structures retained.} #' \item{c1}{a data.frame of loadings of traits for each axis.} \item{li}{a #' data.frame of coordinates of taxa onto the ppca axes (i.e., principal #' components).} \item{ls}{a data.frame of lagged prinpal components; useful #' to represent of global scores.} \item{as}{a data.frame giving the #' coordinates of the axes of an 'ordinary' PCA onto the ppca axes.} #' \item{call}{the matched call.} \item{tre}{a phylogenetic tre with class #' \linkS4class{phylo4}.} \item{prox}{a matrix of phylogenetic proximities.} #' #' Other functions have different outputs:\cr #' #' - \code{scatter.ppca} returns the matched call.\cr #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso The implementation of \code{\link[adegenet]{spca}} in the adegenet #' package (\code{\link[adegenet]{adegenet}}) \cr #' @references Jombart, T.; Pavoine, S.; Dufour, A. & Pontier, D. (2010, in #' press) Exploring phylogeny as a source of ecological variation: a #' methodological approach. doi:10.1016/j.jtbi.2010.03.038 #' #' Jombart, T., Devillard, S., Dufour, A.-B. and Pontier, D. (2008) Revealing #' cryptic phylogenetic patterns in genetic variability by a new multivariate #' method. \emph{Heredity}, \bold{101}, 92--103. #' @keywords multivariate #' @examples #' #' data(lizards) #' #' if(require(ape) && require(phylobase)){ #' #' #### ORIGINAL EXAMPLE FROM JOMBART ET AL 2010 #### #' #' #' ## BUILD A TREE AND A PHYLO4D OBJECT #' liz.tre <- read.tree(tex=lizards$hprA) #' liz.4d <- phylo4d(liz.tre, lizards$traits) #' par(mar=rep(.1,4)) #' table.phylo4d(liz.4d,var.lab=c(names(lizards$traits), #' "ACP 1\n(\"size effect\")"),show.node=FALSE, cex.lab=1.2) #' #' #' ## REMOVE DUPLICATED POPULATIONS #' liz.4d <- prune(liz.4d, c(7,14)) #' table.phylo4d(liz.4d) #' #' #' ## CORRECT LABELS #' lab <- c("Pa", "Ph", "Ll", "Lmca", "Lmcy", "Phha", "Pha", #' "Pb", "Pm", "Ae", "Tt", "Ts", "Lviv", "La", "Ls", "Lvir") #' tipLabels(liz.4d) <- lab #' #' #' ## REMOVE SIZE EFFECT #' dat <- tdata(liz.4d, type="tip") #' dat <- log(dat) #' newdat <- data.frame(lapply(dat, function(v) residuals(lm(v~dat$mean.L)))) #' rownames(newdat) <- rownames(dat) #' tdata(liz.4d, type="tip") <- newdat[,-1] # replace data in the phylo4d object #' #' #' ## pPCA #' liz.ppca <- ppca(liz.4d,scale=FALSE,scannf=FALSE,nfposi=1,nfnega=1, method="Abouheif") #' liz.ppca #' tempcol <- rep("grey",7) #' tempcol[c(1,7)] <- "black" #' barplot(liz.ppca$eig,main='pPCA eigenvalues',cex.main=1.8,col=tempcol) #' #' par(mar=rep(.1,4)) #' plot(liz.ppca,ratio.tree=.7) #' #' #' ## CONTRIBUTIONS TO PC (LOADINGS) (viewed as dotcharts) #' dotchart(liz.ppca$c1[,1],lab=rownames(liz.ppca$c1),main="Global principal #' component 1") #' abline(v=0,lty=2) #' #' dotchart(liz.ppca$c1[,2],lab=rownames(liz.ppca$c1),main="Local principal #' component 1") #' abline(v=0,lty=2) #' #' #' ## REPRODUCE FIGURES FROM THE PAPER #' obj.ppca <- liz.4d #' tdata(obj.ppca, type="tip") <- liz.ppca$li #' myLab <- paste(" ",rownames(liz.ppca$li), sep="") #' #' ## FIGURE 1 #' par(mar=c(.1,2.4,2.1,1)) #' table.phylo4d(obj.ppca, ratio=.7, var.lab=c("1st global PC", "1st local #' PC"), tip.label=myLab,box=FALSE,cex.lab=1.4, cex.sym=1.2, show.node.label=TRUE) #' add.scatter.eig(liz.ppca$eig,1,1,1,csub=1.2, posi="topleft", ratio=.23) #' #' #' ## FIGURE 2 #' s.arrow(liz.ppca$c1,xlim=c(-1,1),clab=1.3,cgrid=1.3) #' #' #' #' #### ANOTHER EXAMPLE - INCLUDING NA REPLACEMENT #### #' ## LOAD THE DATA #' data(maples) #' tre <- read.tree(text=maples$tre) #' x <- phylo4d(tre, maples$tab) #' omar <- par("mar") #' par(mar=rep(.1,4)) #' table.phylo4d(x, cex.lab=.5, cex.sym=.6, ratio=.1) # note NAs in last trait ('x') #' #' ## FUNCTION TO REPLACE NAS #' f1 <- function(vec){ #' if(any(is.na(vec))){ #' m <- mean(vec, na.rm=TRUE) #' vec[is.na(vec)] <- m #' } #' return(vec) #' } #' #' #' ## PERFORM THE PPCA #' dat <- apply(maples$tab,2,f1) # replace NAs #' x.noNA <- phylo4d(tre, as.data.frame(dat)) #' map.ppca <- ppca(x.noNA, scannf=FALSE, method="Abouheif") #' map.ppca #' #' #' ## SOME GRAPHICS #' screeplot(map.ppca) #' scatter(map.ppca, useLag=TRUE) #' plot(map.ppca, useLag=TRUE) #' #' #' ## MOST STRUCTURED TRAITS #' a <- map.ppca$c1[,1] # loadings on PC 1 #' names(a) <- row.names(map.ppca$c1) #' highContrib <- a[a< quantile(a,0.1) | a>quantile(a,0.9)] #' datSel <- cbind.data.frame(dat[, names(highContrib)], map.ppca$li) #' temp <- phylo4d(tre, datSel) #' table.phylo4d(temp) # plot of most structured traits #' #' #' ## PHYLOGENETIC AUTOCORRELATION TESTS FOR THESE TRAITS #' prox <- proxTips(tre, method="Abouheif") #' abouheif.moran(dat[, names(highContrib)], prox) #' #' } #' #' @import phylobase methods #' @importFrom stats screeplot #' @importFrom graphics par layout barplot title box dotchart abline rect text #' axis segments #' @importFrom stats median #' @export ppca ppca <- function(x, prox=NULL, method=c("patristic","nNodes","oriAbouheif","Abouheif","sumDD"), f=function(x) {1/x}, center=TRUE, scale=TRUE, scannf=TRUE, nfposi=1, nfnega=0){ ## handle arguments ## if(!require(ade4)) stop("The package ade4 is not installed.") if (is.character(chk <- checkPhylo4(x))) stop("bad phylo4d object: ",chk) ##if (is.character(chk <- checkData(x))) stop("bad phylo4d object: ",chk) : no longer needed tre <- as(x, "phylo4") method <- match.arg(method) NEARZERO <- 1e-10 ## proximity matrix if(is.null(prox)){ # have to compute prox W <- proxTips(x, tips="all", method=method, f=f, normalize="row", symmetric=TRUE) } else { # prox is provided W <- as.matrix(prox) if(!is.matrix(W)) stop("W is not a matrix") if(ncol(W) != nrow(W)) stop("W is not a square matrix") diag(W) <- 0 W <- 0.5 * (t(W) + W) # re-symmetrization } N <- nTips(x) ## data matrix X X <- tdata(x, type="tip") X.colnames <- names(X) X.rownames <- row.names(X) temp <- sapply(X, is.numeric) if(!all(temp)) { warning(paste("non-numeric data are removed:", X.colnames[!temp])) X <- X[,temp] X.colnames <- X.colnames[!temp] X.rownames <- X.rownames[!temp] } ## replace NAs f1 <- function(vec){ m <- mean(vec,na.rm=TRUE) vec[is.na(vec)] <- m return(vec) } if(any(is.na(X))) { warning("Replacing missing values (NA) by mean values") X <- as.data.frame(apply(X, 2, f1)) } X <- scalewt(X, center=center, scale=scale) # centring/scaling of traits ## main computation ## ## make a skeleton of dudi res <- dudi.pca(X, center=center, scale=scale, scannf=FALSE,nf=2) Upca <- as.matrix(res$c1) ## computations of the ppca X <- as.matrix(X) decomp <- eigen( ((t(X) %*% W %*% X)/N), symmetric=TRUE) U <- decomp$vectors # U: principal axes lambda <- decomp$values ## remove null eigenvalues and corresponding vectors toKeep <- (abs(lambda) > NEARZERO) lambda <- lambda[toKeep] U <- U[, toKeep] p <- ncol(U) if(scannf){ # interactive part barplot(lambda) cat("Select the number of global axes: ") nfposi <- as.integer(readLines(n = 1)) cat("Select the number of local axes: ") nfnega <- as.integer(readLines(n = 1)) } nfposi <- max(nfposi, 1) nfnega <- max(nfnega, 0) posi.idx <- 1:nfposi if(nfnega<1) { nega.idx <- NULL } else { nega.idx <- (p-nfnega+1):p } axes.idx <- unique(c(posi.idx, nega.idx)) # index of kept axes U <- U[, axes.idx, drop=FALSE] S <- X %*% U # S: scores (=princ. components) LS <- W %*% S # LS: lagged scores A <- t(Upca) %*% U # A: pca princ. axes onto ppca princ. axes. ## build the output axes.lab <- paste("PA",axes.idx, sep="") scores.lab <- paste("PC",axes.idx, sep="") res$cent <- res$norm <- res$co <- NULL # cleaning res$eig <- lambda # eigenvalues res$nf <- NULL res$nfposi <- nfposi res$nfnega <- nfnega res$kept.axes <- axes.idx res$c1 <- as.data.frame(U) # principal axes names(res$c1) <- axes.lab row.names(res$c1) <- X.colnames res$li <- as.data.frame(S) # scores (princ. components) names(res$li) <- scores.lab row.names(res$li) <- X.rownames res$ls <- as.data.frame(LS) # lagged scores names(res$ls) <- scores.lab row.names(res$ls) <- X.rownames res$as <- as.data.frame(A) # PCA axes onto pPCA axes names(res$as) <- axes.lab row.names(res$as) <- paste("PCA axis", 1:nrow(A)) res$tre <- as(tre,"phylo4") # tree res$prox <- W # proximity matrix res$call <- match.call() # call class(res) <- "ppca" return(res) } # end ppca ##################### # Function scatter.ppca ##################### #' @rdname ppca #' @export scatter.ppca <- function(x, axes=1:ncol(x$li), useLag=FALSE, ...){ if(useLag){ df <- as.data.frame(x$ls) } else{ df <- as.data.frame(x$li) } if(any(axes < 1 | axes > ncol(x$li)) ) stop("Wrong axes specified.") df <- df[, axes, drop=FALSE] obj <- phylo4d(x$tre,df) args <- list(...) if(is.null(args$ratio.tree)){ args$ratio.tree <- 0.5 } args <- c(obj,args) do.call(table.phylo4d, args) return(invisible(match.call())) } # end scatter.ppca ###################### # Function print.ppca ###################### #' @rdname ppca #' @method print ppca #' @export print.ppca <- function(x, ...){ cat("\t#############################################\n") cat("\t# phylogenetic Principal Component Analysis #\n") cat("\t#############################################\n") cat("class: ") cat(class(x)) cat("\n$call: ") print(x$call) cat("\n$nfposi:", x$nfposi, "axes-components saved") cat("\n$nfnega:", x$nfnega, "axes-components saved") cat("\n$kept.axes: index of kept axes") cat("\nPositive eigenvalues: ") l0 <- sum(x$eig >= 0) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat("Negative eigenvalues: ") l0 <- sum(x$eig <= 0) cat(sort(signif(x$eig, 4))[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat('\n') sumry <- array("", c(1, 4), list(1, c("vector", "length", "mode", "content"))) sumry[1, ] <- c('$eig', length(x$eig), mode(x$eig), 'eigenvalues') class(sumry) <- "table" print(sumry) cat("\n") sumry <- array("", c(4, 4), list(1:4, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "principal axes: scaled vectors of traits loadings") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "principal components: coordinates of taxa ('scores')") sumry[3, ] <- c("$ls", nrow(x$ls), ncol(x$ls), 'lag vector of principal components') sumry[4, ] <- c("$as", nrow(x$as), ncol(x$as), 'pca axes onto ppca axes') class(sumry) <- "table" print(sumry) cat("\n$tre: a phylogeny (class phylo4)") cat("\n$prox: a matrix of phylogenetic proximities") cat("\n\nother elements: ") if (length(names(x)) > 16) cat(names(x)[17:(length(names(x)))], "\n") else cat("NULL\n") } #end print.ppca ############### # summary.ppca ############### #' @rdname ppca #' @method summary ppca #' @export summary.ppca <- function (object, ..., printres=TRUE) { ## some checks if (!inherits(object, "ppca"))stop("to be used with 'ppca' object") ## if(!require(ade4)) stop("The package ade4 is not installed.") norm.w <- function(X, w) { f2 <- function(v) sum(v * v * w)/sum(w) norm <- apply(X, 2, f2) return(norm) } resfin <- list() if(printres) { cat("\n### Phylogenetic Principal Component Analysis ###\n") cat("\nCall: ") print(object$call) } appel <- as.list(object$call) ## compute original pca X <- object$tab # transformed data W <- object$prox nfposi <- object$nfposi nfnega <- object$nfnega dudi <- dudi.pca(X, center=FALSE, scale=FALSE, scannf=FALSE, nf=nfposi+nfnega) ## end of pca Istat <- data.frame(attributes(moran.idx(X[,1], W,TRUE))) row.names(Istat) <- "" resfin$Istat <- Istat if(printres) { cat("\n== Moran's I statistics ==\n") print(Istat) } ## pca scores nf <- dudi$nf eig <- dudi$eig[1:nf] cum <- cumsum(dudi$eig)[1:nf] ratio <- cum/sum(dudi$eig) moran <- apply(as.matrix(dudi$l1),2,moran.idx, W) res <- data.frame(var=eig,cum=cum,ratio=ratio, moran=moran) row.names(res) <- paste("Axis",1:nf) if(printres) { cat("\n== PCA scores ==\n") print(res) } resfin$pca <- res ## ppca scores ## ppca is recomputed, keeping all axes eig <- object$eig nfposimax <- sum(eig > 0) nfnegamax <- sum(eig < 0) listArgs <- appel[-1] listArgs$nfposi <- nfposimax listArgs$nfnega <- nfnegamax listArgs$scannf <- FALSE ppcaFull <- do.call(ppca, listArgs) # ppca with all axes ndim <- dudi$rank nf <- nfposi + nfnega toKeep <- c(1:nfposi,if (nfnega>0) (ndim-nfnega+1):ndim) varspa <- norm.w(ppcaFull$li,dudi$lw) moran <- apply(as.matrix(ppcaFull$li), 2, moran.idx, W) res <- data.frame(eig=eig,var=varspa,moran=moran) row.names(res) <- paste("Axis",1:length(eig)) if(printres) { cat("\n== pPCA eigenvalues decomposition ==\n") print(res[toKeep,]) } resfin$ppca <- res return(invisible(resfin)) } # end summary.ppca ################# # screeplot.ppca ################# #' @rdname ppca #' @export screeplot.ppca <- function(x,...,main=NULL){ opar <- par("las") on.exit(par(las=opar)) sumry <- summary(x,printres=FALSE) labels <- lapply(1:length(x$eig),function(i) bquote(lambda[.(i)])) par(las=1) xmax <- sumry$pca[1,1]*1.1 I0 <- unlist(sumry$Istat[1]) Imin <- unlist(sumry$Istat[2]) Imax <- unlist(sumry$Istat[3]) plot(x=sumry$ppca[,2],y=sumry$ppca[,3],type='n',xlab='Variance',ylab="Phylogenetic autocorrelation (I)",xlim=c(0,xmax),ylim=c(Imin*1.1,Imax*1.1),yaxt='n',...) text(x=sumry$ppca[,2],y=sumry$ppca[,3],do.call(expression,labels)) ytick <- c(I0,round(seq(Imin,Imax,le=5),1)) ytlab <- as.character(round(seq(Imin,Imax,le=5),1)) ytlab <- c(as.character(round(I0,1)),as.character(round(Imin,1)),ytlab[2:4],as.character(round(Imax,1))) axis(side=2,at=ytick,labels=ytlab) rect(0,Imin,xmax,Imax,lty=2) segments(0,I0,xmax,I0,lty=2) abline(v=0) if(is.null(main)) main <- ("Decomposition of pPCA eigenvalues") title(main) return(invisible(match.call())) } # end screeplot.ppca ############ # plot.ppca ############ #' @rdname ppca #' @method plot ppca #' @export plot.ppca <- function(x, axes = 1:ncol(x$li), useLag=FALSE, ...){ ## some checks if (!inherits(x, "ppca")) stop("Use only with 'ppca' objects.") if(any(axes>ncol(x$li) | axes<0)) stop("wrong axes required.") ## par / layout opar <- par(no.readonly = TRUE) on.exit(par(opar)) par(mar = rep(.1,4)) layout(matrix(c(1,2,3,4,4,4,4,4,4), ncol=3)) ## some variables tre <- x$tre n <- nrow(x$li) ## 1) barplot of eigenvalues omar <- par("mar") par(mar = c(0.8, 2.8, 0.8, 0.8)) r <- length(x$eig) col <- rep("white", r) keptAxes <- c( (1:r)[1:x$nfposi], (r:1)[1:x$nfnega]) # kept axes if(x$nfposi==0) keptAxes <- keptAxes[-1] if(x$nfnega==0) keptAxes <- keptAxes[-length(keptAxes)] col[keptAxes] <- "grey" repAxes <- gsub("PC","",colnames(x$li)[axes]) # represented axes repAxes <- as.numeric(repAxes) col[repAxes] <- "black" barplot(x$eig, col=col) title("Eigenvalues", line=-1) par(mar=rep(.1,4)) box() ## 2) decomposition of eigenvalues par(mar=c(4,4,2,1)) screeplot(x,main="Eigenvalues decomposition") par(mar=rep(.1,4)) box() ## 3) loadings if(length(axes)==1){ # one axis retained par(mar=c(2.5,4,2,1)) dotchart(x$c1[,1], labels=row.names(x$c1), main="Loadings", cex=par("cex")*.66) abline(v=median(x$c1[,1]), lty=2) par(mar=rep(.1,4)) box() } else{ # at least two axes retained s.arrow(x$c1[,axes], sub="Loadings") } ## 4) scatter plot ratioTree <- .6 cexLabel <- 1 cexSymbol <- 1 temp <- try(scatter(x, axes=axes, ratio.tree=ratioTree, cex.lab=cexLabel, cex.sym=cexSymbol, show.node=FALSE, useLag=useLag), silent=TRUE) # try default plot scatterOk <- !inherits(temp,"try-error") while(!scatterOk){ ## clear 4th screen par(new=TRUE) plot(1, type="n",axes=FALSE) rect(-10,-10, 10,10,col="white") par(new=TRUE) if(ratioTree > .25 & cexSymbol <= .7) { ratioTree <- ratioTree - .05 } if(cexLabel > .65 & cexSymbol <= .5) { cexLabel <- cexLabel - .05 } cexSymbol <- cexSymbol - .05 temp <- try(scatter(x, axes=axes, ratio.tree=ratioTree, cex.lab=cexLabel, cex.sym=cexSymbol, show.node=FALSE, useLag=useLag), silent=TRUE) # try default plot scatterOk <- !inherits(temp,"try-error") } return(invisible(match.call())) } # end plot.phylo ### testing ## obj <- phylo4d(read.tree(text=mjrochet$tre),mjrochet$tab) ## x@edge.length= rep(1,length(x@edge.label)) ## M = cophenetic.phylo(as(x,"phylo")) ## M = 1/M ## diag(M) <- 0 ## ppca1 <- ppca(obj,scannf=FALSE,nfp=1,nfn=0) ## plot(ppca1) adephylo/R/partition.R0000644000176200001440000001640112620502313014410 0ustar liggesusers## ## Functions to obtain partitions of tips from a tree. ## For instance to obtain dummy vectors used in the orthogram. ## ############ # listTips ############ #' List tips descendings from all nodes of a tree #' #' The function \code{listTips} lists the tips descending from each node of a #' tree. The tree can be of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' #' #' @param x A tree of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' @return A list whose components are vectors of named tips for a given node. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso \code{\link{listDD}} which lists the direct descendants for each #' node. \cr #' #' \code{\link{treePart}} which defines partitions of tips according to the #' tree topology. #' @keywords manip #' @examples #' #' if(require(ape) & require(phylobase)){ #' ## make a tree #' x <- as(rtree(20),"phylo4") #' plot(x,show.node=TRUE) #' listTips(x) #' } #' #' @import phylobase #' @export listTips listTips <- function(x){ ## if(!require(phylobase)) stop("phylobase package is not installed") ## conversion from phylo, phylo4 and phylo4d x <- as(x, "phylo4") ## check phylo4 object if (is.character(checkval <- checkPhylo4(x))) stop(checkval) ## computations nodIdx <- nTips(x)+1 nodIdx <- nodIdx:(nodIdx+nNodes(x)-1) res <- lapply(nodIdx, function(i) descendants(x, i)) if(hasNodeLabels(x)) {names(res) <- nodeLabels(x)} return(res) } # end listTips ########### # treePart ########### #' Define partitions of tips according from a tree #' #' The function \code{treePart} defines partitions of tips reflecting the #' topology of a tree. There are two possible outputs (handled by the argument #' \code{result}):\cr - \code{basis} mode: each node but the root is translated #' into a dummy vector having one value for each tip: this value is '1' if the #' tip descends from this node, and '0' otherwise.\cr - \code{orthobasis}: in #' this mode, an orthonormal basis is derived from the basis previously #' mentionned. This orthobasis was proposed in the orthogram (Ollier \emph{et #' al.} 2006). #' #' Orthobasis produced by this function are identical to those stored in the #' \$Bscores component of deprecated \link[ade4]{phylog} objects, from the ade4 #' package. #' #' @param x a tree of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' @param result a character string specifying the type of result: either a #' basis of dummy vectors (\code{dummy}), or an orthobasis derived from these #' dummy vectors (\code{orthobasis}). #' @return A matrix of numeric vectors (in columns) having one value for each #' tip (rows). #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso - \code{\link{listDD}} which is called by \code{treePart}.\cr - #' \code{\link{orthogram}}, which uses by default the orthobasis produced by #' \code{treePart}.\cr #' @references Ollier, S., Chessel, D. and Couteron, P. (2005) Orthonormal #' Transform to Decompose the Variance of a Life-History Trait across a #' Phylogenetic Tree. \emph{Biometrics}, \bold{62}, 471--477. #' @keywords manip #' @examples #' #' \dontrun{ #' #' if(require(ape) & require(phylobase)){ #' ## make a tree #' x <- as(rtree(10),"phylo4") #' partition <- treePart(x) #' partition #' #' ## plot the dummy vectors with the tree #' temp <- phylo4d(x, partition) #' table.phylo4d(temp, cent=FALSE, scale=FALSE) #' } #' } #' #' @import phylobase #' @export treePart treePart <- function(x, result=c("dummy", "orthobasis")){ ## if(!require(phylobase)) stop("phylobase package is not installed") ## conversion from phylo, phylo4 and phylo4d x <- as(x, "phylo4") result <- match.arg(result) ## check phylo4 object if (is.character(checkval <- checkPhylo4(x))) stop(checkval) n <- nTips(x) # number of tips HTU.idx <- (n+1):(n+nNodes(x)) # index of internal nodes (HTU) if(!hasNodeLabels(x)) { # node labels will be used after nodeLabels(x) <- as.character(HTU.idx) } ## function coding one dummy vector fDum <- function(vec){ # vec is a vector of tip numbers dum <- integer(n) dum[vec] <- 1 return(dum) } ## main computations temp <- listTips(x) res <- data.frame(lapply(temp,fDum)) row.names(res) <- tipLabels(x) res <- res[,-1, drop=FALSE] if(result=="dummy"){ return(res) # res is a data.frame of dummy vectors } ## If orthobasis is required ## ## Find values 'w' for all nodes ## ## Notations: ## - n: an internal node (HTU) ## - Dn: the set of all internal nodes descending from 'n' ## - En: the set 'n U Dn' (that is, Dn plus n itself) ## - ndd(e): the number of direct descendants from a node 'e' ## ## Then the values 'w' are computed as: ## ## w(n) = sum_{e \in En} lgamma( ndd(e) + 1) ## listDDx <- listDD(x) nbOfDD <- sapply(listDDx, length) # nb of DD for each node names(nbOfDD) <- HTU.idx # used to match the results of Dn findAlldHTU <- function(node){ # find all HTU descending from a node res <- descendants(x, node, type="all") # tips and HTU res <- res[res > n] # only HTU (here, just node numbers are kept if(length(res)==0) return(NULL) return(res) } listAlldHTU <- lapply(HTU.idx, function(node) c(node,findAlldHTU(node))) # ='Dn': for each HTU, list all HTU descending from it w <- sapply(listAlldHTU, function(e) sum(lgamma(nbOfDD[as.character(e)]+1))) # w(n) ## from now on, 'w' stores the w(n) values. ## add dummy vectors for tips res <- cbind(diag(1, n), root=rep(1,n), res) # sorted from first tip to last node colnames(res) <- 1:(nTips(x) + nNodes(x)) valDum <- c(rep(-1, n), w) # dummy vectors of tips are given a negative value ## note: valDum is the w values for all nodes, sorted from first tip to last node ## Discard dummy vectors with lowest valDum (value of dummy vectors, w). ## -> for each node, a dummy vector associated to its DD is removed ## this one is that with the lowest valDum. discardOneDum <- function(node, DDnode){ # node is a node label, not a node number if(length(DDnode)==1) return(NULL) val <- valDum[DDnode] toRemove <- which.min(val) keptDD <- DDnode[-toRemove] return(keptDD) } # end discardOneDum dumToKeep <- lapply(1:length(listDDx), function(i) discardOneDum(i, listDDx[[i]])) dumToKeep <- unlist(dumToKeep) # contains indices of kept dummy vectors res <- res[dumToKeep] # retained dummy vectors res <- res[,order(valDum[dumToKeep], decreasing=TRUE)] # reorder vectors by decreasing w ## orthonormalization res <- cbind(root=rep(1,n), res) # for centring: vectors will be orthogonal to 1_n res <- qr.Q(qr(res)) # Gram-Schmidt orthogonalization res <- res[,-1] # keep only centred vectors; orthogonal for identity res <- res * sqrt(n) # render vectors orthogonal for 1/n rownames(res) <- tipLabels(x) colnames(res) <- paste("V",1:ncol(res)) return(as.data.frame(res)) } # end treePart ## EXAMPLE ## ## plot(x <- read.tree(te=newick.eg[[2]])) ## plot(y <- newick2phylog(newick.eg[[2]]), clabel.node=1) ## ## adephylo/R/dibas.R0000644000176200001440000004674512767533704013523 0ustar liggesusers######### ## dibas ('distance-based group assignment') ######### #' DIstance-Based Assignment #' #' These functions are under development. Please do not use them unless asked by #' the author. #' #' #' @aliases dibas dibas.matrix dibas.dist dibas.phylo dibas.vector simDatGroups #' @param x a \code{phylo} object, or a symmetric matrix of pairwise distances #' of class \code{matrix} or \code{dist}. #' @param grp a \code{factor} indicating the groups of observations. #' @param method a character string indicating the method to be used for #' estimating the distribution of pairwise distances within groups. The #' default method ("default") uses all observations, while the "leaveOneOut" #' estimates separate group distributions for each individual, leaving this #' one out in the estimation process. #' @param metric a character string matching "nNodes", "patristic", "Abouheif", #' or "sumDD" indicating the distance measure to be used. See #' \code{\link{distTips}} for more information. Note that patristic distances #' should be avoided in presence of one or more highly diverse group because #' of the 'hand fan' syndrome (see example). #' @param fromRoot a logical indicating if distances from the root, rather than #' between groups, should be used. #' @param n.items a vector of integers of the same length as x, stating how many #' times each items in 'x' should be repeated; used to take into account #' differences in abundances of the different items (e.g. sequences in #' multiple copies). #' @param \dots further arguments passed to other methods. Can be used to #' provide arguments to \code{\link{table.phylo4d}} in \code{plot} method. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @keywords multivariate #' @examples #' #' \dontrun{ #' if(require(ape)){ #' #### SIMPLE SIMULATED DATA #### #' ## 50 variables, 2 groups, 30 indiv #' dat <- simDatGroups(k=2, p=50, n=c(15,15), mu=c(0,1)) #' names(dat) #' #' ## make a tree #' tre <- nj(dist(dat$dat)) #' plot(tre,type="unr", tip.col=c("blue","red")[as.integer(dat$grp)], #' main="simulated data - tree") #' #' ## use dibas method #' res <- dibas(tre, dat$grp, metric="nNodes") #' res #' #' barplot(t(res$prob), main="group membership probabilities") #' #' #' #' #### NON-PARAMETRIC TEST BASED ON MEAN SUCCESSFUL ASSIGNMENT #### #' ## use dibas method #' distHo <- replicate(100, #' dibas(tre, sample(dat$grp), metric="patristic")$mean.ok) #' pval <- mean(res$mean.ok<=c(distHo,res$mean.ok)) #' pval #' #' hist(c(distHo,res$mean.ok), col="grey", #' main="Mean successful assignement - permuted values") #' abline(v=res$mean.ok, col="red") #' mtext(side=3, text="Observed value in red") #' #' #' #' #### HAND FAN SYNDROME #### #' ## 50 variables, 2 groups, 30 indiv #' dat <- simDatGroups(k=2, p=50, n=c(15,15), mu=c(0,1), sigma=c(2,4)) #' names(dat) #' #' ## make a tree #' tre <- nj(dist(dat$dat)) #' plot(tre,type="unr", tip.col=c("blue","red")[as.integer(dat$grp)], #' main="simulated data - tree") #' mtext(side=3, text="hand-fan syndrome") #' #' ## use dibas method #' res.patri <- dibas(tre, dat$grp, metric="patristic") #' res.patri$grp.tab # poor results #' plot(table(res.patri$groups), main="Group assignment - dibas patristic") #' #' res <- dibas(tre, dat$grp, metric="nNodes") #' res$grp.tab # results OK #' plot(table(res$groups), main="Group assignment - dibas nNodes") #' #' #' #' #' #### MORE COMPLEX DATASET #### #' if(require(adegenet)){ #' #' dat <- simDatGroups(k=5, p=50, n=c(5,10,10,30,60), mu=sample(1:5, 5, #' replace=TRUE), sigma=sample(1:5)/2) #' names(dat) #' #' ## make a tree #' tre <- nj(dist(dat$dat)) #' plot(tre,type="unr", tip.col=fac2col(dat$grp),main="simulated data - tree") #' #' ## use dibas method #' res <- dibas(tre, dat$grp, metric="Abouheif") #' res #' #' plot(table(res$groups), main="Group assignment - dibas Abouheif") #' #' } #' } #' } #' #' #' #' #' #' #' #' @importFrom stats dnorm sd rnorm #' #' @export dibas dibas <- function (x, ...) UseMethod("dibas") ################ ## dibas.matrix ################ #' @rdname dibas #' @export dibas.matrix <- function(x, grp, method=c("default","leaveOneOut"), ...){ method <- match.arg(method) ## DECLARE SOME VARIABLES, HANDLE ARGUMENTS ## grp <- factor(grp) K <- length(LEV <- levels(grp)) N <- nrow(x) ## AUXILIARY FUNCTIONS ## ## COMPUTE LOG AND AVOIDS -INF logprob <- function(prob){ res <- log(prob) res[res< -1e20] <- -1e20 return(res) } ## FUNCTION TO GET A VECTOR OF PAIRWISE DISTANCE WITHIN ONE GROUP ## M: matrix of distances ## fac: factor ## val: level of the chosen group getdist.within.grp <- function(M, fac, val){ # val is one level of fac temp <- M[fac==val,fac==val] return(temp[lower.tri(temp)]) } ## FUNCTION TO GET LIST OF VECTORS OF PAIRWISE DISTANCES WITHIN GROUP, FOR EVERY GROUP getdist.within.allgrp <- function(M, fac){ res <- lapply(LEV, function(e) getdist.within.grp(M, fac, e)) names(res) <- LEV return(res) } ## FUNCTION TO GET THE DISTANCES OF AN INDIVIDUAL TO THE GROUPS getdist.indiv <- function(i){ return(split(x[i,-i],grp[-i])) } ## FUNCTION TO COMPUTE MEMBERSHIP PROBA FOR ONE INDIV ## i: index of an individual ## distrib.param[1,]: vector of the means of with-grp distance distributions ## distrib.param[2,]: vector of the sds of with-grp distance distributions getproba.ind <- function(i, distrib.param){ temp <- getdist.indiv(i) out <- sapply(1:K, function(k) mean(logprob(dnorm(temp[[k]], distrib.param[1,k],distrib.param[1,k])))) return(exp(out)/sum(exp(out))) } ## CORE COMPUTATIONS ## ## DEFAULT: DENSITY BASED ON ENTIRE SAMPLE ## if(method=="default"){ ## get distance data for each group temp <- getdist.within.allgrp(x, grp) ## parameter of the group distributions ## matrix of within-group dist: col=grp, row1=mean,row2=sd distrib.param <- sapply(temp, function(e) return(c(mean(e,na.rm=TRUE),sd(e,na.rm=TRUE)))) ## result: row=indiv, col=groups, values=membership proba prob <- t(sapply(1:N, getproba.ind, distrib.param)) } ## LEAVEONEOUT: DENSITY EXCLUDES THE INDIV FOR WHICH PROBA IS SEEKED ## if(method=="leaveOneOut"){ ## get within-group distance data for each individual temp <- lapply(1:N, function(i) getdist.within.allgrp(x[-i,-i], grp[-i])) # grp density data for each individual ## parameter of the group distributions ## list of matrices, one per individual ## matrix of within-group dist: col=grp, row1=mean,row2=sd distrib.param <- lapply(1:N, function(i) sapply(temp[[i]], function(e) return(c(mean(e,na.rm=TRUE),sd(e,na.rm=TRUE))))) ## result: row=indiv, col=groups, values=membership proba prob <- t(sapply(1:N, function(i) getproba.ind(i, distrib.param[[i]]))) } ## SHAPE MEMBERSHIP PROBABILITIES MATRIX ## colnames(prob) <- LEV rownames(prob) <- rownames(x) ## FIND GROUP ASSIGNMENTS ## temp <- factor(colnames(prob)[apply(prob,1, which.max)]) annot <- rep(" ", N) annot[as.character(grp)!=as.character(temp)] <- "!" groups <- data.frame(observed=grp, inferred=temp, annot=annot) ##rownames(groups) <- rownames(prob) ## BUILD / RETURN RESULT ## ## get proportion of correct assignment propcorrect <- mean(annot==" ") propcorrect.bygroup <- tapply(annot==" ", grp, mean) ## get summary of assignments grp.tab <- table(observed=groups[,1], assigned=groups[,2]) ## get assignability ## i.e. how many times better than at random is assignment? ## 0 = grp very unlikely ## 1 = assignment no better than at random ## >1 = better than random (e.g. 2 = twice as better as at random) temp <- table(grp)/N probActualGrp <- sapply(1:N, function(i) prob[i, as.character(grp[i])]) assign.idx <- probActualGrp / as.numeric(temp[as.character(grp)]) assignStat <- list(assign.idx=assign.idx, mean=mean(assign.idx), grp.mean=tapply(assign.idx,grp,mean)) ##res <- list(prob=prob,groups=groups, mean.correct=propcorrect, prop.correct=propcorrect.bygroup) res <- list(prob=prob, groups=groups, mean.ok=propcorrect, grp.tab=grp.tab, assignStat=assignStat) return(res) } # end dibas.matrix ################ ## dibas.vector ################ ## ## in this one, one distance to a reference point ## is used to defined group membership probabilities ## #' @rdname dibas #' @export dibas.vector <- function(x, grp, method=c("default","leaveOneOut"), n.items=NULL, ...){ method <- match.arg(method) ## DECLARE SOME VARIABLES, HANDLE ARGUMENTS ## grp <- factor(grp) K <- length(LEV <- levels(grp)) N <- length(x) if(!is.null(n.items)){ n.items <- round(n.items) if(length(n.items)!=N) stop("n.items has a wrong length") if(any(n.items<1)) stop("values in n.items cannot be less than 1") x <- rep(x, n.items) grp <- rep(grp, n.items) } ## AUXILIARY FUNCTIONS ## ## COMPUTE LOG AND AVOIDS -INF logprob <- function(prob){ res <- log(prob) res[res< -1e20] <- -1e20 return(res) } ## FUNCTION TO COMPUTE MEMBERSHIP PROBA FOR ONE INDIV ## i: index of an individual ## distrib.mu: vector of the means of with-grp distance distributions ## distrib.sigma: vector of the sds of with-grp distance distributions getproba.ind <- function(i, leaveOneOut){ if(leaveOneOut){ distrib.mu <- tapply(x[-i], grp[-i], mean, na.rm=TRUE) distrib.sigma <- tapply(x[-i], grp[-i], sd, na.rm=TRUE) } else { distrib.mu <- tapply(x, grp, mean, na.rm=TRUE) distrib.sigma <- tapply(x, grp, sd, na.rm=TRUE) } out <- sapply(1:K, function(k) logprob(dnorm(x[i], distrib.mu[k],distrib.sigma[k]))) return(exp(out)/sum(exp(out))) } ## CORE COMPUTATIONS ## prob <- t(sapply(1:length(x), getproba.ind, leaveOneOut=method=="leaveOneOut")) ## SHAPE MEMBERSHIP PROBABILITIES MATRIX ## colnames(prob) <- LEV rownames(prob) <- rownames(x) ## FIND GROUP ASSIGNMENTS ## temp <- factor(colnames(prob)[apply(prob,1, which.max)]) annot <- rep(" ", N) annot[as.character(grp)!=as.character(temp)] <- "!" groups <- data.frame(observed=grp, inferred=temp, annot=annot) ##rownames(groups) <- rownames(prob) ## BUILD / RETURN RESULT ## ## get proportion of correct assignment propcorrect <- mean(annot==" ") propcorrect.bygroup <- tapply(annot==" ", grp, mean) ## get summary of assignments grp.tab <- table(observed=groups[,1], assigned=groups[,2]) ## get assignability ## i.e. how many times better than at random is assignment? ## 0 = grp very unlikely ## 1 = assignment no better than at random ## >1 = better than random (e.g. 2 = twice as better as at random) temp <- table(grp)/N probActualGrp <- sapply(1:N, function(i) prob[i, as.character(grp[i])]) assign.idx <- probActualGrp / as.numeric(temp[as.character(grp)]) assignStat <- list(assign.idx=assign.idx, mean=mean(assign.idx), grp.mean=tapply(assign.idx,grp,mean)) ##res <- list(prob=prob,groups=groups, mean.correct=propcorrect, prop.correct=propcorrect.bygroup) res <- list(prob=prob, groups=groups, mean.ok=propcorrect, grp.tab=grp.tab, assignStat=assignStat) return(res) } # end dibas.vector ############### ## dibas.phylo ############### #' @rdname dibas #' @export dibas.phylo <- function(x, grp, method=c("default","leaveOneOut"), fromRoot=FALSE, metric=c("Abouheif", "nNodes", "patristic", "sumDD"), n.items=NULL, ...){ ## if(!require(ape)) stop("ape package is required") if(!inherits(x,"phylo")) stop("x is not a phylo object") metric <- match.arg(metric) if(fromRoot){ res <- dibas.vector(distRoot(x, method=metric), grp=grp, method=method, n.items=n.items) } else { res <- dibas(distTips(x, method=metric), grp=grp, method=method) } return(res) } # end dibas.phylo ############## ## dibas.dist ############## #' @rdname dibas #' @export dibas.dist <- function(x, grp, method=c("default","leaveOneOut"), ...){ res <- dibas.matrix(as.matrix(x), grp, method) return(res) } # end dibas.phylo ############################## ## simulate data with groups ############################## simDatGroups <- function(k=2, p=1000, n=10, mu=0, sigma=1){ ## RECYCLE ARGUMENTS ## n <- rep(n, length=k) mu <- rep(mu, length=k) sigma <- rep(sigma, length=k) ## GENERATE DATA ## dat <- list() for(i in 1:k){ dat[[i]] <- replicate(p, rnorm(n[i], mu[i], sigma[i])) } dat <- Reduce(rbind,dat) rownames(dat) <- paste("ind", 1:nrow(dat)) ## SHAPE OUTPUT ## grp <- factor(paste("grp", rep(1:k, n))) res <- list(dat=dat, grp=grp) return(res) } # end simDatGroups ########## OLD CODE, USING A DIFFERENT APPROACH ########### ## THIS WAS USING A KERNEL APPROX OF THE DISTRIBUTION OF ## WITHIN GROUP DISTANCES. NOT WORKING BECAUSE THERE COULD BE ## MORE THAN ONE MODE, SO GROUPS COULD BE PRETTY SPLIT ACROSS ## THE PHYLOGENY ## ## ############## ## ## dibas ## ############## ## dibas <- function(x, grp, method=c("default","leaveOneOut","bootstrap"), n.dens=4096, plot=TRUE, ## warn.lab=FALSE, dat=NULL, FUN=NULL, n.boot=10, ...){ ## if(!require(ape)) stop("ape package is required") ## if(!inherits(x,"phylo")) stop("x is not a phylo object") ## method <- match.arg(method) ## if(method=="bootstrap" && (is.null(dat) || is.null(FUN))) stop("dat and FUN must be provided for the bootstrap procedure") ## if(warn.lab && !is.null(dat) && !identical(x$tip.label,rownames(dat))) warning("Tip labels in x and rownames of dat differ \nplease make sure the same order is used in x, grp, and dat") ## ## DECLARE SOME VARIABLES, HANDLE ARGUMENTS ## ## grp <- factor(grp) ## K <- length(LEV <- levels(grp)) ## N <- length(x$tip.label) ## D <- cophenetic.phylo(x) ## THRES <- 1e-320 # densities < THRES will be set to THRES to avoid log(x)=-Inf ## ## RE-ORDER GRP AND DATA MATRIX AFTER TIP LABELS ## ## if(!is.null(dat)){ ## if(is.null(rownames(dat))) rownames(dat) <- x$tip.label ## if(!all(x$tip.label %in% rownames(dat))) stop("some tips do not have data matching their label") ## grp <- grp[match(x$tip.label, rownames(dat))] # grp is assumed to be in the same order as 'dat' ## dat <- dat[x$tip.label,,drop=FALSE] ## } ## #### AUXILIARY FUNCTIONS #### ## ## FUNCTION TO ESTIMATE A DENSITY AT A SERIES OF POINTS ## ## compute.dens <- function(dens, values){ ## pred.y <- double(n <- length(values)) ## return(.C("predict_density", dens$x, dens$y, length(dens$x), as.double(values), pred.y, n, PACKAGE="adephylo")[[5]]) ## } ## ## FUNCTION TO GET A VECTOR OF PAIRWISE DISTANCE WITHIN ONE GROUP ## ## getdist.within.grp <- function(M, fac, val){ # val is one level of fac ## temp <- M[fac==val,fac==val] ## return(temp[lower.tri(temp)]) ## } ## ## FUNCTION TO GET A VECTOR OF PAIRWISE DISTANCES WITHIN GROUP, FOR ALL GROUPS ## ## getdist.within.allgrp <- function(M, fac){ ## res <- lapply(LEV, function(e) getdist.within.grp(M, fac, e)) ## names(res) <- LEV ## return(res) ## } ## ## FUNCTION TO GET PROBA FOR ONE INDIV / ONE GROUP ## ## getprob.ind <- function(i, g, dens.per.grp){ # i: idx of indiv; g: idx of a group ## temp <- 1:ncol(D) ## dens <- compute.dens(dens.per.grp[[g]], D[i,grp==LEV[g] & temp!=i]) ## dens[dens < THRES] <- THRES ## res <- exp(mean(log(dens))) ## return(res) ## } ## ## FUNCTION TO GET PROBA FOR ALL INDIV / ONE GROUP ## ## if(method=="leaveOneOut"){ ## getprob.grp <- function(g, dens.per.ind.grp){ # g: idx of a group; dens.per.ind.grp is a list giving grp density for each indiv ## return(sapply(1:N, function(i) getprob.ind(i,g,dens.per.ind.grp[[i]]))) ## } ## } else { ## getprob.grp <- function(g, dens.per.grp){ # g: idx of a group ## return(sapply(1:N, function(i) getprob.ind(i,g,dens.per.grp))) ## } ## } ## ## FUNCTION TO GET A BOOTSTRAPPED TREE AND MATCHING GRP ## ## getboot.tree.grp <- function(){ ## samp <- sample(1:N,replace=TRUE) ## tre <- FUN(dat[samp,,drop=FALSE]) ## newgrp <- factor(grp[samp]) ## return(list(tre=tre, grp=newgrp)) ## } ## #### CORE COMPUTATIONS #### ## ## DEFAULT: DENSITY BASED ON SAMPLE ## ## if(method=="default"){ ## dens.dat <- getdist.within.allgrp(D, grp) # density data for each group ## list.dens <- lapply(dens.dat, density, n=n.dens, ...) # densities for each group ## } ## ## LEAVEONEOUT: GRP DENSITY EXCLUDES THE INDIV FOR WHICH PROBA IS SEEKED ## ## if(method=="leaveOneOut"){ ## dens.dat <- lapply(1:N, function(i) getdist.within.allgrp(D[-i,-i], grp[-i])) # grp density data for each individual ## list.dens <- lapply(1:N, function(i) lapply(dens.dat[[i]], density, n=n.dens, ...)) # densities for each group ## } ## ## BOOTSTRAP: DENSITY BASED ON BOOTSTRAPPIN INDIVIDUALS ## ## if(method=="bootstrap"){ ## ## GET BOOTSTRAPPED TREES ## ## list.trees.grp <- lapply(1:n.boot, function(i) getboot.tree.grp()) ## ## GET WITHIN-GROUP DISTANCES FOR EACH BOOTSTRAP SAMPLE ## ## list.D <- lapply(list.trees.grp, function(e) cophenetic.phylo(e$tre)) ## temp <- lapply(1:n.boot, function(i) getdist.within.allgrp(list.D[[i]], list.trees.grp[[i]]$grp)) # for each replicate, list of distances within for each grp ## ## GET DENSITIES FOR EACH GROUP ## ## dens.dat <- lapply(LEV, function(onegroup) unlist(lapply(temp, function(e) e[[onegroup]]))) # density data for each group ## list.dens <- lapply(dens.dat, density, n=n.dens, ...) # densities for each group ## } ## ## PLOT DENSITIES ## ## if(method != "leaveOneOut" && plot){ ## find.mfrow <- function(i) { ## nrow <- ceiling(sqrt(i)) ## ncol <- ceiling(i/ceiling(sqrt(i))) ## return(c(nrow,ncol)) ## } ## par(mfrow = find.mfrow(K)) ## for(i in 1:K){ ## plot(list.dens[[i]], main=paste("Group:",LEV[i]),xlab="Within-group pairwise distance",ylab="Density", col="blue") ## points(dens.dat[[i]], rep(0,length(dens.dat[[i]])), pch="|", col="blue") ## } ## } ## ## COMPUTE MEMBERSHIP PROBABILITIES ## ## prob <- matrix(unlist(lapply(1:K, getprob.grp, list.dens)), ncol=K) ## prob <- prop.table(prob,1) ## colnames(prob) <- LEV ## rownames(prob) <- x$tip.label ## ## FIND GROUP ASSIGNMENTS ## ## temp <- factor(colnames(prob)[apply(prob,1, which.max)]) ## annot <- rep(" ", N) ## annot[as.character(grp)!=as.character(temp)] <- "!" ## groups <- data.frame(observed=grp, inferred=temp, annot=annot) ## ##rownames(groups) <- rownames(prob) ## ## BUILD / RETURN RESULT ## ## propcorrect <- mean(annot==" ") ## ## propcorrect.bygroup <- tapply(annot==" ", grp, mean) ## assignability <- mean((apply(prob,1,max)-.5)/.5) ## ##res <- list(prob=prob,groups=groups, mean.correct=propcorrect, prop.correct=propcorrect.bygroup) ## res <- list(prob=prob, groups=groups, assigndex=assignability, mean.correct=propcorrect) ## return(res) ## } # end dibas adephylo/R/table.phylo4d.R0000644000176200001440000004310412767534101015064 0ustar liggesusers############# ## table.phylo4d ############# #' Graphical display of phylogeny and traits #' #' This function represents traits onto the tips of a phylogeny. Plotted objects #' must be valid \linkS4class{phylo4d} objects (implemented by the #' \code{phylobase} package). Current version allows plotting of a tree and one #' or more quantitative traits (possibly containing missing data, represented by #' an 'x').\cr #' #' The plot of phylogenies is performed by a call to #' \code{\link[ape]{plot.phylo}} from the \code{ape} package. Hence, many of the #' arguments of \code{\link[ape]{plot.phylo}} can be passed to #' \code{table.phylo4d}, through the \dots{} argument, but their names must be #' complete. #' #' For large trees, consider using \code{\link{bullseye}}. #' #' The function \code{table.phylo4d} is based on former plot method for #' \linkS4class{phylo4d} objects from the \code{phylobase} package. It replaces #' the deprecated \code{ade4} functions \code{\link[ade4]{symbols.phylog}} and #' \code{\link[ade4]{table.phylog}}. #' #' @param x a \linkS4class{phylo4d} object #' @param treetype the type of tree to be plotted ("phylogram" or "cladogram") #' @param symbol the type of symbol used to represent data ("circles", #' "squares", or "colors") #' @param repVar the numerical index of variables to be plotted #' @param center a logical stating whether variables should be centred (TRUE, #' default) or not (FALSE) #' @param scale a logical stating whether variables should be scaled (TRUE, #' default) or not (FALSE) #' @param legend a logical stating whether a legend should be added to the plot #' (TRUE) or not (FALSE, default) #' @param grid a logical stating whether a grid should be added to the plot #' (TRUE, default) or not (FALSE) #' @param box a logical stating whether a box should be added around the plot #' (TRUE, default) or not (FALSE) #' @param show.tip.label a logical stating whether tip labels should be printed #' (TRUE, default) or not (FALSE) #' @param show.node.label a logical stating whether node labels should be #' printed (TRUE, default) or not (FALSE) #' @param show.var.label a logical stating whether labels of variables should be #' printed (TRUE, default) or not (FALSE) #' @param ratio.tree the proportion of width of the figure occupied by the tree #' @param font an integer specifying the type of font for the labels: 1 (plain #' text), 2 (bold), 3 (italic, default), or 4 (bold italic). #' @param tip.label a character vector giving the tip labels #' @param var.label a character vector giving the labels of variables #' @param cex.symbol a numeric giving the factor scaling the symbols #' @param cex.label a numeric giving the factor scaling all labels #' @param cex.legend a numeric giving the factor scaling the legend #' @param pch is \code{symbol} is set to 'colors', a number indicating the type #' of point to be plotted (see ?points) #' @param col is \code{symbol} is set to 'colors', a vector of colors to be used #' to represent the data #' @param coord.legend an optional list with two components 'x' and 'y' #' indicating the lower-left position of the legend. Can be set to #' \code{locator(1) to position the legend interactively.} #' @param \dots further arguments to be passed to plot methods from \code{ape}. #' See \code{\link[ape]{plot.phylo}}. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso The \linkS4class{phylo4d} class for storing #' \code{phylogeny+data}.\cr #' #' For large trees, consider using \code{\link{bullseye}}. #' #' \code{\link[ape]{plot.phylo}} from the \code{ape} package.\cr #' #' An alternative (deprecated) representation is available from #' \code{\link[ade4]{dotchart.phylog}}. #' @keywords hplot multivariate #' @examples #' #' if(require(ape) & require(phylobase) & require(ade4)){ #' #' ## simulated data #' tr <- rtree(20) #' dat <- data.frame(a = rnorm(20), b = scale(1:20), c=runif(20,-2,2) ) #' dat[3:6, 2] <- NA # introduce some NAs #' obj <- phylo4d(tr, dat) # build a phylo4d object #' table.phylo4d(obj) # default scatterplot #' table.phylo4d(obj,cex.leg=.6, use.edge.length=FALSE) # customized #' table.phylo4d(obj,treetype="clad", show.node=FALSE, cex.leg=.6, #' use.edge.length=FALSE, edge.color="blue", edge.width=3) # more customized #' #' #' ## teleost fishes data #' data(mjrochet) #' temp <- read.tree(text=mjrochet$tre) # make a tree #' mjr <- phylo4d(x=temp,tip.data=mjrochet$tab) # male a phylo4d object #' table.phylo4d(mjr,cex.lab=.5,show.node=FALSE,symb="square") #' #' #' ## lizards data #' data(lizards) #' liz.tr <- read.tree(tex=lizards$hprA) # make a tree #' liz <- phylo4d(liz.tr, lizards$traits) # make a phylo4d object #' table.phylo4d(liz) #' #' #' ## plotting principal components #' liz.pca1 <- dudi.pca(lizards$traits, scannf=FALSE, nf=2) # PCA of traits #' myPC <- phylo4d(liz.tr, liz.pca1$li) # store PC in a phylo4d object #' varlab <- paste("Principal \ncomponent", 1:2) # make labels for PCs #' table.phylo4d(myPC, ratio=.8, var.lab=varlab) # plot the PCs #' add.scatter.eig(liz.pca1$eig,2,1,2,posi="topleft", inset=c(0,.15)) #' title("Phylogeny and the principal components") #' #' } #' #' @import phylobase #' @importFrom ape plot.phylo #' @importFrom graphics par strwidth segments symbols points text strheight #' @importFrom grDevices heat.colors #' @export table.phylo4d table.phylo4d <- function(x, treetype=c("phylogram","cladogram"), symbol=c("circles", "squares", "colors"), repVar=1:ncol(tdata(x, type="tip")), center=TRUE, scale=TRUE, legend=TRUE, grid=TRUE, box=TRUE, show.tip.label=TRUE, show.node.label=TRUE, show.var.label=TRUE, ratio.tree=1/3, font=3, tip.label=tipLabels(x), var.label=colnames(tdata(x,type="tip")), cex.symbol=1, cex.label=1, cex.legend=1, pch=20, col=heat.colors(100), coord.legend=NULL, ...) { ## preliminary stuff and checks if (is.character(chk <- checkPhylo4(x))) stop("bad phylo4d object: ",chk) # if (is.character(chk <- checkData(x))) stop("bad phylo4d object: ",chk) <- needed? ## if(!require(ape)) stop("the ape package is required") if(cex.label<0.1) { show.tip.label <- FALSE show.node.label <- FALSE show.var.label <- FALSE } cex <- par("cex") symbol <- match.arg(symbol) treetype <- match.arg(treetype) SYMBSCALE <- 0.2 # i.e. max size of a plotted symbol is 0.2*cex.symbol inches if(symbol=="colors") { SYMBSCALE <- 0.05 } ## convert the tree into phylo tre <- suppressWarnings(as(x,"phylo")) ##tre$node.label <- x@node.label # this should be done by the as(x,"phylo") ## plot only tree if no tip data if(ncol(tdata(x,type="tip")) == 0) { plot(tre, type=treetype, direction="rightwards", show.tip.label=show.tip.label, show.node.label=show.node.label, cex=cex.label, no.margin=FALSE, x.lim=NULL, y.lim=NULL, ...) return(invisible()) } #### data handling ## retrieve data dat <- tdata(x, type="tip") dat <- dat[, repVar, drop=FALSE] clas <- lapply(dat,class) isNum <- sapply(clas, function(e) e %in% c("integer","numeric")) ## keep only numeric data dat <- dat[, isNum, drop=FALSE] var.label <- var.label[repVar] var.label <- var.label[isNum] ## order data like tips E <- phylobase::edges(x) tips.ord <- E[,2][!E[,2] %in% E[,1]] dat <- dat[tips.ord,,FALSE] tip.label <- tip.label[tips.ord] # reorder tip labels ## centring / scaling dat <- as.data.frame(scale(dat,center=center,scale=scale)) ## compute bottom margin ## ! use inches as units still these won't be changed by plot.phylo temp <- var.label[which.max(nchar(var.label))] # longest tip label lab.height <- strwidth(temp, units="inches", cex=cex.label) # height required by the longest var label lab.height <- lab.height / par("pin")[1] # returned as a fraction of the plot region #### define plot region plotreg <- plotreg0 <- par("plt") plotreg.width <- plotreg0[2] - plotreg0[1] plotreg.height <- plotreg0[4] - plotreg0[3] plotreg[2] <- plotreg[1] + (ratio.tree)*plotreg.width # restrain the width for phylo plotreg[3] <- plotreg[3] + plotreg.height*ifelse(show.var.label,lab.height+0.05,0.05) ## add internal vertical margins plotreg[4] <- plotreg[4] - plotreg.height*0.05 # add internal vertical margins #### plot the tree par(plt = plotreg) plotres <- plot(tre, type=treetype, direction="rightwards", show.tip.label=FALSE, show.node.label=show.node.label, cex=cex.label, no.margin=FALSE, x.lim=NULL, y.lim=NULL, ...) #### plot the data par(plt=plotreg0) cur.usr.width <- par("usr")[2] - par("usr")[1] # beware: par("usr") does not adapt to the new plot region usr.width <- cur.usr.width / ratio.tree usr.height <- par("usr")[4] - par("usr")[3] ## x.inset is the space between tree/data and data/tip.labels (in usr units) x.inset <- SYMBSCALE * cex.symbol * usr.width / par("pin")[1] y.inset <- SYMBSCALE * cex.symbol * usr.height / par("pin")[2] x.base <- plotres$x.lim[2] + x.inset # start plotting from x.base rightwards if(show.tip.label){ temp <- tipLabels(x)[which.max(nchar(tipLabels(x)))] # longest tip label lab.width <- strwidth(temp, units="user", cex=cex.label) # compute the width to keep for tip labels } else{ lab.width <- 0 } xrange.data <- c(x.base , (par("usr")[1]+usr.width) - lab.width - 2*x.inset) # plot data within this range ## if(diff(xrange.data) < (x.inset*ncol(dat))) ("No room left to plot data; please try reducing ratio.tree or cex.label.") if(diff(xrange.data) < (x.inset*ncol(dat))) warning("There may not be enough room left to plot data; you may consider reducing ratio.tree or cex.label.") ## define x and y coordinates x.grid <- seq(xrange.data[1],xrange.data[2], length=ncol(dat)) if(ncol(dat)==1) {x.grid <- mean(c(xrange.data[1],xrange.data[2]))} y.grid <- seq(plotres$y.lim[1],plotres$y.lim[2],length=plotres$Ntip) temp <- expand.grid(y.grid, x.grid) # here are coordinates for data xy.data <- data.frame(x=temp[,2],y=temp[,1]) ## merge data and their coordinates alldat <- cbind.data.frame(xy.data, unlist(dat)) ## fac <- factor(rep(1:ncol(dat), rep(nrow(dat),ncol(dat)))) ## alldat <- split(alldat, fac) ## need to "reboot" the plot region without changing coordinates ## seems that box does the job. if(box) {box()} else {box(col="transparent")} if(grid){ ## vertical segments segments(x0=x.grid, y0=rep(min(y.grid),plotres$Ntip), x1=x.grid, y1=rep(max(y.grid),plotres$Ntip), col="grey") ## horizontal segments segments(x0=rep(min(x.grid),plotres$Ntip), y0=y.grid, x1=rep(max(x.grid),plotres$Ntip), y1=y.grid, col="grey") } ## auxiliary function to translate a variable into colors makeColors <- function(x, col){ # x is a numeric vector, col is a vector of colors if(length(x)==1) return(col[1]) nCol <- length(col) res <- x - min(x) res <- res / max(res) res <- res * (nCol-1) + 1 res <- round(res) res[res>nCol] <- nCol res[res<1] <- 1 return(col[res]) } ## auxiliary function to plot a single variable ## max size of a symbol is set to SYMBSCALE*cex inches plotaux <- function(x,y,var,symbol,cex){ if(any(var[!is.na(var)]<0)) { usebw <- TRUE } else { usebw <- FALSE } if(usebw){ ispos <- var>0 fg.col <- rep("black",length(var)) fg.col[ispos] <- "white" bg.col <- rep("white",length(var)) bg.col[ispos] <- "black" if(symbol == "squares"){ symbols(x=x, y=y, squares=abs(var), inches=SYMBSCALE*cex, fg=fg.col, bg=bg.col, add=TRUE) } # end squares if(symbol == "circles"){ symbols(x=x, y=y, circles=abs(var), inches=SYMBSCALE*cex, fg=fg.col, bg=bg.col, add=TRUE) } # end circles if(symbol == "colors"){ myCol <- makeColors(var, col) points(x=x, y=y, pch=pch, cex=cex, col=myCol) } # end colors } else { if(symbol == "squares"){ symbols(x=x, y=y, squares=var, inches=SYMBSCALE*cex, fg="white", bg="black", add=TRUE) } # end squares if(symbol == "circles"){ symbols(x=x, y=y, circles=var, inches=SYMBSCALE*cex, fg="white", bg="black", add=TRUE) } # end circles if(symbol == "colors"){ myCol <- makeColors(var, col) points(x=x, y=y, pch=pch, cex=cex, col=myCol) } # end colors } # end else if(any(is.na(var))){ isNA <- is.na(var) points(x[isNA],y[isNA],pch=4,cex=cex.symbol) } } # end plotaux ## finally plot the data ## carefull : all variables must be plotted in as a single vector, so that ## scaling is the same for all variables ## lapply(alldat, function(X) plotaux(X[,1],X[,2],X[,3],symbol,cex.symbol)) plotaux(alldat[,1],alldat[,2],alldat[,3],symbol,cex.symbol) #### plot labels for variables if(show.var.label) text(x=x.grid, y=rep(min(y.grid)-1.5*y.inset, ncol(dat)), lab=var.label, adj=1, srt=90, cex=cex.label) #### plot tip labels if(show.tip.label){ x.base <- xrange.data[2] + x.inset text(x=rep(x.base,plotres$Ntip), y=1:plotres$Ntip, lab=tip.label, font=font, cex=cex.label, pos=4) } #### add a legend for symbols if(legend){ ## Auxiliary function to add the legend ## (x,y): coordinates of the lower-left annotation ## z: a numeric vector whose values are being legended addLegend <- function(x,y,z,cex.legend,cex.label,cex.symbol){ z <- z*cex.legend leg.values <- pretty(z,n=4, min.n=1) temp <- length(leg.values) ## make sure to get maximum 4 symbols if(temp>4) { leg.values <- leg.values[c(1,2,temp-1,temp)] } leg.txt <- as.character(leg.values) ## compute the maximum size taken by symbols in usr coordinates if(symbol=="colors") { sym.w <-strwidth("o",units="user",cex=cex.symbol) sym.w <- rep(sym.w, length(leg.values)) sym.h <- strheight("o",units="user",cex=cex.symbol) sym.h <- rep(sym.h, length(leg.values)) } else { usr.w <- (par("usr")[2]-par("usr")[1]) / ratio.tree # because par("usr") is the one of plot.phylo usr.h <- par("usr")[4]-par("usr")[3] sym.w <- usr.w * ((abs(leg.values)/max(abs(leg.values))) * SYMBSCALE * cex.symbol * cex.legend) / par("pin")[1] sym.h <- usr.h * (SYMBSCALE * cex.symbol * cex.legend) / par("pin")[2] } ## compute the maximum size taken by annotations in usr coordinates ann.w <- strwidth(leg.txt,units="user",cex=cex.label*cex.legend) ann.h <- strheight(leg.txt,units="user",cex=cex.label*cex.legend) ## retain relevant spaces between symbols / annotations space.w.sym <- sapply(1:(length(sym.w)-1),function(i) sum(sym.w[c(i,i+1)])) space.w.ann <- sapply(1:(length(ann.w)-1),function(i) sum(ann.w[c(i,i+1)])) / 2 temp <- cbind(space.w.sym, space.w.ann) space.w <- apply(temp,1,max) if(symbol=="colors"){ space.h <- sym.h + ann.h } else { space.w <- space.w + 0.01*usr.w space.h <- sym.h + ann.h + 0.01*usr.h } ## define coordinates of annotations and symbols ann.coordX <- c(x, x + cumsum(space.w)) + max(sym.w[1],ann.w[1]) + 0.01*usr.w ann.coordY <- y sym.coordX <- ann.coordX sym.coordY <- y + space.h ## plot annotations text(ann.coordX, ann.coordY, leg.txt, cex=cex.label*cex.legend) ## plot symbols plotaux(sym.coordX, sym.coordY, leg.values, symbol, cex.symbol*cex.legend) } # end addLegend if(!is.null(coord.legend)){ x.leg <- coord.legend$x y.leg <- coord.legend$y } else { usr.w <- (par("usr")[2]-par("usr")[1]) / ratio.tree usr.h <- par("usr")[4]-par("usr")[3] temp <- lab.height * usr.height / (1 - lab.height) ## need to substract temp from par("usr")[3] y.base <- par("usr")[3] - temp - y.inset ## to get closer the actual par("usr")[3] ! x.leg <- par("usr")[1] + 0.01 * usr.w y.leg <- y.base ## remember to use y.base instead of par("usr3")[3], which is wrong } addLegend(x=x.leg, y=y.leg, z=alldat[,3], cex.legend=cex.legend, cex.label=cex.label, cex.symbol=cex.symbol) ## FIXME ## ## draw a rectangle around the legend #rect.size <- c(diff(range(leg.x)) , diff(c(y.base, max(leg.y))) ) #rect(min(leg.x)- rect.size[1]*0.05, # min(y.base) - rect.size[2]*0.05, # max(leg.x) + rect.size[1]*0.05, # max(y.base) + rect.size[2]*0.05) } ## end legend return(invisible()) } # end table.phylo4d adephylo/R/distances.R0000644000176200001440000003055312620502243014362 0ustar liggesusers########### # distTips ########### #' Compute some phylogenetic distance between tips #' #' The function \code{distTips} computes a given distance between a set of tips #' of a phylogeny. A vector of tips is supplied: distances between all possible #' pairs of these tips are computed. The distances are computed from the #' shortest path between the tips. Several distances can be used, defaulting to #' the sum of branch lengths (see argument \code{method}). #' #' An option (enabled by default) allows computations to be run using compiled #' C code, which is much faster than pure R code. In this case, a matrix of all #' pairwise distances is returned (i.e., \code{tips} argument is ignored). #' #' \code{Abouheif} distance refers to the phylogenetic distance underlying the #' test of Abouheif (see references). Let P be the set of all the nodes in the #' path going from \code{node1} to \code{node2}. Let DDP be the number of #' direct descendants from each node in P. Then, the so-called 'Abouheif' #' distance is the product of all terms in DDP.\cr #' #' \code{sumDD} refers to a phylogenetic distance quite similar to that of #' Abouheif. We consider the same sets P and DDP. But instead of computing the #' product of all terms in DDP, this distance computes the sum of all terms in #' DDP. #' #' @param x a tree of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' @param tips A vector of integers identifying tips by their numbers, or a #' vector of characters identifying tips by their names. Distances will be #' computed between all possible pairs of tips. #' @param method a character string (full or abbreviated without ambiguity) #' specifying the method used to compute distances ; possible values are:\cr - #' \code{patristic}: patristic distance, i.e. sum of branch lengths \cr - #' \code{nNodes}: number of nodes on the path between the nodes \cr - #' \code{Abouheif}: Abouheif's distance (see details) \cr - \code{sumDD}: sum #' of direct descendants of all nodes on the path (see details) \cr #' @param useC a logical indicating whether computations should be performed #' using compiled C code (TRUE, default), or using a pure R version (FALSE). C #' version is several orders of magnitude faster, and R version is kept for #' backward compatibility. #' @return An object of class \code{dist}, containing phylogenetic distances. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso \code{\link{distTips}} which computes several phylogenetic #' distances between tips. #' @references Pavoine, S.; Ollier, S.; Pontier, D. & Chessel, D. (2008) #' Testing for phylogenetic signal in life history variable: Abouheif's test #' revisited. \emph{Theoretical Population Biology}: \bold{73}, 79-91. #' @keywords manip #' @examples #' #' if(require(ape) & require(phylobase)){ #' ## make a tree #' x <- as(rtree(10),"phylo4") #' plot(x, show.node=TRUE) #' axisPhylo() #' ## compute different distances #' distTips(x, 1:3) #' distTips(x, 1:3, "nNodes") #' distTips(x, 1:3, "Abouheif") #' distTips(x, 1:3, "sumDD") #' #' ## compare C and pure R code outputs #' x <- rtree(10) #' all.equal(as.matrix(distTips(x)), as.matrix(distTips(x, useC=FALSE))) #' all.equal(as.matrix(distTips(x, meth="nNode")), #' as.matrix(distTips(x, meth="nNode", useC=FALSE))) #' all.equal(as.matrix(distTips(x, meth="Abou")), #' as.matrix(distTips(x, meth="Abou", useC=FALSE))) #' all.equal(as.matrix(distTips(x, meth="sumDD")), #' as.matrix(distTips(x, meth="sumDD", useC=FALSE))) #' #' ## compare speed #' x <- rtree(50) #' tim1 <- system.time(distTips(x, useC=FALSE)) # old pure R version #' tim2 <- system.time(distTips(x)) # new version using C #' tim1[c(1,3)]/tim2[c(1,3)] # C is about a thousand time faster in this case #' } #' #' @useDynLib adephylo #' @import phylobase #' @export distTips distTips <- function(x, tips="all", method=c("patristic","nNodes","Abouheif","sumDD"), useC=TRUE){ ## if(!require(phylobase)) stop("phylobase package is not installed") if(useC){ tre <- as(x, "phylo") n <- as.integer(nTips(tre)) resSize <- as.integer(n*(n-1)/2) res <- double(resSize) method <- match.arg(method) method <- match(method, c("patristic","nNodes","Abouheif","sumDD")) if(is.null(tre$edge.length)){ tre$edge.length <- as.double(rep(1, nrow(tre$edge))) } temp <- .C("distalltips", as.integer(tre$edge[,1]), as.integer(tre$edge[,2]), as.double(tre$edge.length), nrow(tre$edge), n, res, resSize, as.integer(method), PACKAGE="adephylo") res <- temp[[6]] class(res) <- "dist" attr(res, "Size") <- nTips(tre) attr(res, "Diag") <- FALSE attr(res, "Upper") <- FALSE attr(res, "method") <- paste("Phylogenetic: ",method,sep="") attr(res, "call") <- match.call() attr(res, "Labels") <- tre$tip.label } else { ## handle arguments x <- as(x, "phylo4") method <- match.arg(method) N <- nTips(x) if(tips[1]=="all") { tips <- 1:N } tips <- getNode(x, tips) tips.names <- names(tips) ## some checks if (is.character(checkval <- checkPhylo4(x))) stop(checkval) if(any(is.na(tips))) stop("wrong tips specified") ## create all couples of observations findAllPairs <- function(vec){ res <- list(i=NULL,j=NULL) k <- 0 for(i in 1:(length(vec)-1)){ for(j in (i+1):length(vec)){ k <- k+1 res[[1]][k] <- i res[[2]][k] <- j } } res <- data.frame(res) return(res) } allPairs <- findAllPairs(tips) # this contains all possible pairs of tips ## get the shortest path between all pairs of tips if(method != "patristic") { allPath <- sp.tips(x, allPairs$i, allPairs$j, useTipNames=TRUE, quiet=TRUE) } else { allPath <- sp.tips(x, allPairs$i, allPairs$j, useTipNames=TRUE, quiet=TRUE, include.mrca=FALSE) } ## compute distances if(method=="patristic"){ if(!hasEdgeLength(x)) stop("x does not have branch length") ## add tip1 and tip2 to the paths, so that these edges are counted allPath.names <- names(allPath) allPath <- lapply(1:length(allPath), function(i) c(allPath[[i]], allPairs[i,1], allPairs[i,2]) ) names(allPath) <- allPath.names edge.idx <- lapply(allPath, function(e) getEdge(x, e) ) # list of indices of edges allEdgeLength <- edgeLength(x) res <- lapply(edge.idx, function(idx) sum(allEdgeLength[idx], na.rm=TRUE) ) } # end patristic if(method=="nNodes"){ res <- lapply(allPath, length) } # end nNodes if(method=="Abouheif"){ E <- x@edge f1 <- function(onePath){ # computes product of dd for one path temp <- table(E[,1])[as.character(onePath)] # number of dd per node return(prod(temp)) } res <- lapply(allPath, f1) } # end Abouheif if(method=="sumDD"){ E <- x@edge f1 <- function(onePath){ # computes sum of dd for one path temp <- table(E[,1])[as.character(onePath)] # number of dd per node return(sum(temp)) } res <- lapply(allPath, f1) } # end sumDD ## convert res to a dist object res <- unlist(res) class(res) <- "dist" attr(res, "Size") <- length(tips) attr(res, "Diag") <- FALSE attr(res, "Upper") <- FALSE attr(res, "method") <- paste("Phylogenetic: ",method,sep="") attr(res, "call") <- match.call() attr(res, "Labels") <- tips.names } return(res) } # end distTips ########### # distRoot ########### #' Compute the distance of tips to the root #' #' The function \code{distRoot} computes the distance of a set of tips to the #' root. Several distances can be used, defaulting to the sum of branch #' lengths. #' #' \code{Abouheif} distance refers to the phylogenetic distance underlying the #' test of Abouheif (see references). Let P be the set of all the nodes in the #' path going from \code{node1} to \code{node2}. Let DDP be the number of #' direct descendants from each node in P. Then, the so-called 'Abouheif' #' distance is the product of all terms in DDP.\cr #' #' \code{sumDD} refers to a phylogenetic distance quite similar to that of #' Abouheif. We consider the same sets P and DDP. But instead of computing the #' product of all terms in DDP, this distance computes the sum of all terms in #' DDP. #' #' @param x a tree of class \code{\link[ape:read.tree]{phylo}}, #' \linkS4class{phylo4} or \linkS4class{phylo4d}. #' @param tips A vector of integers identifying tips by their numbers, or a #' vector of characters identifying tips by their names. #' @param method a character string (full or abbreviated without ambiguity) #' specifying the method used to compute distances ; possible values are:\cr - #' \code{patristic}: patristic distance, i.e. sum of branch lengths \cr - #' \code{nNodes}: number of nodes on the path between the nodes \cr - #' \code{Abouheif}: Abouheif's distance (see details) \cr - \code{sumDD}: sum #' of direct descendants of all nodes on the path (see details) \cr #' @return A numeric vector containing one distance value for each tip. #' @author Thibaut Jombart \email{tjombart@@imperial.ac.uk} #' @seealso \code{\link{distTips}} which computes the same phylogenetic #' distances, but between tips. #' @references Pavoine, S.; Ollier, S.; Pontier, D. & Chessel, D. (2008) #' Testing for phylogenetic signal in life history variable: Abouheif's test #' revisited. \emph{Theoretical Population Biology}: \bold{73}, 79-91. #' @keywords manip #' @examples #' #' if(require(ape) & require(phylobase)){ #' ## make a tree #' x <- as(rtree(50),"phylo4") #' ## compute 4 different distances #' met <- c("patristic","nNodes","Abouheif","sumDD") #' D <- lapply(met, function(e) distRoot(x, method=e) ) #' names(D) <- met #' D <- as.data.frame(D) #' #' ## plot these distances along with the tree #' temp <- phylo4d(x, D) #' table.phylo4d(temp, show.node=FALSE, cex.lab=.6) #' } #' #' @import phylobase #' @export distRoot distRoot <- function(x, tips="all", method=c("patristic","nNodes","Abouheif","sumDD") ){ ## if(!require(phylobase)) stop("phylobase package is not installed") ## handle arguments x <- as(x, "phylo4") method <- match.arg(method) N <- nTips(x) if(tips[1]=="all") { tips <- 1:N } tips <- getNode(x, tips) tips.names <- names(tips) x <- as(x, "phylo4") root <- getNode(x, N+1) # so that we have a named node ## some checks if(is.character(checkval <- checkPhylo4(x))) stop(checkval) if(any(is.na(tips))) stop("wrong tips specified") ## main computations ## get path from root to tops allPath <- lapply(tips, function(tip) .tipToRoot(x, tip, root, include.root = TRUE)) ## compute distances if(method=="patristic"){ if(!hasEdgeLength(x)) stop("x does not have branch length") ## add the concerned tips to the paths, so that these edges are counted allPath.names <- names(allPath) allPath <- lapply(1:length(allPath), function(i) c(allPath[[i]], tips[i]) ) names(allPath) <- allPath.names edge.idx <- lapply(allPath, function(e) getEdge(x, e) ) # list of indices of edges allEdgeLength <- edgeLength(x) res <- sapply(edge.idx, function(idx) sum(allEdgeLength[idx], na.rm=TRUE) ) } # end patristic if(method=="nNodes"){ res <- sapply(allPath, length) } # end nNodes if(method=="Abouheif"){ E <- x@edge f1 <- function(onePath){ # computes product of dd for one path temp <- table(E[,1])[as.character(onePath)] # number of dd per node return(prod(temp)) } res <- sapply(allPath, f1) } # end Abouheif if(method=="sumDD"){ E <- x@edge f1 <- function(onePath){ # computes sum of dd for one path temp <- table(E[,1])[as.character(onePath)] # number of dd per node return(sum(temp)) } res <- sapply(allPath, f1) } # end sumDD ## the output is a named numeric vector return(res) } # end distRoot adephylo/R/abouheif.R0000644000176200001440000001373212620510140014162 0ustar liggesusers#' Abouheif's test based on Moran's I #' #' The test of Abouheif (1999) is designed to detect phylogenetic #' autocorrelation in a quantitative trait. Pavoine \emph{et al.} (2008) have #' shown that this tests is in fact a Moran's I test using a particular #' phylogenetic proximity between tips (see details). The function #' \code{abouheif.moran} performs basically Abouheif's test for several traits #' at a time, but it can incorporate other phylogenetic proximities as well.\cr #' #' Note that the original Abouheif's proximity (Abouheif, 1999; Pavoine #' \emph{et al.} 2008) unifies Moran's I and Geary'c tests (Thioulouse \emph{et #' al.} 1995).\cr #' #' \code{abouheif.moran} can be used in two ways:\cr - providing a data.frame #' of traits (\code{x}) and a matrix of phylogenetic proximities (\code{W})\cr #' - providing a \linkS4class{phylo4d} object (\code{x}) and specifying the #' type of proximity to be used (\code{method}). #' #' \code{W} is a squared symmetric matrix whose terms are all positive or #' null.\cr #' #' \code{W} is firstly transformed in frequency matrix A by dividing it by the #' total sum of data matrix : \deqn{a_{ij} = #' \frac{W_{ij}}{\sum_{i=1}^{n}\sum_{j=1}^{n}W_{ij}}}{a_ij = W_ij / (sum_i #' sum_j W_ij)} The neighbouring weights is defined by the matrix \eqn{D = #' diag(d_1,d_2, \ldots)} where \eqn{d_i = \sum_{j=1}^{n}W_{ij}}{d_i = sum_j #' W_ij}. For each vector x of the data frame x, the test is based on the Moran #' statistic \eqn{x^{t}Ax}{t(x)Ax} where x is D-centred. #' #' @param x a data frame with continuous variables, or a \linkS4class{phylo4d} #' object (i.e. containing both a tree, and tip data). In the latter case, #' \code{method} argument is used to determine which proximity should be used. #' @param W a \emph{n} by \emph{n} matrix (\emph{n} being the number rows in x) #' of phylogenetic proximities, as produced by \code{\link{proxTips}}. #' @param method a character string (full or unambiguously abbreviated) #' specifying the type of proximity to be used. By default, the proximity used #' is that of the original Abouheif's test. See details in #' \code{\link{proxTips}} for information about other methods. #' @param f a function to turn a distance into a proximity (see #' \code{\link{proxTips}}). #' @param nrepet number of random permutations of data for the randomization #' test #' @param alter a character string specifying the alternative hypothesis, must #' be one of "greater" (default), "less" or "two-sided" #' @return Returns an object of class \code{krandtest} (randomization tests #' from ade4), containing one Monte Carlo test for each trait. #' @author Original code from ade4 (gearymoran function) by Sebastien Ollier\cr #' Adapted and maintained by Thibaut Jombart . #' @seealso - \code{\link[ade4]{gearymoran}} from the ade4 package\cr - #' \code{\link[ape]{Moran.I}} from the ape package for the classical Moran's I #' test. \cr #' @references #' #' Thioulouse, J., Chessel, D. and Champely, S. (1995) Multivariate analysis of #' spatial patterns: a unified approach to local and global structures. #' \emph{Environmental and Ecological Statistics}, \bold{2}, 1--14. #' @examples #' #' #' if(require(ade4)&& require(ape) && require(phylobase)){ #' ## load data #' data(ungulates) #' tre <- read.tree(text=ungulates$tre) #' x <- phylo4d(tre, ungulates$tab) #' #' ## Abouheif's tests for each trait #' myTests <- abouheif.moran(x) #' myTests #' plot(myTests) #' #' ## a variant using another proximity #' plot(abouheif.moran(x, method="nNodes") ) #' #' ## Another example #' #' data(maples) #' tre <- read.tree(text=maples$tre) #' dom <- maples$tab$Dom #' #' ## Abouheif's tests for each trait (equivalent to Cmean) #' W1 <- proxTips(tre,method="oriAbouheif") #' abouheif.moran(dom,W1) #' #' ## Equivalence with moran.idx #' #' W2 <- proxTips(tre,method="Abouheif") #' abouheif.moran(dom,W2) #' moran.idx(dom,W2) #' } #' #' @rdname abouheif #' @import phylobase #' @import ade4 #' @export abouheif.moran abouheif.moran <- function (x, W=NULL, method=c("oriAbouheif","patristic","nNodes","Abouheif","sumDD"), f=function(x){1/x}, nrepet=999,alter=c("greater", "less", "two-sided")) { ## some checks ## if(!require(ade4)) stop("The ade4 package is not installed.") alter <- match.arg(alter) method <- match.arg(method) ## handle W if(!is.null(W)){ # W is provided if (any(W<0)) stop ("negative terms found in 'W'") if (nrow(W) != ncol(W)) stop ("'W' is not squared") W <- as.matrix(W) } else { # otherwise computed W from x, a phylo4d object if(!inherits(x, "phylo4d")) stop("if W is not provided, x has to be a phylo4d object") if (is.character(chk <- checkPhylo4(x))) stop("bad phylo4d object: ",chk) ##if (is.character(chk <- checkData(x))) stop("bad phylo4d object: ",chk) no longer needed W <- proxTips(x, method=method, f=f, normalize="row", symmetric=TRUE) } nobs <- ncol(W) ## W has to be symmetric W <- (W + t(W))/2 ## take data from x if it is a phylo4d if(inherits(x, "phylo4d")){ if (is.character(chk <- checkPhylo4(x))) stop("bad phylo4d object: ",chk) ## if (is.character(chk <- checkData(x))) stop("bad phylo4d object: ",chk) : no longer needed x <- tdata(x, type="tip") } ## main computations x <- data.frame(x) test.names <- names(x) x <- data.matrix(x) # convert all variables to numeric type if (nrow(x) != nobs) stop ("non convenient dimension") nvar <- ncol(x) res <- .C("gearymoran", param = as.integer(c(nobs,nvar,nrepet)), data = as.double(x), W = as.double(W), obs = double(nvar), result = double (nrepet*nvar), obstot = double(1), restot = double (nrepet), PACKAGE="adephylo" ) res <- as.krandtest(obs=res$obs,sim=matrix(res$result,ncol=nvar, byrow=TRUE), names=test.names,alter=alter) return(res) } # end abouheif.moran adephylo/R/zzz.R0000644000176200001440000000012412617071127013241 0ustar liggesusers## .First.lib <- function (lib, pkg){ ## library.dynam("adephylo", pkg, lib) ## } adephylo/vignettes/0000755000176200001440000000000013215710501014062 5ustar liggesusersadephylo/vignettes/adephylo.Rnw0000644000176200001440000005566713176115555016420 0ustar liggesusers\documentclass{article} % \VignettePackage{adephylo} % \VignetteIndexEntry{adephylo: exploratory analyses for the phylogenetic comparative method} \usepackage{graphicx} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{array} \usepackage{color} \usepackage[utf8]{inputenc} % for UTF-8/single quotes from sQuote() \newcommand{\code}[1]{{{\tt #1}}} \title{\code{adephylo}: exploratory analyses for the phylogenetic comparative method} \author{Thibaut Jombart and St\'ephane Dray} \date{\today} \sloppy \hyphenpenalty 10000 \begin{document} \SweaveOpts{concordance=TRUE} \definecolor{Soutput}{rgb}{0,0,0.56} \definecolor{Sinput}{rgb}{0.56,0,0} \DefineVerbatimEnvironment{Sinput}{Verbatim} {formatcom={\color{Sinput}},fontsize=\footnotesize, baselinestretch=0.75} \DefineVerbatimEnvironment{Soutput}{Verbatim} {formatcom={\color{Soutput}},fontsize=\footnotesize, baselinestretch=0.75} \color{black} \maketitle \tableofcontents %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \section{Introduction} %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \SweaveOpts{prefix.string = figs/adephylo, fig = FALSE, eps = FALSE, pdf = TRUE, width = 6, height = 6} This document describes the \code{adephylo} package for the R software. \code{adephylo} aims at implementing exploratory methods for the analysis of phylogenetic comparative data, i.e. biological traits measured for taxa whose phylogeny is also provided. This package extends and replaces implementation of phylogeny-related methods in the ade4 package \url{http://pbil.univ-lyon1.fr/ADE-4/home.php?lang=eng}. Procedures implemented in \code{adephylo} rely on exploratory data analysis. They include data visualization and manipulation, tests for phylogenetic autocorrelation, multivariate analysis, computation of phylogenetic proximities and distances, and modelling phylogenetic signal using orthonormal bases. \\ These methods can be used to visualize, test, remove or investigate the phylogenetic signal in comparative data. The purpose of this document is to provide a general view of the main functionalities of \code{adephylo}, and to show how this package can be used along with \code{ape}, \code{phylobase} and \code{ade4} to analyse comparative data. %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \section{First steps} %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \subsection{Data representation: why we are not reinventing the weel} %%%%%%%%%%%%%%%%%%%%% Data representation can be defined as the way data are stored in a software (R, in our case). Technically, data representation is defined by classes of objects that contain the information. In the case of phylogeny and comparative data, very efficient data representation are already defined in other packages. Hence, it makes much more sense to use directly objects from these classes. \\ Phylogenies are best represented in Emmanuel Paradis's \code{ape} package (\url{http://ape.mpl.ird.fr/}), as the class \code{phylo}. As \code{ape} is by far the largest package dedicated to phylogeny, using the \code{phylo} class assures a good interoperability of data. This class is defined in an online document: \url{http://ape.mpl.ird.fr/misc/FormatTreeR_28July2008.pdf}. \\ However, data that are to be analyzed in \code{adephylo} do not only contain trees, but also traits associated to the tips of a tree. The package \code{phylobase} (\url{http://r-forge.r-project.org/projects/phylobase/}) is a collaborative effort designed to handling such data. Its representation of phylogenies slightly differs from that of \code{ape}; the class \code{phylo4} was originally an extension of the \code{phylo} class into formal (S4) class, but it has now evolved into something more original. The S4 class \code{phylo4d} (`d' for `data') can be used to store a tree and data associated to tips, internal nodes, or even edges of a tree. Classes of \code{phylobase} are described in a vignette of the package, accessible by typing: <>= vignette("phylobase") @ ~\\ As trees and comparative data are already handled by \code{ape} and \code{phylobase}, no particular data format shall be defined in \code{adephylo}. In particular, we are no longer using \code{phylog} objects, which were used to represent phylogenies in \code{ade4} in a very \textit{ad hoc} way, without much compatibility with other packages. This class is now deprecated, but all previous functionalities available for \code{phylog} objects have been re-implemented and -- in some cases -- improved in \code{adephylo}. %%%%%%%%%%%%%%%%%%%%% \subsection{Installing the package} %%%%%%%%%%%%%%%%%%%%% What is tricky here is that a vignette is basically available once the package is installed. Assuming you got this document before installing the package, here are some clues about installing \code{adephylo}. \\ First of all, \code{adephylo} depends on other packages, being \code{methods}, \code{ape}, \code{phylobase}, and \code{ade4}. These dependencies are mandatory, that is, you actually need to have these packages installed before using \code{adephylo}. Also, it is better to make sure you are using the latest versions of these packages. This can be achieved using the \texttt{update.packages} command, or by installing devel versions from R-Forge (\url{http://r-forge.r-project.org/}). In all cases, the latest version of \code{adephylo} can be found from \url{http://r-forge.r-project.org/R/?group_id=303}. \\ We load \textit{adephylo}, alongside some useful packages: <>= library(ape) library(phylobase) library(ade4) library(adephylo) search() @ %%%%%%%%%%%%%%%%%%%%% \subsection{Getting started} %%%%%%%%%%%%%%%%%%%%% All the material of the package is summarized in a manpage accessible by typing: <>= ?adephylo @ The html version of this manpage may be preferred to browse easily the content of \code{adephylo}; this is accessible by typing: <>= help("adephylo", package="adephylo", html=TRUE) @ To revert help back to text mode, simply type: <>= options(htmlhelp = FALSE) @ %%%%%%%%%%%%%%%%%%%%% \subsection{Putting data into shape} %%%%%%%%%%%%%%%%%%%%% While this is not the purpose of this document to go through the details of \code{phylo}, \code{phylo4} and \code{phylo4d} objects, we shall show briefly how these objects can be obtained. % % % % % % % % % % % \subsubsection{Making a \code{phylo} object} % % % % % % % % % % % The simplest way of turning a tree into a \code{phylo} object is using ape's function \code{read.tree}. This function reads a tree with the Newick (or `parentetic') format, from a file (default, argument \code{file}) of from a character string (argument \code{text}). <>= data(ungulates) ungulates$tre myTree <- read.tree(text=ungulates$tre) myTree plot(myTree, main="ape's plotting of a tree") @ It is easy to convert \code{ade4}'s \code{phylog} objects to a \code{phylo}, as \code{phylog} objects store the Newick format of the tree in the \code{\$tre} component. \\ Note that \code{phylo} trees can also be constructed from alignements (see \code{read.GenBank}, \code{read.dna}, \code{dist.dna}, \code{nj}, \code{bionj}, and \code{mlphylo}, all in \code{ape}), or even simulated (for instance, see \code{rtree}). \\ Also note that, if needed, conversion can be done back and forward with \code{phylo4} trees: <<>>= temp <- as(myTree, "phylo4") class(temp) temp <- as(temp, "phylo") class(temp) all.equal(temp, myTree) @ % % % % % % % % % % % \subsubsection{Making a \code{phylo4d} object} % % % % % % % % % % % \code{phylo4d} objects are S4 objects, and are thus created in a particular way. These objects can be obtained in two ways, by reading a Nexus file containing tree and data information, or by `assembling' a tree and data provided for tips, nodes, or edges. Nexus files containing both tree and data can be read by \code{phylobase}'s function \code{readNexus} (see corresponding manpage for more information). The other way of creating a \code{phylo4d} object is using the constructor, also named \code{phylo4d}. This is a function that takes two arguments: a tree (\code{phylo} or \code{phylo4} format) and a \code{data.frame} containing data, for tips by default (see \code{?phylo4d} for more information). Here is an example: <>= ung <- phylo4d(myTree, ungulates$tab) class(ung) table.phylo4d(ung) @ %% \noindent Note that the constructor checks the consistency of the %% names used for the tips of the tree and for the rows of the data.frame. %% Inconsistencies issue an error. %% To override this behaviour, one can specify %% \code{use.tip.names=FALSE}. %% However, this can be tricky: often, mismatches between names can %% indicate that data are not sorted adequately; moreover, object created %% with such mismatches will often be invalid objects, and may issue %% errors in further analyses. %% \\ Data are stored inside the \code{@data} slot of the object. They can be accessed using the function \code{tdata}: <<>>= x <- tdata(ung, type="tip") head(x) @ %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \section{Exploratory data analysis} %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% \subsection{Quantifying and testing phylogenetic signal} %%%%%%%%%%%%%%%%%%%%% In this document, the terms `phylogenetic signal' and `phylogenetic autocorrelation' are used interchangeably. They refer to the fact that values of life-history traits or ecological features are not independent in closely related taxa. Several procedures are implemented by \code{adephylo} to measure and test phylogenetic autocorrelation. % % % % % % % % % % % \subsubsection{Moran's $I$} % % % % % % % % % % % The function \code{moran.idx} computes Moran's $I$, the most widely-used autocorrelation measure. It can also provide additionnal information (argument \code{addInfo}), being the null value of $I$ (i.e., the expected value in absence of phylogenetic autocorrelation), and the range of variation of $I$. It requires the degree of relatedness of tips on the phylogeny to be modelled by a matrix of phylogenetic proximities. Such a matrix can be obtained using different methods implemented by the function \code{proxTips}. <>= W <- proxTips(myTree, met="Abouheif") moran.idx(tdata(ung, type="tip")$afbw, W) moran.idx(tdata(ung, type="tip")[,1], W, addInfo=TRUE) @ From here, it is quite straightforward to build a non-parametric test based on Moran's $I$. For instance (taken from \code{?moran.idx}): <>= afbw <- tdata(ung, type="tip")$afbw sim <- replicate(499, moran.idx(sample(afbw), W)) # permutations sim <- c(moran.idx(afbw, W), sim) cat("\n=== p-value (right-tail) === \n") pval <- mean(sim>=sim[1]) pval plot(density(sim), main="Moran's I Monte Carlo test for 'bif'") # plot mtext("Density of permutations, and observation (in red)") abline(v=sim[1], col="red", lwd=3) @ \noindent Here, \code{afbw} is likely not phylogenetically autocorrelated. % % % % % % % % % % % \subsubsection{Abouheif's test} % % % % % % % % % % % The test of Abouheif (see reference in \code{?abouheif.moran}) is designed to test the existence of phylogenetic signal. In fact, it has been shown that this test amounts to a Moran's $I$ test with a particular proximity matrix (again, see references in the manpage). The implementation in \code{abouheif.moran} proposes different phylogenetic proximities, using by default the original one. The function can be used on different objects; in particular, it can be used with a \code{phylo4d} object. In such case, all traits inside the object are tested. The returned object is a \code{krandtest}, a class of object defined by \code{ade4} to store multiple Monte Carlo tests. Here is an example using the ungulates dataset: <>= ung.abTests <- abouheif.moran(ung) ung.abTests plot(ung.abTests) @ \noindent In this case, it seems that all variables but \code{afbm} are phylogenetically structured. \\ Note that other proximities than those proposed in \code{abouheif.moran} can be used: on has just to pass the appropriate proximity matrix to the function (argument \code{W}). For instance, we would like to use the correlation corresponding to a Brownian motion as a measure of phylogenetic proximity. First, we must estimate branch lengths, as our tree does not have any (ideally, we would already have a tree with meaningful branch lengths): <<>>= hasEdgeLength(ung) myTree.withBrLe <- compute.brlen(myTree) @ \noindent Now, we can use ape's function \code{vcv.phylo} to compute the matrix of phylogenetic proximities, and use this matrix in Abouheif's test: <<>>= myProx <- vcv.phylo(myTree.withBrLe) abouheif.moran(ung, W=myProx) @ \noindent In the present case, traits no longer appear as phylogenetically autocorrelated. Several explanation can be proposed: the procedure for estimating branch length may not be appropriate in this case, or the Brownian motion may fail to describe the evolution of the traits under study for this set of taxa. % % % % % % % % % % % \subsubsection{Phylogenetic decomposition of trait variation} % % % % % % % % % % % The phylogenetic decomposition of the variation of a trait proposed by Ollier et al. (2005, see references in \code{?orthogram}) is implemented by the function \code{orthogram}. This function replaces the former, deprecated version from \code{ade4}. \\ The idea behind the method is to model different levels of variation on a phylogeny. Basically, these levels can be obtained from dummy vectors indicating which tip descends from a given node. A partition of tips can then be obtained for each node. This job is achieved by the function \code{treePart}. Here is an example using a small simulated tree: <>= x <- as(rtree(5),"phylo4") plot(x,show.n=TRUE) @ <<>>= x.part <- treePart(x) x.part @ \noindent The obtained partition can also be plotted: <>= temp <- phylo4d(x, x.part) table.phylo4d(temp, cent=FALSE, scale=FALSE) @ \noindent What we would like to do is assess where the variation of a trait is structured on the phylogeny; to do so, we could use these dummy vectors as regressors and see how variation is distributed among these vectors. However, these dummy vectors cannot be used as regressors because they are linearly dependent. The orthogram circumvents this issue by transforming and selecting dummy vectors into a new set of variables that are orthonormal. The obtained orthonormal basis can be used to decompose the variation of the trait. Even if not necessary to get an orthogram, this basis can be obtained from \code{treePart}: <<>>= args(treePart) temp <- phylo4d(x, treePart(x, result="orthobasis") ) @ \noindent And here are the first 8 vectors of the orthonormal basis for the ungulate dataset: <>= temp <- phylo4d(myTree, treePart(myTree, result="orthobasis") ) par(mar=rep(.1,4)) table.phylo4d(temp, repVar=1:8, ratio.tree=.3) @ The decomposition of variance achieved by projecting a trait onto this orthonormal basis gives rise to several test statistics, that are performed by the function \code{orthogram}. Like the \code{abouheif.moran} function, \code{orthogram} outputs a \code{krandtest} object: <>= afbw.ortgTest <- orthogram(afbw, myTree) afbw.ortgTest @ \noindent Here again, \code{afbw} does not seem to be phylogenetically structured. %%%%%%%%%%%%%%%%%%%%% \subsection{Modelling phylogenetic signal} %%%%%%%%%%%%%%%%%%%%% % % % % % % % % % % % \subsubsection{Using orthonormal bases} % % % % % % % % % % % The previous section describing the orthogram has shown that testing phylogenetic signal underlies a model of phylogenetic structure. In the case of the orthogram, several tests are based on the decomposition of the variance of a trait onto an orthonormal basis describing tree topology. In fact, it is possible to extend this principle to any orthonormal basis modelling phylogenetic topology. Another example of such bases is offered by Moran's eigenvectors, which can be used to model different observable phylogenetic structures (see references in \code{me.phylo}). Moran's phylogenetic eigenvectors are implemented by the function \code{me.phylo} (also nicknamed \code{orthobasis.phylo}). The returned object is a data.frame with the class \code{orthobasis} defined in \code{ade4}; columns of this object are Moran's eigenvectors. An \code{orthobasis} can be coerced to a regular \code{data.frame} or to a matrix using \code{as.data.frame} and \code{as.matrix}. <<>>= me.phylo(myTree.withBrLe) @ \noindent Moran's eigenvectors are constructed from a matrix of phylogenetic proximities between tips. Any proximity can be used (argument \code{prox}); the 5 proximities implemented by the \code{proxTips} function are available by default, giving rise to different orthobases: <>= ung.listBas <- list() ung.listBas[[1]] <- phylo4d(myTree, as.data.frame(me.phylo(myTree.withBrLe, method="patristic"))) ung.listBas[[2]] <- phylo4d(myTree, as.data.frame(me.phylo(myTree, method="nNodes"))) ung.listBas[[3]]<- phylo4d(myTree, as.data.frame(me.phylo(myTree, method="Abouheif"))) ung.listBas[[4]] <- phylo4d(myTree, as.data.frame(me.phylo(myTree, method="sumDD"))) par(mar=rep(.1,4), mfrow=c(2,2)) invisible(lapply(ung.listBas, table.phylo4d, repVar=1:5, cex.sym=.7, show.tip.label=FALSE, show.node=FALSE)) @ \includegraphics[width=.8\textwidth]{figs/adephylo-figFourBas} \noindent In this case, the first Moran's eigenvectors are essentially similar. In other cases, however, the orthobases built from different proximities can be quite different. \\ One of the interests of Moran's eigenvectors in phylogeny is to account for phylogenetic autocorrelation in a linear model. This can be achieved using the appropriate eigenvector as covariate. Here is an example when studying the link of two traits in ungulate dataset. <>= afbw <- log(ungulates$tab[,1]) neonatw <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) names(afbw) <- myTree$tip.label names(neonatw) <- myTree$tip.label plot(afbw, neonatw, main="Relationship between afbw and neonatw") lm1 <- lm(neonatw~afbw) abline(lm1, col="blue") anova(lm1) @ \noindent Are the residuals of this model independent? <>= resid <- residuals(lm1) names(resid) <- myTree$tip.label temp <- phylo4d(myTree,data.frame(resid)) abouheif.moran(temp) table.phylo4d(temp) @ \noindent No, residuals are clearly not independent, as they exhibit strong phylogenetic autocorrelation. In this case, autocorrelation can be removed by using the first Moran's eigenvector as a covariate. In general, the appropriate eigenvector(s) can be chosen by usual variable-selection approaches, like the forward selection, or using a selection based on the existence of autocorrelation in the residuals. <<>>= myBasis <- me.phylo(myTree, method="Abouheif") lm2 <- lm(neonatw~myBasis[,1] + afbw) resid <- residuals(lm2) names(resid) <- myTree$tip.label temp <- phylo4d(myTree,data.frame(resid)) abouheif.moran(temp) anova(lm2) @ The link between the two variables is still very statistically significant, but this time the model is not invalid because of non-independence of residuals. % % % % % % % % % % % \subsubsection{Autoregressive models} % % % % % % % % % % % Autoregressive models can also be used to remove phylogenetic autocorrelation from residuals. This approach implies the use of a phylogenetically lagged vector, for some or all of the variates of a model (see references in \code{?proxTips}). The lag vector of a trait $x$, denoted $\tilde{x}$, is computed as: $$ \tilde{x} = Wx $$ \noindent where $W$ is a matrix of phylogenetic proximities, as returned by \code{proxTips}. Hence, one can use an autoregressive approach to remove phylogenetic autocorrelation quite simply. We here re-use the example from the previous section: <<>>= W <- proxTips(myTree, method="Abouheif", sym=FALSE) lagNeonatw <- W %*% neonatw lm3 <- lm(neonatw ~ lagNeonatw + afbw) resid <- residuals(lm3) abouheif.moran(resid,W) @ \noindent Here, this most simple autoregressive model may not be sufficient to account for all phylogenetic signal; yet, phylogenetic autocorrelation is no longer detected at the usual threshold $\alpha=0.05$. %%%%%%%%%%%%%%%%%%%%% \subsection{Using multivariate analyses} %%%%%%%%%%%%%%%%%%%%% Multivariate analyses can be used to identify the main biodemographic strategies in a large set of traits. This could be the topic of an entire book. Such application is not particular to \code{adephylo}, but some practices are made easier by the package, used together with \code{ade4}. We here provide a simple example, using the \code{maples} dataset. This dataset contains a tree and a set of 31 quantitative traits (see \code{?maples}). First of all, we seek a summary of the variability in traits using a principal component analysis. Missing data are replaced by mean values, so they are placed at the origin of the axes (the `non-informative' point). <>= f1 <- function(x){ m <- mean(x,na.rm=TRUE) x[is.na(x)] <- m return(x) } data(maples) traits <- apply(maples$tab, 2, f1) pca1 <- dudi.pca(traits, scannf=FALSE, nf=1) barplot(pca1$eig, main="PCA eigenvalues", col=heat.colors(16)) @ \noindent One axis shall be retained. Does this axis reflect a phylogenetic structure? We can represent this principal component onto the phylogeny. In some cases, positive autocorrelation can be better perceived by examining the lag vector (see previous section on autoregressive models) instead of the original vector. Here, we shall plot both the retained principal component, and its lag vector: <>= tre <- read.tree(text=maples$tre) W <- proxTips(tre) myComp <- data.frame(PC1=pca1$li[,1], lagPC1=W %*% pca1$li[,1]) myComp.4d <- phylo4d(tre, myComp) nodeLabels(myComp.4d) <- names(nodeLabels(myComp.4d)) table.phylo4d(myComp.4d) @ \noindent It is quite clear that the main component of diversity among taxa separates descendants from node 19 from descendants of node 24. Phylogenetic autocorrelation can be checked in `PC1' (note that testing it in the lag vector would be circulary, as the lag vector already otimizes positive autocorrelation), for instance using Abouheif's test: <>= myTest <- abouheif.moran(myComp[,1], W=W) plot(myTest, main="Abouheif's test using patristic proximity") mtext("First principal component - maples data", col="blue", line=1) @ \noindent To dig further into the interpretation of this structure, one can have a look at the loadings of the traits, to see to which biological traits these opposed life histories correspond: <>= ldgs <- pca1$c1[,1] plot(ldgs, type="h", xlab="Variable", xaxt="n", ylab="Loadings") s.label(cbind(1:31, ldgs), lab=colnames(traits), add.p=TRUE, clab=.8) temp <- abs(ldgs) thres <- quantile(temp, .75) abline(h=thres * c(-1,1), lty=2, col="blue3", lwd=3) title("Loadings for PC1") mtext("Quarter of most contributing variables indicated in blue", col="blue") @ \noindent As a reminder, species with a large black symbol would be on the top of this graph, while species with a large white symbol would lie on the bottom. %%%%%%%%%%%%%%%%%%%%% %\subsection{Performing a phylogenetic Principal Component Analysis} %%%%%%%%%%%%%%%%%%%%% \end{document} adephylo/vignettes/figs/0000755000176200001440000000000013176115560015024 5ustar liggesusersadephylo/vignettes/figs/adephylo-017.pdf0000644000176200001440000001230513215710500017617 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105823) /ModDate (D:20171218105823) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 1126 /Filter /FlateDecode >> stream xXMo5 "G7w]J - J+c;oj 3Cgq#q;t'!& @M}vwHZk {ߐ܏[!UGLi)^5lZ1$؇"!F>A- BHBF~dËFL ${s6qC3Y>!*O*5S#$r%-`:EϠ).5(BÙ)ߣF2 :]C Ph^8z]5l/R 1 D5RW +X leAΔݗ ǯٞWI"Ś!0*cva[Eh^ NxQ Jﶛ%l]UL%m&"hMD5PDhBܜ-ظƥCܜi{=ҡp;=:~H4ٝ>o޸= N[^MB遚O(u_O9 A٠IdͅmxET!`BٹĶh\$mAC[}E*CR&ӶHhSPV{я6mKВkU$\4 Lۊ\t"!C. lЦhm"hE%V*K.\&7&.y-h-R`{Ƃ. 7K~F&9Ee)HMG+;gԨZ㵎n\E{QMphۋJ}۸E*CRT*[$RqE5%0+Ec2:n , :.I[ 4_*[΢gvnWc|/~`'a/P#ʳx="r| WCϧ׳[NWc܋;lnoZ;dt -dQzq_[EEwzL?xfQs˺t<TnN Dw4AF/p94~r Ӣ=$=+ZV fYP"vWoa %!R.t_h"*xF~ОHzJ{ O8QIy9XPendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R /F4 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000001490 00000 n 0000001573 00000 n 0000001708 00000 n 0000001741 00000 n 0000000212 00000 n 0000000292 00000 n 0000004436 00000 n 0000004693 00000 n 0000004777 00000 n 0000004874 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 4979 %%EOF adephylo/vignettes/figs/adephylo-figFourBas.pdf0000644000176200001440000002541613215710500021346 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105824) /ModDate (D:20171218105824) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 6966 /Filter /FlateDecode >> stream x]K,qޟ_1xQMr+`] +%YK ԓ,ΰL p!>$o/pݷ$wo"T_7,mAjo|ݶ_=o^-|[57I=?ڽ5m9ޏQ̗6Z5pÔQ_)6gq7Q߲ԏ9:O!wl^!i%aK$jC%Jϗh/Q)+Ql%J_*=%:^ow{|]6uGM>m>GM~S9jw5Li_+rԼzLo>5;%:ꗷl/QmD׼brNc}59\\M.;c ojp۱\i0F,?۳/ x_3lC??ŐxNXxNPO|ٕ쿿\ 7[F@V"Aլǭtr0+q#񥞿z>$8-Cۿۧ!Oo />:7\B]_ѯ`/{\ϐ>`23y *r/ťfFOȑdie ?Bh_]}W"+BaW>LM͉Z{ö>>_KKáI ]@,[:!gW/^_rQFJ-갣8VWYHjN u${ꩳР]*`'( |8*7t43?xXº'P|W |V@U:ŝ[K!h-\Z?onsoR g`>~8-P)bc洀g뮗 (0K/P |V[B= ]KNߪ{0C-. 4@ qSr ޜ>l!CVlXF:l㒯@ugp]yL`kS&‰*"m.Ԭa+ pXkMJ85ñ3Ȇcߡ4,јI>YZRy=C{~D1gK֔uz9p5ynmc-/u]mmR6ժ ٶH֔uzc[oM+Ȥ(f-R֝=C9) ݥpBH̴E-1*۶{mmkYw7 ;t)O"nن,kk -S-u uW^ɃOkrޓ.ڊQwbbK4Tv 4l }),ńPS-z]I98Y;LUצZ҅)ayms~RK/' 405}~kuM=׵K] rUSpҜeϑ{I?53rXƋ!~# ) ot?SA{. =)+b臗_-V\HYW[+(C6/x9j+7PcKxθ>-Mċ3\SgsЄxbV$…$$4@[rV?LNʑ(.|gWsv]!S4 ȷ亶x^鳠[75 aG t%֣k>N8d=1㮔RGG3zӶPL9H@g/v Tߢ@9a*(p3OS^2컎٫ĸק(O5ȵ1UBUbS: jj^K&(`OStJ(PjnS=%L=f*(4EWq0}ʀ!t6!R Զ (VAXS`mM(AxϭPAA<<Tbs˙=͎YO3j?2͎l§sܕ:]Pǣ YYLݢC9l;z*,Rt>>rd0Z\> /cy<>\r6zjRltdv{*xr%[ĸl֔jQ8-gK֔uz3.׼(ZS*}EՂ(Z#RWՖX6F[8f"ZS֝}@K+Zr!~C' B_Z *5< ^XK@Z^f9[}c G~kz/(;ij/F aoT-60G Aj EiZ%_k*n 7 yq"c=x3-1½'ҳRyykMYw ؗ!,;y)jprlo`86r 18nq־YR4f)86JE-ՒqlvȱV'L@ғ)M,m x, DG6$J䇉Q3E}PUP8NDM~8%jā(QO5'D#L?hBES߬D+ɡDmDr(QDsԯN$5m"9h}}w#[-d%dmX*VK%s}ͤ Eo]*_0'=Eez~V}o]w}޼kXm]"y5p`p^vI)` Dr!\N!{1 9x#_黯7J9֗_.u}KuHXp;MQǂaX|qA/(;D]D>u!ܲA8>tIKsvV@ҜaUż5`ܐ-!grVF@kxipd'WYhX|`#AD-ϥYH2y[pw9K?'+/+x]woO`?BEЕMTZ7)Nv8'Ŧb|')Nuؑ*9:Tg]^V?6'1ax^އ_"7v@u|S:C1LN1LaHpqPI.3D~?pw/oݏ#LMr6g:)HB Gl!=~{g;r3~oOl] -k\~SMEso*GLS%#zw$CWTɕ%C৥7%'Z#&އ^}K.WP-DwTCS}ɕE٧vVzщǓPWKLaְ%6Rm]C, `mk/nr7]dAT'StU@wξʵz89ԣ$u z r=ɓ<>+ eEx6Ќo}=[װѧ cAݳf^BZ-R/֝-Kxi偳 -m+XP[9;(݁l˳%_kOs?ᙳBs{JKhZ]&WwK>Z~kOf|<=k\5 cz1^fxLw`w;T%wv丐7V8;2x`u`u8UULAߌQϱ:G=]=ˤjg&G&Fgҵ~d _,#%e) $p܍   @gj6 0淉n1i:MIP*ԉlo5|j @IB-C;XSx xMRL\90MiB :3o8My) :Ԕ8s_pIי- D%[i%*ϼSfJ@Q Āhkǩq5̬%fVJSQ Esj6PS[i,]gf4P9>$sz5XN0;&aᝏh392M ϧ;z`Ӡ^{5c;ijs-e`lb峈deHM|V@'@#)&6;TSɇGLU2j$߬9$M{Ɯq37k 5sufmli'/aP$Li}Hj3="S%' *aLHY!:CZ/:@hR" W;Rrx 3Xzvv /'XMaB  aӟQ!5kRkC6rDH DmXTDvsR߉^hc}xDJ7|R#@. [˅u}t(;~hiN~ { hDUޮм U.Z"?̹ IGs0~q/aĂ^sF`ˣ~?Zޟ?rL&ٮ#C$ +{`Ŵ_z9B s[VGJ}d8^דZ>e}} (䔯bUS]ZWBJ"vQ()_/ !KE|(d~bt|dRiPL%)2Y'JA2ԁgJ.FFfMB>yiԓ0OJg29j掔\tIgr˵=[W7Yendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000007330 00000 n 0000007413 00000 n 0000007537 00000 n 0000007570 00000 n 0000000212 00000 n 0000000292 00000 n 0000010265 00000 n 0000010522 00000 n 0000010606 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 10703 %%EOF adephylo/vignettes/figs/adephylo-lm1.pdf0000644000176200001440000001146613215710500020010 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105824) /ModDate (D:20171218105824) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 731 /Filter /FlateDecode >> stream xVMOA =yJHCCB()MvPllb޾xy<@p dyzNw t3Lj:dg|2 5[ ސ=djlOj:U/isE#*VxԻ8g!pmT%qa~ćvZJOV A$o+]z|:JzBOv콧n|EuWһΚwa.Uu p q7̾h>N.k-jts˧r+X/׋mE4 b}?ՠ&gP &b9X /H{RoƳ/endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R /F3 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000001094 00000 n 0000001177 00000 n 0000001312 00000 n 0000001345 00000 n 0000000212 00000 n 0000000292 00000 n 0000004040 00000 n 0000004297 00000 n 0000004381 00000 n 0000004478 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 4580 %%EOF adephylo/vignettes/figs/adephylo-pca2.pdf0000644000176200001440000001456213215710500020144 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105824) /ModDate (D:20171218105824) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 2323 /Filter /FlateDecode >> stream xˎ>_t|GKHHG `dFWԳ;bgXdUX'Ǚƙ߻oߤfhNƹh}4>$ti37?͛wNdwo%_v`&ΙqmŸmڸ _w; 2)L:lr"'{b~2#|NaTm {mJ#ېf )ކ`h pNplK{lÈJ‰XLF0lwx+&>R; ]̎T`& pQ$*ܺ!3`R`q {j}5)<͝ a 9Y?)&F39bw﫳3S;091Sֱ[3S;0U;#4>&fP=F+f f9x6˝ cĆ`0=Vv= +7>T C^9i{z7[V1-}eC;^YЎWV;&ւ/$7/{8`X xqm^\|x?M<2meD"6PwDn 3xP׊Ba`kdyos6PkHΝ7P/$.[%5ޛl}p*ֶؚk[lM}$ԛlMM&1z5,`*M-.Bhb~'ȟyX4H~PHLҺ S¡!p31<{ +C%$bI1H0XR p+c.oOC)rJ1C0R -kC%~bI1^RKz -+C)Ōllq6t͆=@Z @FH|zEA/ʹ o– Oxʛ!–e]ڕ܇kX3Tm`zk(<ؐu />)o \d<~=f0sjffp܋ 锒[mʶ:>\ C u-NxzP0yr.>aQ-cVZ7cˌKh]" [UR]ɍVr!FV\ n_%5OEW>h}3d` z8W2VVb6 zԹf$e]o" ļgB2iA1..5-A-{˺%+ ҄(2H/#\@N@#ܓvoM $PI~rbTiA[%ϴ1o&Πw<_Zvj\B{͂MiFB z6+F+FH첡GJU`v`o]"-x]Fy'm$ u"4FoTyD|IO H#F$#P4@ `B(?>g7u3ŃY G@*J3ajDy4V ͞3a$PZ/J c\B{yʠ < W;MǛϟsxq0LT?˪Jx?z;n.f}{yTe^mRzG/u{qGH!?noꊩ΂}8~bb>GTr=f=߿#Ç=H }?J)B7J >]?0Kۛr ǃ^Çg 1dͥ`G0w H4˟ϼJE9]z%rُ𬠃Hi?z.n&rsBFQʟN*0|B6Fqe6=MA[>6hӀb:(6}SSrT$< \'a2ʓLj2̒0JqW(vi< 89TTL_ _3.|.şY.VNN:Nihѵ̰℔5*uƲ2 JdQ endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R /F4 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000002687 00000 n 0000002770 00000 n 0000002905 00000 n 0000002938 00000 n 0000000212 00000 n 0000000292 00000 n 0000005633 00000 n 0000005890 00000 n 0000005974 00000 n 0000006071 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 6176 %%EOF adephylo/vignettes/figs/adephylo-loadings.pdf0000644000176200001440000001315613215710500021115 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105824) /ModDate (D:20171218105824) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 1670 /Filter /FlateDecode >> stream xYMW[7WhQ%$-MsHS,( )Lڞч$-b3ּyWW/kQ(tFܜo?LIh?ǿW?/Lx5Zz8~Vqz)`$q=z42q=LZ Pd04jdJKYX9F#4h| 'j4L&HY:CQ8HwF#d- cCVye k*6^ڐ5B!Ȥ5bCX4fN4Y|eFGƊ`b xߣB5䡘JƆ*5L8-]CXW1Š@m aEbIVdMF$>Q#zoY5[JڱǎY֎#S0VdP y/D" B0VdU9yI aE)B?69Xr6|9  @[bYJNYY-(.~),bd ޯgq\ YC׳8@uw*?=rOpڤ,_q(f.Vf?=<?_8G-?4M<|[ζ3j/HArv'UnTHk7sʉ?Pwb,脚wp՟JWwXdEmםڎ鴝3mԥ*7H4ZF> Nѩ3}VYw-^޾uoYd]Fyz`VP( (As$R!IjHk2b܎.Ft[嗫b=FD#T\KhY4 QpsSk'X!w MN`bu<"FpF>=Tt^S`M:ƝTt)06yJ9ޣ׸u@Ssy? f~b4K@<%m f i&tyK5qOX_o'g+V@삥%s9>(U>ăy#jEt:$<#B>Up[Lf`FsanY]u4[|;;:!U̦[,]ʑt뇫M38} Ի*f]mŋ;+xQ⹁CfԺ3r$ؤjvA>6yK# '4M)(2.ץO-Oo_D @?8lgʛH9jJt+{ =!9Ɠ&cG\,7g\D[mnV᭦}(/*SAU ^A3J8+f=.7g4ωek=45sg5g~`U7d7=2b+KEۛ5<|#W/:F8M,62YR̚w%݌:<8 )nqߜ+eXfX /nT(rW?f HGdqm<-&OoX9V?!j@ޕkۃןⅷ7z#׻[qv}uGq[CpO+wj}qvz{_ic}endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000002034 00000 n 0000002117 00000 n 0000002240 00000 n 0000002273 00000 n 0000000212 00000 n 0000000292 00000 n 0000004968 00000 n 0000005225 00000 n 0000005322 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 5424 %%EOF adephylo/vignettes/figs/adephylo-012.pdf0000644000176200001440000001745412617071127017636 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130810112958) /ModDate (D:20130810112958) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 3908 /Filter /FlateDecode >> stream xZɮ]83p9W 24 H2ۊ}VϽ,=fUϷxǭ^QNn[^vǟ}?mo}{v7?ؾ46멍ȧ҄hM(SBhVINDOfhh9ǩhٍfYZafi':%f"f:퍨v>z!ʧYf6ZӾ@ Q EjDDKana}&˨ _7 KۉvmލFVoKWV mUZ+jlۊ]:5O^$h6#*4Sb[^2Jk3i_: aܔijGqReӂ#8龥$ƈi,ale̒)a T.ǩq Tq7)O5@ )9&8,cS~`J)#_:*w΁Nb#lVj |FcR%^4D40s~5J#j{aaZa|ɞDpi5<^#p8_g n9dOl4sI2?x0<^e*x Ļ I܄qP\qМ=?^(֣!<Kl~a܏LO|0i x&|D M46UB_D*8?06RZF`hk?8w(/棞nFVwWqga?9|_+Q*ʏ{z`~30tz]@Cm{P;>%~|To8_ۈ3b> Q}e4OW >#N-G>l4Ĩyk]|??t{HX_&g_*;} #g;%3 !)q3P|HS;b}=lʱ?*>̇L&FFgqQ{ߒpۥgy KG}|_/`yq>bdOZ&G,jc328ӟܖC 1vB"ֱ=^h2|OD(bih5RA g$ SO=orԇ)tCPZ+16^?IH3b4yp2'0祭ߋtAoD=ԃ8i$C8 eAN"JјC==1 R|q>h |/}E L4zL<8_s=d.Z`ez} }'&n}!;g>AX֤$a/x!>1a1ojZzП>Zؿh7](F`Z}Z;z0 ;SOZ7y_+zp^ԃ͈gA|dX p2κzZVksA)ωy_c7F!e]h4F`S;~^0\i]]* >q>C=,^X_A a<7ԃCq_b>^sZ=ߔ?&w}E@g?D]];5? YW|TG%4p>ЬEEC|vɈPDL"bd~A!Z+;HtTg|=(P[C"f5rCG5vt1Ď>]r%n t؏.lӘO$L۹zT՚֒C*I]jD5#Y~@u8u`#{MМI X ]X;#ܭu8pWp0;T0#үJ.\(ƶ^jph"6 U]A%FhNTNibCQ;B(*=HtB- 6&inBGg5.g@9 ˞JVSyew;+tA+{]P;fH Vhh^v1 (xיg몓PPFf Pew.{ޒ&6iSWQG85Pid#!-<N&hm S@2$3Z߄\j#hr:Q>g8i9:NƑL$2XPi*"NSg4,ERf0C}:~\rwBaTޒB{!k+xaT PAQJe Q-Du")"W(lYP-Jˏ u2JGEo܆_t&T.[)yrk]+3Vzq{3j?oy! _~?|u:[~^._7u̒,~zucSS ȰzthLo>x{mݻgO߾z{~n{n߼>勏}=̖:|4͗mݳ^>{O m> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000004272 00000 n 0000004355 00000 n 0000004478 00000 n 0000004511 00000 n 0000000212 00000 n 0000000292 00000 n 0000007206 00000 n 0000007463 00000 n 0000007560 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 7662 %%EOF adephylo/vignettes/figs/adephylo-phylo4d.png0000644000176200001440000001460512617071127020725 0ustar liggesusersPNG  IHDRJ N PLTEG2 7IDATx흁 9C߻פ"f}5!f} i6.l\ظq9`r倍6.l\ظq9`r倍6.l\ظq9`r倍6.l\ظq9`r倍6.l\ظq9`r倍6.l\ظq9`r倍6.l\ظq9`r倍 `p=A O6.l\ظq9`r倍6.l\ظq9`r倍6.l\ظq9ojqkf#ܾrw"E&qpD?doƧ}Se;@>B@U8NEZ0{oů(^|z[8e^{:rŲ6]8 A`zh{Gr@ 86c26.ۘWrm1e^{VOR0kr0V'*fSGi5*Z@U>28}sFϐ4wE%Oִ:E{<r͛W7t=غtpe綃3󑍂6e 0@&n;Bf|mDfU3"1/%L`}k8E0Kˊ#pУPfW3ci@2^*Sf]iLV$.z:ẎuQG)RwΞ6;愹)#i/¥JQsp L7 OGG|Աɹ;RtSegxW76o^m,?Z7r iR+:8OVg{#<*4O4E'+@2?Rh\_g.:o bcQ}Є>RSf('ćb`>! MsT~ B32#oyo:v 3=B`^YG|yu'Eߖv͛W76o6?[x,Q}'233ؚ^=|Bx}gk|_nмUSft4bJ\I#{ :La:\S-L8nc|&p+ۮ=|s0"\`n##UTjXTƻV{7ksr`Q0MZ 0E3eS&{+;,p Ȑ!|`wr1_ OƟP.aQD`W8 \W~Lq|qպ=`H#`ȍo"sDȦ|CJC]p(z#W]?B 8q啛fFue|#~"~޶.`٤Apª8UߵyXvg49ghp=kV}FCO `Fo"P$ *,N7\TA%*ͪ#+ 7+s+Pa,0C 04ϛE8itįЬb=F^:!}g>ZePV!}[D0Ҫ:s]T!`!fGGgҢCCU,VK7Qzgf7F>B>xh:)lqA9i倧ϖ4K]t_={J8`, rCF\N xۼ2!,6-sΗkŐY}`8R\+Z'U>}Ѹ#ِޠH< qb>nirsEZ"Խ,L2kKh$'̧Ӆ+=0Y>#tIQhU&|h&~T^\jǫ`82zK3D/mEc}YpssFE[5um3dn0GY'>]{lGZOypꥻ^=HttĞMd,MKT1r6`oz58Ʃ.ӻ+vv`hYB\$сæMzED ++/gWKCXEߦ&`h Œk NQ.H:8"cx 4$.>P,y hUIeƬ2NȠ8K@qMe%=; 1`5]o*N|J:d pfs(2QkbOy|t,OU>g.bp x.`i|S0_$q "4r EYLQ"Yrϋt!" xf`w|y>X?:VΌY 0 `(́[]د`Hm8q|2<`Es0qpِWEǻ^X6g$0Spep3U,.ǚA%de+I pGY&lҠYgw͛Wg`=v4\޼M@wVQiDU'Ngp< 0=;?eV}XZfLp?XQ6z;adV+̪+s$Dx! YM ΁+#b9h!q繇.8-#2,SLb:94r-'_%-p[0.6Fs쏏qzzcV8LNm}*]i/^<<p~[#Ɇy-,l<|ʷ~*U`.<*CG#=[h0>BBv~)X130Ik1PpVo|i C$fxm^..Vf/]SAl*f=SEnT ս:@se}L"/64{7#A *c%l`Ɇ:B[&KT"a_0^eZ,`,DXc޹eZK '`< k;|p\XK GjuלJBq<`y}K,~|Nv;8IE3UpMU߽;zaF{I"݀|@4ƣh_'k.L<`ah_GYKۼZ,U :4ųM<,|gP+MtM";`Se+ͪJo(~ pʬ& a~7D pn ibr~f0 CL3 `#x¬QH8J5|F0 xEi˧2ZYC 3Հgwܛ.9U,Y7C 0%$s ) p_.4/u[ 8=,weu|( ,[Z/=-yYxw3 _x*Fgp3ϙrYMqz&K0Uu-He/F5\ XKx?_;{k _JេDQ߸U[-vGѲVn4߯\/+3YJb.Z쓟;lgOzĒ]9Xv}\Wl?=ps6Hs> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 2708 /Filter /FlateDecode >> stream xZIo[W|ph;YАȉ(yJ6(jrbWꭖ=7q?fl&bnO{9zZ;߼;4xdw 7-r0h\n`ӛO ȑaBI#W*rdbS8'4"C{`:#fkt?JΦn{;L%ܯ~VM&kBU8\!diEX{=eBޚj[j9|1)vL#o$7ZNV8':cHwvtϑiR9j5vtLtѢi`[mQRh&tkq0sDolL"tZNzn>tucpN3tBoC;>8Xz{ZIO?Gxy.r;KH110-' {f:q{6\圴[\N&ɹ#5JGGE%?^~ Pwile|̽#%$>3_!1 ]M,^z H:Vdv!$TI؉D*EΔ,䵒xJQo:}`}k&^i:xtYM==`:{8X;;w_8PDaP̠ѡ PTHg p(Vw бp(:V cбp(2Q b_谋؃b "[萭p(QXNwQ"r3d۩R LZn In1Q5f x|~bp= ~`VL45ppqjдG}OW +Dn1aᎋR'QyKfely.كy_.^~mP(>"nO4 7[4ݰx " | ƶO }({ GD{,R@  Vxd`Ֆi9byKxѦBnX$E`]d'ǖ2/=7ZFQ|Fl*;猊 Acd# Reb 61,@b2&+qQ'I(ܘ;=GGwO閍 C7E W'DJ󳶥:hx 7;mKzZ<Z?i M^"guI9Tg= +L2SOC~q;zړ<],u3ч{i`q bD~rm8n"ˬWƅBjd8Xd6E8!y/]44,od̓5yGCpOЁ; .NA`vNK2m p[([* Ds,5Ugu(ad )5IwHD"3V)MHbKd)g^\.^F{*YjdD~WCŁTV)kŻR+ߺǖ2/=)~\[@9RK"SA`'RKrXE~xlG)b}7 W'FFAŸ>A~m6> 1ϕ_;@vsӕ$Kjbʅl7Q* nQ,Y7IW)ԒjW?zβ@`9"4^ 'b"m fcӡ0_W lŢqd]n#o.~fWC #jK?~[EcǏTwUJ͸X\A9gzqŋKf}q)]HGhTTkPW=ũvz{v;ݖۋէn^=ba%9VP{^@-oM "fʖwn?֫ ~_if9A-^,/WMj^|F 5۳WW귟Akiu{[]~g[:A%9JnfƲ!nYgv!~\,&ۍ.qF9A+@k.VKx!K͉:k-;Ҟx?;كOrPDpECkJn($rS{gendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R /F4 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000003072 00000 n 0000003155 00000 n 0000003290 00000 n 0000003323 00000 n 0000000212 00000 n 0000000292 00000 n 0000006018 00000 n 0000006275 00000 n 0000006359 00000 n 0000006456 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 6561 %%EOF adephylo/vignettes/figs/adephylo-016.pdf0000644000176200001440000001024512617071127017631 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130810112958) /ModDate (D:20130810112958) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 323 /Filter /FlateDecode >> stream xMK@+樗~eڢBA&7TP ~bv`}MɆa 'R6v"$"v$zy7ŰuR a{衶~@,k2hcCƍJb##kHv0]q3tq"ڧ=5D5a:?9EƠ 1A0pyX50U`b@U0AJn;wpT{9tPJ53pmo;.OsIi }&XҼ>m1'bNěMJڌK*ZRendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj xref 0 11 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000000686 00000 n 0000000769 00000 n 0000000881 00000 n 0000000914 00000 n 0000000212 00000 n 0000000292 00000 n 0000003609 00000 n 0000003866 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 3963 %%EOF adephylo/vignettes/figs/adephylo-aboutest.pdf0000644000176200001440000001122413215710500021135 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105824) /ModDate (D:20171218105824) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 685 /Filter /FlateDecode >> stream xKo0 -9Iɖk([P"%)Qb[]Q4!N|<~Χs >uqv)bCow0]â7hOzî9lwc`ś1~WWŇiZ q]_|+[0pW\籠&OuH r$.n%жBNbY8x<y+< oi 4cű'A;c,m46Svu6Ne'’3.q)N{YŢ7 Q۔ GzJDNbYIyrwLiI9ZKeyU$`I;]&j9]]H5wԊvtX,haoofgQD>5 u!—hˌQ@ZHFC95Z_I]C\؄Gg2,Z.RA:! ~U-N )m]2BȔG'UBNwyKQR\1*8ve-RҍG q TÒWiQ nпcyշQN[t.hUcMcY3eǩ,9.PIbu{޺IЄ%>E{YbD+> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000001048 00000 n 0000001131 00000 n 0000001254 00000 n 0000001287 00000 n 0000000212 00000 n 0000000292 00000 n 0000003982 00000 n 0000004239 00000 n 0000004336 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 4438 %%EOF adephylo/vignettes/figs/adephylo-012.png0000644000176200001440000001073112617071127017640 0ustar liggesusersPNG  IHDRJ N PLTEQ/IDATx흍(v2QAAiͬX8&,ktEEEEEEEEEEEEEEEEEEEEEEepjV>[2+c4*祟iIE3dO檐"H-Ǧj x{>;]+C¶9YCY>%^ oKru[D8E!+/ZWLH%6h\emɒX R:7!wj}G\zzf 3o{%.pHKw [ Z!aBr.zɭ-M}ƿI^>j/Bm!"{mǶuF) Ǔ!ҐupR#]جщ_XN$룿IX'ztRHW%F6?N_`[a0VfS:"`"`"`"`"`"`"`"`"`"`"`"`PW1!I^uş!Z{9ٻrl Cͨ:!doy aڽFڄ\'i[(59DiB0x\pc[i|Zu2%bT4jﲰ=B83BvZdJ8o{9dJт}|u}eE>o%6i%: lяn%lnIK6nϒfQ1!DCwCH(=M7,JSғ!vH:Iҭ?9eJ΁wxgv"`*yA^"`ת*yA^"`ת*y{j%`hPEL osw 0[R6% x+!#R ԩN o=-y#A^@9}4 NW~j;pn ke.0+-UE^@ /H Jp?.WB_8%^.*pWbfJ]͋ ͍bc0_Y4_Ez1yBӜD&ŝI pGgL=+ݓp4|[ۛ翓E?=pGWP0# BpsZռ"0ȋ-Bj^liج f5/76y5Y ;"`]ۚռ%N䅗 f5/75yY @Mj^|LoW f5/,y*pCWd&`W˛ռXެ' =90ȫ8"`W%j^x&L N<Kռ:,mVYͫOSnݥw5 ؂ 5O %y{ԖNe=?7 x XԬU '`Qsv!&Jn z,i k׭:+y/:&[ 8W:z!/̴}#`fv&L j6W7y V}5  ʿ-7[c /RWaKm kp-A'Y#!`wD^u ѡQV+` E{<"qmun]Kv&o y=5i?}' M݀@ 8 X+*#r1/ `ٴՏ縮pcaEO (Wp'{.{1`qİ\=-"GO8_'58W˫<p&˼"VVjfU%`W3(Ǩ)3# `W/JTTA^ E%`W/JVXA^ j%&`W+4ZI M&>A^Iuyu0ȫ_A^ '`W'>:A0ȫyr:zuA^DycbD`/>S^0ȋ@A />W cn0ҋ#~v䍀7h1ӕGF'K52__^Xl⣆U!^ XLR؂7'Nq-~~uV, /啀˫@2w ֥HZƏ&,ZeA^\Vzu%n]E{'\.dMV~epwZ ZYI,iD"mZA,v_aoyYlp+.ٱ׹L +&`2"`E /¯Y)HHwz 5Gjn'Y6B [0fElsmaf~_GsCު̯I&26 xnl&fzcb`)xmo߈ XMEB|1l/φn,F&`P]8n, AHo5J{-E~qH3Ps~+D=c%`_>`,Zl O>`co [Qo+ER:hImW M~XqwT#-zCXmw$=Z'`4lĆ?.`v?2` ,6`*lXwJ0^?'+dGYxt n\<&Xw +W OE߿s=\c?8vMG٭8xEͨ<twy{Z'.mhߓfvr?0L vU><}Tnǚܣw^8>ve!`]!yyr:8')V(NοvIsssssssssssssssss*NMIENDB`adephylo/vignettes/figs/adephylo-017.png0000644000176200001440000000564512617071127017655 0ustar liggesusersPNG  IHDRJ N PLTEG2 WIDATx흋:3Gu=>ljsf4fwH X= A96 `slA96 `slA96 `slA96 `slA96 `slA96 `slA96 `sli\@B6 `slA96 `sȮtIA$q0{bC8|&EZ#8W&+  ؛$0 J*G~nTlMCK!(|Z2BJFŖ4nxWRFh (xh ._,ucuf~5z,%spŔ׻%[7p'>%[7YY-iYc@pus5W7wYc-I x5W7wYc/sά1$ML{0 d=`s\cKBp,rIE. %!8$"X\cKBp,rIE. %!8$"tS`ܴ%]Jp)7yIr)7yI\[Rn[M{^R'IYk|7*7yIGF#7yIE.I]pCiKBp,rIE. %!8$"X\cKBp,rIE. %!8$"X\Ap 7 b$!8_gtk$!8K$!8{ 9Zk ~c_?+&'?*&&nBp3~N\7#)|\.2:u[<}U\d(XL_EW4{|yllNPn>xebh}|Vkx4)W6೒BI"G$G`RN30O6T6% ٫4Mlu,U\)]7ъI^ ֹnrӞ[nrӞ`,rӞ/8%%mOEnl`$'!< I6OBy͓l`$'!< I6OBy͓l`$'!< I6OBy͓l`$'!< I6OBy͓|U- I G=/ I2OBy͓l`$'!< I6OBy͓l`$'!< I6OBy͓l`$'!< IQ`^`K% Vo^`t%9 ~^cAp?|M^_W3鱀eo-3t%4WK_;&o-6xxCTd׍gi_[s Ep0g??nl3l}ǂV|,W0G x 8rb_7sb^sb_7sb*@p+U=/ %!8$"X\cKBp,rIE. %!8$"X\cKm߁|iKrӞtE4W`6\Ppyowނy΂A GIn.-xrӞt=5=/ %!8$"X\cKBp,rIE. %!8$"X\cKBp,rI[9^K7wV65wUuzmwʑΪ [9Py}Ap+>d,x/]Ap+.b|.ӫ&?/#Nr ?+Zkг4i}/_5kMo^}|KG/ StWe(ttS349u,T[Bu@AMcC@Eիp\ͧٵ{d\̋4[Iϋ| ը_Kc ޯa}0 GAp}@]0{x<3.Q=c4yJ}IL:0 "<.Ԭ}|$GF\5k ^+Ue8?_{xZSs-K'yKĽjI,R&@J%| ygXVԤ$_VzhK:S*kq=x}s\*hGp,gȚ#8s2L?‹Pn' ؜A~ `slA96 `slA96 `slA96 `slA96 `slA96 `slA96 `slA96 `slA96 `slA96(\ϭ4IENDB`adephylo/vignettes/figs/adephylo-resid.pdf0000644000176200001440000001340613215710500020421 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105824) /ModDate (D:20171218105824) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 1703 /Filter /FlateDecode >> stream xXKo7W(1q @XȊ$i}gX M[Q %#k:10LJ%3\ްݒݰDp!Wlcߓ`^ljDc4W pg(Gl_(d(M(82U^yFkhJ”a.H Y%a ё0e4 G UB40y7J#aPT-;Qpb!xGSPfL f : `8 ## ;w etDtGF1@I21e8_9?cr~t^VϘ21٭VX8:?cZ-|)E]1eU6cbֶrmƔa|ڌ3`Wi>Uj 5Mᔤ 8NU &Ké@0+OqqFi0:*O{g/ w)=8/GpAٚMl 68m["o!^}%q1BD0#yq5Bz8919Jh˕t<$GLu\x)Оlo7чUaZ7%olISj T؉7.UQ,L5iFAܪNK?om w0c̔ƔQSFjL1eƄw5UԘ2J]c(]E)t5ט2JgRc(o ]jL1eƔQ17?2ip!7L7\;30WQ.^ o zëbzlRB*J#%AFH+R$y{h ǧƑns I !)#T`%f>EǛ?*#% =IA-Gq t 8PFIhB8qLA-V `Am7QG=2񨠫P.\) - A}!ٌ3e)pԝPdٮ,[ٽ< oJYHUȇk'̋#ʁp "G4'8kWCܣRҸ+NJbK#FA7xn&Y yEw~E\%q $g ؑjnnOQ(<h͡[m=mz Kiٴ[_ ]bnWI+ 9-W~=3 Q>8P~?_unn3Vhd;Bi;'j,pzZÇ<Qu݁ВːM1n}XCu-[\J>-޴Co,w9q1}Z,RagsO c=`W>_nh?vwݦk*>؉u}ZPkn1zڰg1h>zZC%ox?!-<3-[e.1onߔP*\JS(,GB#cz Q> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R /F4 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000002067 00000 n 0000002150 00000 n 0000002285 00000 n 0000002318 00000 n 0000000212 00000 n 0000000292 00000 n 0000005013 00000 n 0000005270 00000 n 0000005354 00000 n 0000005451 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 5556 %%EOF adephylo/vignettes/figs/adephylo-015.pdf0000644000176200001440000001024213215710477017630 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105823) /ModDate (D:20171218105823) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 320 /Filter /FlateDecode >> stream xMK@ +rKv2߽‚.L3bqjaBo:}H @û:phF5c{xj𩞞AEyL(&t4pL dRඤZ鳠1"XoBJT@r ~+ RyTXQ<#)+(}ϒ}gITﳱT,P8Ԥ +FHUjRBf$lBfNIwe֍75 Ґ ">^t̆w:# $nM1b݈ow; 21m2Mmݧ/= Lendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj xref 0 11 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000000683 00000 n 0000000766 00000 n 0000000878 00000 n 0000000911 00000 n 0000000212 00000 n 0000000292 00000 n 0000003606 00000 n 0000003863 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 3960 %%EOF adephylo/vignettes/figs/adephylo-011.pdf0000644000176200001440000001752613215710477017640 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105823) /ModDate (D:20171218105823) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 3950 /Filter /FlateDecode >> stream xZKuϯH Ul<2@E!$2&9 I:SݷSUS/r|wߏ}v̸vDY?{vW|7}P,jfE'=^B([Fn Մ6QA4޸2єU-de -+[[-VFxtuZUr;;QL1:WʊeEsYq2F@5ќDwi|WB.7ou{焟M*4ae>o10— a}5l/vT62h n>3фxk+X4ڰ2;q밲aɨ GUr #bʖؕ36;-|rzxزYn֐ [R8; {%f`JAtC `q'(t48,T̶%ƃ6x8 an1DqrHY/(?.v0|`(Jx.a}MyBc}2ÌQnwǗ@hK_1&^FWɗxg!1f0R~itWbĵ>VL/f1pAv $͚>*êU2d# +`UNc%Qkf &E \಍7!^UajZ&@Up( Vg%?j=љx =~1HSzbTy5O"Y{yu/r ċG`3PVo8 ;jb\ ]_茘x [QHh - (W6P!&%Daw>^at#09$Z/E\Doz-%mĆo† d|JJ|E$H*#FBf>?HL}0?>HTg=x@?@q+01}%n 'v< Cx`Xx& |O|{ģy>o$Nͷ'MePx%"9T(Xk,b M׳`($:O&#f=[+>dO|f>j?ET#RXh=I8/>+(纔z)_c$&PMu!>r~,nte30E>Yw4$nROP['G_Ou6)ڋCBo]?|j%g)(~>|߯zoGb4qSI4R^M> ;Bq[JAǕU}oz{;)ϺO$A⬵[VAϲ|O}=m'*d17eTLZٿKsԃz%'ԃLhzc1f?|/e317~mcb$& ]M\9. "5-z.ܯ* \~%s땎ԇ2և4T=kGxǕzze.a0HVCzASAs 3bH o+"=D6Y,lMg[q<(D=񤽖A=H{ ~mNPG~;sfD\_#ܯkmZظ_+1k-jzUs~tZPx5zaײx_A|Zsi{|ke]Dܴޮ'f<#lܯ~>_CXܯ!lǮ">wb|^œۆ ׀]oJlli~9l_ǃzB=XޡFmBp{CmY3V [;> uίDqA'v?j4Ozp ? %*M""n6:b' %lR7*$1XRؿBKh*ѵ =ȉ_=) 6_Pcg`J iPA<6ƅzz0ԃ]zp 7}z6QV{)'!mx]PV7i?@eIXeV<˸k![3ߩO=]ٿ?Czj#)7'eLL,}>gPo_sgRj̋EA&d,ة3•:/Z-S+4r-Pɔ3Sɞ,H8t=:Y'nmYy܍\NLp%(dJp˔tGyuL9˚/5ɥ J섳u5F8ncPG'e.z}[!_&}#"W?6LrV}8Ӕ8wCk<8[>;'O{g/9}yŷGQ#>?x) ⻇~!6wU(^:1ιG|:POfpAȌȏ,3G% u%i܇>*8O#Q{x'M{7|2' ǩ>r㏫'􉛛o;_zߟ[gGzr^y"?\T{>~)f 'z&/32>" ykLΚ|g_yOv|_ǷQIdz7oOOxů$&AVtHǣc8>7oxOGct߽z; g< uC:P>ٯ /V* l`:7Sd7pǛcVqĀ:k8?=V~RgCǶx7endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000004314 00000 n 0000004397 00000 n 0000004520 00000 n 0000004553 00000 n 0000000212 00000 n 0000000292 00000 n 0000007248 00000 n 0000007505 00000 n 0000007602 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 7704 %%EOF adephylo/vignettes/figs/adephylo-018.pdf0000644000176200001440000001240412617071127017632 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20130810112958) /ModDate (D:20130810112958) /Title (R Graphics Output) /Producer (R 3.0.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 1189 /Filter /FlateDecode >> stream xXMo$5Զv۾fH+d$VJ rU#W~e?}޻.Uأ/ 9om}yG>v;<'#f۲>JU3ܭ|xAL]5Bc+Žٜ`pxa||pF(pf `isEGZ̞2B,K@(hFNXX\8q[MKi-hhl1 #M~fZ$>񅈐!I$rLn2[_ps4!HC>2Ԟ2-dj=e<:g>,cьYaI neANtits|й]t '?<=P/{\kwq9NDqt?{ x*'H EHV@;ήB Yd-ؔ bl[K f0u躠'T(͇XgףAWKeCף> :b⳨ٜz]Cs@+P T(`zr=cr͡9ϳw"=?pC}_(NJ?ރ}{ܽcj%yj5W(Y-UPW/^Pk^@}obH'﹆5k4!`GH-U֨pRBx Nendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R /F4 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000001553 00000 n 0000001636 00000 n 0000001771 00000 n 0000001804 00000 n 0000000212 00000 n 0000000292 00000 n 0000004499 00000 n 0000004756 00000 n 0000004840 00000 n 0000004937 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 5042 %%EOF adephylo/vignettes/figs/adephylo-treePart.pdf0000644000176200001440000000431312617071127021110 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20081216174754) /ModDate (D:20081216174754) /Title (R Graphics Output) /Producer (R 2.8.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R /Resources 4 0 R >> endobj 6 0 obj << /Length 7 0 R >> stream q Q q Q q 59.04 73.44 342.72 299.52 re W n 0.000 0.000 0.000 RG 0.75 w [] 0 d 1 J 1 j 10.00 M 71.73 145.20 m 71.73 361.87 l S 134.86 84.53 m 134.86 205.87 l S 280.74 153.87 m 280.74 257.87 l S 369.84 223.20 m 369.84 292.53 l S 134.86 84.53 m 378.04 84.53 l S 280.74 153.87 m 378.04 153.87 l S 369.84 223.20 m 378.04 223.20 l S 369.84 292.53 m 378.04 292.53 l S 71.73 361.87 m 378.04 361.87 l S 71.73 145.20 m 134.86 145.20 l S 134.86 205.87 m 280.74 205.87 l S 280.74 257.87 m 369.84 257.87 l S BT 0.000 0.000 0.000 rg /F4 1 Tf 12.00 0.00 -0.00 12.00 378.04 80.36 Tm (t2) Tj ET BT /F4 1 Tf 12.00 0.00 -0.00 12.00 378.04 149.69 Tm (t1) Tj ET BT /F4 1 Tf 12.00 0.00 -0.00 12.00 378.04 219.10 Tm (t3) Tj ET BT /F4 1 Tf 12.00 0.00 -0.00 12.00 378.04 288.52 Tm (t5) Tj ET BT /F4 1 Tf 12.00 0.00 -0.00 12.00 378.04 357.69 Tm (t4) Tj ET BT /F4 1 Tf 12.00 0.00 -0.00 12.00 71.73 249.23 Tm (N1) Tj ET BT /F4 1 Tf 12.00 0.00 -0.00 12.00 134.86 140.89 Tm (N2) Tj ET BT /F4 1 Tf 12.00 0.00 -0.00 12.00 280.74 201.67 Tm (N3) Tj ET BT /F4 1 Tf 12.00 0.00 -0.00 12.00 369.84 253.56 Tm (N4) Tj ET Q endstream endobj 7 0 obj 1083 endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> >> endobj 8 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 8 0 R >> endobj xref 0 10 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000001448 00000 n 0000001531 00000 n 0000000212 00000 n 0000000292 00000 n 0000001428 00000 n 0000001612 00000 n 0000001869 00000 n trailer << /Size 10 /Info 1 0 R /Root 2 0 R >> startxref 1973 %%EOF adephylo/vignettes/figs/adephylo-treePart.png0000644000176200001440000000337212617071127021127 0ustar liggesusersPNG  IHDRJ N PLTEpOIDATx݋n6@Q6kڵnnD b78N88N88N88N88N88N88N88N88N88N88N88N88N88N88N88N8,.XLn+p5Ԟv e 6n/gYS+ 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pqxkf݊[]<+g1^o7+pX}֟-pV38N88N88N88N88N88N88N8NdL=S*pʏxxʃg<>ރY1Ȕ'h:wnYc@I}B6vq$3x+I֦ 9#H88N88N88N88N88N88n=F^{Sx>k,<{W%xty|yZ{s>qy[35x; |t 'pq 'pIӾ"Rc%4]wHFyWh!Mwn"SQi"g9fʞW^ !^}>ONw}Ҕiy 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq- |{7 ŁW̱;Zrꮙbw +xGK}~^TGY0eS6n/ǷfQq{|op-K8RܴE_GU}yvm8Rܻ.5vq{7/zog9Dox,p%[~ŋz˽m867&_ 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pq 'pܢɿ9xGlZ0(> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 529 /Filter /FlateDecode >> stream xMo0 <Ƈj"ۀŷKm-GYN,)0`G^B~47r9~~cZ Gyk y(o?X l:4?MDb0(=zaVN3 "YP3$V h$ٚqllЌS 'I3)FLHIϘ5CHj? bX24Q5y^XP!Qh YQ"C3M-e%ur3%c(tl/gen5#w ☘l A.Ⱥ0Yc!Wqʭ$/ߠէ5kJ][p݂kl6ojse:GM*=cXXLz '$J΄nKX)~9%q;'ڝ|jV<*+|*ፓCN:IV '1a 0YivX\r(g\sG@-ik{endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000000892 00000 n 0000000975 00000 n 0000001098 00000 n 0000001131 00000 n 0000000212 00000 n 0000000292 00000 n 0000003826 00000 n 0000004083 00000 n 0000004180 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 4282 %%EOF adephylo/vignettes/figs/adephylo-orthobas1.pdf0000644000176200001440000001455513215710500021223 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20171218105824) /ModDate (D:20171218105824) /Title (R Graphics Output) /Producer (R 3.4.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 2318 /Filter /FlateDecode >> stream xZMo9Ww$;@`bc AxҬeg뷊UTm*n!`YHGx+( B(;Bk-vxkrRJԿoo;/Pf[Ш h J EڊJxl}6A]EfsS,b14'*O`$Xcr5=˵2Tm`Ө a,g~nbAr~U&7TKL͠7d* + PeJrR JhIy@16b?&tRR'm(" ݭzrtR RcQ WXu'۝ H4,t;VqrO՘\'QArU`\kD/BrKSE˵F=NjxOl~>}5}ڜ}֜:Ҝi A7v0DX3 6r0p8X~!\@?$)՝x?W_KDeRl[8J(dc4Y pnJݜ! Y-OI&KvxY1s&dn#'8V)in-|Ýr_.E2?w gmߖ4k^LLyQh%0X2L}DuT VB@b1 @b``A, , HW6X+@HUou#ß! ƪ,\^t*/<+"@G" 5 gBËFEXPQl(ThT5 U(C&#CfLFqF!E'EܢѳܢQ(GѨH,s!%.*RFE⨬QhKѨ Zyd5:YM;Q@JK뽀EtAC'"ၫ(?#_=tm 5oKvFlN1/;RT~о]g?*Hqiۯq m:.ͽAJ1<in`7Srhpt#=͂}]3SX SQp c{N> xJ+Oh[h$SURV;/@ N# GZőҵzp^tőINGQFQGt;TwdXK'԰,ʘbagm~ҟb`_$em˹]l;h7-hC'H:} m| q G@Ox<jM̳4 Ɯ~o[ s-՛p`4ĈM <]q9m.-K pTX&)ks\bAOXyQ㖜65F[m1C 3aָԲ VMX(L*0g{hFl<ɶ T/KE')/.~~O _*ގ +hI8el N1 pRMOw'8m?I8q~v]'qxߐan,=l{Sby[KX/6n9q]?,;0C< |]?<5Hx(N}<\o76~QU~Rұ |?W? @[.[[>,tٙ9\cݬwa e;рX}3b 9,?\_n78c|z3=Ou<SjY='G~9[/f)lwCe:чi)x?m mQ΄%^4^.'g@dYDz"z&el]£g3úH6M>='5 Z< rZJ޷$/!%Go24zU#zlGN$T!2iZ]endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R /F4 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000002682 00000 n 0000002765 00000 n 0000002900 00000 n 0000002933 00000 n 0000000212 00000 n 0000000292 00000 n 0000005628 00000 n 0000005885 00000 n 0000005969 00000 n 0000006066 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 6171 %%EOF adephylo/MD50000644000176200001440000001103413215766712012400 0ustar liggesusers1ce151019e24615b020192f1b544b2d4 *ChangeLog e8f09cbf37fc3117d25d770994f7d907 *DESCRIPTION eed3f37ec2e10afa1676905f41021e81 *NAMESPACE 82aba88b46c88682a9d85982abef6ec4 *R/abouheif.R 3f7e8da1935350bb2a09ee9e0aa0051c *R/adephylo-package.R bb5257814c5d46340cc5246038355304 *R/bullseye.R 3c1e19b14282d4c7df2de2dfe89dec39 *R/dibas.R 04a2d77c2cd49f67b7e2458bf077a4e0 *R/distances.R 05cbf3b73b8242f3d07f3b3d7f2443e1 *R/moran.R 25173b10539408dafb74aa0dedcc79e8 *R/orthobasis.R 0f23257cce05d800f740eb2fd2605f0f *R/orthogram.R 1becda05bad78b0d191dd6c22543af43 *R/partition.R 86d729cb5419bfcfe564b83db5e021be *R/ppca.R 25ba8a83c333f1afb92fb4ead4632429 *R/proximities.R 2327af739484d50738ffeb9625dda505 *R/table.phylo4d.R 6fb95c7db9492ebd66bdb9a2a5d38071 *R/utils.R bd589a28ab5c5b6e56977d0a9eeec90b *R/zzz.R 341bfa14fba7ec198432cc5255c48a34 *build/vignette.rds fb47d6532985c28847275ecc7fedfc0b *data/carni19.RData 275000d0eed20069101d0d260cfcde55 *data/carni70.RData d31937e2535ffe6fe6c0d72d25347aa4 *data/lizards.RData 54f190b119437306366726f1706a003d *data/maples.RData f9b33e218603ee0ab52f253996e22fe5 *data/mjrochet.RData dcf24d8a524b736c8e9bafe76ab56e06 *data/palm.RData 09955da04f6c0d7ce2cdaa0be3fe694f *data/procella.RData b2504fb4f437fc17c5d95a03febe4c3e *data/tithonia.RData e30d7b713ffad63530009e2233314dea *data/ungulates.RData 669fd22410226e1e9cb0d60dd1aca4e1 *inst/CITATION f134eb2960513f5ac20b6ca2ff358efd *inst/doc/adephylo.R fc9613fde673d724e8e6b8c154a45071 *inst/doc/adephylo.Rnw 7846fef0534cca059da08ab5fc226f05 *inst/doc/adephylo.pdf 948f0783b396f6a52f18c50ca9758bc0 *man/abouheif.Rd 7663806baccb10320e768febb484cdd6 *man/adephylo-package.Rd 73855e32cf61d6d2bbe3e0b9896fc0bc *man/bullseye.Rd 0312a8a8922f81ed8fe760599801945f *man/carni19.Rd cbeaec7e513735f22d378a406433d8ae *man/carni70.Rd 6d589fc2cbd954af3b17809cf32380d1 *man/dibas.Rd 363c0f403fb5518a70d49f753d9d5f7b *man/distRoot.Rd 93b00bc1ca83d4aafc35e6ba6299a260 *man/distTips.Rd 26da0e739d2c37ec903fd304077097a0 *man/listDD.Rd b1b9b5852c66d0aee6612d49b04445fc *man/listTips.Rd bb93b83d0e84db8985917215e21f25b2 *man/lizards.Rd 63dfa03c877d54ca6d26bf69c5da44a6 *man/maples.Rd 255f3b396c26d8bcb3553b3749f485b8 *man/miscUtils.Rd 18827d9cffa5d96d1849de0c8787c1eb *man/mjrochet.Rd 233b526fd1fc24502ff2002224c5397f *man/moranIdx.Rd b3d2f9074502f2fb39907c33ea68291d *man/orthobasis.Rd 1353cde08c9c847bdde5cd7ecdf8af01 *man/orthogram.Rd 9bf54606b1c68e11e349e7f539a08811 *man/palm.Rd e5a6fb83623e263c09cf4bfd408e05b9 *man/ppca.Rd d3320f64c87118dba4cdaf8a8980fada *man/procella.Rd 4ad205fc81226ef2b11b3b0ba1da4bae *man/proxTips.Rd dcbce9e34615ce6aa5081151e82b679a *man/sp.tips.Rd a2d478331394a38e90ebdbdfb035b255 *man/table.phylo4d.Rd e94a2b724d840572a2c136d11b0d7c20 *man/tithonia.Rd 80504a8f33664ea4ba9728604cf5dd2d *man/treePart.Rd a196670b662bdb887ee24f8b5774f8c3 *man/ungulates.Rd 56878ddf3eb7a8688f3dd762d00f5d21 *src/adesub.c 193a84ba51685334c563db5ba4c5c322 *src/adesub.h d6a30425786e3569ff112f4315c63719 *src/distPhylo.c 613f31bc3f0fe411a8d79410ed128c7d *src/init.c 6c4bbbcb5992f13082f08ce84739abdd *src/misc.c 3bcedd4e41987c777c74a500fd7f94f0 *src/phylog.c dd217810ba88e51b18367e6cde1c876d *src/sptips.c 3adff053ac9e3f225e6be54236e109c3 *src/sptips.h fc9613fde673d724e8e6b8c154a45071 *vignettes/adephylo.Rnw d836c2b80d6daf3c64e9e8f132623755 *vignettes/figs/adephylo-011.pdf d76037f9bbd3b256d477055847c9d0d7 *vignettes/figs/adephylo-012.pdf feda0f7e2434eacdd920247eb11c259c *vignettes/figs/adephylo-012.png 2fe12559ca3eeac80b8112dc2a29d51d *vignettes/figs/adephylo-015.pdf b08c7e26a4ef79a43dc95aaa5deb56d5 *vignettes/figs/adephylo-016.pdf f573682fbfec89d92aed206f02121cfc *vignettes/figs/adephylo-017.pdf 730504bf836f10a58bd8912553eda10c *vignettes/figs/adephylo-017.png cc9f03f2354ac8f45bef6e1f4bfca65f *vignettes/figs/adephylo-018.pdf 96749c6d848678965e6711a274c89b3a *vignettes/figs/adephylo-aboutest.pdf 1f01abb99ace3abbff809a61280f2861 *vignettes/figs/adephylo-figFourBas.pdf 9760e0148488ad8d0e4274635a8c6771 *vignettes/figs/adephylo-lm1.pdf 56812646a7bb410fa83f8f374ff9aff9 *vignettes/figs/adephylo-loadings.pdf 9c786476af6babdda95ac894de983eb1 *vignettes/figs/adephylo-orthobas1.pdf abd101ee39e58242e361d6fb2da8989c *vignettes/figs/adephylo-pca1.pdf b5995160b941271f82053f402807c608 *vignettes/figs/adephylo-pca2.pdf 2f31061b448c7b23c1aeee9061b9a359 *vignettes/figs/adephylo-phylo4d.pdf c982aaeafa2d518a939e15165846d270 *vignettes/figs/adephylo-phylo4d.png d172e1f87ef9279ea48e6922cf450871 *vignettes/figs/adephylo-resid.pdf 8da38c81c7d17b6ad1cec22d964c127f *vignettes/figs/adephylo-treePart.pdf f44ae56792427611f2e9d2a1f9acbdc5 *vignettes/figs/adephylo-treePart.png adephylo/build/0000755000176200001440000000000013215710501013151 5ustar liggesusersadephylo/build/vignette.rds0000644000176200001440000000036113215710501015510 0ustar liggesusersuQ˪0M _p-ݸqvh4 iv痫SUL&9dΐC Y, lF4e'uSex2R[pvȮrW"s~Qr1#]ſ(<,y!;ǠEs#56|FJחIZmgY%q軯m٣ vϬnayQgJWZ4 -,{7Gnadephylo/DESCRIPTION0000644000176200001440000000130413215766712013575 0ustar liggesusersPackage: adephylo Version: 1.1-11 Date: 2017-12-18 Title: Exploratory Analyses for the Phylogenetic Comparative Method Author: Thibaut Jombart , Stéphane Dray , Anders Ellern Bilgrau Maintainer: Stéphane Dray Depends: methods, ade4 (>= 1.7-10) Imports: phylobase, ape, adegenet Description: Multivariate tools to analyze comparative data, i.e. a phylogeny and some traits measured for each taxa. License: GPL (>= 2) LazyLoad: yes RoxygenNote: 6.0.1 Encoding: UTF-8 NeedsCompilation: yes Packaged: 2017-12-18 09:58:25 UTC; stephane Repository: CRAN Date/Publication: 2017-12-18 16:33:14 UTC adephylo/ChangeLog0000644000176200001440000000460012617071127013635 0ustar liggesusers CHANGES IN ADEPHYLO VERSION 1.1-7 FIXES o sp.tips now returns ordered paths between tips FRESH BLOOD o Anders Ellern Bilgrau has joined the development team! CHANGES IN ADEPHYLO VERSION 1.1-5 FIXES o the new NAMESPACE selectively imports procedures to avoid conflicts between ape, phylobase, and ade4. Thes packages are no longer attached when loading adephylo o most dataset examples have been 'dontrun-ed' to save time during checks of the package on CRAN CHANGES IN ADEPHYLO VERSION 1.1-4 NEW FEATURES o added the function bullseye to plot fan-like phylogenies and associated traits. o added new methods for dibas. CHANGES IN ADEPHYLO VERSION 1.1-3 NEW FEATURES o added dibas, a new (and still under development) method for describing/testing phylogenetic clusters BUG FIXES o replaced the use of .First.lib and library.dynam by more up-to-date procedures o replaced a call to a C procedure from ade4 to the same procedure in adephylo o replaced instances of 'printf' by 'Rprintf' in C procedures CHANGES IN ADEPHYLO VERSION 1.1-1 BUG FIXES o fixed the citation to be used for adephylo. CHANGES IN ADEPHYLO VERSION 1.1-0 NEW FEATURES o the phylogenetic Principal Component Analysis (pPCA, Jombart et al. 2010) has been implemented in adephylo. See ?ppca for more information. o phylogenetic distances and proximities are now computed using compiled C code, speeding up dramatically computations and making the functions applicable to large trees (thousands of tips). o table.phylo4d has now a color mode which allows using colors to represent values of traits; this is usefull for large trees. CHANGES IN ADEPHYLO VERSION 1.0-2 BUG FIXES o standardization of variables in abouheif.moran is now performed using uniform weights (instead of marginal phylogenetic weights) CHANGES IN ADEPHYLO VERSION 1.0-1 NEW FEATURES o first release on CRAN, first stable version o compatible with the first stable release of the phylobase package CHANGES IN ADEPHYLO VERSION 1.0-0 NEW FEATURES o first release of the package with unstable status. Compatible with phylobase (in development) and ape packages; package only released on R-Forge, not CRAN. o re-implements all phylogenetic methods and datasets available in ade4 o add new features to compute phylogenetic distances/proximities, pPCA, tree walks, ... adephylo/man/0000755000176200001440000000000012766210217012636 5ustar liggesusersadephylo/man/moranIdx.Rd0000644000176200001440000000416413176115016014710 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/moran.R \name{moran.idx} \alias{moran.idx} \title{Computes Moran's index for a variable} \usage{ moran.idx(x, prox, addInfo = FALSE) } \arguments{ \item{x}{a numeric vector whose autocorrelation is computed.} \item{prox}{a matrix of proximities between observations, as computed by the \code{\link{proxTips}}. Off-diagonal terms must be positive or null, while diagonal terms must all equal zero.} \item{addInfo}{a logical indicating whether supplementary info (null value, minimum and maximum values) should be returned (TRUE) or not (FALSE, default); if computed, these quantities are returned as attributes.} } \value{ The numeric value of Moran's index. } \description{ This simple function computes Moran's index of autocorrelation given a variable and a matrix of proximities among observations. } \examples{ \dontrun{ ## use maples dataset data(maples) tre <- read.tree(text=maples$tre) dom <- maples$tab$Dom bif <- maples$tab$Bif ## get a proximity matrix between tips W <- proxTips(tre, met="Abouheif") ## compute Moran's I for two traits (dom and bif) moran.idx(dom, W) moran.idx(bif, W) moran.idx(rnorm(nTips(tre)), W) ## build a simple permutation test for 'bif' sim <- replicate(499, moran.idx(sample(bif), W)) # permutations sim <- c(moran.idx(bif, W), sim) pval <- mean(sim>=sim[1]) # right-tail p-value pval hist(sim, col="grey", main="Moran's I Monte Carlo test for 'bif'") # plot mtext("Histogram of permutations and observation (in red)") abline(v=sim[1], col="red", lwd=3) } } \references{ Moran, P.A.P. (1948) The interpretation of statistical maps. \emph{Journal of the Royal Statistical Society, B} \bold{10}, 243--251. Moran, P.A.P. (1950) Notes on continuous stochastic phenomena. \emph{Biometrika}, \bold{37}, 17--23. de Jong, P. and Sprenger, C. and van Veen, F. (1984) On extreme values of Moran's I and Geary's c. \emph{Geographical Analysis}, \bold{16}, 17--24. } \seealso{ \code{\link{proxTips}} which computes phylogenetic proximities between tips of a phylogeny. } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip} adephylo/man/sp.tips.Rd0000644000176200001440000000421413176115016014523 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils.R \name{sp.tips} \alias{sp.tips} \title{Find the shortest path between tips of a tree} \usage{ sp.tips(x, tip1, tip2, useTipNames = FALSE, quiet = FALSE, include.mrca = TRUE) } \arguments{ \item{x}{A tree of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}.} \item{tip1}{A vector of integers identifying tips by their numbers, or a vector of characters identifying tips by their names. Recycled if needed.} \item{tip2}{A vector of integers identifying tips by their numbers, or a vector of characters identifying tips by their names. Recycled if needed.} \item{useTipNames}{a logical stating whether the output must be named using tip names in all cases (TRUE), or not (FALSE). If not, names of \code{tip1} and \code{tip2} will be used.} \item{quiet}{a logical stating whether a warning must be issued when tip1==tip2, or not (see details).} \item{include.mrca}{a logical stating whether the most recent common ancestor shall be included in the returned path (TRUE, default) or not (FALSE).} } \value{ A list whose components are vectors of named nodes forming the shortest path between a couple of tips. } \description{ The function \code{sp.tips} finds the shortest path between tips of a tree, identified as \code{tip1} and \code{tip2}. This function applies to trees with the class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}. Several tips can be provided at a time. } \details{ The function checks if there are cases where tip1 and tip2 are the same. These cases are deleted when detected, issuing a warning (unless \code{quiet} is set to TRUE). } \examples{ \dontrun{ if(require(ape) & require(phylobase)){ ## make a tree x <- as(rtree(20),"phylo4") plot(x,show.node=TRUE) ## get shortest path between tip 1 and all other tips. sp.tips(x, "t1", "t2") sp.tips(x, 1, 2:20, TRUE) } } } \seealso{ \code{\link[phylobase]{shortestPath}} which does the same thing as \code{sp.tips}, for any node (internal or tip), but much more slowly. \cr } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip} adephylo/man/proxTips.Rd0000644000176200001440000001452313176115016014757 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/proximities.R \name{proxTips} \alias{proxTips} \title{Compute some phylogenetic proximities between tips} \usage{ proxTips(x, tips = "all", method = c("patristic", "nNodes", "oriAbouheif", "Abouheif", "sumDD"), f = function(x) { 1/x }, normalize = c("row", "col", "none"), symmetric = TRUE, useC = TRUE) } \arguments{ \item{x}{a tree of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}.} \item{tips}{A vector of integers identifying tips by their numbers, or a vector of characters identifying tips by their names. Distances will be computed between all possible pairs of tips.} \item{method}{a character string (full or abbreviated without ambiguity) specifying the method used to compute proximities; possible values are:\cr - \code{patristic}: (inversed sum of) branch length \cr - \code{nNodes}: (inversed) number of nodes on the path between the nodes \cr - \code{oriAbouheif}: original Abouheif's proximity, with diagonal (see details) \cr - \code{Abouheif}: Abouheif's proximity without diagonal (see details) \cr - \code{sumDD}: (inversed) sum of direct descendants of all nodes on the path (see details) \cr} \item{f}{a function to change a distance into a proximity.} \item{normalize}{a character string specifying whether the matrix must be normalized by row (\code{row}), column (\code{col}), or not (\code{none}). Normalization amounts to dividing each row (or column) so that the marginal sum is 1. Hence, default is matrix with each row summing to 1.} \item{symmetric}{a logical stating whether M must be coerced to be symmetric (TRUE, default) or not. This is achieved by taking (denoting N the matrix of proximities before re-symmetrization): \deqn{M = 0.5 * (N + N^{T})} Note that \eqn{x^{T}Ny = x^{T}My}, but the latter has the advantage of using a bilinear symmetric form (more appropriate for optimization purposes).} \item{useC}{a logical indicating whether computations of distances (before transformation into proximities) should be performed using compiled C code (TRUE, default), or using a pure R version (FALSE). C version is several orders of magnitude faster, and R version is kept for backward compatibility.} } \value{ A matrix of phylogenetic proximities. } \description{ The function \code{proxTips} computes a given proximity between a set of tips of a phylogeny. A vector of tips is supplied: proximities between all possible pairs of these tips are computed. The proximities are computed from the shortest path between the tips. \cr } \details{ Proximities are computed as the inverse (to the power \code{a}) of a phylogenetic distance (computed by \code{\link{distTips}}. Denoting \eqn{D=[d_{ij}]} a matrix of phylogenetic distances, the proximity matrix \eqn{M=[m_{ij}]} is computed as: \deqn{m_{ij} = \frac{1}{d_{ij}^a} \forall i \neq j}{ m_{ij} = (1/d_{ij})^a for all i different from j} and \deqn{m_{ii} = 0} Several distances can be used, defaulting to the sum of branch lengths (see argument \code{method}). Proximities are not true similarity measures, since the proximity of a tip with itself is always set to zero.\cr The obtained matrix of phylogenetic proximities (M) defines a bilinear symmetric form when M is symmetric (default):\cr \deqn{f(x,y) = x^{T}My} In general, M is not a metric because it is not positive-definite. Such a matrice can be used to measure phylogenetic autocorrelation (using Moran's index): \deqn{I(x) = \frac{x^TMx}{var(x)}}{I(x) = (x^{T}Mx)/(var(x)) } or to compute lag vectors (Mx) used in autoregressive models, like: \deqn{x = Mx + ... + e} where '...' is the non-autoregressive part of the model, and 'e' are residuals. \code{Abouheif} proximity refers to the phylogenetic proximity underlying the test of Abouheif (see references). Let P be the set of all the nodes in the path going from \code{node1} to \code{node2}. Let DDP be the number of direct descendants from each node in P. Then, the so-called 'Abouheif' distance is the inverse of the product of all terms in DDP. \code{oriAbouheif} returns a matrix with non-null diagonal elements, as formulated in Pavoine \emph{et al.} (2008). This matrix is bistochastic (all marginal sums equal 1), but this bilinear symmetric form does not give rise to a Moran's index, since it requires a null diagonal. \code{Abouheif} contains Abouheif's proximities but has a null diagonal, giving rise to a Moran's index.\cr \code{sumDD} refers to a phylogenetic proximity quite similar to that of Abouheif. We consider the same sets P and DDP. But instead of taking the inverse of the product of all terms in DDP, this proximity computes the inverse of the sum of all terms in DDP. This matrix was denoted 'M' in Pavoine \emph{et al.} (2008), who reported that it is related to May's index (May, 1990). } \examples{ if(require(ape) & require(phylobase)){ ## make a tree x <- as(rtree(10),"phylo4") plot(x, show.node=TRUE) axisPhylo() ## compute different distances proxTips(x, 1:5) proxTips(x, 1:5, "nNodes") proxTips(x, 1:5, "Abouheif") proxTips(x, , "sumDD") ## see what one proximity looks like M <- proxTips(x) obj <- phylo4d(x,as.data.frame(M)) table.phylo4d(obj,symbol="sq") } } \references{ == About Moran's index with various proximities == \cr Pavoine, S.; Ollier, S.; Pontier, D.; Chessel, D. (2008) Testing for phylogenetic signal in life history variable: Abouheif's test revisited. \emph{Theoretical Population Biology}: \bold{73}, 79-91.\cr == About regression on phylogenetic lag vector == \cr Cheverud, J. M.; Dow, M. M.; Leutenegger, W. (1985) The quantitative assessment of phylogentic constaints in comparative analyses: sexual dimorphism in body weights among primates. \emph{Evolution} \bold{39}, 1335-1351.\cr Cheverud, J. M.; Dow, M. M. (1985) An autocorrelation analysis of genetic variation due to lineal fission in social groups of Rhesus macaques. \emph{American Journal of Phyisical Anthropology} \bold{67}, 113-121.\cr == Abouheif's original paper ==\cr Abouheif, E. (1999) A method for testing the assumption of phylogenetic independence in comparative data. \emph{Evolutionary Ecology Research}, \bold{1}, 895-909.\cr == May's index ==\cr May, R.M. (1990) Taxonomy as destiny. \emph{Nature} \bold{347}, 129-130. } \seealso{ \code{\link{distTips}} which computes several phylogenetic distances between tips. } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip} adephylo/man/adephylo-package.Rd0000644000176200001440000001323113176115016016320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{package} \name{adephylo-package} \alias{adephylo-package} \alias{adephylo} \title{The adephylo package} \description{ This package is devoted to exploratory analysis of phylogenetic comparative data. It re-implements and extends phylogenetic procedures from the \code{ade4} package (which are now deprecated).\cr } \details{ Comparative data (phylogeny+traits) are handled as \linkS4class{phylo4d} objects, a canonical class implemented by the \code{phylobase} package. Trees are handled as \code{\link[ape:read.tree]{phylo}} objects (from the \code{ape} package) or as \linkS4class{phylo4} objects (\code{phylobase}'s extension of \code{phylo} objects).\cr Main functionalities of \code{adephylo} are summarized below.\cr === TOPOLOGICAL INFORMATION ===\cr Several functions allow one to retrieve topological information from a tree; such information can be used, for instance, as a basis to compute distances or proximities between tips.\cr - \code{\link{listDD}}: lists the direct descendants from each node of a tree.\cr - \code{\link{listTips}}: lists the tips descending from each node of a tree.\cr - \code{\link{.tipToRoot}}: finds the set of nodes between a tip and the root of a tree.\cr - \code{\link{sp.tips}}: finds the shortest path between tips of a tree.\cr - \code{\link{treePart}}: defines partitions of tips reflecting the topology of a tree. This function can output non-independent dummy vectors, or alternatively an orthonormal basis used by the orthogram procedure.\cr === PHYLOGENETIC PROXIMITIES/DISTANCES ===\cr Several phylogenetic proximities and distances are implemented. Auxiliary function easing the computation of other distances/proximities are also provided:\cr - \code{\link{distRoot}}: computes different distances of a set of tips to the root.\cr - \code{\link{distTips}}: computes different pairwise distances in a set of tips.\cr - \code{\link{proxTips}}: computes different proximities between a set of tips.\cr === MEASURES/TESTS OF PHYLOGENETIC AUTOCORRELATION ===\cr Several procedures allow one to measure, and/or test phylogenetic signal in biological traits:\cr - \code{\link{abouheif.moran}}: performs Abouheif's test, designed to detect phylogenetic autocorrelation in a quantitative trait. This implementation is not based on original heuristic procedure, but on the exact formulation proposed by Pavoine et al. (2008), showing that the test is in fact a Moran's index test. This implementation further extends the procedure by allowing any measure of phylogenetic proximity (5 are proposed).\cr - \code{\link{orthogram}}: performs the orthonormal decomposition of variance of a quantitative variable on an orthonormal basis as in Ollier et al. (2005). It also returns the results of five non parametric tests associated to the variance decomposition.\cr - \code{\link{moran.idx}}: computes Moran's index of autocorrelation given a variable and a matrix of proximities among observations (no test).\cr === MODELLING/INVESTIGATION OF PHYLOGENETIC SIGNAL ===\cr Rather than testing or measuring phylogenetic autocorrelation, these procedures can be used for further investigation of phylogenetic signal. Some, like \code{\link{me.phylo}}, can be used to remove phylogenetic autocorrelation. Others can be used to understand the nature of this autocorrelation (i.e., to ascertain which traits and tips are concerned by phylogenetic non-independence).\cr - \code{\link{me.phylo}}/\code{\link{orthobasis.phylo}}: these synonymous functions compute Moran's eigenvectors (ME) associated to a tree. These vectors model different observable phylogenetic signals. They can be used as covariables to remove phylogenetic autocorrelation from data.\cr - \code{\link{orthogram}}: the orthogram mentioned above also provides a description of how biological variability is structured on a phylogeny.\cr - \code{\link{ppca}}: performs a phylogenetic Principal Component Analysis (pPCA, Jombart et al. 2010). This multivariate method investigates phylogenetic patterns in a set of quantitative traits.\cr === GRAPHICS ===\cr Some plotting functions are proposed, most of them being devoted to representing phylogeny and a quantitative information at the same time.\cr - \code{\link{table.phylo4d}}: fairly customisable way of representing traits onto the tips of a phylogeny. Several traits can be plotted in a single graphic.\cr - \code{\link{bullseye}}: an alternative to \code{\link{table.phylo4d}} based on fan-like representation, better for large trees.\cr - \code{\link{scatter.ppca}}, \code{\link{screeplot.ppca}}, \code{\link{plot.ppca}}: several plots associated to a phylogenetic principal component analysis (see \code{\link{ppca}}).\cr === DATASETS ===\cr Several datasets are also proposed. Some of these datasets replace former version from \code{ade4}, which are now deprecated. Here is a list of available datasets: \code{\link{carni19}}, \code{\link{carni70}}, \code{\link{lizards}}, \code{\link{maples}}, \code{\link{mjrochet}}, \code{\link{palm}}, \code{\link{procella}}, \code{\link{tithonia}}, and \code{\link{ungulates}}.\cr To cite adephylo, please use the reference given by \code{citation("adephylo")}. \tabular{ll}{ Package: \tab adephylo\cr Type: \tab Package\cr Version: \tab 1.1-7\cr Date: \tab 2014-11-10 \cr License: \tab GPL (>=2) } } \seealso{ The \code{ade4} package for multivariate analysis. } \author{ Thibaut Jombart \cr with contributions Stephane Dray and Anders Ellern Bilgrau . \cr Parts of former code from \code{ade4} by Daniel Chessel and Sebastien Ollier. } \keyword{manip} \keyword{multivariate} adephylo/man/procella.Rd0000644000176200001440000000325413176115016014727 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{data} \name{procella} \alias{procella} \title{Phylogeny and quantitative traits of birds} \format{\code{procella} is a list containing the 2 following objects: \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{traits}{is a data frame with 19 species and 6 traits} }} \description{ This data set describes the phylogeny of 19 birds as reported by Bried et al. (2002). It also gives 6 traits corresponding to these 19 species. } \details{ Variables of \code{procella$traits} are the following ones: \cr - site.fid: a numeric vector that describes the percentage of site fidelity\cr - mate.fid: a numeric vector that describes the percentage of mate fidelity\cr - mass: an integer vector that describes the adult body weight (g)\cr - ALE: a numeric vector that describes the adult life expectancy (years)\cr - BF: a numeric vector that describes the breeding frequencies\cr - col.size: an integer vector that describes the colony size (no nests monitored) } \note{ This dataset replaces the former version in ade4. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ ## load data, make tree and phylo4d object data(procella) tre <- read.tree(text=procella$tre) x <- phylo4d(tre, procella$traits) par(mar=rep(.1,4)) table.phylo4d(x,cex.lab=.7) } } } \references{ Bried, J., Pontier, D. and Jouventin, P. (2002) Mate fidelity in monogamus birds: a re-examination of the Procellariiformes. \emph{Animal Behaviour}, \bold{65}, 235--246. See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps037.pdf} (in French). } \keyword{datasets} adephylo/man/bullseye.Rd0000644000176200001440000000606513176115016014755 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bullseye.R \name{bullseye} \alias{bullseye} \title{Fan-like phylogeny with possible representation of traits on tips} \usage{ bullseye(phy, traits = NULL, col.tips.by = NULL, col.pal = spectral, circ.n = 6, circ.bg = transp("royalblue", 0.1), circ.unit = NULL, legend = TRUE, leg.posi = "bottomleft", leg.title = "", leg.bg = "white", traits.inset = 1.1, traits.space = 0.05, traits.pch = 19, traits.cex = 1, alpha = 1, axis = TRUE, ...) } \arguments{ \item{phy}{a tree in \code{phylo}, \linkS4class{phylo4} or \linkS4class{phylo4d} format.} \item{traits}{an optional data.frame of traits.} \item{col.tips.by}{an optional vector used to define colors for tip labels; if unamed, must be ordered in the same order as \code{phy$tip.label}.} \item{col.pal}{a function generating colors according to a given palette; several palettes can be provided as a list, in the case of several traits; the first palette is always reserved for the tip colors; this argument is recycled.} \item{circ.n}{the number of circles for the distance annotations.} \item{circ.bg}{the color of the circles.} \item{circ.unit}{the unit of the circles; if NULL, determined automatically from the data.} \item{legend}{a logical specifying whether a legend should be plotted; only one legend is displayed, with priority to tip colors first, and then to the first trait.} \item{leg.posi, leg.title, leg.bg}{position, title and background for the legend.} \item{traits.inset}{inset for positioning the traits; 1 corresponds to the circle crossing the furthest tip, 0 to the center of the plot.} \item{traits.space}{a coefficient indicating the spacing between traits.} \item{traits.pch, traits.cex}{type and size of the symbols used for the traits; recycled if needed.} \item{alpha}{alpha value to be used for the color transparency, between 0 (invisible) and 1 (plain).} \item{axis}{a logical indicating whether an axis should be displayed.} \item{\dots}{further arguments to be passed to plot methods from \code{ape}. See \code{\link[ape]{plot.phylo}}.} } \description{ This function represents a phylogeny as a fan, using circles to provide a legend for distances and optionally colored symbols to represent traits associated to the tips of the tree. This function uses and is compatible with ape's \code{\link[ape]{plot.phylo}}. } \examples{ if(require(ape) && require(phylobase) && require(adegenet)){ data(lizards) tre <- read.tree(text=lizards$hprA) # make a tree ## basic plots bullseye(tre) bullseye(tre, lizards$traits) ## customized par(mar=c(6,6,6,6)) bullseye(tre, lizards$traits, traits.cex=sqrt(1:7), alpha=.7, legend=FALSE, circ.unit=10, circ.bg=transp("black",.1), edge.width=2) } } \seealso{ \code{\link{table.phylo4d}} for non-radial plots.\cr The \linkS4class{phylo4d} class for storing \code{phylogeny+data}.\cr \code{\link[ape]{plot.phylo}} from the \code{ape} package.\cr \code{\link[ade4]{dotchart.phylog}}. } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{hplot} \keyword{multivariate} adephylo/man/orthogram.Rd0000644000176200001440000001421413176115016015126 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/orthogram.R \name{orthogram} \alias{orthogram} \title{Orthonormal decomposition of variance} \usage{ orthogram(x, tre = NULL, orthobas = NULL, prox = NULL, nrepet = 999, posinega = 0, tol = 1e-07, cdot = 1.5, cfont.main = 1.5, lwd = 2, nclass, high.scores = 0, alter = c("greater", "less", "two-sided")) } \arguments{ \item{x}{a numeric vector corresponding to the quantitative variable} \item{tre}{a tree of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}.} \item{orthobas}{an object of class \code{'orthobasis'}} \item{prox}{a matrix of phylogenetic proximities as returned by \code{\link{proxTips}}.} \item{nrepet}{an integer giving the number of permutations} \item{posinega}{a parameter for the ratio test. If posinega > 0, the function computes the ratio test.} \item{tol}{a tolerance threshold for orthonormality condition} \item{cdot}{a character size for points on the cumulative decomposition display} \item{cfont.main}{a character size for titles} \item{lwd}{a character size for dash lines} \item{nclass}{a single number giving the number of cells for the histogram} \item{high.scores}{a single number giving the number of vectors to return. If > 0, the function returns labels of vectors that explains the larger part of variance.} \item{alter}{a character string specifying the alternative hypothesis, must be one of "greater" (default), "less" or "two-sided"} } \value{ If (high.scores = 0), returns an object of class \code{'krandtest'} (randomization tests) corresponding to the five non parametric tests. \cr \cr If (high.scores > 0), returns a list containg : \item{w}{: an object of class \code{'krandtest'} (randomization tests)} \item{scores.order}{: a vector which terms give labels of vectors that explain the larger part of variance} } \description{ This function performs the orthonormal decomposition of variance of a quantitative variable on an orthonormal basis. It also returns the results of five non parametric tests associated to the variance decomposition. It thus provides tools (graphical displays and test) for analysing phylogenetic, pattern in one quantitative trait. This implementation replace the (deprecated) version from the \code{ade4} package.\cr } \details{ Several orthonormal bases can be used. By default, basis is constructed from a partition of tips according to tree topology (as returned by \code{\link{treePart}}); for this, the argument \code{tre} must be provided. Alternatively, one can provide an orthonormal basis as returned by \code{\link{orthobasis.phylo}}/\code{\link{me.phylo}} (argument \code{orthobas}), or provide a proximity matrix from which an orthobasis based on Moran's eigenvectors will be constructed (argument \code{prox}). The function computes the variance decomposition of a quantitative vector x on an orthonormal basis B. The variable is normalized given the uniform weight to eliminate problem of scales. It plots the squared correlations \eqn{R^{2}}{R^2} between x and vectors of B (variance decomposition) and the cumulated squared correlations \eqn{SR^{2}}{SR^2} (cumulative decomposition). The function also provides five non parametric tests to test the existence of autocorrelation. The tests derive from the five following statistics : - R2Max=\eqn{\max(R^{2})}{max(R^2)}. It takes high value when a high part of the variability is explained by one score.\cr - SkR2k=\eqn{\sum_{i=1}^{n-1}(iR^{2}_i)}{sum_i^(n-1) i*(R^2)_i}. It compares the part of variance explained by internal nodes to the one explained by end nodes.\cr - Dmax=\eqn{\max_{m=1,...,n-1}(\sum_{j=1}^{m}R^{2}_j - }{max_(m=1,...,n-1)(sum_(j=1)^m(R^2_j) - (m/n-1))}\eqn{ \frac{m}{n-1})}{max_(m=1,...,n-1)(sum_(j=1)^m(R^2_j) - (m/n-1))}. It examines the accumulation of variance for a sequence of scores.\cr - SCE=\eqn{\sum_{m=1}^{n-1} (\sum_{j=1}^{m}R^{2}_j - }{sum_(m=1)^(n-1)(sum_(j=1)^m(R^2_j) - (m/n-1))^2}\eqn{ \frac{m}{n-1})^{2}}{sum_(m=1)^(n-1)(sum_(j=1)^m(R^2_j) - (m/n-1))^2}. It examines also the accumulation of variance for a sequence of scores.\cr - ratio: depends of the parameter posinega. If posinega > 0, the statistic ratio exists and equals \eqn{\sum_{i=1}^{posinega}R^{2}_i}{sum_i (R^2)_i with i < posinega + 1}. It compares the part of variance explained by internal nodes to the one explained by end nodes when we can define how many vectors correspond to internal nodes. } \note{ This function replaces the former version from the ade4 package, which is deprecated. Note that if ade4 is not loaded BEFORE adephylo, then the version from ade4 will erase that of adephylo, which will still be available from adephylo::orthogram. In practice, though, this should never happen, since ade4 is loaded as a dependence by adephylo. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ ## a phylogenetic example data(ungulates) tre <- read.tree(text=ungulates$tre) plot(tre) ## look at two traits afbw <- log(ungulates$tab[,1]) neonatw <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) names(afbw) <- tre$tip.label names(neonatw) <- tre$tip.label plot(afbw, neonatw) # relationship between traits lm1 <- lm(neonatw~afbw) resid <- residuals(lm1) abline(lm1) ## plot the two traits and the residuals of lm1 x <- phylo4d(tre, cbind.data.frame(afbw, neonatw, residuals=resid)) table.phylo4d(x) # residuals are surely not independant ## default orthogram for residuals of lm1 orthogram(resid, tre) ## using another orthonormal basis (derived from Abouheif's proximity) myOrthoBasis <- orthobasis.phylo(tre, method="oriAbouheif") # Abouheif's proximities orthogram(resid, ortho=myOrthoBasis) # significant phylog. signal ## Abouheif's test W <- proxTips(tre, method="oriAbouheif") # proximity matrix abouheif.moran(resid, W) } } } \references{ Ollier, S., Chessel, D. and Couteron, P. (2005) Orthonormal Transform to Decompose the Variance of a Life-History Trait across a Phylogenetic Tree. \emph{Biometrics}, \bold{62}, 471--477. } \seealso{ \code{\link{orthobasis.phylo}} } \author{ Original code: Sebastien Ollier and Daniel Chessel.\cr Current maintainer: Stephane Dray } adephylo/man/mjrochet.Rd0000644000176200001440000000314313176115016014736 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{data} \name{mjrochet} \alias{mjrochet} \title{Phylogeny and quantitative traits of teleos fishes} \format{\code{mjrochet} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{tab}{is a data frame with 49 rows and 7 traits.} }} \description{ This data set describes the phylogeny of 49 teleos fishes as reported by Rochet et al. (2000). It also gives life-history traits corresponding to these 49 species. } \details{ Variables of \code{mjrochet$tab} are the following ones : tm (age at maturity (years)), lm (length at maturity (cm)), l05 (length at 5 per cent survival (cm)), t05 (time to 5 per cent survival (years)), fb (slope of the log-log fecundity-length relationship), fm (fecundity the year of maturity), egg (volume of eggs (\eqn{mm^{3}}{mm^3})). } \note{ This dataset replaces the former version in ade4. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ data(mjrochet) tre <- read.tree(text=mjrochet$tre) # make a tree traits <- log((mjrochet$tab)) ## build a phylo4d mjr <- phylo4d(tre, traits) ## see data table.phylo4d(mjr,cex.lab=.5,show.node=FALSE,symb="square") ## perform Abouheif's test for each trait mjr.tests <- abouheif.moran(mjr, nrep=499) mjr.tests } } } \references{ Rochet, M. J., Cornillon, P-A., Sabatier, R. and Pontier, D. (2000) Comparative analysis of phylogenic and fishing effects in life history patterns of teleos fishes. \emph{Oikos}, \bold{91}, 255--270. } \keyword{datasets} adephylo/man/listTips.Rd0000644000176200001440000000173713176115016014745 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/partition.R \name{listTips} \alias{listTips} \title{List tips descendings from all nodes of a tree} \usage{ listTips(x) } \arguments{ \item{x}{A tree of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}.} } \value{ A list whose components are vectors of named tips for a given node. } \description{ The function \code{listTips} lists the tips descending from each node of a tree. The tree can be of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}. } \examples{ if(require(ape) & require(phylobase)){ ## make a tree x <- as(rtree(20),"phylo4") plot(x,show.node=TRUE) listTips(x) } } \seealso{ \code{\link{listDD}} which lists the direct descendants for each node. \cr \code{\link{treePart}} which defines partitions of tips according to the tree topology. } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip} adephylo/man/table.phylo4d.Rd0000644000176200001440000001274113176115016015600 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/table.phylo4d.R \name{table.phylo4d} \alias{table.phylo4d} \title{Graphical display of phylogeny and traits} \usage{ table.phylo4d(x, treetype = c("phylogram", "cladogram"), symbol = c("circles", "squares", "colors"), repVar = 1:ncol(tdata(x, type = "tip")), center = TRUE, scale = TRUE, legend = TRUE, grid = TRUE, box = TRUE, show.tip.label = TRUE, show.node.label = TRUE, show.var.label = TRUE, ratio.tree = 1/3, font = 3, tip.label = tipLabels(x), var.label = colnames(tdata(x, type = "tip")), cex.symbol = 1, cex.label = 1, cex.legend = 1, pch = 20, col = heat.colors(100), coord.legend = NULL, ...) } \arguments{ \item{x}{a \linkS4class{phylo4d} object} \item{treetype}{the type of tree to be plotted ("phylogram" or "cladogram")} \item{symbol}{the type of symbol used to represent data ("circles", "squares", or "colors")} \item{repVar}{the numerical index of variables to be plotted} \item{center}{a logical stating whether variables should be centred (TRUE, default) or not (FALSE)} \item{scale}{a logical stating whether variables should be scaled (TRUE, default) or not (FALSE)} \item{legend}{a logical stating whether a legend should be added to the plot (TRUE) or not (FALSE, default)} \item{grid}{a logical stating whether a grid should be added to the plot (TRUE, default) or not (FALSE)} \item{box}{a logical stating whether a box should be added around the plot (TRUE, default) or not (FALSE)} \item{show.tip.label}{a logical stating whether tip labels should be printed (TRUE, default) or not (FALSE)} \item{show.node.label}{a logical stating whether node labels should be printed (TRUE, default) or not (FALSE)} \item{show.var.label}{a logical stating whether labels of variables should be printed (TRUE, default) or not (FALSE)} \item{ratio.tree}{the proportion of width of the figure occupied by the tree} \item{font}{an integer specifying the type of font for the labels: 1 (plain text), 2 (bold), 3 (italic, default), or 4 (bold italic).} \item{tip.label}{a character vector giving the tip labels} \item{var.label}{a character vector giving the labels of variables} \item{cex.symbol}{a numeric giving the factor scaling the symbols} \item{cex.label}{a numeric giving the factor scaling all labels} \item{cex.legend}{a numeric giving the factor scaling the legend} \item{pch}{is \code{symbol} is set to 'colors', a number indicating the type of point to be plotted (see ?points)} \item{col}{is \code{symbol} is set to 'colors', a vector of colors to be used to represent the data} \item{coord.legend}{an optional list with two components 'x' and 'y' indicating the lower-left position of the legend. Can be set to \code{locator(1) to position the legend interactively.}} \item{\dots}{further arguments to be passed to plot methods from \code{ape}. See \code{\link[ape]{plot.phylo}}.} } \description{ This function represents traits onto the tips of a phylogeny. Plotted objects must be valid \linkS4class{phylo4d} objects (implemented by the \code{phylobase} package). Current version allows plotting of a tree and one or more quantitative traits (possibly containing missing data, represented by an 'x').\cr } \details{ The plot of phylogenies is performed by a call to \code{\link[ape]{plot.phylo}} from the \code{ape} package. Hence, many of the arguments of \code{\link[ape]{plot.phylo}} can be passed to \code{table.phylo4d}, through the \dots{} argument, but their names must be complete. For large trees, consider using \code{\link{bullseye}}. The function \code{table.phylo4d} is based on former plot method for \linkS4class{phylo4d} objects from the \code{phylobase} package. It replaces the deprecated \code{ade4} functions \code{\link[ade4]{symbols.phylog}} and \code{\link[ade4]{table.phylog}}. } \examples{ if(require(ape) & require(phylobase) & require(ade4)){ ## simulated data tr <- rtree(20) dat <- data.frame(a = rnorm(20), b = scale(1:20), c=runif(20,-2,2) ) dat[3:6, 2] <- NA # introduce some NAs obj <- phylo4d(tr, dat) # build a phylo4d object table.phylo4d(obj) # default scatterplot table.phylo4d(obj,cex.leg=.6, use.edge.length=FALSE) # customized table.phylo4d(obj,treetype="clad", show.node=FALSE, cex.leg=.6, use.edge.length=FALSE, edge.color="blue", edge.width=3) # more customized ## teleost fishes data data(mjrochet) temp <- read.tree(text=mjrochet$tre) # make a tree mjr <- phylo4d(x=temp,tip.data=mjrochet$tab) # male a phylo4d object table.phylo4d(mjr,cex.lab=.5,show.node=FALSE,symb="square") ## lizards data data(lizards) liz.tr <- read.tree(tex=lizards$hprA) # make a tree liz <- phylo4d(liz.tr, lizards$traits) # make a phylo4d object table.phylo4d(liz) ## plotting principal components liz.pca1 <- dudi.pca(lizards$traits, scannf=FALSE, nf=2) # PCA of traits myPC <- phylo4d(liz.tr, liz.pca1$li) # store PC in a phylo4d object varlab <- paste("Principal \\ncomponent", 1:2) # make labels for PCs table.phylo4d(myPC, ratio=.8, var.lab=varlab) # plot the PCs add.scatter.eig(liz.pca1$eig,2,1,2,posi="topleft", inset=c(0,.15)) title("Phylogeny and the principal components") } } \seealso{ The \linkS4class{phylo4d} class for storing \code{phylogeny+data}.\cr For large trees, consider using \code{\link{bullseye}}. \code{\link[ape]{plot.phylo}} from the \code{ape} package.\cr An alternative (deprecated) representation is available from \code{\link[ade4]{dotchart.phylog}}. } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{hplot} \keyword{multivariate} adephylo/man/miscUtils.Rd0000644000176200001440000000251113176115016015075 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils.R \name{.tipToRoot} \alias{.tipToRoot} \title{Low-level auxiliary functions for adephylo} \usage{ .tipToRoot(x, tip, root, include.root = FALSE) } \arguments{ \item{x}{A valid tree of class \linkS4class{phylo4}.} \item{tip}{An integer identifying a tip by its numbers.} \item{root}{An integer identifying the root of the tree by its number.} \item{include.root}{a logical stating whether the root must be included as a node of the path from tip to root (TRUE), or not (FALSE, default).} } \value{ \code{.tipToRoot}: a vector of named integers identifying nodes.\cr } \description{ These hidden functions are utils for adephylo, used by other functions. Regular users can use them as well, but no validity checks are performed for the arguments: speed is here favored over safety. Most of these functions handle trees inheriting \linkS4class{phylo4} class.\cr } \details{ \code{.tipToRoot} finds the set of nodes between a tip and the root of a tree.\cr } \examples{ if(require(ape) & require(phylobase)){ ## make a tree x <- as(rtree(20),"phylo4") plot(x,show.node=TRUE) ## .tipToRoot root <- rootNode(x) .tipToRoot(x, 1, root) lapply(1:nTips(x), function(i) .tipToRoot(x, i, root)) } } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip} adephylo/man/abouheif.Rd0000644000176200001440000000777213176115016014721 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/abouheif.R \name{abouheif.moran} \alias{abouheif.moran} \title{Abouheif's test based on Moran's I} \usage{ abouheif.moran(x, W = NULL, method = c("oriAbouheif", "patristic", "nNodes", "Abouheif", "sumDD"), f = function(x) { 1/x }, nrepet = 999, alter = c("greater", "less", "two-sided")) } \arguments{ \item{x}{a data frame with continuous variables, or a \linkS4class{phylo4d} object (i.e. containing both a tree, and tip data). In the latter case, \code{method} argument is used to determine which proximity should be used.} \item{W}{a \emph{n} by \emph{n} matrix (\emph{n} being the number rows in x) of phylogenetic proximities, as produced by \code{\link{proxTips}}.} \item{method}{a character string (full or unambiguously abbreviated) specifying the type of proximity to be used. By default, the proximity used is that of the original Abouheif's test. See details in \code{\link{proxTips}} for information about other methods.} \item{f}{a function to turn a distance into a proximity (see \code{\link{proxTips}}).} \item{nrepet}{number of random permutations of data for the randomization test} \item{alter}{a character string specifying the alternative hypothesis, must be one of "greater" (default), "less" or "two-sided"} } \value{ Returns an object of class \code{krandtest} (randomization tests from ade4), containing one Monte Carlo test for each trait. } \description{ The test of Abouheif (1999) is designed to detect phylogenetic autocorrelation in a quantitative trait. Pavoine \emph{et al.} (2008) have shown that this tests is in fact a Moran's I test using a particular phylogenetic proximity between tips (see details). The function \code{abouheif.moran} performs basically Abouheif's test for several traits at a time, but it can incorporate other phylogenetic proximities as well.\cr } \details{ Note that the original Abouheif's proximity (Abouheif, 1999; Pavoine \emph{et al.} 2008) unifies Moran's I and Geary'c tests (Thioulouse \emph{et al.} 1995).\cr \code{abouheif.moran} can be used in two ways:\cr - providing a data.frame of traits (\code{x}) and a matrix of phylogenetic proximities (\code{W})\cr - providing a \linkS4class{phylo4d} object (\code{x}) and specifying the type of proximity to be used (\code{method}). \code{W} is a squared symmetric matrix whose terms are all positive or null.\cr \code{W} is firstly transformed in frequency matrix A by dividing it by the total sum of data matrix : \deqn{a_{ij} = \frac{W_{ij}}{\sum_{i=1}^{n}\sum_{j=1}^{n}W_{ij}}}{a_ij = W_ij / (sum_i sum_j W_ij)} The neighbouring weights is defined by the matrix \eqn{D = diag(d_1,d_2, \ldots)} where \eqn{d_i = \sum_{j=1}^{n}W_{ij}}{d_i = sum_j W_ij}. For each vector x of the data frame x, the test is based on the Moran statistic \eqn{x^{t}Ax}{t(x)Ax} where x is D-centred. } \examples{ if(require(ade4)&& require(ape) && require(phylobase)){ ## load data data(ungulates) tre <- read.tree(text=ungulates$tre) x <- phylo4d(tre, ungulates$tab) ## Abouheif's tests for each trait myTests <- abouheif.moran(x) myTests plot(myTests) ## a variant using another proximity plot(abouheif.moran(x, method="nNodes") ) ## Another example data(maples) tre <- read.tree(text=maples$tre) dom <- maples$tab$Dom ## Abouheif's tests for each trait (equivalent to Cmean) W1 <- proxTips(tre,method="oriAbouheif") abouheif.moran(dom,W1) ## Equivalence with moran.idx W2 <- proxTips(tre,method="Abouheif") abouheif.moran(dom,W2) moran.idx(dom,W2) } } \references{ Thioulouse, J., Chessel, D. and Champely, S. (1995) Multivariate analysis of spatial patterns: a unified approach to local and global structures. \emph{Environmental and Ecological Statistics}, \bold{2}, 1--14. } \seealso{ - \code{\link[ade4]{gearymoran}} from the ade4 package\cr - \code{\link[ape]{Moran.I}} from the ape package for the classical Moran's I test. \cr } \author{ Original code from ade4 (gearymoran function) by Sebastien Ollier\cr Adapted and maintained by Thibaut Jombart . } adephylo/man/ungulates.Rd0000644000176200001440000000346513176115016015141 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{data} \name{ungulates} \alias{ungulates} \title{Phylogeny and quantitative traits of ungulates.} \format{\code{fission} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{tab}{is a data frame with 18 species and 4 traits} }} \source{ Data were obtained from Pelabon, C., Gaillard, J.M., Loison, A. and Portier, A. (1995) Is sex-biased maternal care limited by total maternal expenditure in polygynous ungulates? \emph{Behavioral Ecology and Sociobiology}, \bold{37}, 311--319. } \description{ This data set describes the phylogeny of 18 ungulates as reported by Pelabon et al. (1995). It also gives 4 traits corresponding to these 18 species. } \details{ Variables of \code{ungulates$tab} are the following ones : \cr - afbw: is a numeric vector that describes the adult female body weight (g) \cr - mnw: is a numeric vector that describes the male neonatal weight (g) \cr - fnw: is a numeric vector that describes the female neonatal weight (g) \cr - ls: is a numeric vector that describes the litter size \cr } \note{ This dataset replaces the former version in ade4. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ ## load data data(ungulates) tre <- read.tree(text=ungulates$tre) plot(tre) ## look at two traits afbw <- log(ungulates$tab[,1]) neonatw <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) names(afbw) <- tre$tip.label names(neonatw) <- tre$tip.label plot(afbw, neonatw) # relationship between traits lm1 <- lm(neonatw~afbw) abline(lm1) x <- phylo4d(tre, cbind.data.frame(afbw, neonatw)) # traits on the phylogeny ## test phylogenetic inertia in residuals orthogram(residuals(lm1), x) } } } \keyword{datasets} adephylo/man/palm.Rd0000644000176200001440000000353013176115016014054 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{data} \name{palm} \alias{palm} \title{Phylogenetic and quantitative traits of amazonian palm trees} \format{\code{palm} is a list containing the 2 following objects: \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{traits}{is a data frame with 66 species (rows) and 7 traits (columns).} }} \source{ This data set was obtained by Clementine Gimaret-Carpentier. } \description{ This data set describes the phylogeny of 66 amazonian palm trees. It also gives 7 traits corresponding to these 66 species. } \details{ Variables of \code{palm$traits} are the following ones: \cr - rord: specific richness with five ordered levels\cr - h: height in meter (squared transform)\cr - dqual: diameter at breast height in centimeter with five levels \code{sout : subterranean}, \code{ d1(0, 5 cm)}, \code{ d2(5, 15 cm)}, \code{ d3(15, 30 cm)} and \code{ d4(30, 100 cm)}\cr - vfruit: fruit volume in \eqn{mm^{3}}{mm^3} (logged transform)\cr - vgrain: seed volume in \eqn{mm^{3}}{mm^3} (logged transform)\cr - aire: spatial distribution area (\eqn{km^{2}}{km^2})\cr - alti: maximum altitude in meter (logged transform)\cr } \note{ This dataset replaces the former version in ade4. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ ## load data, make a tree and a phylo4d object data(palm) tre <- read.tree(text=palm$tre) rord <- as.integer(palm$traits$rord) # just use this for plotting purpose traits <- data.frame(rord, palm$traits[,-1]) x <- phylo4d(tre, traits) ## plot data par(mar=rep(.1,4)) table.phylo4d(x, cex.lab=.6) ## test phylogenetic autocorrelation if(require(ade4)){ prox <- proxTips(x, method="sumDD") phylAutoTests <- gearymoran(prox, traits[,-3], nrep=499) plot(phylAutoTests) } } } } \keyword{datasets} adephylo/man/listDD.Rd0000644000176200001440000000222613176115016014307 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils.R \name{listDD} \alias{listDD} \title{List direct descendants for all nodes of a tree} \usage{ listDD(x, nameBy = c("label", "number")) } \arguments{ \item{x}{A tree of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}.} \item{nameBy}{a character string indicating whether the returned list must be named by node labels ("label") or by node numbers ("number").} } \value{ A list whose components are vectors of named nodes (or tips) for a given internal node. } \description{ The function \code{listDD} lists the direct descendants from each node of a tree. The tree can be of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}. } \examples{ if(require(ape) & require(phylobase)){ ## make a tree x <- as(rtree(20),"phylo4") plot(x,show.node=TRUE) listDD(x) } } \seealso{ \code{\link{listTips}} which lists the tips descending from each node. \cr \code{\link{treePart}} which defines partitions of tips according to the tree topology. } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip} adephylo/man/ppca.Rd0000644000176200001440000002117713176115016014055 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppca.R \name{ppca} \alias{ppca} \alias{print.ppca} \alias{summary.ppca} \alias{scatter.ppca} \alias{screeplot.ppca} \alias{plot.ppca} \alias{scatter.ppca} \alias{print.ppca} \alias{summary.ppca} \alias{screeplot.ppca} \alias{plot.ppca} \title{Phylogenetic principal component analysis} \usage{ ppca(x, prox = NULL, method = c("patristic", "nNodes", "oriAbouheif", "Abouheif", "sumDD"), f = function(x) { 1/x }, center = TRUE, scale = TRUE, scannf = TRUE, nfposi = 1, nfnega = 0) \method{scatter}{ppca}(x, axes = 1:ncol(x$li), useLag = FALSE, ...) \method{print}{ppca}(x, ...) \method{summary}{ppca}(object, ..., printres = TRUE) \method{screeplot}{ppca}(x, ..., main = NULL) \method{plot}{ppca}(x, axes = 1:ncol(x$li), useLag = FALSE, ...) } \arguments{ \item{x}{a \linkS4class{phylo4d} object (for \code{ppca}) or a ppca object (for other methods).} \item{prox}{a marix of phylogenetic proximities as returned by \code{\link{proxTips}}. If not provided, this matrix will be constructed using the arguments \code{method} and \code{a}.} \item{method}{a character string (full or abbreviated without ambiguity) specifying the method used to compute proximities; possible values are:\cr - \code{patristic}: (inversed sum of) branch lengths \cr - \code{nNodes}: (inversed) number of nodes on the path between the nodes \cr - \code{oriAbouheif}: original Abouheif's proximity, with diagonal (see details in \code{\link{proxTips}}) \cr - \code{Abouheif}: Abouheif's proximity (see details in \code{\link{proxTips}}) \cr - \code{sumDD}: (inversed) sum of direct descendants of all nodes on the path (see details in \code{\link{proxTips}}).} \item{f}{a function to change a distance into a proximity.} \item{center}{a logical indicating whether traits should be centred to mean zero (TRUE, default) or not (FALSE).} \item{scale}{a logical indicating whether traits should be scaled to unit variance (TRUE, default) or not (FALSE).} \item{scannf}{a logical stating whether eigenvalues should be chosen interactively (TRUE, default) or not (FALSE).} \item{nfposi}{an integer giving the number of positive eigenvalues retained ('global structures').} \item{nfnega}{an integer giving the number of negative eigenvalues retained ('local structures').} \item{axes}{the index of the principal components to be represented.} \item{useLag}{a logical stating whether the lagged components (\code{x\$ls}) should be used instead of the components (\code{x\$li}).} \item{\dots}{further arguments passed to other methods. Can be used to provide arguments to \code{\link{table.phylo4d}} in \code{plot} method.} \item{object}{a \code{ppca} object.} \item{printres}{a logical stating whether results should be printed on the screen (TRUE, default) or not (FALSE).} \item{main}{a title for the screeplot; if NULL, a default one is used.} } \value{ The class \code{ppca} are given to lists with the following components:\cr \item{eig}{a numeric vector of eigenvalues.} \item{nfposi}{an integer giving the number of global structures retained.} \item{nfnega}{an integer giving the number of local structures retained.} \item{c1}{a data.frame of loadings of traits for each axis.} \item{li}{a data.frame of coordinates of taxa onto the ppca axes (i.e., principal components).} \item{ls}{a data.frame of lagged prinpal components; useful to represent of global scores.} \item{as}{a data.frame giving the coordinates of the axes of an 'ordinary' PCA onto the ppca axes.} \item{call}{the matched call.} \item{tre}{a phylogenetic tre with class \linkS4class{phylo4}.} \item{prox}{a matrix of phylogenetic proximities.} Other functions have different outputs:\cr - \code{scatter.ppca} returns the matched call.\cr } \description{ These functions are designed to perform a phylogenetic principal component analysis (pPCA, Jombart et al. 2010) and to display the results. } \details{ \code{ppca} performs the phylogenetic component analysis. Other functions are:\cr - \code{print.ppca}: prints the ppca content\cr - \code{summary.ppca}: provides useful information about a ppca object, including the decomposition of eigenvalues of all axes\cr - \code{scatter.ppca}: plot principal components using \code{\link{table.phylo4d}}\cr - \code{screeplot.ppca}: graphical display of the decomposition of pPCA eigenvalues\cr - \code{plot.ppca}: several graphics describing a ppca object\cr The phylogenetic Principal Component Analysis (pPCA, Jombart et al., 2010) is derived from the spatial Principal Component Analysis (spca, Jombart et al. 2008), implemented in the adegenet package (see \code{\link[adegenet]{spca}}).\cr pPCA is designed to investigate phylogenetic patterns a set of quantitative traits. The analysis returns principal components maximizing the product of variance of the scores and their phylogenetic autocorrelation (Moran's I), therefore reflecting life histories that are phylogenetically structured. Large positive and large negative eigenvalues correspond to global and local structures.\cr } \examples{ data(lizards) if(require(ape) && require(phylobase)){ #### ORIGINAL EXAMPLE FROM JOMBART ET AL 2010 #### ## BUILD A TREE AND A PHYLO4D OBJECT liz.tre <- read.tree(tex=lizards$hprA) liz.4d <- phylo4d(liz.tre, lizards$traits) par(mar=rep(.1,4)) table.phylo4d(liz.4d,var.lab=c(names(lizards$traits), "ACP 1\\n(\\"size effect\\")"),show.node=FALSE, cex.lab=1.2) ## REMOVE DUPLICATED POPULATIONS liz.4d <- prune(liz.4d, c(7,14)) table.phylo4d(liz.4d) ## CORRECT LABELS lab <- c("Pa", "Ph", "Ll", "Lmca", "Lmcy", "Phha", "Pha", "Pb", "Pm", "Ae", "Tt", "Ts", "Lviv", "La", "Ls", "Lvir") tipLabels(liz.4d) <- lab ## REMOVE SIZE EFFECT dat <- tdata(liz.4d, type="tip") dat <- log(dat) newdat <- data.frame(lapply(dat, function(v) residuals(lm(v~dat$mean.L)))) rownames(newdat) <- rownames(dat) tdata(liz.4d, type="tip") <- newdat[,-1] # replace data in the phylo4d object ## pPCA liz.ppca <- ppca(liz.4d,scale=FALSE,scannf=FALSE,nfposi=1,nfnega=1, method="Abouheif") liz.ppca tempcol <- rep("grey",7) tempcol[c(1,7)] <- "black" barplot(liz.ppca$eig,main='pPCA eigenvalues',cex.main=1.8,col=tempcol) par(mar=rep(.1,4)) plot(liz.ppca,ratio.tree=.7) ## CONTRIBUTIONS TO PC (LOADINGS) (viewed as dotcharts) dotchart(liz.ppca$c1[,1],lab=rownames(liz.ppca$c1),main="Global principal component 1") abline(v=0,lty=2) dotchart(liz.ppca$c1[,2],lab=rownames(liz.ppca$c1),main="Local principal component 1") abline(v=0,lty=2) ## REPRODUCE FIGURES FROM THE PAPER obj.ppca <- liz.4d tdata(obj.ppca, type="tip") <- liz.ppca$li myLab <- paste(" ",rownames(liz.ppca$li), sep="") ## FIGURE 1 par(mar=c(.1,2.4,2.1,1)) table.phylo4d(obj.ppca, ratio=.7, var.lab=c("1st global PC", "1st local PC"), tip.label=myLab,box=FALSE,cex.lab=1.4, cex.sym=1.2, show.node.label=TRUE) add.scatter.eig(liz.ppca$eig,1,1,1,csub=1.2, posi="topleft", ratio=.23) ## FIGURE 2 s.arrow(liz.ppca$c1,xlim=c(-1,1),clab=1.3,cgrid=1.3) #### ANOTHER EXAMPLE - INCLUDING NA REPLACEMENT #### ## LOAD THE DATA data(maples) tre <- read.tree(text=maples$tre) x <- phylo4d(tre, maples$tab) omar <- par("mar") par(mar=rep(.1,4)) table.phylo4d(x, cex.lab=.5, cex.sym=.6, ratio=.1) # note NAs in last trait ('x') ## FUNCTION TO REPLACE NAS f1 <- function(vec){ if(any(is.na(vec))){ m <- mean(vec, na.rm=TRUE) vec[is.na(vec)] <- m } return(vec) } ## PERFORM THE PPCA dat <- apply(maples$tab,2,f1) # replace NAs x.noNA <- phylo4d(tre, as.data.frame(dat)) map.ppca <- ppca(x.noNA, scannf=FALSE, method="Abouheif") map.ppca ## SOME GRAPHICS screeplot(map.ppca) scatter(map.ppca, useLag=TRUE) plot(map.ppca, useLag=TRUE) ## MOST STRUCTURED TRAITS a <- map.ppca$c1[,1] # loadings on PC 1 names(a) <- row.names(map.ppca$c1) highContrib <- a[a< quantile(a,0.1) | a>quantile(a,0.9)] datSel <- cbind.data.frame(dat[, names(highContrib)], map.ppca$li) temp <- phylo4d(tre, datSel) table.phylo4d(temp) # plot of most structured traits ## PHYLOGENETIC AUTOCORRELATION TESTS FOR THESE TRAITS prox <- proxTips(tre, method="Abouheif") abouheif.moran(dat[, names(highContrib)], prox) } } \references{ Jombart, T.; Pavoine, S.; Dufour, A. & Pontier, D. (2010, in press) Exploring phylogeny as a source of ecological variation: a methodological approach. doi:10.1016/j.jtbi.2010.03.038 Jombart, T., Devillard, S., Dufour, A.-B. and Pontier, D. (2008) Revealing cryptic phylogenetic patterns in genetic variability by a new multivariate method. \emph{Heredity}, \bold{101}, 92--103. } \seealso{ The implementation of \code{\link[adegenet]{spca}} in the adegenet package (\code{\link[adegenet]{adegenet}}) \cr } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{multivariate} adephylo/man/lizards.Rd0000644000176200001440000000502713176115016014576 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{data} \name{lizards} \alias{lizards} \title{Phylogeny and quantitative traits of lizards} \format{\code{lizards} is a list containing the 3 following objects : \describe{ \item{traits}{is a data frame with 18 species and 8 traits.} \item{hprA}{is a character string giving the phylogenetic tree (hypothesized phylogenetic relationships based on immunological distances) in Newick format.} \item{hprB}{is a character string giving the phylogenetic tree (hypothesized phylogenetic relationships based on morphological characteristics) in Newick format.} }} \description{ This data set describes the phylogeny of 18 lizards as reported by Bauwens and D\'iaz-Uriarte (1997). It also gives life-history traits corresponding to these 18 species. } \details{ Variables of \code{lizards$traits} are the following ones : mean.L (mean length (mm)), matur.L (length at maturity (mm)), max.L (maximum length (mm)), hatch.L (hatchling length (mm)), hatch.m (hatchling mass (g)), clutch.S (Clutch size), age.mat (age at maturity (number of months of activity)), clutch.F (clutch frequency). } \note{ This dataset replaces the former version in ade4. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ ## see data data(lizards) liz.tr <- read.tree(tex=lizards$hprA) # make a tree liz <- phylo4d(liz.tr, lizards$traits) # make a phylo4d object table.phylo4d(liz) ## compute and plot principal components if(require(ade4)){ liz.pca1 <- dudi.pca(lizards$traits, cent=TRUE, scale=TRUE, scannf=FALSE, nf=2) # PCA of traits myPC <- phylo4d(liz.tr, liz.pca1$li) # store PC in a phylo4d object varlab <- paste("Principal \\ncomponent", 1:2) # make labels for PCs table.phylo4d(myPC, ratio=.8, var.lab=varlab) # plot the PCs add.scatter.eig(liz.pca1$eig,2,1,2,posi="topleft", inset=c(0,.15)) title("Phylogeny and the principal components") ## compute a pPCA ## ## remove size effect temp <- lapply(liz.pca1$tab, function(e) residuals(lm(e~-1+liz.pca1$li[,1])) ) temp <- data.frame(temp) row.names(temp) <- tipLabels(liz) ## build corresponding phylo4d object liz.noSize <- phylo4d(liz.tr, temp) ppca1 <- ppca(liz.noSize, method="Abouheif", scale=FALSE, scannf=FALSE) plot(ppca1) } } } } \references{ Bauwens, D., and D\'iaz-Uriarte, R. (1997) Covariation of life-history traits in lacertid lizards: a comparative study. \emph{American Naturalist}, \bold{149}, 91--111. See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps063.pdf} (in French). } \keyword{datasets} adephylo/man/dibas.Rd0000644000176200001440000001021713176115016014205 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dibas.R \name{dibas} \alias{dibas} \alias{dibas.matrix} \alias{dibas.dist} \alias{dibas.phylo} \alias{dibas.vector} \alias{simDatGroups} \alias{dibas.matrix} \alias{dibas.vector} \alias{dibas.phylo} \alias{dibas.dist} \title{DIstance-Based Assignment} \usage{ dibas(x, ...) \method{dibas}{matrix}(x, grp, method = c("default", "leaveOneOut"), ...) \method{dibas}{vector}(x, grp, method = c("default", "leaveOneOut"), n.items = NULL, ...) \method{dibas}{phylo}(x, grp, method = c("default", "leaveOneOut"), fromRoot = FALSE, metric = c("Abouheif", "nNodes", "patristic", "sumDD"), n.items = NULL, ...) \method{dibas}{dist}(x, grp, method = c("default", "leaveOneOut"), ...) } \arguments{ \item{x}{a \code{phylo} object, or a symmetric matrix of pairwise distances of class \code{matrix} or \code{dist}.} \item{\dots}{further arguments passed to other methods. Can be used to provide arguments to \code{\link{table.phylo4d}} in \code{plot} method.} \item{grp}{a \code{factor} indicating the groups of observations.} \item{method}{a character string indicating the method to be used for estimating the distribution of pairwise distances within groups. The default method ("default") uses all observations, while the "leaveOneOut" estimates separate group distributions for each individual, leaving this one out in the estimation process.} \item{n.items}{a vector of integers of the same length as x, stating how many times each items in 'x' should be repeated; used to take into account differences in abundances of the different items (e.g. sequences in multiple copies).} \item{fromRoot}{a logical indicating if distances from the root, rather than between groups, should be used.} \item{metric}{a character string matching "nNodes", "patristic", "Abouheif", or "sumDD" indicating the distance measure to be used. See \code{\link{distTips}} for more information. Note that patristic distances should be avoided in presence of one or more highly diverse group because of the 'hand fan' syndrome (see example).} } \description{ These functions are under development. Please do not use them unless asked by the author. } \examples{ \dontrun{ if(require(ape)){ #### SIMPLE SIMULATED DATA #### ## 50 variables, 2 groups, 30 indiv dat <- simDatGroups(k=2, p=50, n=c(15,15), mu=c(0,1)) names(dat) ## make a tree tre <- nj(dist(dat$dat)) plot(tre,type="unr", tip.col=c("blue","red")[as.integer(dat$grp)], main="simulated data - tree") ## use dibas method res <- dibas(tre, dat$grp, metric="nNodes") res barplot(t(res$prob), main="group membership probabilities") #### NON-PARAMETRIC TEST BASED ON MEAN SUCCESSFUL ASSIGNMENT #### ## use dibas method distHo <- replicate(100, dibas(tre, sample(dat$grp), metric="patristic")$mean.ok) pval <- mean(res$mean.ok<=c(distHo,res$mean.ok)) pval hist(c(distHo,res$mean.ok), col="grey", main="Mean successful assignement - permuted values") abline(v=res$mean.ok, col="red") mtext(side=3, text="Observed value in red") #### HAND FAN SYNDROME #### ## 50 variables, 2 groups, 30 indiv dat <- simDatGroups(k=2, p=50, n=c(15,15), mu=c(0,1), sigma=c(2,4)) names(dat) ## make a tree tre <- nj(dist(dat$dat)) plot(tre,type="unr", tip.col=c("blue","red")[as.integer(dat$grp)], main="simulated data - tree") mtext(side=3, text="hand-fan syndrome") ## use dibas method res.patri <- dibas(tre, dat$grp, metric="patristic") res.patri$grp.tab # poor results plot(table(res.patri$groups), main="Group assignment - dibas patristic") res <- dibas(tre, dat$grp, metric="nNodes") res$grp.tab # results OK plot(table(res$groups), main="Group assignment - dibas nNodes") #### MORE COMPLEX DATASET #### if(require(adegenet)){ dat <- simDatGroups(k=5, p=50, n=c(5,10,10,30,60), mu=sample(1:5, 5, replace=TRUE), sigma=sample(1:5)/2) names(dat) ## make a tree tre <- nj(dist(dat$dat)) plot(tre,type="unr", tip.col=fac2col(dat$grp),main="simulated data - tree") ## use dibas method res <- dibas(tre, dat$grp, metric="Abouheif") res plot(table(res$groups), main="Group assignment - dibas Abouheif") } } } } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{multivariate} adephylo/man/carni19.Rd0000644000176200001440000000206513176115016014373 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{data} \name{carni19} \alias{carni19} \title{Phylogeny and quantative trait of carnivora} \format{\code{carni19} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{bm}{is a numeric vector which values correspond to the body mass of the 19 species (log scale).} }} \source{ Diniz-Filho, J. A. F., de Sant'Ana, C.E.R. and Bini, L.M. (1998) An eigenvector method for estimating phylogenetic inertia. \emph{Evolution}, \bold{52}, 1247--1262. } \description{ This data set describes the phylogeny of carnivora as reported by Diniz-Filho et al. (1998). It also gives the body mass of these 19 species. } \note{ This dataset replaces the former version in ade4. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ data(carni19) tre <- read.tree(text=carni19$tre) x <- phylo4d(tre, data.frame(carni19$bm)) table.phylo4d(x, ratio=.5, center=FALSE) } } } \keyword{datasets} adephylo/man/treePart.Rd0000644000176200001440000000401713176115016014712 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/partition.R \name{treePart} \alias{treePart} \title{Define partitions of tips according from a tree} \usage{ treePart(x, result = c("dummy", "orthobasis")) } \arguments{ \item{x}{a tree of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}.} \item{result}{a character string specifying the type of result: either a basis of dummy vectors (\code{dummy}), or an orthobasis derived from these dummy vectors (\code{orthobasis}).} } \value{ A matrix of numeric vectors (in columns) having one value for each tip (rows). } \description{ The function \code{treePart} defines partitions of tips reflecting the topology of a tree. There are two possible outputs (handled by the argument \code{result}):\cr - \code{basis} mode: each node but the root is translated into a dummy vector having one value for each tip: this value is '1' if the tip descends from this node, and '0' otherwise.\cr - \code{orthobasis}: in this mode, an orthonormal basis is derived from the basis previously mentionned. This orthobasis was proposed in the orthogram (Ollier \emph{et al.} 2006). } \details{ Orthobasis produced by this function are identical to those stored in the \$Bscores component of deprecated \link[ade4]{phylog} objects, from the ade4 package. } \examples{ \dontrun{ if(require(ape) & require(phylobase)){ ## make a tree x <- as(rtree(10),"phylo4") partition <- treePart(x) partition ## plot the dummy vectors with the tree temp <- phylo4d(x, partition) table.phylo4d(temp, cent=FALSE, scale=FALSE) } } } \references{ Ollier, S., Chessel, D. and Couteron, P. (2005) Orthonormal Transform to Decompose the Variance of a Life-History Trait across a Phylogenetic Tree. \emph{Biometrics}, \bold{62}, 471--477. } \seealso{ - \code{\link{listDD}} which is called by \code{treePart}.\cr - \code{\link{orthogram}}, which uses by default the orthobasis produced by \code{treePart}.\cr } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip} adephylo/man/distRoot.Rd0000644000176200001440000000476713176115016014747 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distances.R \name{distRoot} \alias{distRoot} \title{Compute the distance of tips to the root} \usage{ distRoot(x, tips = "all", method = c("patristic", "nNodes", "Abouheif", "sumDD")) } \arguments{ \item{x}{a tree of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}.} \item{tips}{A vector of integers identifying tips by their numbers, or a vector of characters identifying tips by their names.} \item{method}{a character string (full or abbreviated without ambiguity) specifying the method used to compute distances ; possible values are:\cr - \code{patristic}: patristic distance, i.e. sum of branch lengths \cr - \code{nNodes}: number of nodes on the path between the nodes \cr - \code{Abouheif}: Abouheif's distance (see details) \cr - \code{sumDD}: sum of direct descendants of all nodes on the path (see details) \cr} } \value{ A numeric vector containing one distance value for each tip. } \description{ The function \code{distRoot} computes the distance of a set of tips to the root. Several distances can be used, defaulting to the sum of branch lengths. } \details{ \code{Abouheif} distance refers to the phylogenetic distance underlying the test of Abouheif (see references). Let P be the set of all the nodes in the path going from \code{node1} to \code{node2}. Let DDP be the number of direct descendants from each node in P. Then, the so-called 'Abouheif' distance is the product of all terms in DDP.\cr \code{sumDD} refers to a phylogenetic distance quite similar to that of Abouheif. We consider the same sets P and DDP. But instead of computing the product of all terms in DDP, this distance computes the sum of all terms in DDP. } \examples{ if(require(ape) & require(phylobase)){ ## make a tree x <- as(rtree(50),"phylo4") ## compute 4 different distances met <- c("patristic","nNodes","Abouheif","sumDD") D <- lapply(met, function(e) distRoot(x, method=e) ) names(D) <- met D <- as.data.frame(D) ## plot these distances along with the tree temp <- phylo4d(x, D) table.phylo4d(temp, show.node=FALSE, cex.lab=.6) } } \references{ Pavoine, S.; Ollier, S.; Pontier, D. & Chessel, D. (2008) Testing for phylogenetic signal in life history variable: Abouheif's test revisited. \emph{Theoretical Population Biology}: \bold{73}, 79-91. } \seealso{ \code{\link{distTips}} which computes the same phylogenetic distances, but between tips. } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip} adephylo/man/maples.Rd0000644000176200001440000000301613176115016014403 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{data} \name{maples} \alias{maples} \title{Phylogeny and quantitative traits of flowers} \format{\code{tithonia} is a list containing the 2 following objects : - tre: a character string giving the phylogenetic tree in Newick format.\cr - tab: a data frame with 17 species and 31 traits.\cr} \description{ This data set describes the phylogeny of 17 flowers as reported by Ackerly and Donoghue (1998). It also gives 31 traits corresponding to these 17 species. } \note{ This dataset replaces the former version in ade4. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ data(maples) ## see the tree tre <- read.tree(text=maples$tre) plot(tre) axisPhylo() ## look at two variables dom <- maples$tab$Dom bif <- maples$tab$Bif plot(bif,dom,pch = 20) abline(lm(dom~bif)) # a strong negative correlation ? summary(lm(dom~bif)) cor.test(bif,dom) ## look at the two variables onto the phylogeny temp <- phylo4d(tre, data.frame(dom,bif, row.names=tre$tip.label)) table.phylo4d(temp) # correlation is strongly linked to phylogeny ## use ape's PIC (phylogenetic independent contrasts) pic.bif <- pic(bif, tre) pic.dom <- pic(dom, tre) cor.test(pic.bif, pic.dom) # correlation is no longer significant } } } \references{ Ackerly, D. D. and Donoghue, M.J. (1998) Leaf size, sappling allometry, and Corner's rules: phylogeny and correlated evolution in Maples (Acer). \emph{American Naturalist}, \bold{152}, 767--791. } \keyword{datasets} adephylo/man/tithonia.Rd0000644000176200001440000000432313176115016014743 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{data} \name{tithonia} \alias{tithonia} \title{Phylogeny and quantitative traits of flowers} \format{\code{tithonia} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{tab}{is a data frame with 11 species and 14 traits (6 morphologic traits and 8 demographic).} }} \source{ Data were obtained from Morales, E. (2000) Estimating phylogenetic inertia in Tithonia (Asteraceae) : a comparative approach. \emph{Evolution}, \bold{54}, 2, 475--484. } \description{ This data set describes the phylogeny of 11 flowers as reported by Morales (2000). It also gives morphologic and demographic traits corresponding to these 11 species. } \details{ Variables of \code{tithonia$tab} are the following ones : \cr morho1: is a numeric vector that describes the seed size (mm)\cr morho2: is a numeric vector that describes the flower size (mm)\cr morho3: is a numeric vector that describes the female leaf size (cm)\cr morho4: is a numeric vector that describes the head size (mm)\cr morho5: is a integer vector that describes the number of flowers per head \cr morho6: is a integer vector that describes the number of seeds per head \cr demo7: is a numeric vector that describes the seedling height (cm)\cr demo8: is a numeric vector that describes the growth rate (cm/day)\cr demo9: is a numeric vector that describes the germination time\cr demo10: is a numeric vector that describes the establishment (per cent)\cr demo11: is a numeric vector that describes the viability (per cent)\cr demo12: is a numeric vector that describes the germination (per cent)\cr demo13: is a integer vector that describes the resource allocation\cr demo14: is a numeric vector that describes the adult height (m)\cr } \note{ This dataset replaces the former version in ade4. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ data(tithonia) tre <- read.tree(text=tithonia$tre) traits <- log(tithonia$tab + 1) rownames(traits) <- gsub("_", ".", rownames(traits)) ## build a phylo4d object x <- phylo4d(tre, traits) par(mar=rep(.1,4)) table.phylo4d(x) } } } \keyword{datasets} adephylo/man/orthobasis.Rd0000644000176200001440000001043513176115016015302 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/orthobasis.R \name{orthobasis.phylo} \alias{orthobasis.phylo} \alias{me.phylo} \title{Computes Moran's eigenvectors from a tree or a phylogenetic proximity matrix} \usage{ orthobasis.phylo(x = NULL, prox = NULL, method = c("patristic", "nNodes", "oriAbouheif", "Abouheif", "sumDD"), f = function(x) { 1/x }) } \arguments{ \item{x}{A tree of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}.} \item{prox}{a matrix of phylogenetic proximities as returned by \code{\link{proxTips}}.} \item{method}{a character string (full or abbreviated without ambiguity) specifying the method used to compute proximities; possible values are:\cr - \code{patristic}: (inversed sum of) branch lengths \cr - \code{nNodes}: (inversed) number of nodes on the path between the nodes \cr - \code{oriAbouheif}: original Abouheif's proximity, with diagonal (see details in \code{\link{proxTips}}) \cr - \code{Abouheif}: Abouheif's proximity (see details in \code{\link{proxTips}}) \cr - \code{sumDD}: (inversed) sum of direct descendants of all nodes on the path (see details in \code{\link{proxTips}}).} \item{f}{a function to change a distance into a proximity.} } \value{ An object of class \code{orthobasis}. This is a data.frame with Moran's eigenvectors in column, with special attributes:\cr - attr(...,"values"): Moran's index for each vector - attr(...,"weights"): weights of tips; current implementation uses only uniform weights } \description{ The function \code{orthobasis.phylo} (also nicknamed \code{me.phylo}) computes Moran's eigenvectors (ME) associated to a tree. If the tree has 'n' tips, (n-1) vectors will be produced. These vectors form an orthonormal basis: they are centred to mean zero, have unit variance, and are uncorrelated. Each vector models a different pattern of phylogenetic autocorrelation. The first vectors are those with maximum positive autocorrelation, while the last vectors are those with maximum negative autocorrelation. ME can be used, for instance, as regressors to remove phylogenetic autocorrelation from data (see references).\cr } \details{ ME can be obtained from a tree, specifying the phylogenetic proximity to be used. Alternatively, they can be obtained directly from a matrix of phylogenetic proximities as constructed by \code{\link{proxTips}}. } \examples{ if(require(ape) && require(phylobase)){ ## SIMPLE EXAMPLE ## ## make a tree x <- rtree(50) ## compute Moran's eigenvectors ME <- me.phylo(x, met="Abouheif") ME ## plot the 10 first vectors obj <- phylo4d(x, as.data.frame(ME[,1:10])) table.phylo4d(obj, cex.sym=.7, cex.lab=.7) \dontrun{ ## REMOVING PHYLOGENETIC AUTOCORRELATION IN A MODEL ## ## use example in ungulates dataset data(ungulates) tre <- read.tree(text=ungulates$tre) plot(tre) ## look at two traits afbw <- log(ungulates$tab[,1]) neonatw <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) names(afbw) <- tre$tip.label names(neonatw) <- tre$tip.label plot(afbw, neonatw) # relationship between traits lm1 <- lm(neonatw~afbw) abline(lm1) lm1 resid1 <- residuals(lm1) orthogram(resid1, tre) # residuals are autocorrelated ## compute Moran's eigenvectors (ME) myME <- me.phylo(tre, method="Abou") lm2 <- lm(neonatw ~ myME[,1] + afbw) # use for ME as covariable resid2 <- residuals(lm2) orthogram(resid2, tre) # there is no longer phylogenetic autocorrelation ## see the difference table.phylo4d(phylo4d(tre, cbind.data.frame(resid1, resid2))) } } } \references{ Peres-Neto, P. (2006) A unified strategy for estimating and controlling spatial, temporal and phylogenetic autocorrelation in ecological models \emph{Oecologica Brasiliensis} \bold{10}: 105-119.\cr Dray, S.; Legendre, P. \& Peres-Neto, P. (2006) Spatial modelling: a comprehensive framework for principal coordinate analysis of neighbours matrices (PCNM) \emph{Ecological Modelling} \bold{196}: 483-493.\cr Griffith, D. \& Peres-Neto, P. (2006) Spatial modeling in ecology: the flexibility of eigenfunction spatial analyses \emph{Ecology} \bold{87}: 2603-2613.\cr } \seealso{ - \code{\link{proxTips}} which computes phylogenetic proximities between tips.\cr - \code{\link{treePart}} which can compute an orthobasis based on the topology of a phylogeny.\cr } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip} adephylo/man/carni70.Rd0000644000176200001440000000320513176115016014365 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/adephylo-package.R \docType{data} \name{carni70} \alias{carni70} \title{Phylogeny and quantitative traits of carnivora} \format{\code{carni70} is a list containing the 2 following objects: \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format. Branch lengths are expressed as divergence times (millions of years)} \item{tab}{is a data frame with 70 species and two traits: size (body size (kg)) ; range (geographic range size (km)).} }} \source{ Diniz-Filho, J. A. F., and N. M. Torres. (2002) Phylogenetic comparative methods and the geographic range size-body size relationship in new world terrestrial carnivora. \emph{Evolutionary Ecology}, \bold{16}, 351--367. } \description{ This data set describes the phylogeny of 70 carnivora as reported by Diniz-Filho and Torres (2002). It also gives the geographic range size and body size corresponding to these 70 species. } \note{ This dataset replaces the former version in ade4. } \examples{ \dontrun{ if(require(ape) && require(phylobase)){ data(carni70) rownames(carni70$tab) <- gsub("_", ".", rownames(carni70$tab)) tre <- read.tree(text=carni70$tre) x <- phylo4d(tre, carni70$tab) table.phylo4d(x) par(mar=rep(.1,4)) table.phylo4d(x,cex.lab=.5, show.n=FALSE, ratio=.5) ## transform size in log and test for a phylogenetic signal size <- log(carni70$tab)[,1] names(size) <- row.names(carni70$tab) orthogram(size, tre) ## transform range and test for a phylogenetic signal yrange <- scale(carni70$tab)[,2] names(yrange) <- row.names(carni70$tab) orthogram(yrange, tre) } } } \keyword{datasets} adephylo/man/distTips.Rd0000644000176200001440000000740313176115016014731 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distances.R \name{distTips} \alias{distTips} \title{Compute some phylogenetic distance between tips} \usage{ distTips(x, tips = "all", method = c("patristic", "nNodes", "Abouheif", "sumDD"), useC = TRUE) } \arguments{ \item{x}{a tree of class \code{\link[ape:read.tree]{phylo}}, \linkS4class{phylo4} or \linkS4class{phylo4d}.} \item{tips}{A vector of integers identifying tips by their numbers, or a vector of characters identifying tips by their names. Distances will be computed between all possible pairs of tips.} \item{method}{a character string (full or abbreviated without ambiguity) specifying the method used to compute distances ; possible values are:\cr - \code{patristic}: patristic distance, i.e. sum of branch lengths \cr - \code{nNodes}: number of nodes on the path between the nodes \cr - \code{Abouheif}: Abouheif's distance (see details) \cr - \code{sumDD}: sum of direct descendants of all nodes on the path (see details) \cr} \item{useC}{a logical indicating whether computations should be performed using compiled C code (TRUE, default), or using a pure R version (FALSE). C version is several orders of magnitude faster, and R version is kept for backward compatibility.} } \value{ An object of class \code{dist}, containing phylogenetic distances. } \description{ The function \code{distTips} computes a given distance between a set of tips of a phylogeny. A vector of tips is supplied: distances between all possible pairs of these tips are computed. The distances are computed from the shortest path between the tips. Several distances can be used, defaulting to the sum of branch lengths (see argument \code{method}). } \details{ An option (enabled by default) allows computations to be run using compiled C code, which is much faster than pure R code. In this case, a matrix of all pairwise distances is returned (i.e., \code{tips} argument is ignored). \code{Abouheif} distance refers to the phylogenetic distance underlying the test of Abouheif (see references). Let P be the set of all the nodes in the path going from \code{node1} to \code{node2}. Let DDP be the number of direct descendants from each node in P. Then, the so-called 'Abouheif' distance is the product of all terms in DDP.\cr \code{sumDD} refers to a phylogenetic distance quite similar to that of Abouheif. We consider the same sets P and DDP. But instead of computing the product of all terms in DDP, this distance computes the sum of all terms in DDP. } \examples{ if(require(ape) & require(phylobase)){ ## make a tree x <- as(rtree(10),"phylo4") plot(x, show.node=TRUE) axisPhylo() ## compute different distances distTips(x, 1:3) distTips(x, 1:3, "nNodes") distTips(x, 1:3, "Abouheif") distTips(x, 1:3, "sumDD") ## compare C and pure R code outputs x <- rtree(10) all.equal(as.matrix(distTips(x)), as.matrix(distTips(x, useC=FALSE))) all.equal(as.matrix(distTips(x, meth="nNode")), as.matrix(distTips(x, meth="nNode", useC=FALSE))) all.equal(as.matrix(distTips(x, meth="Abou")), as.matrix(distTips(x, meth="Abou", useC=FALSE))) all.equal(as.matrix(distTips(x, meth="sumDD")), as.matrix(distTips(x, meth="sumDD", useC=FALSE))) ## compare speed x <- rtree(50) tim1 <- system.time(distTips(x, useC=FALSE)) # old pure R version tim2 <- system.time(distTips(x)) # new version using C tim1[c(1,3)]/tim2[c(1,3)] # C is about a thousand time faster in this case } } \references{ Pavoine, S.; Ollier, S.; Pontier, D. & Chessel, D. (2008) Testing for phylogenetic signal in life history variable: Abouheif's test revisited. \emph{Theoretical Population Biology}: \bold{73}, 79-91. } \seealso{ \code{\link{distTips}} which computes several phylogenetic distances between tips. } \author{ Thibaut Jombart \email{tjombart@imperial.ac.uk} } \keyword{manip}