Разбить огромную матрицу на подматрицы для вычисления корреляции - PullRequest
0 голосов
/ 20 марта 2019

Я хочу вычислить корреляции в моей матрице с тысячами строк. На данный момент невозможно вычислить корреляции для всей матрицы, потому что она слишком большая.

Моя идея состоит в том, чтобы разбить эту матрицу на множество подматриц и вычислить корреляции между моими строками на каждой из этих подматриц.

Это мой код 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 строк до первых 50 000 строк моей матрицы (что соответствует 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

Bests

...