• Aucun résultat trouvé

TD Tests multiples - Corrigé Etienne Birmelé 3 novembre 2019

N/A
N/A
Protected

Academic year: 2022

Partager "TD Tests multiples - Corrigé Etienne Birmelé 3 novembre 2019"

Copied!
13
0
0

Texte intégral

(1)

TD Tests multiples - Corrigé

Etienne Birmelé 3 novembre 2019

Tests multiples et jeu simulé

1.1

Simuler un jeu de données portant sur 5000 gènes et deux conditions telles qu’on dispose de 10 réplicats dans chacune d’elle. On suppose l’indépendance entre tous les gènes et tous les réplicats.

Dans la première condition, chacun des gènes a une expression, que nous qualifierons de normale, qui suit une loiN(500,100). Dans la seconde condition, chaque g‘ene a une probabilit’e de 0.01 d’être sur-exprimé et une probabilité 0.01 d’être sous-exprimé. Suivant qu’il est sous-exprimé, resté normal ou sur-exprimé, son expression dans la condition 2 suit une loiN(400,100),N(500,100) ouN(600,100).

La simulation sera stockée sous la forme d’un tableau à 5000 lignes et 21 colonnes contenant de gauche à droite les dix réplicats de la condition 1, les dix réplicats de la condition 2 puis une variable égale à−1, 0 ou 1 indiquant le véritable état du gène dans la condition 2 (sous-exprimé, normal, sur-exprimé).

On notera que le jeu de données simulées est une simplification extrême de la réalité: toutes les moyennes et variances sont égales pour un état donné; la sur ou sous-expression touche tous les gènes de la même façon; le changement d’expression n’afecte que la moyenne alors qu’il peut en réalité affecter uniquement la variance, ou les deux; les expressions de gènes sont supposées indépendantes entre elles (niant l’existence de régulations).

Ce jeu simplifié sera cependant suffisant ici pour illustrer la problématique des tests multiples.

data <- matrix(rnorm(5000*60,500,100),5000,60) #matrice des données, gènes en ligne, échantillons en colonne condition <- c(rep(1,30),rep(2,30)) #vecteur donnant la condition des échantillons

truth <- sample(c(-1,0,1),5000,replace=TRUE,prob=c(.01,.98,.01)) #vecteur verite data[truth==1,condition==2] <- data[truth==1,condition==2] +100

data[truth==-1,condition==2] <- data[truth==-1,condition==2] -100

Regardons combien il y a de gènes réellement différentiellement exprimés (on en attend à peu près 100) sum(truth!=0)

## [1] 92

1.2

On ne s’intéresse dans un premier temps qu’au gène num’ero 1. Quels tests pouvez-vous proposer afin de décider s’il est différentiellement exprimé?

Test de comparaison des moyennes: Wilcoxon en raison du faible nombre d’échantillons. On pourrait également faire appel à un test basé sur du bootstrap

1.3

Appliquer l’un de ces tests, au taux de 5% à l’ensemble des gènes du jeu de données.

Examinez la liste des gènes retenus. Que pouvez-vous en dire?

(2)

En particulier, quel est le nombre de faux positifs, c’est-à-dire le nombre de gène qui ne sont pas différen- tiellement exprimés mais qui sont sélectionnés comme tels par la procédure de test. Ce résultat est-il surprenant?

pval <- apply(data, 1, function(x) t.test(x[condition==1],x[condition==2])$p.value)

sum(pval<.05)

## [1] 326

On constate qu’il y bien plus de positifs que de gènes réellement exprimés. Cela n’est pas surprenant puisque environ 5% des gènes non différentiellement exprimés sont classés à tort et que cela représente environ 4900×.05≈250gènes.

Afin de résoudre le problème de la surabondance de faux positifs, il faut rendre les tests plus stringents, c’est-à-dire rendre plus difficile le fait de déciderH1.

La question se pose alors de savoir quel critère on cherche à maîtriser (dans le test simple, on maîtrise l’erreur de première espèce à travers le choix deα).

Pour cela, introduisons la table de comptage suivante:

H0 accepté H0 rejeté

H0 vrai T N F P m0

H0 faux F N T P mm0

mR R m

Maîtrise du FWER

LeFamily Wise Error Rate ou FWER est la probabilité d’avoir au moins un faux positif.

F W ER=P(F P ≥1)

Soitα∈[0,1]. Il existe plusieurs façons de choisir la confiance de chaque test individuel afin d’obtenir un FWER inférieur àα. On notemle nombre de tests à effectuer.

1.4 Procédure de Bonferroni

On effectue chaque test avec un risque de première espèce de mα. D’emontrer que le FWER est bien inférieur àα, quel que soit les relations de dépendance entre variables.

La probabilité d’une union est inférieure à la somme des probabilités: o, applique cela aux événements (Ai)1≤i≤5000 oùAi désigne l’évènement le gèneiest un faux positif.

L’appliquer au jeu de donn’ees simul’ees. Commenter.

sum(pval<0.05/5000)

## [1] 25

truth[pval<0.05/5000]

## [1] -1 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 1 1 1 1 1 1 1 -1

## [24] -1 -1

On ne sélectionne bien que de vrai positifs, mais seulement une fraction d’entre eux.

(3)

1.5 Procédure de Sidàk

Sous l’hypothèse d’indépendance des variables testées, on effectue chaque test avec un risque de première espèce de 1−(1−α)1/m. Démontrer que le FWER est bien inférieur àα. Montrer que cette correction est moins conservatrice que celle de Bonferroni. Que peut-on en dire simest grand?

On passe aux complémentaires desAi, l’union devient une intersection et on utilise l’indépendance.

Si fait un développement limité pour mgrand, on retrouve Bonferroni.

L’appliquer au jeu de données simulées. Commenter.

sum(pval<(1-0.95^{1/5000}))

## [1] 25

truth[pval<(1-0.95^{1/5000})]

## [1] -1 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 1 1 1 1 1 1 1 -1

## [24] -1 -1

La liste est bien la même

1.6 Procédure de Holm-Bonferroni

1. effectuer lesmtest et ordonner les mp-valeurs obtenues p(1)p(2). . .p(m)

2. déterminerI= max{k|∀i≤k, p(i)m−i+1α } 3. on rejette les p-valeurs inférieures à m−I+1α .

Montrer que cette correction est moins conservatrice que celle de Bonferroni. L’appliquer au jeu de données simulées. Commenter.

Tous les gènes sont testés avec une erreur de première espèce supérieure à mα. La procédure est donc mois conservative que Bonferroni.

holmBonferroni=function(pval,alpha){

m=length(pval)

sortedpval <- sort(pval)

x=which(sortedpval>alpha/c(m:1)) #liste des gènes pour lesquels on décide H_0 quand on fait le test avec alpha/(m-k) cut=min(x)-1 #rang auquel il faut couper la liste qu'on renvoie

selected=c() if(cut>1){

selected=order(pval)[1:cut]

}

return(selected) }

Application aux données simulées:

holmBonferroni(pval,.05)

## [1] 3335 1740 288 2621 2443 3731 424 1292 4160 2775 3076 1375 1569 3979

## [15] 4420 4478 2331 1073 2544 39 1619 4032 2131 3317 3708

(4)

On trouve toujours les mêmes gènes.

Maîtrise de FDR

On constate que pour des valeurs grandes de m, ce qui est typiquement le cas en génomique quand on teste un grand nombre de gènes simultanément, le contrôle du FWER entraîne des test très conservatifs, et possiblement des listes vides de gènes différentiellement exprimés.

Un alternative moins conservatrice est de s’intéresser non pas au nombre absolu de faux positifs mais à leur proportion de parmi les positifs.

LaFalse Discovery Proportion ou FDP est la proportion de faux positifs parmi les positifs:

F DP = F P F P +T P

Cette quantité est par définition une variable aléatoire. Son espérance est appeléeFalse Discovery Rate ou FDR.

F DR=E( F P F P +T P)

1.7 Procédure de Benjamini-Hochberg

benjaminiHochberg=function(pval,alpha){

m=length(pval)

sortedpval <- sort(pval)

x=which(sortedpval<alpha*c(1:m)/m) #liste des gènes pour lesquels on décide H_1 quand on fait le test avec alpha/(m-k) cut=max(x) #rang auquel il faut couper la liste qu'on renvoie

selected=c() if(cut>0){

selected=order(pval)[1:cut]

}

return(selected) }

Application aux données simulées:

BHres <- benjaminiHochberg(pval,.05) BHres

## [1] 3335 1740 288 2621 2443 3731 424 1292 4160 2775 3076 1375 1569 3979

## [15] 4420 4478 2331 1073 2544 39 1619 4032 2131 3317 3708 3960 1037 3515

## [29] 3135 722 4133 4317 4812 2656 1574 3205 1440 3023 1921 2914 1627 3009

## [43] 1756 4143 1784 934 2424 3548 3627 1626 421 1226 2182 3058 1398 1232

## [57] 4961 2832 958 1302 772 2246 295 1251 73 c('taille',length(BHres))

## [1] "taille" "65"

truth[BHres]

## [1] 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 1

## [24] 1 1 1 -1 1 1 -1 1 -1 1 1 1 1 1 -1 1 1 1 -1 1 1 0 1

## [47] -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1 0 1

(5)

On renvoie cette fois sensiblement plus de gènes, avec un petit nombre de faux positifs.

1.8 p-valeurs ajustées

Comparons par exemple les listes pour Benjamini Hochberg pvaladjusted <- p.adjust(pval,method="BH")

which(pvaladjusted<0.05)

## [1] 39 73 288 295 421 424 722 772 934 958 1037 1073 1226 1232

## [15] 1251 1292 1302 1375 1398 1440 1569 1574 1619 1626 1627 1740 1756 1784

## [29] 1921 2131 2182 2246 2331 2424 2443 2544 2621 2656 2775 2832 2914 3009

## [43] 3023 3058 3076 3135 3205 3317 3335 3515 3548 3627 3708 3731 3960 3979

## [57] 4032 4133 4143 4160 4317 4420 4478 4812 4961 sort(BHres)

## [1] 39 73 288 295 421 424 722 772 934 958 1037 1073 1226 1232

## [15] 1251 1292 1302 1375 1398 1440 1569 1574 1619 1626 1627 1740 1756 1784

## [29] 1921 2131 2182 2246 2331 2424 2443 2544 2621 2656 2775 2832 2914 3009

## [43] 3023 3058 3076 3135 3205 3317 3335 3515 3548 3627 3708 3731 3960 3979

## [57] 4032 4133 4143 4160 4317 4420 4478 4812 4961

1.9

Bonus: puissance et confiance de Bonferroni, Holm-Bonferroni et Benjamini-Hochberg pour différentes valeurs deα

datageneration = function(ngenes=5000,ncond1=10,ncond2=10,mu=500,sd=100,diff=100){

data <- matrix(rnorm(ngenes*(ncond1+ncond2),mu,sd),ngenes,(ncond1+ncond2)) #matrice des données, gènes en ligne, échantillons en colonne condition <- c(rep(1,ncond1),rep(2,ncond2)) #vecteur donnant la condition des échantillons

truth <- sample(c(-1,0,1),ngenes,replace=TRUE,prob=c(.01,.98,.01)) #vecteur verite data[truth==1,condition==2] <- data[truth==1,condition==2] +diff

data[truth==-1,condition==2] <- data[truth==-1,condition==2] -diff return(list(data=data,condition=condition,truth=truth))

}

evaluation <- function(simulation,alpha){

#prend un jeu de données généré par la fonction datageneration

#détermine la confiance et la puissance pour Bonferroni, Holm-Bonferroni et

#Benjamini-Hochberg pour un alpha fixé data = simulation$data

truth= simulation$truth

condition= simulation$condition m=length(truth)

pval <- apply(data, 1, function(x) t.test(x[condition==1],x[condition==2])$p.value)

(6)

#confiance-puissance pour Bonferroni

selected <- (pval<(alpha/m)) #contient 1 si le gene est dans la liste renvoyée, 0 sinon

confianceBonf <- sum((truth==0) * (selected==0)) / sum(truth==0) #vrai H0 et pas dans la liste / vraiH0 puissanceBonf <- sum((truth!=0) * (selected==1)) / sum(truth!=0) #vraiH1 et dans la liste / vraiH1

#confiance-puissance pour Holm-Bonferroni sortedpval <- sort(pval)

x=which(sortedpval>alpha/c(m:1)) #liste des gènes pour lesquels on décide H_0 quand on fait le test avec alpha/(m-k) cut=min(x)-1 #rang auquel il faut couper la liste qu'on renvoie

selected <- (pval<=sortedpval[cut]) #contient 1 si le gene est dans la liste renvoyée, 0 sinon

confianceHolm <- sum((truth==0) * (selected==0)) / sum(truth==0) #vrai H0 et pas dans la liste / vraiH0 puissanceHolm <- sum((truth!=0) * (selected==1)) / sum(truth!=0) #vraiH1 et dans la liste / vraiH1

#confiance-puissance pour Benjamini-Hochberg sortedpval <- sort(pval)

x=which(sortedpval<alpha*c(1:m)/m) #liste des gènes pour lesquels on décide H_1 quand on fait le test avec alpha/(m-k) cut=max(x) #rang auquel il faut couper la liste qu'on renvoie

selected <- (pval<=sortedpval[cut]) #contient 1 si le gene est dans la liste renvoyée, 0 sinon confianceBH <- sum((truth==0) * (selected==0)) / sum(truth==0) #vrai H0 et pas dans la liste / vraiH0 puissanceBH <- sum((truth!=0) * (selected==1)) / sum(truth!=0) #vraiH1 et dans la liste / vraiH1

return(list(confianceBonf=confianceBonf,puissanceBonf=puissanceBonf,confianceHolm=confianceHolm,puissanceHolm=puissanceHolm,confianceBH=confianceBH,puissanceBH=puissanceBH)) }

simulation <- datageneration(diff=100) evaluation(simulation,.05)

## $confianceBonf

## [1] 0.9997954

#### $puissanceBonf

## [1] 0

#### $confianceHolm

## [1] 0.9997954

#### $puissanceHolm

## [1] 0

#### $confianceBH

## [1] 0.9997954

#### $puissanceBH

## [1] 0

(7)

evaluation(simulation,.3)

## $confianceBonf

## [1] 0.9997954

#### $puissanceBonf

## [1] 0.01785714

#### $confianceHolm

## [1] 0.9997954

#### $puissanceHolm

## [1] 0.01785714

#### $confianceBH

## [1] 0.9985679

#### $puissanceBH

## [1] 0.09821429

evaluation(simulation,.6)

## $confianceBonf

## [1] 0.9997954

#### $puissanceBonf

## [1] 0.01785714

#### $confianceHolm

## [1] 0.9997954

#### $puissanceHolm

## [1] 0.01785714

#### $confianceBH

## [1] 0.9957038

#### $puissanceBH

## [1] 0.2321429

Applications

Question 2.1: Données

Charger les donnéesGolub_M ergedisponibles dans le packagegolubEsetsde Bioconductor.

Que contiennent ces données?

library(golubEsets)

## Loading required package: Biobase

## Loading required package: BiocGenerics

## Loading required package: parallel

##

(8)

## Attaching package: 'BiocGenerics'

## The following objects are masked from 'package:parallel':

#### clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,

## clusterExport, clusterMap, parApply, parCapply, parLapply,

## parLapplyLB, parRapply, parSapply, parSapplyLB

## The following objects are masked from 'package:stats':

#### IQR, mad, sd, var, xtabs

## The following objects are masked from 'package:base':

#### anyDuplicated, append, as.data.frame, basename, cbind,

## colnames, dirname, do.call, duplicated, eval, evalq, Filter,

## Find, get, grep, grepl, intersect, is.unsorted, lapply, Map,

## mapply, match, mget, order, paste, pmax, pmax.int, pmin,

## pmin.int, Position, rank, rbind, Reduce, rownames, sapply,

## setdiff, sort, table, tapply, union, unique, unsplit, which,

## which.max, which.min

## Welcome to Bioconductor

#### Vignettes contain introductory material; view with

## 'browseVignettes()'. To cite Bioconductor, see

## 'citation("Biobase")', and for packages 'citation("pkgname")'.

data(Golub_Merge)

golub <- exprs(Golub_Merge) Question 2.2: filtrage

La matrice des expressions se trouve en tapantexprs(Golub_M erge).

En tracer l’histogramme. Pourquoi certaines valeurs sont-elles aberrantes? Cela est en fait dû au fait que le bruit de fond a déjà été enlevé (et parfois sur-estimé).

hist(golub,main='expressions')

expressions

golub

Frequency

−20000 0 20000 40000 60000

0 200000

Certaines expressions sont négatives, ce qui n’est pas possible car elles correspondent à des intensités lumineuses dans la technologie utilisée ici.

(9)

A la suite des auteurs de l’article d’origine, remplacez toutes les valeurs inférieures à 100 par 100 et toutes celles supérieures à 16000 par 16000.

On souhaite ensuite enlever les gènes dont l’expression n’est pas assez importante ou dont la variance est trop faible. Pour cela, déterminer l’expression maximaleemaxet minimaleeminde chaque gène et ne garder que les gènes tels que emaxemin >5 etemaxemin >500.

Puis passez les données en logarithme en base 10.

Enfin, à l’aide de la fonction scale, centrez et réduisez les données par gène. Cette opération aura-t-elle une influence sur le fait que les gènes sont considérés comme différentiellement exprimés ou non à l’aide d’un t-test?

golub[golub<100]<-100 golub[golub>16000]<-16000 tmp1<-apply(golub,1,max) tmp2<-apply(golub,1,min) which1<-(tmp1/tmp2)>5 which2<-(tmp1-tmp2)>500 golub.sub<-which1*which2 golub<-golub[golub.sub==1,]

golub <- log(golub,10)

golub.expr<- t(scale(t(golub),TRUE,TRUE))

Pas d’influence sur le fait d’être différentiellement exprimés puisque le cetrage-réduction se fait sur l’ensemble des échantillons.

Question 2.3: Analyse différentielle

Réaliser l’analyse différentielle à l’aide d’un test de Student et d’une FDR à 1%.

Créer une sous-matrice DEgene des données précédentes en ne gardant que les gènes différentiellement exprimés.

ALL <- which(Golub_Merge$ALL.AML=="ALL") AML <- which(Golub_Merge$ALL.AML=="AML")

pval <- apply(golub.expr,1,function(x) t.test(x[ALL],x[AML])$p.value) pvalBH <- p.adjust(pval,method="BH")

DEgene <- golub.expr[pvalBH<.01,]

Question 2.4: Visualisation

A l’aide de la fonctionheatmap de la librairiegplots, représenter l’expression des gènes différentiellement exprimés. Que pouvez-vous dire des conditions AML et ALL?

library(gplots)

#### Attaching package: 'gplots'

## The following object is masked from 'package:stats':

#### lowess

(10)

colnames(DEgene) <- Golub_Merge$ALL.AML

heatmap(DEgene, col=greenred(75),xlab="Conditions",ylab="Genes")

ALL ALL ALL ALL AML ALL ALL ALL ALL ALL ALL ALL AML AML AML AML AML AML AML AML ALL ALL ALL ALL

Conditions

J04182_at U44772_at U07132_at X71973_at L19872_at J03801_f_at M57731_s_at D26308_at X70297_at U70867_at U57094_at M81695_s_at M16424_at X80907_at U31342_at J04990_at M12959_s_at U29175_at Z49194_at HG1862−HT1897_at M86667_at D21262_at U31814_at HG2274−HT2370_at Z69881_at X05323_at U02493_at D63880_at M29971_at U79285_at U84388_at X58399_at D80006_at L21936_at U72936_s_at U46006_s_at

Genes

Question 2.5: Signature

Gardez uniquement les 50 gènes les plus différentiellement exprimés (la fonctionorder vous sera utile). On se demande si cet ensemble de 50 gènes peut être une bonne signature du type de cancer, c’est-à-dire permet bien de séparer les deux types de conditions.

bestgenes <- order(pvalBH)[1:50]

DEbest <- golub.expr[bestgenes,]

colnames(DEbest) <- Golub_Merge$ALL.AML

heatmap(DEbest, col=greenred(75),xlab="Conditions",ylab="Genes")

(11)

AML AML AML AML AML ALL ALL ALL ALL ALL ALL ALL AML ALL ALL

Conditions

M22960_at X64072_s_at D88422_at M83652_s_at X95735_at M55150_at Z15115_at M11722_at L47738_at

HG1612−HT1612_at U73737_at

X82240_rna1_at U05259_rna1_at

Genes

Pour répondre plus avant à cette question, mettre en oeuvre une méthode de classification, avec ensemble d’apprentissage et test, et tester son efficacité. Toute méthode est possible (SVM, k-means, forêt aléatoire, régression logistique . . . ).

library(randomForest)

## randomForest 4.6-14

## Type rfNews() to see new features/changes/bug fixes.

#### Attaching package: 'randomForest'

## The following object is masked from 'package:Biobase':

#### combine

## The following object is masked from 'package:BiocGenerics':

#### combine

rfDEbest <- DEbest #jeu pour appliquer random forest

rownames(rfDEbest) <- paste('G',c(1:50),sep="") #les - dans les noms sont incompatibles avec la fonction randomForest rfDEbestdata <- as.data.frame(t(rfDEbest))

rfDEbestdata$type <- Golub_Merge$ALL.AML selected <- rbinom(dim(rfDEbestdata)[1],1,.8)

rf <- randomForest(x=rfDEbestdata[selected==1,1:50],y=rfDEbestdata[selected==1,51], xtest=rfDEbestdata[selected==0,1:50],ytest=rfDEbestdata[selected==0,51],data=rfDEbestdata) rf

#### Call:

## randomForest(x = rfDEbestdata[selected == 1, 1:50], y = rfDEbestdata[selected == 1, 51], xtest = rfDEbestdata[selected == 0, 1:50], ytest = rfDEbestdata[selected == 0, 51], data = rfDEbestdata)

## Type of random forest: classification

## Number of trees: 500

## No. of variables tried at each split: 7

#### OOB estimate of error rate: 1.89%

## Confusion matrix:

(12)

## ALL AML class.error

## ALL 33 1 0.02941176

## AML 0 19 0.00000000

## Test set error rate: 5.26%

## Confusion matrix:

## ALL AML class.error

## ALL 13 0 0.0000000

## AML 1 5 0.1666667

Question 2.6: Analyse d’enrichissement

Installer le packagehu6800.db de Bioconductor. Ce package permet de retrouver notamment les correspon- dances entre les noms deprobes de la puce Affymetrix Hgu6800 (sur laquelle a été faite cette expérience) et les noms de gènes dans les bases de données, dont ENSEMBL.

Les commandes

> DElist <- rownames(DEgene)

> DEensemblIds <- mget(DElist, envir=hu6800ENSEMBL)

> DEensembllist <- unlist(unname(DEensemblIds[!is.na(DEensemblIds)]))

> write.table(DEensembllist,file='DElist.txt',row.names=FALSE,col.names=FALSE,quote=FALSE) permettent de récupérer les noms des gènes différentiellement exprimés sur la puce (ligne 1), leur équivalent dans la base ENSEMBL (ligne 2) et de supprimer les gènes n’étant pas présent dans ENSEMBL (ligne 3). La ligne 4 écrit la liste des identifiants ENSEMBL dans un fichierDElist.txt.

Appliquer ces qautre lignes et faire de même avec l’ensemble des gènes de la puce (l’univers) et les cinquante gènes le plus différentiellement exprimé.

#BiocManager::install("hu6800.db", version = "3.8") library("hu6800.db")

## Loading required package: AnnotationDbi

## Loading required package: stats4

## Loading required package: IRanges

## Loading required package: S4Vectors

#### Attaching package: 'S4Vectors'

## The following object is masked from 'package:gplots':

#### space

## The following object is masked from 'package:base':

#### expand.grid

## Loading required package: org.Hs.eg.db

##

##

DElist <- rownames(DEgene) universe <- rownames(golub.expr) best <- rownames(DEbest)

DEensemblIds <- mget(DElist, envir=hu6800ENSEMBL)

DEensembllist <- unlist(unname(DEensemblIds[!is.na(DEensemblIds)]))

(13)

ensemblIds <- mget(universe, envir=hu6800ENSEMBL)

ensembllist <- unlist(unname(ensemblIds[!is.na(ensemblIds)])) bestensemblIds <- mget(best, envir=hu6800ENSEMBL)

bestensembllist <- unlist(unname(bestensemblIds[!is.na(bestensemblIds)]))

#Décommenter les lignes pour créer les fichiers à télécharger dans GOrilla

#write.table(DEensembllist,file='DElist.txt',row.names=FALSE,col.names=FALSE,quote=FALSE)

#write.table(ensembllist,file='universe.txt',row.names=FALSE,col.names=FALSE,quote=FALSE)

#write.table(bestensembllist,file='bestlist.txt',row.names=FALSE,col.names=FALSE,quote=FALSE) Rendez-vous ensuite sur la page du serveurGOrilla permettant de réaliser des analyses d’enrichissement GO en ligne.

Réalisez l’enrichissement de l’ensemble des gènes différentiellement exprimés puis de des cinquante meilleurs, par rapport à l’univers.

Réalisez ensuite l’enrichissement proposé sur le serveur GOrilla avec une seule liste. Quel en est l’avantage?

Références

Documents relatifs

On the other hand, the operation of such processes will have negligible effects concerning the truth bias effects, if the conscious or unconscious meta-cognitive monitoring that

The Fundamental Theorem of Calculus

[r]

The identification of the intended meaning in the student's current context is then used to provide the student with the appropriate translation, warnings and quizzes,

En effet, un des états (ici setosa) est choisi comme base, et Species est remplacé par deux indicatrices (versicolor et virginica)... On trace le boxplot pour voir l’évolution,

L’erreur de première espèce est le fait de décider H 1 quand H 0 est vraie, c’est-à-dire de mettre le vaccin en production (et donc d’investir) alors qu’il n’est pas

My bedroom is quite small and all the furniture is old, so the room doesn’t look nice.. I just hate my orange bookcase and my

The good news is that I’ve passed my BEM exam, and now I study at “El Ibrahim ” secondary school.. I like it but I have already been in trouble because I hate P.E