From 08c57764807609aac73cbd21a09be5952c095cd1 Mon Sep 17 00:00:00 2001 From: OTT Oceane <o22025448@V-PP-47-L-084.salsa.univ-amu.fr> Date: Wed, 23 Oct 2024 17:00:54 +0200 Subject: [PATCH] k --- src/TP1.v2.R | 190 --------------------------------------------------- src/TP1.v3.R | 39 ----------- 2 files changed, 229 deletions(-) delete mode 100644 src/TP1.v2.R delete mode 100644 src/TP1.v3.R diff --git a/src/TP1.v2.R b/src/TP1.v2.R deleted file mode 100644 index 0db5778..0000000 --- a/src/TP1.v2.R +++ /dev/null @@ -1,190 +0,0 @@ -options(repos = c(CRAN = "https://cloud.r-project.org")) - -# Définir le répertoire de travail de manière dynamique -m2bsgreprod <- normalizePath(".") -data.dir <- file.path(m2bsgreprod, "data") -output_dir <- file.path(m2bsgreprod, "results", "TP1") - -# Créer les répertoires si nécessaire -dir.create(output_dir, showWarnings = FALSE, recursive = TRUE) - -# Les données analysées nécessitant beaucoup de RAM, nous allons sélectionner aléatoirement 250000 SNPs et réecrire des fichiers bed, bim, fam -penncath_bed_path = file.path(data.dir, "penncath.bed") -penncath_bim_path = file.path(data.dir, "penncath.bim") -penncath_fam_path = file.path(data.dir, "penncath.fam") - -clinical_csv_path = "data/GWAStutorial_clinical.csv" - -# Fichiers d'entrées -gwas.fn<-lapply(c(bed='bed', fam='fam', bim ='bim', gds='gds'), function(n) sprintf("%s/GWAStutorial.%s", data.dir, n)) - -gwas.fn.2<-lapply(c(bed='bed', fam='fam', bim ='bim', gds='gds'), function(n) sprintf("%s/data.%s", data.dir, n)) - -# clinical.fn<-sprintf("%s/GWAStutorial_clinical.csv", data.dir) -onethou.fn<-lapply(c(info='info', ped='ped'), function(n) sprintf("%s/chr16_1000g_CEU.%s", data.dir, n)) -protein.coding.coords.fname<-sprintf("%s/ProCodgene_coords.csv", data.dir) - -# Sauvegarde des "modules" -working.data.fname <- function(num) { sprintf("%s/working_%s.Rdata", output_dir, num) } - - - -geno <- snpStats::read.plink(penncath_bed_path, penncath_bim_path, penncath_fam_path, select.snps=sample(1:861473, 25000, replace = FALSE ), na.strings = ("-9")) - -plink_base=file.path(output_dir, "plink_base") -snpStats::write.plink(plink_base, snps=geno$genotypes, pedigree=geno$fam[,1], id=geno$fam[,1], mother=geno$fam[,4], sex=geno$fam[,5], phenotype=geno$fam[,6], chromosome = geno$map[,1], genetic.distance = geno$map[,3], position = geno$map[,4], allele.1 = geno$map[,5], allele.2 = geno$map[,6], na.code = ("-9")) - -genoBim<-geno$map -colnames(genoBim)<-c("chr", "SNP", "gen.dist", "position", "A1", "A2") - -genotype<-geno$genotype - -genoFam<-geno$fam - -# On commence par libérer de l'espace -rm(geno) - -# On charge le fichier clinique -clinical<- read.csv(clinical_csv_path, colClasses = c("character", "factor", "factor", rep("numeric", 4))) -rownames(clinical)<-clinical$FamID -print(head(clinical)) - -# On conserve uniquement les individus présents dans les 2 fichiers : génotype et clinique -genotype <- genotype[clinical$FamID, ] -print(genotype) - -save(genotype, genoBim, clinical, file = working.data.fname(1)) - -# Creation d'un résumé statistique lié aux SNPs -snpsum.col<-col.summary(genotype) -print(head(snpsum.col)) - -# Création des seuils -call<-0.95 -minor<-0.01 - -# Application des filtres sur la MAF et le call rate -use<- with(snpsum.col, (!is.na(MAF) & MAF > minor) & Call.rate >= call) -use[is.na(use)]<-FALSE -cat(ncol(genotype)-sum(use), "SNPs will be removed due to low MAF or call rate. \n") - -# Creation d'un jeu de données et de résumé stat excluant les SNPs n'ayant pas passé les seuils -genotype<- genotype[,use] -snpsum.col<- snpsum.col[use,] -print(genotype) - -save(genotype, snpsum.col, genoBim, clinical, file=working.data.fname(2)) - -# Création des statistiques liés aux échantillons (Call rate, hétérozygotie) -snpsum.row<-row.summary(genotype) - -# Ajout du coefficient de consanguinité|F| à snpsum.row -MAF<-snpsum.col$MAF -callmatrix<-!is.na(genotype) # matrice de valeurs logiques les génotypes non NA prennent la valeur logique TRUE -hetExp<-callmatrix %*% (2*MAF*(1-MAF)) # produit matriciel matrice logique par le vecteur numérique de la fréquence de génotype hétérozygote => en gros on additionne les 2pq des SNPs génotypés (non NA, valeur logique TRUE) pour chaque individu (donc la proportion de SNPs hétérozygotes attendus) -hetObs<-with(snpsum.row, Heterozygosity*(ncol(genotype))*Call.rate) # calcule la proportion de SNP hétérozygotes observés -snpsum.row$hetF<-1-(hetObs/hetExp) - -# Création des seuils -sampcall<-0.95 -hetcutoff<-0.1 - -sampleuse<-with(snpsum.row, !is.na(Call.rate) & Call.rate >sampcall & abs(hetF)<=hetcutoff) -sampleuse[is.na(sampleuse)]<-FALSE # élimine les données manquantes -cat(nrow(genotype)-sum(sampleuse), "Subjects will beremoved due to low sample call rate or inbreeding coefficient") - -# Creation d'un jeu de données (incluant données cliniques et génotypes) excluant les échantillons (individus) n'ayant pas passé les seuils -genotype<-genotype[sampleuse,] -clinical<-clinical[rownames(genotype),] - -# Vérification des liens de parenté -ld.thresh<-0.2 # seuil de déséquilibre de liaison -kin.thresh<-0.1 # seuil de parenté - -# Création d'un fichier gds nécessaire pour les fonctions de la library SNPRelate -snpgdsBED2GDS(gwas.fn.2$bed, gwas.fn.2$fam, gwas.fn.2$bim, gwas.fn.2$gds) -genofile<-openfn.gds(gwas.fn.2$gds, readonly=FALSE) - -# Suppression des suffixes -1 automatiquement ajoutés aux échantillons -gds.ids<-read.gdsn(index.gdsn(genofile, "sample.id")) -gds.ids<-sub("-1", "", gds.ids) -add.gdsn(genofile, "sample.id", gds.ids, replace=TRUE) - -# Elagage des SNPs en DL pour l'analyse IBD -set.seed(1000) # la position de début de l'analyse est aléatoire. set seed permet de fixer cette position aléatoire pour chaque itération -geno.sample.ids<- rownames(genotype) -snpSUB<-snpgdsLDpruning(genofile, ld.threshold = ld.thresh, - sample.id = geno.sample.ids, # Analyse seulement les ech. filtr?s - snp.id = colnames(genotype)) # Analyse seulement les SNPs filtr?s -snpset.ibd<-unlist(snpSUB, use.names=FALSE) -cat(length(snpset.ibd), "SNPs will be used in IBD analysis\n") - -# Recherche des coefficients IBD par paire à l'aide de la méthode des moments. Le résultat est une table indiquant le lien de parenté entre chaque paire d'échantillon -ibd<-snpgdsIBDMoM(genofile, kinship = TRUE, sample.id=geno.sample.ids, snp.id = snpset.ibd, num.thread = 1) -ibdcoeff<-snpgdsIBDSelection(ibd) # comparaison par paire d'individus -head(ibdcoeff) -#k0: probabilité de partager ZERO alleles, k1 probabilité de partager 1 allele, kinship: coefficient de parenté - -# Recherche des individus présentant un lien de parenté potentiel -ibdcoeff <- ibdcoeff[ ibdcoeff$kinship >= kin.thresh, ] - -# Suppression itérative des échantillons/individus avec un lien de parenté élevé en débutant par l'échantillon ayant le plus d'appariement -related.samples <- NULL -while ( nrow(ibdcoeff) > 0 ) { - sample.counts <- arrange(count(c(ibdcoeff$ID1, ibdcoeff$ID2)), -freq) - rm.sample <- sample.counts[1, 'x'] - cat("Removing sample", as.character(rm.sample), 'too closely related to', - sample.counts[1, 'freq'],'other samples.\n') - - ibdcoeff <- ibdcoeff[ibdcoeff$ID1 != rm.sample & ibdcoeff$ID2 != rm.sample,] - related.samples <- c(as.character(rm.sample), related.samples) -} - -# Filtre de la matrice genotype et du data frame clinical afin de ne conserver que les individus sans lien de parenté -genotype <- genotype[ !(rownames(genotype) %in% related.samples), ] -clinical <- clinical[ !(clinical$FamID %in% related.samples), ] - -geno.sample.ids <- rownames(genotype) -cat(length(related.samples), "similar samples removed due to correlation coefficient >=", kin.thresh,"\n") -print(genotype) - -pca <- snpgdsPCA(genofile, sample.id = geno.sample.ids, snp.id = snpset.ibd, num.thread=1) - -# Création d'un data frame des 2 composantes principales (PC) -pop_pheno <- read.gdsn(index.gdsn(genofile, "sample.annot/phenotype")) -samp.id <- read.gdsn(index.gdsn(genofile, "sample.id")) -pctab <- data.frame(sample.id = pca$sample.id, - CAD = factor(pop_pheno)[match(pca$sample.id, samp.id)], - PC1 = pca$eigenvect[,1], # 1ère composante principale - PC2 = pca$eigenvect[,2], # 2nde composante principale - stringsAsFactors = FALSE) -head(pctab) - -# Graphe des 2 PCs -plot(pctab$PC2, pctab$PC1, col=as.integer(pctab$CAD), xlab="Principal Component 2", ylab="Principal Component 1", main = "Ancestry Plot") -legend("bottomright", legend=levels(pctab$CAD), pch="o", col=1:4) - - -closefn.gds(genofile) -save(genotype, genoBim, clinical, file=working.data.fname(3)) - -# Exclusions des SNPs déviant de l'HWE (uniquement pour les témoins) -hardy <- 10^-6 # Seuil d'HWE - -CADcontrols <- as.character(clinical[ clinical$CAD==0, 'FamID' ]) -snpsum.colCont <- col.summary(genotype[CADcontrols,]) -HWEuse <- with(snpsum.colCont, !is.na(z.HWE) & ( abs(z.HWE) < abs( qnorm(hardy/2) ) ) ) -rm(snpsum.colCont) - -HWEuse[is.na(HWEuse)] <- FALSE # Suppression des valeurs manquantes -cat(ncol(genotype)-sum(HWEuse),"SNPs will be removed due to high HWE.\n") - -# Suppression des SNPs déviant de l'HWE de la matrice genotype -genotype <- genotype[,HWEuse] -print(genotype) - -save(genotype, genoBim, clinical, file=working.data.fname(4)) - -rdata_path = file.path(output_dir, "TP1_asbvg.RData") -save.image(rdata_path) - diff --git a/src/TP1.v3.R b/src/TP1.v3.R deleted file mode 100644 index abefe18..0000000 --- a/src/TP1.v3.R +++ /dev/null @@ -1,39 +0,0 @@ -options(repos = c(CRAN = "https://cloud.r-project.org")) -output_dir = "results/tp1" -dir.create(output_dir, showWarnings = F, recursive = T) - -# Les données analysées nécessitant beaucoup de RAM, nous allons sélectionner aléatoirement 250000 SNPs et réecrire des fichiers bed, bim, fam -penncath_bed_path = "results/data/penncath.bed" -penncath_bim_path = "results/data/penncath.bim" -penncath_fam_path = "results/data/penncath.fam" - -geno <- snpStats::read.plink(penncath_bed_path, penncath_bim_path, penncath_fam_path, select.snps=sample(1:861473, 25000, replace = FALSE ), na.strings = ("-9")) - -plink_base=file.path(output_dir, "plink_base") -snpStats::write.plink(plink_base, snps=geno$genotypes, pedigree=geno$fam[,1], id=geno$fam[,1], mother=geno$fam[,4], sex=geno$fam[,5], phenotype=geno$fam[,6], chromosome = geno$map[,1], genetic.distance = geno$map[,3], position = geno$map[,4], allele.1 = geno$map[,5], allele.2 = geno$map[,6], na.code = ("-9")) - -genoBim<-geno$map -colnames(genoBim)<-c("chr", "SNP", "gen.dist", "position", "A1", "A2") -#head(genoBim) - -genotype<-geno$genotype -#print(genotype) - -genoFam<-geno$fam -#head(genoFam) - -# On commence par libérer de l'espace -rm(geno) - -# On charge le fichier clinique -clinical_csv_path = "data/GWAStutorial_clinical.csv" -clinical<- read.csv(clinical_csv_path, colClasses = c("character", "factor", "factor", rep("numeric", 4))) -rownames(clinical)<-clinical$FamID -#print(head(clinical)) - -protein.coding.coords.fname<-"data/ProCodgene_coords.csv" - - -rdata_path = file.path(output_dir, "TP1_asbvg.RData") -save.image(rdata_path) - -- GitLab