我想在具有数千行的矩阵上计算相关性。由于太大,目前无法在整个矩阵上计算相关性。
我的想法是将这个矩阵分成许多子矩阵,并计算这些子矩阵中每个行之间的相关性。
这是我的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
最佳