Hi David.The diagonal of Q is defined such that row sum (or sometimes the column sum) is zero. This is the case for any transition rate matrix of a continuous time Markov chain & is required so that matrix exponentiation of Q*t give the matrix P[i,j] in which i,j gives the probability of going from i->j.
In ace, rerootingMethod, etc. it is possible to specify the parameterization of the model (i.e., how many different transition rates to estimate, which ones to set equal to one another, and which ones to set to zero) - but not to constrain any particular rate to a specific value (other than zero). With make.simmap it is possible to fix Q at some arbitrary (valid) value. It will even give you the likelihood for that value, if I remember correctly.
All the best, Liam Liam J. Revell, Assistant Professor of Biology University of Massachusetts Boston web: http://faculty.umb.edu/liam.revell/ email: [email protected] blog: http://blog.phytools.org On 6/17/2015 4:29 PM, David Bapst wrote:
Liam- Yes, that works! I apparently confused the sort of model matrix needed by rTraitDisc with the sort needed by ace. Here's a full working example, for future posterity: ################# library(ape) library(phytools) data(bird.orders) #make a matrix for a 4 step trait model<-matrix(c(0,1,0,0, 1,0,1,0, 0,1,0,1, 0,0,1,0),4,4) #simulate data where you have only observed endmembers trait <- factor(c(rep(0, 5), rep(3, 18))) names(trait)<-bird.orders$tip.label trait<-to.matrix(trait,seq=0:3) rerootingMethod(tree=bird.orders, x=trait) #works rerootingMethod(tree=bird.orders, x=trait, model=model) ################# An interesting thing to note about the above example is that even with equal rates between sequential states, it infers a higher negative rate of staying in the missing states, so a better model might be one in we constrained the rate of staying in a state as the same across all states. However, that doesn't seem to be possible with ace/rerootingMethod as the diagonal of the model matrix is ignored, right? Brian, yes, corHMM seems like it should be able to do it; I overlooked that package. diversitree's ML reconstruction functions don't seem to accept a model matrix, at least based on current documentation. -Dave On Wed, Jun 17, 2015 at 1:30 PM, Liam J. Revell <[email protected]> wrote:Hi David. I think the problem may be that you're specifying the model matrix incorrectly. The model matrix is an integer matrix in which each number is a different rate type and the diagonal is zeroes. So, for instance, for a single-rate ordered model with four states you would do: model<-matrix(c(0,1,0,0, 1,0,1,0, 0,1,0,1, 0,0,1,0),4,4) (with row & column names of your states). A symmetric ordered model would be: model<-matrix(c(0,1,0,0, 1,0,2,0, 0,2,0,3, 0,0,3,0),4,4) ## I think Does this help? In my tests it seems to run fine for phytools. All the best, Liam Liam J. Revell, Assistant Professor of Biology University of Massachusetts Boston web: http://faculty.umb.edu/liam.revell/ email: [email protected] blog: http://blog.phytools.org On 6/17/2015 3:06 PM, David Bapst wrote:Liam, Ah, I see, rerootingMethod(), unlike ace, will accept a matrix representation of discrete trait values. However, it doesn't appear that one can define a model matrix still? Outside of molecular data, the missing state issue is often for ordered data, hence the need to define a model matrix. ################################ library(ape) library(phytools) data(bird.orders) #make a matrix for a 4 step trait model<-matrix(0,4,4) for(i in 1:4){for(j in 1:4){ if(abs(i-j)<2){ model[i,j]<-0.1 } }} rownames(model)<-colnames(model)<-0:3 #simulate data where you have only observed endmembers trait <- factor(c(rep(0, 5), rep(3, 18))) names(trait)<-bird.orders$tip.label trait<-to.matrix(trait,seq=0:3) rerootingMethod(tree=bird.orders, x=trait) #works rerootingMethod(tree=bird.orders, x=trait, model=model) #fails ################# Cheers, -Dave On Wed, Jun 17, 2015 at 12:06 PM, Liam J. Revell <[email protected]> wrote:Hi David. Actually, if I understand correctly, this does work in phytools. I suspect it can be set up in phangorn as well - Klaus can probably explain how. So, if I understand correctly, you want to get marginal ancestral states for a character that can assume, say, states "A", "C", "G", & "T", but for which you have only observed states "A", "C", & "G" (for instance) in your tip taxa? The way to do this in rerootingMethod is as follows: library(phytools) ## simulate some data to work with: tree<-pbtree(n=26,tip.label=letters,scale=1) Q<-matrix(c(-2,1,1,1,-2,1,1,1,-2),3,3) rownames(Q)<-colnames(Q)<-c("A","C","G") x<-sim.history(tree,Q)$states x ## our data ## now convert to a matrix representation: X<-to.matrix(x,seq=c("A","C","G","T")) ## reconstruct ancestral states fitER<-rerootingMethod(tree,X,model="ER") fitER Note that as we have not observed any evidence that changes to "T" occur for this character, if we use a symmetric model instead, we will find that the marginal likelihoods at all internal nodes for state "T" are zero. This is because the maximum likelihood q[i,"T"] & q["T",i] for all i will be zero (sensibly). For instance: fitSYM<-rerootingMethod(tree,X,model="SYM") fitSYM Let me know if this is what you had in mind. rerootingMethod just uses modified code from ace internally to do the calculations - so if ace does not permit this presently, it could easily be modified to allow it. phangorn too must allow this because for many nucleotide sites we want to reconstruct ancestral states - but we will have observed only a subset of the four nucleotides at that site. All the best, Liam Liam J. Revell, Assistant Professor of Biology University of Massachusetts Boston web: http://faculty.umb.edu/liam.revell/ email: [email protected] blog: http://blog.phytools.org On 6/17/2015 1:46 PM, David Bapst wrote:Hello all, (I'm a troublemaker today.) Sometimes, in ordered discrete data, there are states we know might exist as intermediary between observed states but aren't observed themselves. I suppose this is probably common for meristic data. At least to me, it seems like it should be possible to reconstruct node states in a scenario with 'missing' states in a ML approach by defining the corre Anyway, in a recent conversation with a friend, he noted that he couldn't get the function for ML ancestral reconstruction of discrete characters, specifically ace (in ape) or rerootingMethod (in phytools) to accept data with missing states. I was a little shocked by this, and I didn't believe him in my foolhardiness and investigated myself. ################################# library(ape) data(bird.orders) #make an ordered matrix for a 4 state trait model<-matrix(0,4,4) for(i in 1:4){for(j in 1:4){ if(abs(i-j)<2){ model[i,j]<-0.1 } }} rownames(model)<-colnames(model)<-0:3 #simulate data where you have only observed endmembers trait <- factor(c(rep(0, 5), rep(3, 18))) names(trait)<-bird.orders$tip.label ace(trait, bird.orders, type = "discrete") #works ace(trait, bird.orders, type = "discrete", model=model) #fail library(phytools) rerootingMethod(tree=bird.orders, x=trait) #works rerootingMethod(tree=bird.orders, x=trait, model=model) #fail ################################# (And it doesn't look like ancestral.pml in phangorn accepts model matrices.) So, are these functions rejecting a model with missing states due to a real analytical issue that I'm blithely ignorant of, or is there some other function that I've missed that will allow ML reconstruction with missing states? Cheers, -Dave
_______________________________________________ R-sig-phylo mailing list - [email protected] https://stat.ethz.ch/mailman/listinfo/r-sig-phylo Searchable archive at http://www.mail-archive.com/[email protected]/
