[R] Efficient way to convert covariance to Euclidian distance matrix
Rolf Turner
r.turner at auckland.ac.nz
Fri Nov 1 00:01:00 CET 2013
On 10/31/13 23:14, Takatsugu Kobayashi wrote:
> Hi RUsers,
>
> I am struggling to come up with an efficient vectorized way to convert
> 20Kx20K covariance matrix to a Euclidian distance matrix as a surrogate for
> dissimilarity matrix. Hopefully I can apply multidimensional scaling for
> mapping these 20K points (commercial products).
>
> I understand that Distance(ij) = sigma(i) + sigma(j) - 2cov(ij). Without
> replying on a slow loop, I appreciate if anyone can help me out with a
> better idea - guess lapply?
As S. Ellison has pointed out, you probably want sigma^2 rather than sigma.
My suspicion is that with a 20K x 20K covariance matrix:
* nothing will work
* even if it did, the results would be meaningless numerical noise.
I.e. Get real.
That being said, for a *reasonable* size of covariance matrix, the
following might
do what you want:
DM <- outer(diag(CM),diag(CM),"+") - 2*CM
where "CM" is the covariance matrix. And then you might want to do
DM <- sqrt(DM)
to get back to the original units (as S. Ellison indicated).
cheers,
Rolf Turner
More information about the R-help
mailing list