scTenifoldNet
scTenifoldNet copied to clipboard
why using a 4d array in cp?
Dear scTenifoldNet dev,
Thanks very much for the interesting method. That is the first time I learn something about tensor low approximation, ane I would like to try it on my work.
As I am new to the idea of tensor, I was confused on the 4d array used in the rTensor::cp steps. As the N * N * T (N is the number of genes, T is the sampling times) is 3d array, why a 4d array is used in the implementations (example codes taken from CRAN 1.0.0)?
Her are codes used In the script of tensorDecomposition.R,
#- init a 4d array with the 3rd dim is 1
tensorX <- array(data = 0, dim = c(nGenes,nGenes,1,nNet))
if(!is.null(yList)){
tensorY <- array(data = 0, dim = c(nGenes,nGenes,1,nNet))
}
#- Here only the last dim is filled with correlation matrix.
for(i in seq_len(nNet)){
tempX <- matrix(0, nGenes, nGenes)
rownames(tempX) <- colnames(tempX) <- sGenes
temp <- as.matrix(xList[[i]])
tGenes <- sGenes[sGenes %in% rownames(temp)]
tempX[tGenes,tGenes] <- temp[tGenes,tGenes]
tensorX[,,,i] <- tempX
if(!is.null(yList)){
tempY <- matrix(0, nGenes, nGenes)
rownames(tempY) <- colnames(tempY) <- sGenes
temp <- as.matrix(yList[[i]])
tGenes <- sGenes[sGenes %in% rownames(temp)]
tempY[tGenes,tGenes] <- temp[tGenes,tGenes]
tensorY[,,,i] <- tempY
}
}
tensorX <- rTensor::as.tensor(tensorX)
set.seed(1)
tensorX <- rTensor::cp(tnsr = tensorX, num_components = K, max_iter = maxIter, tol = maxError)
tX <- tensorX$est@data[,,,1]
for(i in seq_len(nNet)[-1]){
tX <- tX + tensorX$est@data[,,,i]
}
tX <- tX/nNet
tX <- tX/max(abs(tX))
tX <- round(tX,1)
tX <- as(tX, 'dgCMatrix')
rownames(tX) <- colnames(tX) <- sGenes
Actually I have tried tensorDecomposition
with 3d array, i.e., simly remove the 3rd dim; and replace the "1" in the 3rd to other values. In the former senario I got different results compared to your codes, and the latter case there was an error:
Error in as(tX, "dgCMatrix") : no method or default for coercing “array” to “dgCMatrix”
Thanks in advance.