I'm quite familiar with Principal Component Analysisis, as I use it to study genetic structure. Lately, I was revisiting some of the functions I was using in R (pcoa() from the ape package and prcomp()) and I realized they don't give the same results for the explained variance, and I'm not sure which one to believe.

My distance matrix is already centered and might sometimes contain negative eigenvalues. I'm aware that pcoa() uses eigenvalue decomposition while prcomp() uses single value decomposition, so I expect the results to be slightly different. The scales of the axis that I obtain with each analysis are not the same, but why is the explained variance almost double with prcomp() (in the full dataset)?

I did some digging and apparently pcoa() does a transformation of the distance matrix $M$ of dimensions $m \times m$




$I$ being an identity matrix of $m \times m$. The rest of the PCoA is performed with this $D$ matrix in a similar fashion as in prcomp() (but using eigenvalue decomposition instead of single value decomposition). Might this be the cause? Part of the transformation centers the data, but why the $-0.5M^2$? I can't seem to find anywhere the reason for this.

Example dataset

With a reduced dataset (image 1) the explained variances for PC1 and PC2 are 0.44 and 0.30 with prcomp(); 0.36 and 0.27 with pcoa(). I understand that a small difference is normal, since both perform slighlty different methods, but with the full dataset (image 2), the PCs are almost identical but divided by 10 yet they explain 0.32 and 0.22 in prcomp() and 0.14 and 0.11 with pcoa()!

Sorry but I can't figure out how to produce a better reduced dataset...



vec.prc <- -prc$rotation[ ,1:2]
var.prc <- round(prc$sdev^2/sum(prc$sdev^2),2)
vec.pcoa <- pc$vectors[ ,1:2]
var.pcoa <- round(pc$values$Relative_eig[1:2],2)

plot(vec.prc, main="prcomp",pch=19,cex=2,
     xlab=var.prc[1], ylab=var.prc[2])
plot(vec.pcoa, main="ape::pcoa",pch=19,cex=2,
     xlab=var.pcoa[1], ylab=var.pcoa[2])

small dataset example Big dataset example

  • 1
    $\begingroup$ See here stats.stackexchange.com/questions/14002/…. Some of the answers (e.g. mine) contain and discuss the formula that you are asking about. $\endgroup$ – amoeba May 10 at 19:24
  • 3
    $\begingroup$ I gave the link above, but I do NOT think it's a duplicate. I vote to reopen. $\endgroup$ – amoeba May 12 at 20:30
  • $\begingroup$ @amoeba I understand the relationship between MDS and PC(o)A, my question is more about the difference between using singular value decomposition on or eigenvalue decomposition to calculate the Principal Components and most importantly, the explained variance. To put it simply, why, if I get the same shape with the PCs of both methods, I get such different estimates of explained variance? $\endgroup$ – Athe May 13 at 9:41
  • 1
    $\begingroup$ "the difference between using singular value decomposition on or eigenvalue decomposition" has nothing to do with it! This is a red herring in your question (that's actually why I edited the title to remove it from the title). PCA can be computed using SVD or using eig(), this does not change the result, or the explained variances. Anyway, the question is very good. I think there are several things going on here; note prcomp(Kdist) takes Kdist as the data matrix, i.e. rows as points and columns as features (which is wrong!) and computes the covariance matrix of this data matrix 8-[] $\endgroup$ – amoeba May 13 at 12:18
  • 1
    $\begingroup$ I did not think it through and can't exactly explain why this leads to almost -- but not exactly! -- the same PCs but so different variances. I'll put a bounty now and maybe somebody will give a good answer. If not, and if you are still interested, feel free to ping me again later. $\endgroup$ – amoeba May 13 at 12:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.