Я хочу вычислить корреляции в моей матрице с тысячами строк. На данный момент невозможно вычислить корреляции для всей матрицы, потому что она слишком большая.
Моя идея состоит в том, чтобы разбить эту матрицу на множество подматриц и вычислить корреляции между моими строками на каждой из этих подматриц.
Это мой код 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