# This function fits two or more different evolutionary variance-covariance matrices (rate matrices) # to different parts of a phylogenetic tree # Takes a tree with a binary or multistate character "painted" on the branches in SIMMAP format # (see read.simmap()) and data for 1 or more continuous characters # Written by Liam J. Revell 2010, 2011 evol.vcv<-function(scm.tre,dat,maxit=2000,vars=FALSE){ # require dependencies require(ape) if(vars) require(numDeriv) # function converts symmetric matrix to vector by taking upper diagonal to.upper<-function(mat){ v<-vector(mode="numeric"); k<-1 for(i in 1:nrow(mat)) for(j in i:ncol(mat)){ v[k]<-mat[i,j] k<-k+1 } return(v) } # function converts vector to upper diagonal matrix upper.diag<-function(vect){ m<-(-1+sqrt(1+8*length(vect)))/2 mat<-matrix(0,m,m); k<-1 for(i in 1:m) for(j in i:m){ mat[i,j]<-vect[k] k<-k+1 } return(mat) } # function converts vector to symmetric matrix to.symmetric<-function(vect){ m<-(-1+sqrt(1+8*length(vect)))/2 mat<-matrix(0,m,m); k<-1 for(i in 1:m) for(j in i:m){ mat[i,j]<-vect[k] mat[j,i]<-mat[i,j] k<-k+1 } return(mat) } # bookkeeping X<-as.matrix(dat) n<-nrow(X) # number of species m<-ncol(X) # number of traits p<-ncol(scm.tre$mapped.edge) # number of states D<-matrix(0,n*m,m) for(i in 1:(n*m)) for(j in 1:m) if((j-1)*n