On 21 Dec, 2004, at 13:09, Haynes, Maurice (NIH/NICHD) wrote:
Dear list members,
Where can I find code for computing the p*p variance-covariance
matrix given a vector of p variances (ordered varA, varB, ...,
varp) and a vector of all possible correlations (ordered corAB,
corAC, ..., corp-1,p)?
Something like this (not tested):
sd.vec <- sqrt(var.vec)
n <- length(sd.vec)
cor.mat <- matrix(1, n, n)
for (i in 2:n){
for (j in 1:i-1){
cor.mat[i,j] <- cor.vec[(i-1)*(i-2)/2 + j]
cor.mat[j,i] <- cor.mat[i,j]}}
cov.mat <- cor.mat * outer(sd.vec, sd.vec)
I hope that helps.
David
I know that the covariance between 2 variables is equal to the
product of their correlation and their standard deviations:
corAB * varA^.5 * varB^.5
and so:
covAB <- function(corAB, varA, varB) {
corAB * varA^.5 * varB^.5
}
If the vector of variances were
var.vec <- c(14, 12, 7)
and the vector of correlations were
cor.vec <- c(.4, .2, .5),
then the vector of covariances would be:
covAB(c(.4, .2, .5),c(14, 14, 12), c(12, 7, 7))
[1] 5.184593 1.979899 4.582576
and the variance-covariance matrix with covariances rounded to
the first decimal place would be:
vmat <- matrix(c(14, 5.2, 2.0, 5.2, 12, 4.6, 2.0, 4.6, 7),
+ nrow=3)
vmat
[,1] [,2] [,3]
[1,] 14.0 5.2 2.0
[2,] 5.2 12.0 4.6
[3,] 2.0 4.6 7.0
So the question is: How can I generate a p*p variance-covariance
matrix from a vector of variances and a vector of correlations
without resorting to a construction like:
vmat <- matrix(rep(0, p*p), nrow=p)
if (p == 2) {
vmat[1,1] <- var[1]
vmat[1,2] <- cor[1] * (var[1]^.5 * var[2]^.5)
vmat[2,1] <- cor[1] * (var[2]^.5 * var[1]^.5)
vmat[2,2] <- var[2]
}
if (p == 3) {
vmat[1,1] <- var[1]
vmat[1,2] <- cor[1] * (var[1]^.5 * var[2]^.5)
vmat[1,3] <- cor[2] * (var[1]^.5 * var[3]^.5)
vmat[2,1] <- cor[1] * (var[2]^.5 * var[1]^.5)
vmat[2,2] <- var[2]
vmat[2,3] <- cor[3] * (var[2]^.5 * var[3]^.5)
vmat[3,1] <- cor[2] * (var[3]^.5 * var[1]^.5)
vmat[3,2] <- cor[3] * (var[3]^.5 * var[2]^.5)
vmat[3,3] <- var[3]
}
and so forth?
Thanks,
Maurice Haynes
National Institute of Child Health and Human Development
Child and Family Research Section
6705 Rockledge Drive, Suite 8030
Bethesda, MD 20892
Voice: 301-496-8180
Fax: 301-496-2766
E-mail: [EMAIL PROTECTED]
______________________________________________
[EMAIL PROTECTED] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide!
http://www.R-project.org/posting-guide.html
______________________________________________
[EMAIL PROTECTED] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html