A couple of days I received the following inquiry about phylogenetic PCA as implemented
in the phytools function phyl.pca
:
“Also, another less pressing question I had was what to do about multiple samples from one species. I think the phylo.pca doesn't like 0 branch lengths (I think because of the inverted matrix error), so I've been putting in "placeholder” small branch lengths and/or averaging individuals of the same species. I'm not sure if this was more acceptable or if there was a more standard practice, though.“
Firstly, one should virtually never include interspecific data by adding terminal branches of zero (or very short) length to the tree. I won't get into why here - just don't do it please.
It is possible, however, to compute PC scores for one set of data based on a rotation computed for another set. With respect to the phylogenetic PCA, what I would thus recommend it to compute the rotation using the species means data & then if one wants to obtain scores for individuals, use this rotation to compute those scores.
I previously documented how to do this
here,
but today I also added a new S3 method called scores( )
that automates this
calculation for a "phyl.pca"
option. I just
pushed
this update to GitHub so it can be installed using devtools in the typical way.
Here's a quick demo of how it works:
library(phytools)
## latest phytools version from GitHub
packageVersion("phytools")
## [1] '0.7.3'
tree
##
## Phylogenetic tree with 26 tips and 25 internal nodes.
##
## Tip labels:
## Y, K, R, O, J, W, ...
##
## Rooted; includes branch lengths.
## individual data
Xi
## [,1] [,2] [,3] [,4] [,5]
## A1 1.20787154 0.47914789 0.8623047 1.2495477 -1.42947991
## A2 2.12320487 0.47402360 0.9550751 1.6972576 -1.91713104
## B1 -3.36948268 3.77947415 -0.8104234 5.5267960 -4.22373306
## B2 -3.89240291 3.54207211 -1.3588802 5.1915551 -3.65014197
## B3 -3.63879657 3.37713991 -1.9685069 4.3689452 -4.14255235
## B4 -4.17859299 3.73085941 -1.3349099 5.3970606 -3.86395132
## B5 -2.77632771 3.40620475 -2.0374127 5.4595384 -3.94879047
## C1 2.66252966 -1.69501406 5.0620859 1.4238734 -1.00437382
## C2 2.27931674 -2.71852958 4.8953938 1.0881464 -1.39655915
## C3 3.19271894 -1.67392645 4.3500289 2.0463243 -1.44478241
## C4 1.93553298 -2.86843955 4.8429547 1.6322762 -1.23128013
## C5 2.41170225 -2.05714667 4.7793417 2.0967727 -0.59099047
## D1 -3.06618045 -0.77675201 0.7938031 1.5116715 0.94196412
## D2 -3.36196611 -0.80817106 0.7938168 0.9432299 1.13672644
## E1 0.59350436 1.38165922 -0.3316782 1.9536058 -2.77096246
## E2 0.27218954 0.56687414 0.3876198 1.8826100 -1.69035681
## E3 -0.52332659 0.59848482 0.2504620 2.5939968 -1.65883260
## F1 0.22273476 -2.45198070 2.7746535 0.3861395 1.05274671
## G1 0.29489467 -2.73762657 2.6821865 -0.8493884 1.69457218
## G2 -0.65288642 -3.54374917 2.1397764 -1.0217453 0.94721876
## G3 -0.97408415 -3.32511230 2.7265237 -1.1669954 1.91906697
## G4 -0.02536859 -2.11640698 2.8554528 -1.2779744 1.76777639
## H1 -4.01209732 -0.23426385 -2.0376439 -0.3891521 1.00892916
## H2 -3.15960646 0.08868799 -2.0180995 -0.7439570 0.79702482
## H3 -3.70773942 0.14920207 -2.3082605 -1.0694013 -0.10941989
## H4 -3.46345662 0.22065346 -1.5988715 -1.0741026 0.11413459
## H5 -3.04286821 -0.24156083 -1.2535244 -1.1774794 1.38878052
## I1 0.99431344 -0.39255396 2.7078109 3.0684490 -2.19073296
## J1 1.48012052 -3.89868107 5.3744037 0.4072786 -1.20200149
## J2 0.48200711 -3.35309585 5.2460605 1.0674284 -1.45483287
## J3 1.83140764 -2.74096320 5.3074037 0.3876488 -1.27536042
## J4 1.11622382 -4.10303090 5.5272531 1.2245890 -1.04267349
## K1 -0.59879568 -2.64773568 3.8750676 0.8384714 0.27605077
## K2 0.21024899 -2.11642761 3.6165256 2.7382009 0.69900866
## K3 -1.09273604 -2.74959089 4.3711782 0.8696402 0.64300187
## K4 -0.04152818 -2.61839939 3.7803252 1.6808116 0.29258721
## K5 -0.72210266 -2.33429710 4.1279836 2.4090130 0.78003183
## L1 0.03509973 -2.05695368 1.9254794 -0.2567052 0.68410460
## L2 -1.05658416 -0.88037564 2.6933563 0.5511140 0.86919585
## L3 -0.51878917 -1.93693089 1.6358342 0.3728830 2.03744417
## L4 -0.67541145 -1.70725799 1.2117356 0.2004287 0.01558763
## L5 -1.02782819 -1.63031446 1.0975700 -0.4001964 1.63772015
## M1 2.20607975 -1.60221108 1.4350309 -1.0468959 0.24758727
## M2 2.62837719 -1.04389879 1.3517971 0.5392242 1.07560283
## N1 -2.93057050 -2.17509303 2.6040320 4.7347668 0.15589588
## N2 -3.15345861 -2.59937773 3.3869134 4.2462922 1.39983864
## N3 -3.60232496 -2.71874020 2.8319589 4.4270392 0.24840489
## N4 -4.25563290 -2.64746706 2.8833009 3.6301153 -0.27392402
## O1 -5.28683088 -3.70228410 2.3844570 1.3629796 2.39517794
## O2 -5.38104846 -4.87728898 2.8560162 2.0700145 1.50657055
## O3 -5.48787982 -4.25493642 2.8122042 1.3717118 2.28957850
## P1 3.09231576 -5.14787727 5.6295546 -0.8423818 1.52657614
## Q1 -3.82118671 -3.11733681 4.6756523 5.0033811 0.87620972
## Q2 -4.23022707 -4.21706371 3.7660017 5.0281017 0.93682444
## R1 -2.36400839 -2.27834062 1.9794830 1.4314134 0.60331716
## R2 -2.46014028 -1.08918230 1.6520861 0.9182345 -0.96725226
## R3 -2.73368752 -1.43893280 2.0945741 2.2804404 -0.69332985
## R4 -1.08796774 -2.09122908 1.1532129 1.8427559 0.13805477
## R5 -1.89238447 -2.26101902 1.9490731 1.3904670 -0.78965765
## S1 -3.12227407 -1.54462933 1.4331181 -0.3039058 1.86762871
## S2 -3.54825239 -1.57142641 0.2298638 1.6937560 1.14127352
## S3 -2.68354538 -1.00599847 0.5909795 0.9248922 1.83179640
## S4 -2.87604229 -1.72251468 0.3321336 1.0708315 1.71451830
## T1 -2.57118182 -1.90281553 1.4933224 3.0562073 -2.09442201
## U1 0.66466684 1.65714974 1.0003654 3.9438689 -0.86037147
## U2 0.45740087 2.04635918 1.3612159 4.2285696 -0.80167998
## U3 1.14681687 1.59757388 0.8111320 3.4097557 -1.34731730
## U4 0.52640220 1.64986943 1.7871073 4.3412065 -2.19397881
## V1 0.75658437 -1.87706996 4.4759921 1.5414931 -1.62431717
## W1 2.68267252 -3.19689644 7.4425853 3.7556724 -1.68887877
## W2 2.76196919 -3.74195183 6.1999013 2.9743391 -1.78427181
## X1 0.91234712 -0.72483560 3.6801507 4.4381717 -2.46478786
## X2 -0.05238740 -0.80465206 3.2210595 2.7922503 -3.38940095
## X3 0.45835800 -0.53257849 3.5476527 3.3640370 -2.73478436
## X4 1.49751687 -0.73809794 3.9058654 4.1334758 -3.66075267
## X5 0.28602440 -0.49840370 2.7803620 4.1733508 -2.10614716
## Y1 1.25534713 -5.10787364 4.3453981 -2.7789615 2.23696428
## Y2 3.18711033 -4.93714442 4.0112931 -2.4233436 2.50171151
## Y3 1.57399176 -4.46222484 4.3241397 -2.0585551 2.36389952
## Z1 2.57286210 -2.39561802 5.4534820 2.4485488 -1.16858447
## Z2 3.40395933 -2.58146747 5.9747592 0.9585838 -1.53438227
## Z3 2.55456063 -1.98275084 6.0612324 1.5865925 -2.48843615
## Z4 2.87982996 -0.97677109 5.7028841 1.2531958 -1.32016016
## Z5 2.60403104 -2.01564983 5.3533706 1.4698986 -1.86993584
## species means
Xm<-matrix(NA,Ntip(tree),ncol(Xi),
dimnames=list(tree$tip.label,
colnames(Xi)))
for(i in 1:Ntip(tree)){
ii<-grep(tree$tip.label[i],rownames(Xi))
Xm[i,]<-colMeans(Xi[ii,,drop=FALSE])
}
Xm
## [,1] [,2] [,3] [,4] [,5]
## Y 2.0054831 -4.835747633 4.2269436 -2.42028676 2.3675251
## K -0.4489827 -2.493290133 3.9542160 1.70722742 0.5381361
## R -2.1076377 -1.831740764 1.7656858 1.57266223 -0.3417736
## O -5.3852531 -4.278169835 2.6842258 1.60156865 2.0637757
## J 1.2274398 -3.523942753 5.3637802 0.77173620 -1.2437171
## W 2.7223209 -3.469424136 6.8212433 3.36500574 -1.7365753
## P 3.0923158 -5.147877265 5.6295546 -0.84238176 1.5265761
## N -3.4854967 -2.535169504 2.9265513 4.25955340 0.3825538
## Q -4.0257069 -3.667200260 4.2208270 5.01574141 0.9065171
## G -0.3393611 -2.930723754 2.6009849 -1.07902587 1.5821586
## L -0.6487026 -1.642366534 1.7127951 0.09350482 1.0488105
## X 0.6203718 -0.659713558 3.4270181 3.78025711 -2.8711746
## A 1.6655382 0.476585745 0.9086899 1.47340267 -1.6733055
## S -3.0575285 -1.461142224 0.6465237 0.84639345 1.6388042
## D -3.2140733 -0.792461533 0.7938099 1.22745074 1.0393453
## H -3.4771536 -0.003456233 -1.8432800 -0.89081847 0.6398898
## E 0.1141224 0.849006057 0.1021345 2.14340420 -2.0400506
## U 0.6988217 1.737738058 1.2399551 3.98085017 -1.3008369
## I 0.9943134 -0.392553964 2.7078109 3.06844904 -2.1907330
## B -3.5711206 3.567150066 -1.5020266 5.18877905 -3.9658338
## Z 2.8030486 -1.990451450 5.7091456 1.54336389 -1.6762998
## F 0.2227348 -2.451980697 2.7746535 0.38613948 1.0527467
## M 2.4172285 -1.323054933 1.3934140 -0.25383584 0.6615951
## T -2.5711818 -1.902815534 1.4933224 3.05620725 -2.0944220
## V 0.7565844 -1.877069964 4.4759921 1.54149311 -1.6243172
## C 2.4963601 -2.202611261 4.7859610 1.65747860 -1.1335972
## phylogenetic PCA with species means
pca<-phyl.pca(tree,Xm)
## scores for species means
scores(pca)
## PC1 PC2 PC3 PC4 PC5
## Y 4.8355633 -0.3294605 4.9204846 -1.214253071 0.48417330
## K 1.1271032 -1.8905319 1.1887193 0.146415414 0.52679413
## R -1.3776735 -0.5685501 1.0264633 -0.240509269 -0.23031699
## O -3.0957196 -3.2959470 4.5902049 0.079157313 0.17733263
## J 3.4199678 -2.3877114 0.5020696 -1.548803070 -0.50276096
## W 4.4388588 -4.0399357 -1.8032739 -1.402434823 0.98914395
## P 5.8491031 -1.8008209 3.2645258 -1.562917383 1.10626368
## N -2.6273140 -3.3123513 0.6706146 0.405660969 1.13010196
## Q -2.4989968 -5.2056862 1.2006453 0.378034447 1.59048227
## G 1.5317465 0.1939072 3.6138101 -0.224632080 -0.07356055
## L 0.3058007 0.7250770 2.1747536 0.317350313 0.15884578
## X 0.6098092 -1.3901896 -3.2212485 -0.563561025 0.04254944
## A 0.8665509 2.2910213 -1.9286367 -0.130411521 0.12191960
## S -2.3410551 0.4294088 2.8283221 0.915182583 0.25544998
## D -2.5983693 0.3485202 1.9828177 1.179837056 -0.11900397
## H -3.5720692 3.4015096 2.7538485 0.649728549 -1.19057929
## E -1.0349547 2.1898149 -2.1836836 0.006607482 -0.14215189
## U -0.5987227 1.1359716 -3.3898069 1.467907338 1.06531799
## I 0.7875657 -0.3033870 -2.6109169 -0.309751715 0.26272155
## B -6.0691018 1.7853416 -5.1025947 1.320105136 -1.02195377
## Z 4.4303034 -1.8337284 -1.3996878 -0.735809021 -0.14132283
## F 1.4969275 -0.1922748 2.0672492 -0.093322338 0.59191066
## M 2.5702312 2.2961278 1.0451950 -0.281481952 0.96142293
## T -2.5011852 -1.2398761 -0.6973528 -1.171601072 -0.35424555
## V 2.1926843 -1.5966486 -0.7306491 -0.654874153 -0.59622447
## C 3.7181929 -1.3800392 -0.8978589 -0.808252464 0.43215101
## scores for individuals
scores(pca,newdata=Xi)
## PC1 PC2 PC3 PC4 PC5
## A1 0.58137458 2.26833022 -1.50992755 0.05254930 -0.05285582
## A2 1.15172725 2.31371230 -2.34734580 -0.31337234 0.29669502
## B1 -5.69194457 1.27868306 -5.63929102 1.53355448 -1.13271412
## B2 -6.21729020 1.56489018 -4.80403093 1.57346089 -1.01085811
## B3 -6.09486112 2.37746282 -4.62585228 0.88981672 -1.46686067
## B4 -6.52217871 1.42718979 -5.04909125 1.66474417 -1.17136154
## B5 -5.81923440 2.27848201 -5.39470803 0.93894942 -0.32797441
## C1 4.04819458 -1.22316584 -0.98201155 -0.31625536 0.20825572
## C2 3.81380896 -1.50051504 -0.44363895 -1.31721174 -0.04694296
## C3 3.83684934 -0.78430503 -1.74656305 -0.80025429 0.76853764
## C4 3.35984901 -1.86986239 -0.46865739 -1.25673076 0.29950120
## C5 3.53226258 -1.52234773 -0.84842353 -0.35081017 0.93140344
## D1 -2.58766894 0.28198061 1.71060049 1.13387065 0.05883451
## D2 -2.60906967 0.41505973 2.25503481 1.22580347 -0.29684245
## E1 -0.91950745 2.94693733 -2.90222653 -0.22396817 -0.48265722
## E2 -0.63006722 2.04596141 -1.75443025 0.03041785 -0.05889452
## E3 -1.55528957 1.57654590 -1.89439396 0.21337277 0.11509608
## F1 1.49692754 -0.19227481 2.06724918 -0.09332234 0.59191066
## G1 1.98319119 0.33592552 3.26622081 -0.07905380 0.30794692
## G2 1.01866478 0.14291709 3.58606835 -1.12319680 -0.21212503
## G3 1.18807446 -0.22799820 4.24271622 -0.19775773 -0.12889419
## G4 1.93705568 0.52478448 3.36023520 0.50148001 -0.26116988
## H1 -4.21463202 3.06152517 2.98057354 0.74927758 -0.77191141
## H2 -3.46355581 3.61819193 2.63532881 0.71375796 -0.86001124
## H3 -4.00177798 3.77949585 2.41281338 0.23074439 -1.70697275
## H4 -3.42305167 3.37912219 2.41521653 0.58097673 -1.71788761
## H5 -2.75732844 3.16921261 3.32531008 0.97388609 -0.89611342
## I1 0.78756568 -0.30338695 -2.61091689 -0.30975171 0.26272155
## J1 3.77009981 -2.29606193 0.82355733 -1.87217506 -0.50930671
## J2 2.65643636 -2.62752255 0.36504020 -1.43004519 -0.74223991
## J3 3.93220043 -1.66531301 0.15517195 -1.12167970 -0.70897156
## J4 3.32113450 -2.96194826 0.66450880 -1.77131234 -0.05052566
## K1 1.25159512 -1.57925153 1.63321774 -0.17957517 -0.15125090
## K2 1.09822059 -1.70247634 0.34879191 0.38728142 1.51661199
## K3 1.15682815 -2.16043574 2.02139355 0.18036386 -0.24669436
## K4 1.34821280 -1.66402160 0.98964668 -0.20557961 0.62257941
## K5 0.78065922 -2.34647404 0.95054657 0.54958657 0.89272452
## L1 1.06414744 0.78680684 2.11315269 -0.27273027 0.06153136
## L2 0.29615528 -0.04188865 1.54620281 1.18255466 -0.30825301
## L3 0.36272587 0.61785755 2.72579932 0.62588492 1.02569981
## L4 -0.08817270 0.98616467 1.53609670 -0.44725043 -0.18624600
## L5 -0.10585249 1.27644467 2.95251641 0.49829269 0.20149675
## M1 2.68309527 2.41206799 1.42442617 -0.73468540 0.22034228
## M2 2.45736721 2.18018762 0.66596382 0.17172150 1.70250357
## N1 -2.56948782 -2.95017073 -0.05817857 0.39753741 1.52137482
## N2 -2.04353648 -3.52769425 1.21271646 1.00911592 1.69237269
## N3 -2.82187513 -3.43066649 0.61806938 0.19573987 1.19061494
## N4 -3.07435651 -3.34087382 0.90985106 0.02025067 0.11604538
## O1 -3.11192122 -2.70534277 4.64768619 0.57463847 0.18529130
## O2 -3.16038176 -3.87005819 4.24883516 -0.59826113 0.27313704
## O3 -3.01485587 -3.31243993 4.87409349 0.26109460 0.07356954
## P1 5.84910311 -1.80082091 3.26452583 -1.56291738 1.10626368
## Q1 -2.13304010 -5.24928996 0.85558856 0.87580561 1.36810917
## Q2 -2.86495354 -5.16208245 1.54570204 -0.11973672 1.81285536
## R1 -1.31674630 -0.90476921 1.96308744 0.04823315 0.15262143
## R2 -1.58422603 -0.05391324 0.78230593 -0.05693333 -1.28256572
## R3 -1.97457519 -1.18864009 0.41523442 0.11054128 -0.43355407
## R4 -0.95479129 0.03372347 0.99863380 -0.49640797 0.85483205
## R5 -1.05802876 -0.72915132 0.97305468 -0.80797947 -0.44291866
## S1 -1.56525324 0.29512563 3.63825338 1.14104633 -0.56828429
## S2 -3.25461074 0.14469106 2.26743678 0.57200356 0.46551160
## S3 -2.12348163 0.75013909 2.58217027 1.29353192 0.45436537
## S4 -2.42087490 0.52767940 2.82542790 0.65414852 0.67020723
## T1 -2.50118518 -1.23987611 -0.69735278 -1.17160107 -0.35424555
## U1 -0.70258767 1.29596288 -3.03986714 1.58536349 1.36163333
## U2 -0.78716461 0.98955203 -3.29104221 2.07335134 1.27860604
## U3 -0.28356663 1.79696944 -3.15636432 1.09327885 1.02709589
## U4 -0.62157182 0.46140212 -4.07195378 1.11963568 0.59393669
## V1 2.19268431 -1.59664865 -0.73064913 -0.65487415 -0.59622447
## W1 4.59323403 -4.57051267 -2.13032675 -0.95022639 0.98692254
## W2 4.28448359 -3.50935871 -1.47622110 -1.85464325 0.99136536
## X1 0.78289693 -1.77122312 -3.41011353 -0.30871842 0.73233760
## X2 0.28395177 -1.12040455 -2.70465518 -0.98695764 -1.02311779
## X3 0.69020005 -1.30387401 -2.91689514 -0.35978315 -0.27484074
## X4 1.37014904 -1.63790746 -4.16308027 -1.03919153 0.05889125
## X5 -0.07815197 -1.11753896 -2.91149857 -0.12315438 0.71947689
## Y1 4.44779172 -0.63479302 5.39272325 -1.36041582 -0.07126708
## Y2 5.65042965 0.20766608 4.69310049 -1.47307135 1.11650405
## Y3 4.40846844 -0.56125449 4.67562993 -0.80927204 0.40728292
## Z1 3.87645446 -2.25958453 -1.32575109 -0.72808203 0.78927693
## Z2 5.27985339 -1.79508555 -0.91340898 -1.16277358 -0.10879099
## Z3 4.35122084 -2.21607210 -1.86618529 -1.03597318 -0.76345277
## Z4 4.54419334 -1.27276565 -1.50322641 0.18997248 -0.36284858
## Z5 4.09979495 -1.62513421 -1.38986713 -0.94218880 -0.26079876
Cool. An interesting property of these data is that when we use the rotation from the species means the mean PC scores from the individual data are the same as the original PC scores from the means:
pca<-phyl.pca(tree,Xm)
S<-scores(pca,newdata=Xi)
Sa<-matrix(NA,26,5)
rownames(Sa)<-LETTERS
for(i in 1:26){
ii<-grep(LETTERS[i],rownames(S))
Sa[i,]<-if(length(ii)>1) colMeans(S[ii,]) else S[ii,]
}
plot(Sa,scores(pca)[rownames(Sa),],cex=1.5,pch=19,
col=make.transparent("darkblue",0.5),
xlab="mean scores",ylab="scores from means")
The data for this exercise were simulated using the packages clusterGeneration & phytools as follows:
library(clusterGeneration)
tree<-pbtree(n=26,scale=1,tip.label=sample(LETTERS))
k<-5
V<-genPositiveDefMat(k,covMethod="unifcorrmat")$Sigma
X<-sim.corrs(phytools:::lambdaTree(tree,0.7),V)[LETTERS,]
N<-sample(1:5,nrow(X),replace=TRUE)
Xi<-apply(X,2,sampleFrom,xvar=0.2,n=N)
spp<-as.factor(rownames(Xi))
rownames(Xi)<-paste(rownames(Xi),
unlist(sapply(N,function(n) 1:n)),
sep="")
That's it.