将巨大的矩阵拆分为子矩阵以计算相关性

时间:2019-03-20 20:53:36

标签: r matrix correlation

我想在具有数千行的矩阵上计算相关性。由于太大,目前无法在整个矩阵上计算相关性。

我的想法是将这个矩阵分成许多子矩阵,并计算这些子矩阵中每个行之间的相关性。

这是我的R代码:

#load packages 
library(compositions)
library(parallel)
library(doParallel)
library(optparse)


args <- commandArgs(trailingOnly = F)

# get options
option_list = list(
  make_option(c("-s", "--subset"), type="character", default=NULL,
              help="Input file matrix ")
);


opt_parser = OptionParser(usage = "Usage: %prog -f [FILE]",option_list=option_list,
                          description= "Description:")
opt = parse_args(opt_parser)

# main code 

print('Set Up Cores')

cores<-32
options('mc.cores'=cores)
registerDoParallel(cores)


print('Load matrice')

data<-read.table("/home/vipailler/PROJET_M2/raw/truelength2.prok2.uniref2.rares.tsv", h=T, row.names=1, sep="\t")+1

data=data[1:opt$subset,]

print('Translate')
data=t(data)

print('clr transformation')
data=clr(data)

res <- foreach(i = seq_len(ncol(data)),
  .combine = rbind,
  .multicombine = TRUE,
  .inorder = FALSE,
  .packages = c('data.table', 'doParallel')) %dopar% {
  apply(data, 2, function(x) 1 - ((var(data[,i] - x)) / (var(data[,i]) + var(x))))
}

我创建了一个参数( subset )来选择要计算的行数。感谢此命令 data=data[1:opt$subset,] ,我可以选择从第一行到第n行要计算的行数。例如,在Slurm代码中,使用 subset=$(($SLURM_ARRAY_TASK_ID*5000)) 定义10个数组,第一个数组计算前5000行,第二个数组计算前10000行,直到前50000行我的矩阵(对应于第10个数组)。

然后,我使用Slurm设置我的核心以计算相关性。多亏了数组,我可以选择可以计算多少个子矩阵。 但是我不知道如何更改data=data[1:opt$subset,]以便将第一个数组专用于第一个子矩阵(例如,从第一行到第5000行),第二个数组用于计算第二个子矩阵(第5001行)到第10 000行.....)。有帮助吗?

#!/bin/bash
#SBATCH --nodes=1
#SBATCH -o slurmjob-%j
#SBATCH --job-name=rho
#SBATCH --mail-user vincentpailler@hotmail.fr
#SBATCH --partition=normal
#SBATCH --time=1-00:00:00
#SBATCH --mem=250G 
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=32
#SBATCH --array=0-10

echo tableau de jobs numero $SLURM_ARRAY_JOB_ID, indices de $SLURM_ARRAY_TASK_MIN à $SLURM_ARRAY_TASK_MAX

echo $SLURM_ARRAY_JOB_ID

#Set up whatever package we need to run with

module load gcc/8.1.0 openblas/0.3.3 R

# SET UP DIRECTORIES

OUTPUT="$HOME"/PROJET_M2/data/$(date +"%Y%m%d")_parallel_rho_32cpus_5000lig
mkdir -p "$OUTPUT"

export FILENAME=/home/vipailler/PROJET_M2/bin/coefficient_rho.R

subset=$(($SLURM_ARRAY_TASK_ID*5000))

#Run the program

echo "Start job :"`date` >> "$OUTPUT"/temp_"$SLURM_ARRAY_TASK_ID".txt
echo "Start job :"`date`

Rscript $FILENAME --subset $subset  > "$OUTPUT"/"$SLURM_ARRAY_TASK_ID"

echo "Stop job : "`date` >> "$OUTPUT"/temp_"$SLURM_ARRAY_TASK_ID".txt

最佳

0 个答案:

没有答案