#' sdcor2cov
#'
#' Converts a lower triangular matrix with standard deviations on the diagonal and partial correlations on
#' lower triangle, to a covariance (or cholesky decomposed covariance)
#' @param mat input square matrix with std dev on diagonal and lower tri of partial correlations.
#' @param coronly if TRUE, ignores everything except the lower triangle and outputs correlation.
#' @param cholesky Logical. To return the cholesky decomposition instead of full covariance, set to TRUE.
#' @examples
#' testmat <- diag(exp(rnorm(5,-3,2)),5) #generate arbitrary std deviations
#' testmat[row(testmat) > col(testmat)] <- runif((5^2-5)/2, -1, 1)
#' print(testmat)
#' covmat <- sdpcor2cov(testmat) #convert to covariance
#' cov2cor(covmat) #convert covariance to correlation
#' @export
sdpcor2cov <- function(mat, coronly=FALSE, cholesky=FALSE){
ndim = ncol(mat);
mcholcor=diag(0,ndim);
mcholcor[1,1]=1;
if(ndim > 1){
for(coli in 1:ndim){
for(rowi in coli:ndim){
if(coli==1 && rowi > 1) mcholcor[rowi,coli] = mat[rowi,coli];
if(coli > 1){
if(rowi == coli) mcholcor[rowi,coli] = prod(sqrt(1-mat[rowi,1:(coli-1)]^2));
if(rowi > coli) mcholcor[rowi,coli] = mat[rowi,coli] * prod(sqrt(1-mat[rowi,1:(coli-1)]^2));
}
}
}
}
if(!coronly){
mscale=diag(diag(mat))
out= mscale %*% mcholcor
} else out = mcholcor
if(!cholesky) out = out %*% t(out)
return(out);
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.