/working/auteur.extended/R/generate.starting.point.R

http://github.com/eastman/auteur · R · 45 lines · 39 code · 3 blank · 3 comment · 13 complexity · 16c8e4c808601713565ff980e32bab3d MD5 · raw file

  1. #utility for generating a list of indicator variables and values for each branch in a phylogeny, using a random model complexity as a starting point (or by constraining model complexity)
  2. #author: JM EASTMAN 2010
  3. generate.starting.point <-
  4. function(data, phy, node.des, model, K=FALSE, jumpsize) {
  5. nn=length(phy$edge.length)
  6. ntip=Ntip(phy)
  7. if(!K) nshifts=rtpois(1,log(ntip),nn) else nshifts=K-1
  8. if(nshifts!=0) bb=sample(c(rep(1,nshifts),rep(0,nn-nshifts)),replace=FALSE) else bb=rep(0,nn)
  9. names(bb)=phy$edge[,2]
  10. shifts=as.numeric(names(bb)[bb==1])
  11. if(model=="OU") {
  12. min.max=c(adjustvalue(min(data), jumpsize), adjustvalue(max(data), jumpsize))
  13. values=runif(sum(bb)+1, min=min.max[min.max==min(min.max)], max=min.max[min.max==max(min.max)])
  14. } else if(model=="BM") {
  15. init.rate=fit.continuous(phy,data)
  16. min.max=c(adjustrate(init.rate, jumpsize), adjustrate(init.rate, jumpsize))
  17. values=runif(sum(bb)+1, min=min.max[min.max==min(min.max)], max=min.max[min.max==max(min.max)])
  18. }
  19. internal.shifts<-tip.shifts<-numeric(0)
  20. internal.shifts=sort(shifts[shifts>ntip])
  21. tip.shifts=shifts[shifts<=ntip]
  22. if(length(internal.shifts)==0 & length(tip.shifts)==0) {
  23. vv=rep(values, nn)
  24. } else {
  25. # assign randomly chosen values for each branch, respecting phylogenetic relationship
  26. vv=bb
  27. vv[]=values[length(values)]
  28. i=0
  29. if(length(internal.shifts)!=0) {
  30. for(i in 1:length(internal.shifts)) {
  31. d=node.des[which(names(node.des)==internal.shifts[i])]
  32. vv[match(c(internal.shifts[i], unlist(d)), names(vv))]=values[i]
  33. }
  34. }
  35. if(length(tip.shifts)!=0) {
  36. for(j in 1:length(tip.shifts)) {
  37. vv[match(tip.shifts[j], names(vv))]=values[j+i]
  38. }
  39. }
  40. }
  41. return(list(delta=unname(bb), values=unname(vv)))
  42. }