get_PCs = function( mat, which ) ## fast way to compute PCs
{
PC_mat = crossprod(mat)
res_eigs_sym = rARPACK::eigs_sym( PC_mat, k=max(which), which = "LM" )
if(any(res_eigs_sym$values <0)) stop('Non-positive eigenvalues for A^2')
PCs = mat%*%(res_eigs_sym$vectors)
return( PCs[, which] )
}
PC_compartment <- function(A_oe) ## compute PC and define A/B compartment. Not used currently
{
cA_oe = fast_cor(A_oe)
PC_mat = crossprod(cA_oe)
res_eigs_sym = eigs_sym( PC_mat, k=2, which = "LM" )
PC1 = cA_oe%*%res_eigs_sym$vectors[,1]
PC2 = cA_oe%*%res_eigs_sym$vectors[,2]
borders = which(diff(1*(PC1 > 0))!=0)
to_id = as.numeric(rownames(A_oe)[borders])
from_id = as.numeric(rownames(A_oe)[c(1, head(borders, length(borders)-1)+1)])
start_poses = (from_id-1)*bin_size + 1
end_poses = to_id*bin_size
compartment_AB = data.frame(chr=paste0('chr', chr), start_poses=start_poses, end_poses=end_poses, A_or_B=NA, zero=0, dot='.', start_poses_2=start_poses, end_poses_2=end_poses, col=NA)
compartment_AB[which((1:nrow(compartment_AB))%%2==0), 'A_or_B'] = 'A'
compartment_AB[which((1:nrow(compartment_AB))%%2==1), 'A_or_B'] = 'B'
compartment_AB[which((1:nrow(compartment_AB))%%2==0), 'col'] = '112,128,144'
compartment_AB[which((1:nrow(compartment_AB))%%2==1), 'col'] = '255,255,0'
compartments_bed_files = paste0(sub_folder, '/chr', chr, '_compartments_PCA_AB_2', '.bed')
write.table( compartment_AB, file=compartments_bed_files, quote=FALSE, row.names=FALSE, col.names=FALSE, sep=' ' )
}
PC_compartment_slim <- function(A_oe, downsratio=NULL) ## compute and save the PC values only. Not used currently
{
cA_oe = fast_cor(A_oe)
PC_mat = crossprod(cA_oe)
res_eigs_sym = rARPACK::eigs_sym( PC_mat, k=2, which = "LM" )
PC1 = cA_oe%*%res_eigs_sym$vectors[,1]
PC2 = cA_oe%*%res_eigs_sym$vectors[,2]
compartment_AB = data.frame(PC1=PC1, bin_names=rownames(A_oe))
if( is.null(downsratio) ) compartments_AB_file = paste0(sub_folder, '/chr', chr, '_compartments_PCA_AB.Rdata')
if( !is.null(downsratio) ) compartments_AB_file = paste0(sub_folder, '/chr', chr, '_compartments_PCA_AB_downsratio_', downsratio, '.Rdata')
save( compartment_AB, file=compartments_AB_file )
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.