# [R] Cancor

Irena Komprej irena.komprej at telemach.net
Mon Sep 13 13:30:22 CEST 2004

```Dear Gabor,
thank you for your answer, but I am still a little confused because the
values of the xcoef and ycoef are so small. It is true, that I receive
very similar results to the cancor,  if I use the proposed formula with

z <- svd(cov(x,y) %*% solve(var(y), cov(y,x)) %*% solve(var(x)))
sqrt(z\$d)  # canonical correlations
isqrt((nrow(x)-1)*var(x)) %*% z\$u    # xcoef

But, why do I need the nrow(x)-1)* in isqrt()?
In the literature, if you use the proposed calculation, the a's are
calculated as z\$u %*% isqrt(var(x)).

I have this problem, because I need structural coefficients to calculate
Redundancy measure and according to literature, they are calculated as
a's%*%var(x).
The coefficients from cancor are so small that my redundancy measure iz
almost zero, despite the high correlation coefficient.

I have, on the other hand, calculated correlation between x and their
corresponding canonical variables as:
cor(x, x%*%xcoef)
and results were good.

Can I use these results as structural correlations in Redundancy measure
calculation?

Thank you again and best regards

Irena Komprej

________________________________________________________________
Irena Komprej <irena.komprej <at> telemach.net> writes:

>
> I am strugling with cancor procedure in R. I cannot figure out the
> meaning of xcoef and of yxcoef.
> Are these:
> 1. standardized coefficients
> 2. structural coefficients
> 3. something else?
>

Look at the examples at the bottom of ?cancor from which its evident
xcoef is such that x %*% cxy\$xcoef are the canonical variables.  (More
at the end of this post.)

> I have tried to simulate canonical correlation analysis by checking
the
> eigenstructure of the expression:
>
> Sigma_xx %*% Sigma_xy %*% Sigma_yy %*% t(Sigma_xy).
>
> The resulting eigenvalues were the same as the squared values of
> cancor\$cor. I have normalized the resulting eigenvectors, the a's with
>
> sqrt(a'%*%Sigma_xx%*%t(a)), and similarly the b's with
> sqrt(b'%*%Sigma_yy%*%t(b)).
>
> The results differed considerably from xcoef and ycoef of the cancor.

Run the example in the help page to get some data and some
output:

set.seed(1)
example(cancor)

# Also, define isqrt as the inverse square root of a postive def matrix

isqrt <- function(x) {
e <- eigen(x)
stopifnot( all(e\$values > 0) )
e\$vectors %*% diag(1/sqrt(e\$values)) %*% solve(e\$vectors)
}

# we can reconstruct the canonical correlations and xcoef
# in the way you presumably intended like this:

z <- svd(cov(x,y) %*% solve(var(y), cov(y,x)) %*% solve(var(x)))
sqrt(z\$d)  # canonical correlations
isqrt((nrow(x)-1)*var(x)) %*% z\$u    # xcoef

Another thing you can do is to type

cancor

at the R prompt to view its source and see how it works using
the QR decomposition.

```