I just
pushed
a fix to the S3 biplot
method for objects of class
"phyl.pca"
.
The source of the bug is closely related to my
recent
post on the discrepancy between what are called 'loadings' in
princomp
vs. phyl.pca
. A few years the gentleman
who kindly supplied the S3 method code used by phyl.pca
made
exactly the inverse mistake of princomp
.
First, here is our bi-plot with the existing method:
library(phytools)
tree
##
## Phylogenetic tree with 26 tips and 25 internal nodes.
##
## Tip labels:
## A, B, C, D, E, F, ...
##
## Rooted; includes branch lengths.
X
## [,1] [,2] [,3] [,4] [,5]
## A 0.419211564 -0.07072903 -0.67729412 -1.4275547 -0.8956189
## B 0.423491819 -0.07230281 0.04353057 -1.8236536 -1.5941026
## C 0.674572520 -0.97438998 -0.44582192 -1.2064721 -1.1968349
## D 0.144589136 -0.78968124 0.23939251 -0.1604712 1.2397129
## E 0.037492764 -0.33373486 -1.21897435 0.1363836 1.2665389
## F -0.049170578 -0.24004146 -1.25930976 -0.4204259 1.4010466
## G 0.270753737 -0.16233552 -1.44227716 -0.6901865 1.1583580
## H 0.307947940 -0.17681354 0.80860301 0.4294457 0.3390226
## I 0.121981063 -1.54597206 -0.60546618 -0.6466339 0.9344554
## J -0.420320783 0.21857516 -0.14983841 0.3039046 1.1689236
## K -0.250202949 -0.15091852 -0.26843245 1.0483096 1.4964830
## L 0.470691820 -1.64133733 0.01950930 0.9664008 -1.6606181
## M -0.859279349 -0.79613244 0.21614994 -0.6497791 0.9240529
## N -0.531125300 -0.83481129 0.84552758 -0.8766522 1.6286559
## O -0.362032884 -0.48093998 0.35350781 0.1044871 1.0196886
## P -0.271775777 0.11416429 -0.04792096 0.5975930 1.5266678
## Q -0.241609452 0.15047775 0.10962659 0.4692869 1.4156464
## R 0.250219313 -0.19964343 0.70567779 -0.8044968 1.4153869
## S 0.652031092 -0.57999496 0.41286288 0.2249271 1.5921390
## T 0.259519957 -0.52699138 0.47710290 0.4022593 1.5436005
## U 1.355538164 -0.97106032 0.90405187 0.9945186 2.4721401
## V 1.490160952 0.73566840 0.01132505 -0.6147261 2.8499558
## W 0.778375058 0.59260693 -0.13285445 -0.7414536 3.3113367
## X 0.542971500 0.73316942 -1.09947325 -2.6681790 3.1622164
## Y -0.259842325 0.62505613 -1.01765120 -1.3903978 3.3034612
## Z 0.001442499 0.56993438 -0.88314656 -1.4145177 2.7669227
pca<-phyl.pca(tree,X,method="lambda")
pca
## Phylogenetic pca
## Standard deviations:
## PC1 PC2 PC3 PC4 PC5
## 1.3889973 1.2627293 0.9716614 0.7283548 0.6591273
## Loads:
## PC1 PC2 PC3 PC4 PC5
## [1,] 0.27723112 -0.288933764 0.88668656 0.12016754 0.19750162
## [2,] 0.29061568 0.369744598 -0.25981002 -0.35072584 0.76702125
## [3,] -0.21999919 -0.266820125 0.29765195 -0.86158989 -0.22242651
## [4,] -0.98858119 -0.005420764 0.08204672 0.04923774 0.11628342
## [5,] -0.01938295 0.965462070 0.24065480 -0.02126167 -0.09560596
## lambda:
## [1] 1.002837
biplot(pca)
Here is our fixed biplot
method code:
biplot.phyl.pca<-function(x,...){
to.do<-list(...)
if(hasArg(choices)){
choices<-list(...)$choices
to.do$choices<-NULL
} else choices<-c(1,2)
to.do$x<-x$S[,choices]
to.do$y<-x$Evec[,choices]
do.call(biplot,to.do)
}
and here is the result we should have obtained:
biplot(pca)
That's it!
No comments:
Post a Comment
Note: due to the very large amount of spam, all comments are now automatically submitted for moderation.