Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
B I O I N F O R M T I C A
E S TA D S T I C A
A N L I S I S E S TA D S T I C O D E D AT O S M I C O S C O N R / B I O C O N D U C T O R
G U I L L E R M O . A YA L A @ U V. E S , U N I V E R S I D A D D E V A L E N C I A
Copyright 25 de mayo de 2016
Guillermo Ayala
Guillermo.Ayala@uv.es
This work is free. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To
Public License, Version 2, as published by Sam Hocevar. See http://www.wtfpl.net/ for more details.
ndice general
I Introduccin 11
2 R y Bioconductor 19
3 Anotacin 45
II Datos 77
4 Microarrays 79
6 RNASeq 133
VI Agregacin 371
21 Secuencias 385
23 microRNA 433
25 Probabilidad 461
27 Estimacin 505
33 Miscelnea 633
34 Meta-anlisis 637
C Datos 649
Bibliografa 657
Glossary 677
Prlogo
Introduccin
1
Estadstica y datos micos
DAVID http://david.abcc.ncifcrf.gov.
g:Profiler http://biit.cs.ut.ee/gprofiler/.
Gitools http://www.gitools.org.
1.5 Jerga
uso con las ideas a grandes rasgos. Lo cual quiere decir que la com-
prensin precisa de las tcnicas supone la consulta de la referencia
original.16 Un libro que trata cmo hacer las cosas con R/Bioconduc- 16
Hay una peligrosa tendencia a creer
tor pero no lo que se hace o porqu se hace es Sinha [2014]. Es una que leyendo un resumen se conoce la
tcnica. No es cierto.
gua de uso muy bien elaborada.
Un manual online que sigue una lnea muy similar a este es http:
//genomicsclass.github.io/book/.
2
R y Bioconductor
2.1 Sobre R
install.packages(``UsingR'')
library(UsingR)
x = read.table(file="temperaturas.csv",dec=".",
sep = ";",header = TRUE)
x = c(35.84122,28.95458,36.02971,33.13809,39.55091,39.48182,27.52009,32.58105,
31.54865,36.73312,33.87558,30.05730,29.45515,38.70321,34.80034,35.86523,
32.76480,35.94576,30.44356,38.75483,31.21475,33.15148,36.17373,28.34059,
40.52086,39.34035,34.26828,41.92718,34.83630,43.46855)
La funcin base::c nos sirva para concatenar uno detrs de otro los
datos numricos. Hemos obtenido.
x[1]
## [1] 35.84122
x[13]
## [1] 29.45515
Podemos ver los datos que estn entre el 13 y el 23. Para ello fij-
monos en el siguiente cdigo.
13:23
## [1] 13 14 15 16 17 18 19 20 21 22 23
x[13:23]
Podemos tener inters en saber los valores de los datos que ocu-
pan las posiciones 7, 9 y de la 20 a la 25. Estas posiciones las pode-
mos obtener con
c(7,9,20:25)
## [1] 7 9 20 21 22 23 24 25
x[c(7,9,20:25)]
Puede que nuestro inters en ver los datos no venga dado por
la posicin que ocupan sino por su valor. Por ejemplo, queremos
saber cuntos de estos datos superan o son iguales a 35. Cmo lo
hacemos? Lo lgico es comparar los valores de x con 35. Lo hacemos
con
24 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
x >= 35
Nos devuelve los datos que ocupan las posiciones donde se da-
ba la condicin, donde la condicin era cierta. Podemos saber qu
valores toman los datos que son mayores que 37 con
o bien los datos que son mayores que 35 y menores o iguales que
37.
9 9
El resto de operadores lgicos los
encontramos en la ayuda de Logical
Operators: & (&&) corresponde con la
interseccin, | (||) corresponde con la
unin y la negacin de una condicin la
obtenemos con !.
r y bioconductor 25
sort(x)
sort(x,index.return = TRUE)
## $x
## [1] 27.52009 28.34059 28.95458 29.45515 30.05730
## [6] 30.44356 31.21475 31.54865 32.58105 32.76480
## [11] 33.13809 33.15148 33.87558 34.26828 34.80034
## [16] 34.83630 35.84122 35.86523 35.94576 36.02971
## [21] 36.17373 36.73312 38.70321 38.75483 39.34035
## [26] 39.48182 39.55091 40.52086 41.92718 43.46855
##
## $ix
## [1] 7 24 2 13 12 19 21 9 8 17 4 22 11 27 15
## [16] 29 1 16 18 3 23 10 14 20 26 6 5 25 28 30
## $x
## [1] 43.46855 41.92718 40.52086 39.55091 39.48182
## [6] 39.34035 38.75483 38.70321 36.73312 36.17373
## [11] 36.02971 35.94576 35.86523 35.84122 34.83630
## [16] 34.80034 34.26828 33.87558 33.15148 33.13809
## [21] 32.76480 32.58105 31.54865 31.21475 30.44356
## [26] 30.05730 29.45515 28.95458 28.34059 27.52009
##
## $ix
## [1] 30 28 25 5 6 26 20 14 10 23 3 18 16 1 29
## [16] 15 27 11 22 4 17 8 9 21 19 12 13 2 24 7
6
5
4
26 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
Frequency
3
2
1
De cmo guardar un dibujo Primero hemos de hacerlo. Supongamos
0
que hacemos un histograma de los datos que tenemos en el vector x.
30 35 40
Lo tenemos en la figura 2.1. x
El dibujo anterior podemos querer guardarlo en un fichero externo
Figura 2.1: Histograma
posiblemente para incorporarlo despus a un documento. 10 En el 10
Espero que no sea un documento
siguiente cdigo lo guardamos en un fichero pdf. Word. Pero presumo que, por desgracia,
lo ser.
pdf("histograma_ejemplo.pdf") #Fijamos el nombre del fichero
hist(x)
dev.off()
help.start()
?hist
O simplemente,
help(hist)
source("http://www.bioconductor.org/biocLite.R")
biocLite()
source("http://www.bioconductor.org/biocLite.R")
biocLite("ALL")
chooseBioCmirror()
setRepositories()
data(golub,package = "multtest")
golub.cl
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [24] 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
class(golub.cl)
## [1] "numeric"
(golub.fac = factor(golub.cl,levels=0:1,labels=c("ALL","AML")))
## [1] ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL
## [12] ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL
## [23] ALL ALL ALL ALL ALL AML AML AML AML AML AML
## [34] AML AML AML AML AML
## Levels: ALL AML
table(golub.fac)
## golub.fac
## ALL AML
## 27 11
summary(golub.fac)
## ALL AML
## 27 11
library(ggplot2)
qplot(golub.fac)
class(golub)
count
## [1] "matrix" 10
ALL AML
golub.fac
nrow(golub)
## [1] 3051
ncol(golub)
## [1] 38
dim(golub)
## [1] 3051 38
golub[2000,12]
## [1] 0.19595
qplot(muestra,y2000)
o con
golub[2000,golub.fac == "AML"]
qplot(muestra,y2000,colour=golub.fac)
golub.df = data.frame(muestra,y2000,golub.fac)
golub.gnames[2000,]
class(golub.gnames)
## [1] "matrix"
dim(golub.gnames)
## [1] 3051 3
Cada fila nos da informacin con el gen del cual tenemos su perfil
de expresin en la matriz golub. En concreto, qu tenemos en la fila
2000?
golub.gnames[2000,]
(a) (b)
golub.gnames[2000,2]
golub.gnames[2000,3]
## [1] "X74794_at"
rownames(golub) = golub.gnames[,3]
colnames(golub) = golub.fac
Qu pretendemos hacer? Vamos a realizar dos dibujos. En absci- mos son base::lapply y base::sapply.
mean(golub[2000,])
## [1] 0.02080211
median(golub[2000,])
## [1] 0.147145
2.5 Ejercicios
4. Qu nos indicaran los genes tales que sus puntos asociados estn fuera
de la regin {( x, y) : |y x | > }.
Ejercicio 3. Consideremos los datos golub. Se pide:
1. Determinar la desviacin estndar de las expresiones de cada gen.
nombre.funcion = function(argumentos){
CODIGO
resultado
}
MediaDesviacion = function(x){
resultado = c(mean(x),sd(x))
resultado
}
x = rnorm(23,mean=12,sd=1.3)
MediaDesviacion(x)
Y la utilizamos.
MediaDesviacionPercentil(x)
MediaDesviacionPercentil(x,ordenpercentil=.7)
y = matrix(1:16,ncol=4)
is.vector(y)
## [1] FALSE
MediaDesviacionPercentilError(y)
Y la probamos.
r y bioconductor 39
MediaDesviacionPercentilErrorLista(x)
## $media
## [1] 13.029
##
## $de
## [1] 0.5841361
x.des = MediaDesviacionPercentilErrorLista(x)
x.des$media
## [1] 13.029
x.des$de
## [1] 0.5841361
tami.GenDE
Vamos a definir una funcin que va nos realiza un anlisis de
expresin diferencial aplicando distintas correcciones y nos devuelve
la lista de genes que se declaran con expresin diferencial.
Primero necesitamos cargar un ExpressionSet para trabajar. Utili-
zamos los datos GSE20986.
data(gse20986,package="tamidata")
gse = gse20986
pacman::p_load("multtest","genefilter")
(tejido = pData(gse20986)[,"tissue"])
is.element(tejido,c("iris","huvec"))
gse = gse[,is.element(tejido,c("iris","huvec"))]
(irishuvec = tejido[is.element(tejido,c("iris","huvec"))])
(irishuvec = factor(irishuvec))
alpha = 0.05
tt = rowttests(gse,irishuvec)
p1 = mt.rawp2adjp(tt$p.value,"BH")
sel = which(p1$adjp[p1$index,2] < alpha)
Y ahora la probamos
tami.GenDE(gse,irishuvec,0.05,"BH")
x = 1:25
tami.GenDE(x,irishuvec,0.05,"BH")
fac = rep(1:2,3)
tami.GenDE(gse,fac,0.05,"BH")
ncol(gse)
## Samples
## 6
length(irishuvec)
## [1] 6
Modificamos la funcin.
tami.GenDE(gse,rep(1:2,4))
tami.Report
En esta seccin proponemos una funcin que tiene como argumen-
tos un Biobase::ExpressionSet, su anotacin y nos devuelve un fichero
con el smbolo, su nombre y enlaces a Ensembl y Entrez.
data(gse20986raw,package="tamidata")
pacman::p_load("annotate","R2HTML","hgu133plus2.db")
Definimos la funcin.
Ejecutamos25 la funcin. 25
Aunque, sin duda, Pepe Isbert lo
hara mucho mejor que nosotros.
tami.Report(gse20986raw,sel.sig = c(45,78,378),file="prueba.html")
if(local){
load(localgsc) ## Previamente guardado como gsc
if(subsetting){
gsc1 = sapply(gsc,subsettingGeneSet,sysids)
gsc = GeneSetCollection(gsc1)
}
} else {
frame = toTable(org.Sc.sgdGO)
goframeData = data.frame(frame$go_id, frame$Evidence,
frame$systematic_name)
if(subsetting)
goframeData = goframeData[is.element(frame$systematic_name,sysids),]
goFrame = GOFrame(goframeData, organism = "Saccharomyces cerevisiae")
goAllFrame = GOAllFrame(goFrame)
gsc = GeneSetCollection(goAllFrame, setType = GOCollection())
}
44 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
if(sizefilt)
which(sapply(geneIds(gsc),length) > 10)
gsc = gsc[which(sapply(geneIds(gsc),length) > sizemin)]
gsc
}
subsettingGeneSet = function(gs0,fn0){
geneIds(gs0) = geneIds(gs0)[is.element(geneIds(gs0),fn0)]
gs0
}
data(bdmy.norm,package="tamidata")
3.1 AnnotationDbi
pacman::p_load("AnnotationDbi")
pacman::p_load("hgu133a.db")
ls("package:hgu133a.db")
hgu133a.db
## ChipDb object:
## | DBSCHEMAVERSION: 2.1
## | Db type: ChipDb
## | Supporting package: AnnotationDbi
## | DBSCHEMA: HUMANCHIP_DB
## | ORGANISM: Homo sapiens
## | SPECIES: Human
## | MANUFACTURER: Affymetrix
## | CHIPNAME: Human Genome U133 Set
## | MANUFACTURERURL: http://www.affymetrix.com/support/technical/byproduct.affx?product=hgu133
## | EGSOURCEDATE: 2015-Sep27
## | EGSOURCENAME: Entrez Gene
## | EGSOURCEURL: ftp://ftp.ncbi.nlm.nih.gov/gene/DATA
## | CENTRALID: ENTREZID
## | TAXID: 9606
## | GOSOURCENAME: Gene Ontology
## | GOSOURCEURL: ftp://ftp.geneontology.org/pub/go/godatabase/archive/latest-lite/
## | GOSOURCEDATE: 20150919
## | GOEGSOURCEDATE: 2015-Sep27
## | GOEGSOURCENAME: Entrez Gene
## | GOEGSOURCEURL: ftp://ftp.ncbi.nlm.nih.gov/gene/DATA
## | KEGGSOURCENAME: KEGG GENOME
## | KEGGSOURCEURL: ftp://ftp.genome.jp/pub/kegg/genomes
## | KEGGSOURCEDATE: 2011-Mar15
## | GPSOURCENAME: UCSC Genome Bioinformatics (Homo sapiens)
## | GPSOURCEURL: ftp://hgdownload.cse.ucsc.edu/goldenPath/hg19
## | GPSOURCEDATE: 2010-Mar22
## | ENSOURCEDATE: 2015-Jul16
## | ENSOURCENAME: Ensembl
## | ENSOURCEURL: ftp://ftp.ensembl.org/pub/current_fasta
## | UPSOURCENAME: Uniprot
## | UPSOURCEURL: http://www.uniprot.org/
## | UPSOURCEDATE: Thu Oct 1 23:31:58 2015
48 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
columns(hgu133a.db)
No todas las variables que hemos obtenido con columns son utili-
zables para realizar consultas. Aquellas utilizables para las consultas
las podemos conocer con keytypes. A estas variables las llamamos
llaves (keys).
keytypes(hgu133a.db)
head(keys(hgu133a.db,keytype="ENTREZID"))
head(keys(hgu133a.db,keytype="ENSEMBL"))
anotacin 49
(ids = sample(keys(hgu133a.db,keytype="PROBEID"),5))
AnnotationDbi::select(hgu133a.db,keys=ids,columns=c("ENTREZID","ENSEMBL","SYMBOL"),keytype="PROBEID")
3.2 ChipDb
pacman::p_load(hgu133a.db)
mappedProbes = mappedkeys(hgu133aENTREZID)
mappedProbesList = as.list(hgu133aENTREZID[mappedProbes])
## $`1053_at`
## [1] "5982"
mappedProbesList[4567]
## $`205255_x_at`
## [1] "6932"
Si hacemos
ls("package:hgu133a.db")
pacman::p_load("hgu95av2.db")
columns(hgu95av2.db)
keytypes(hgu95av2.db)
Los identificadores que tenamos eran los AffyID, esto es, los iden-
tificadores de las sondas utilizadas o PROBEID. Podemos plantearnos
su correspondencia con el smbolo o nombre del gen y las protenas
asociadas en la base de datos PFAM.
52 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
columns = c("PFAM","SYMBOL")
AnnotationDbi::select(hgu95av2.db, keys=ids, columns, keytype="PROBEID")
3.3 OrgDb
pacman::p_load(org.Hs.eg.db)
columns(org.Hs.eg.db)
O bien con
keytypes(org.Hs.eg.db)
head(keys(org.Hs.eg.db, keytype="ENTREZID"))
head(keys(org.Hs.eg.db, keytype="ENSEMBL"))
Y en Gene Ontology.
head(keys(org.Hs.eg.db, keytype="GO"))
AnnotationDbi::select(org.Hs.eg.db,keys=ids,column="SYMBOL",keytype='ENTREZID')
## ENTREZID SYMBOL
## 1 1 A1BG
## 2 2 A2M
## 3 3 A2MP1
## 4 9 NAT1
## 5 10 NAT2
(id = "ENSG00000171428")
## [1] "ENSG00000171428"
res[,"GO"]
pacman::p_load(GO.db)
3.4 TxDb
pacman::p_load("TxDb.Dmelanogaster.UCSC.dm3.ensGene")
## [1] "TxDb"
## attr(,"package")
## [1] "GenomicFeatures"
txdb = TxDb.Dmelanogaster.UCSC.dm3.ensGene
class(txdb)
## [1] "TxDb"
## attr(,"package")
## [1] "GenomicFeatures"
anotacin 55
txdb
## TxDb object:
## # Db type: TxDb
## # Supporting package: GenomicFeatures
## # Data source: UCSC
## # Genome: dm3
## # Organism: Drosophila melanogaster
## # Taxonomy ID: 7227
## # UCSC Table: ensGene
## # Resource URL: http://genome.ucsc.edu/
## # Type of Gene ID: Ensembl gene ID
## # Full dataset: yes
## # miRBase build ID: NA
## # transcript_nrow: 29173
## # exon_nrow: 76920
## # cds_nrow: 62135
## # Db created by: GenomicFeatures package from Bioconductor
## # Creation time: 2015-10-07 18:15:53 +0000 (Wed, 07 Oct 2015)
## # GenomicFeatures version at creation time: 1.21.30
## # RSQLite version at creation time: 1.0.0
## # DBSCHEMAVERSION: 1.1
columns(txdb)
y con
keytypes(txdb)
pacman::p_load(GenomicFeatures)
seqlevels(txdb) = "chr2L"
## 7 12655300
## 8 12655474
(txdb.tr = transcripts(txdb))
txdb.tr[c(1:3,1000)]
(txdb.ex = exons(txdb))
## [13846] | 13846
## [13847] | 13847
## [13848] | 13848
## [13849] | 13849
## [13850] | 13850
## -------
## seqinfo: 1 sequence from dm3 genome
txdb.ex[123]
(txdb.cds = cds(txdb))
length(txdb.cds)
## [1] 11003
transcriptsBy(txdb, by="gene")
exonsBy(txdb, by="gene")
## $FBgn0000053
## GRanges object with 8 ranges and 2 metadata columns:
## seqnames ranges strand |
## [1] chr2L [7014861, 7016374] - |
## [2] chr2L [7016437, 7017486] - |
## [3] chr2L [7017545, 7017966] - |
## [4] chr2L [7018085, 7018374] - |
## [5] chr2L [7018149, 7018374] - |
## [6] chr2L [7018431, 7019080] - |
## [7] chr2L [7019135, 7019382] - |
## [8] chr2L [7023529, 7023940] - |
## exon_id exon_name
## [1] 9389 <NA>
## [2] 9390 <NA>
## [3] 9391 <NA>
## [4] 9392 <NA>
## [5] 9393 <NA>
## [6] 9394 <NA>
## [7] 9395 <NA>
## [8] 9396 <NA>
##
## ...
## <2983 more elements>
## -------
## seqinfo: 1 sequence from dm3 genome
cdsBy(txdb, by="tx")
intronsByTranscript(txdb)
##
## ...
## <5381 more elements>
## -------
## seqinfo: 1 sequence from dm3 genome
fiveUTRsByTranscript(txdb)
threeUTRsByTranscript(txdb)
3.5 BSgenome
BSgenome.Dmelanogaster.UCSC.dm3
pacman::p_load(BSgenome.Dmelanogaster.UCSC.dm3)
tx2seqs = extractTranscriptSeqs(BSgenome.Dmelanogaster.UCSC.dm3,TxDb.Dmelanogaster.UCSC.dm3.ensGene)
tx2seqs[[1]]
tx2seqs[[1]][1000:1020]
suppressWarnings(translate(tx2seqs[[1]]))
suppressWarnings(translate(tx2seqs))
BSgenome.Hsapiens.UCSC.hg19
Estos paquetes contienen datos de secuencias para organismos
secuenciados.
pacman::p_load(BSgenome.Hsapiens.UCSC.hg19)
Hsapiens
## Human genome:
## # organism: Homo sapiens (Human)
## # provider: UCSC
## # provider version: hg19
## # release date: Feb. 2009
## # release name: Genome Reference Consortium GRCh37
## # 93 sequences:
## # chr1 chr2
## # chr3 chr4
## # chr5 chr6
## # chr7 chr8
## # chr9 chr10
## # ... ...
## # chrUn_gl000241 chrUn_gl000242
68 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## # chrUn_gl000243 chrUn_gl000244
## # chrUn_gl000245 chrUn_gl000246
## # chrUn_gl000247 chrUn_gl000248
## # chrUn_gl000249
## # (use 'seqnames()' to see all the sequence names,
## # use the '$' or '[[' operator to access a given
## # sequence)
seqNms = seqnames(Hsapiens)
head(seqNms)
getSeq(Hsapiens, seqNms[1:2])
3.6 OrganismDb
pacman::p_load(Homo.sapiens)
transcripts(Homo.sapiens, columns=c("TXNAME","SYMBOL"))
## [82956] | uc011mgu.1 NA
## [82957] | uc011mgv.2 NA
## [82958] | uc011mgw.1 NA
## [82959] | uc022brq.1 NA
## [82960] | uc022brr.1 NA
## -------
## seqinfo: 93 sequences (1 circular) from hg19 genome
3.7 biomaRt
pacman::p_load(biomaRt)
listMarts(host="www.ensembl.org")
## biomart version
_ _
## 1 ENSEMBL MART ENSEMBL Ensembl Genes 84
## 2 ENSEMBL_MART_SNP Ensembl Variation 84
## 3 ENSEMBL_MART_FUNCGEN Ensembl Regulation 84
## 4 ENSEMBL_MART_VEGA Vega 64
(ensembl = useMart("ENSEMBL_MART_ENSEMBL",host="www.ensembl.org"))
head(listDatasets(ensembl))
## dataset
## 1 oanatinus_gene_ensembl
## 2 cporcellus_gene_ensembl
## 3 gaculeatus_gene_ensembl
## 4 itridecemlineatus_gene_ensembl
anotacin 71
## 5 lafricana_gene_ensembl
## 6 choffmanni_gene_ensembl
## description
## 1 Ornithorhynchus anatinus genes (OANA5)
## 2 Cavia porcellus genes (cavPor3)
## 3 Gasterosteus aculeatus genes (BROADS1)
## 4 Ictidomys tridecemlineatus genes (spetri2)
## 5 Loxodonta africana genes (loxAfr3)
## 6 Choloepus hoffmanni genes (choHof1)
## version
## 1 OANA5
## 2 cavPor3
## 3 BROADS1
## 4 spetri2
## 5 loxAfr3
## 6 choHof1
(ensembl = useMart("ENSEMBL_MART_ENSEMBL",dataset="hsapiens_gene_ensembl",
host="www.ensembl.org"))
head(listAttributes(ensembl))
De hecho, son
nrow(listAttributes(ensembl))
affyids=c("202763_at","209310_s_at","207500_at")
A qu genes corresponden?
getBM(attributes=c('affy_hg_u133_plus_2', 'entrezgene'),
filters = 'affy_hg_u133_plus_2',
values = affyids, mart = ensembl)
pacman::p_load("Biobase","AnnotationDbi","BiocGenerics")
data(gse1397,package="tamidata")
Biobase::annotation(gse1397)
## [1] "hgu133a"
Lo cargamos.20 20
En https://www.bioconductor.org/
packages/3.3/data/annotation/ te-
nemos el listado de los paquetes de
pacman::p_load("hgu133a.db")
anotacin de los que dispone Biocon-
ductor.
Como hemos visto en 3.1 con AnnotationDbi::columns podemos
ver la informacin que tenemos y con AnnotationDbi::keytypes las
llaves con las que podemos realizar consultas.
columns(hgu133a.db)
keytypes(hgu133a.db)
Vemos que, en este caso coinciden columns y keys. Los valores los
tenemos con
head(keys(hgu133a.db,keytype="PROBEID"))
head(featureNames(gse1397))
Coinciden todos?
table(featureNames(gse1397) == keys(hgu133a.db,keytype="PROBEID"))
##
## FALSE TRUE
## 53 22230
head(featureNames(gse1397)[control])
## [1] "AFFX-hum_alu_at"
## [2] "AFFX-HUMGAPDH/M33197_3_at"
## [3] "AFFX-HUMGAPDH/M33197_5_at"
## [4] "AFFX-HUMGAPDH/M33197_M_at"
## [5] "AFFX-HUMISGF3A/M97935_3_at"
## [6] "AFFX-HUMISGF3A/M97935_5_at"
probeid2entrez = AnnotationDbi::select(hgu133a.db,keys=featureNames(gse1397),
columns="ENTREZID",keytype="PROBEID")
class(probeid2entrez)
## [1] "data.frame"
head(probeid2entrez)
## PROBEID ENTREZID
## 1 1007_s_at 780
## 2 1007_s_at 100616237
## 3 1053_at 5982
## 4 117_at 3310
## 5 121_at 7849
## 6 1255_g_at 2978
indices = match(featureNames(gse1397),probeid2entrez$PROBEID)
Cmo se ha resuelto?
head(featureNames(gse1397))
head(probeid2entrez$PROBEID,n=7)
head(indices)
## [1] 1 3 4 5 6 7
eset = gse1397
fData(eset) = probeid2entrez[indices,]
all.equal(fData(eset)$PROBEID,featureNames(eset))
## [1] TRUE
3.9 Ejercicios
* Ej. 1 Determinar los cdigos Entrez, Gene Ontology y Ensembl
para los genes BRCA1 y BRCA2 implicados en el cncer de mama.
Datos
4
Microarrays
4.1 Introduccin
library(Biobase); library(affy)
annotation(gse21779)
## [1] "hgu133plus2"
dim(exprs(gse21779))
## [1] 1354896 18
image(gse21779[,1])
head(probeNames(gse21779))
Figura 4.1: Imagen a niveles de gris
correspondiente al primer array de los
## Warning: replacing previous import AnnotationDbi::tail
datos gse21779.
by utils::tail when loading hgu133plus2cdf
## Warning: replacing previous import AnnotationDbi::head
by utils::head when loading hgu133plus2cdf
(ID = probeNames(gse21779)[400])
## [1] "1552281_at"
sum(probeNames(gse21779) == ID)
## [1] 11
counts = table(probeNames(gse21779))
table(counts)
## counts
## 8 9 10 11 13 14 15 16
## 5 1 6 54130 4 4 2 482
## 20 69
## 40 1
indexProbes(gse21779,"both",ID)[[1]]
(posiciones = indexProbes(gse21779,"pm",ID)[[1]])
indexProbes(gse21779,"mm",ID)[[1]]
(a) (b)
(c) (d)
Figura 4.2: (a)Image CEL correspon-
diente al primer array o chip. Cada
Vamos a representar los niveles de expresin PM correspondientes
pixel corresponde con una sonda distin-
ta. Los cuadrados verdes nos localizan
un conjunto de sondas asociadas al mis-
mo gen. (b) Los valores (o intensidades)
PM para un grupo de sondas en el pri-
mer array de nuestras muestras. (c) Los
valores (o intensidades) PM para un
mismo grupo de sondas en los distintos
arrays. Cada lnea corresponde con un
array distinto. En abscisas tenemos la
misma sonda en cada uno de los arrays.
84 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
library(ggplot2)
pmID = probes(gse21779[,1],"pm",ID)
df1 = data.frame(sondas = 1:11,intensidad = pmID[,"GSM542488.CEL.gz"])
ggplot(df1,aes(x=sondas,y=intensidad))+geom_line()
png(paste(dirTamiFigures,"gse217791arrays.png",sep=""))
pm0 = probes(gse21779,"pm",ID)
pm0 = data.frame(pm0,sondas=1:11)
pm1 = reshape::melt(pm0,id="sondas")
ggplot2::ggplot(data=pm1,aes(x=sondas,y=value,colour=variable))+
geom_line()+ylab("Intensidad")
dev.off()
library(reshape)
pmm = data.frame(sondas=1:11,pm = probes(gse21779[,1],"pm",ID),
mm = probes(gse21779[,1],"mm",ID))
df2 = reshape::melt(pmm,id="sondas")
levels(df2[,"variable"]) = c("pm","mm")
ggplot(df2,aes(x=sondas,y=value,colour=variable,linetype=variable))
+geom_line()
Podemos hacer una valoracin global para todos los arrays que
tenemos. Qu proporcin de sondas son tales que el valor PM es
menor que el correspondiente valor MM?
##
## FALSE TRUE
## 4460757 6415887
Ejemplo 1 (MA plot). Vamos a ilustrar el uso de los dibujo MA con los
datos gse21779. En la figura 4.3 podemos ver una comparacin entre los dos
primeros microarrays del experimento.
microarrays 87
MAplot(gse21779[,1:2],pairs=TRUE,plot.method="smoothScatter")
hist(gse21779[,1])
boxplot(gse21779)
En este caso los genes con una alta (anormalmente grande) expre-
sin corresponden con el bigote superior en los diagramas de caja
que acabamos de representar.
mos en http://wwww.uv.es/ayala/
docencia/tami/reports/Report_for_
library(arrayQualityMetrics) gse21779/index.html.
arrayQualityMetrics(expressionset = gse21779,
outdir = "Report_for_gse21779", ## Fija directorio de salida
force = TRUE, ## Sobreescribe
do.logtransform = TRUE) ## Transforma a log2
microarrays 89
apply(probes(gse21779,"pm"),2,min)
## GSM542488.CEL.gz GSM542555.CEL.gz
## 32 31
## GSM542556.CEL.gz GSM542557.CEL.gz
## 34 33
## GSM542558.CEL.gz GSM542559.CEL.gz
## 21 39
## GSM542560.CEL.gz GSM542561.CEL.gz
## 67 60
## GSM542562.CEL.gz GSM542563.CEL.gz
## 74 82
## GSM542570.CEL.gz GSM542571.CEL.gz
## 26 27
## GSM542572.CEL.gz GSM542573.CEL.gz
## 26 27
## GSM542574.CEL.gz GSM542575.CEL.gz
## 28 29
## GSM542576.CEL.gz GSM542577.CEL.gz
## 28 32
1
wk ( x, y) =
d2k ( x, y) + s0
K
1
n( x, y) = K
k=1 wk ( x, y)
wk (x, y)s(Zk ).
k =1
Fijamos una seal objetivo, Sc, que por defecto se toma Sc = 500.
Se calcula el siguiente factor de escala para el grupo de sondas i.
Sc
s fi =
MediaAjustada{2SignalLogValuei , 0,02, 0,98}
En la anterior expresin MediaAjustada indica la media ajustada
(media de los valores quitando una cierta proporcin de los ms
microarrays 93
ReportedValue(i ) = s f i 2SignalLogValuei
Multiarray Average.
donde se procesaba cada array independientemente. El procedimien-
to solamente utiliza los valores PM y no utiliza para nada los valores
MM.
( ba )
E( X |S = s) = a + b
( ba )
(12 + 11 + 19)/ 3
## [1] 14
(10 + 10 + 16) /3
## [1] 12
(7 + 9 + 15)/3
## [1] 10.33333
4.8.3 Resumen
Ya hemos realizado la correccin de fondo ( 4.8.1). A los valo-
res obtenidos les hemos aplicado una normalizacin de cuantiles
( 4.8.2). Ahora nos queda obtener el resumen de las distintas son-
das dentro de cada conjunto (de sondas) y para cada microarray. Se
aplica el mtodo median polish de Tukey.20 Previamente necesitamos 20
33.3.
algo de notacin. En cada array tendremos N sondas y suponemos
que tenemos n arrays. Por tanto la matriz de expresin a nivel de
sonda ser: x = [ xij ]i=1,...,N;j=1,...,n . La sonda i-sima en el array j-
simo tiene una expresin o intensidad xij . Las sondas las suponemos
agrupadas en grupos correspondientes a un mismo gen. Denotamos
el grupo k-simo de sondas con Sk . Por tanto, Sk {1, . . . , N }. Por
ejemplo, el conjunto Sk = {i1 , . . . , i|Sk | }, es decir, corresponde con las
filas {i1 , . . . , i|Sk | } de la matrix x original. Por simplificar la notacin
tomaremos yrj = xir ,j y por tanto
1. la mediana de { j : j = 1, . . . , n} es nula,
Una vez estimados estos parmetros los estimadores (en escala loga-
rtmica en base 2) de la expresin del grupo de sondas k en el array j
viene dada por
+ j .
gse21779_rma = rma(gse21779)
gse21779_mas5 = mas5(gse21779)
data(gse21779_rma,package="tamidata")
data(gse21779_mas5,package="tamidata")
library(geneplotter)
multidensity(exprs(gse21779_rma))
multidensity(exprs(gse21779_mas5))
boxplot.matrix(exprs(gse21779_rma))
boxplot.matrix(exprs(gse21779_mas5))
bgcorrect.methods()
(a) (b)
(c) (d)
Figura 4.5: a) Estimadores kernel de
densidad para los chips una vez hemos
aplicado el procedimiento RMA a
los datos gse21779. b) Lo mismo con
el mtodo MAS5. c) Boxplot para
los niveles de expresin de los datos
gse21779 con mtodo RMA. d) Lo
mismo que el punto (c) pero con el
mtodo MAS5.
100 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
normalize.methods(gse21779)
pmcorrect.methods()
express.summary.stat.methods()
mas5
data(gse1397raw,package="tamidata")
annotation(gse1397raw)
## [1] "hgu133a"
library(limma)
exprs1 = normalizeBetweenArrays(exprs(gse1397raw),method = "quantile")
O bien podemos hacer que coincidan las medianas de los distintos arrays
con
5.1 Introduccin
5.2 sample.ExpressionSet
library(Biobase)
data(sample.ExpressionSet)
help(sample.ExpressionSet)
varLabels(sample.ExpressionSet)
sample.ExpressionSet$type
phenoData(sample.ExpressionSet)
exprs(sample.ExpressionSet)
annotation(sample.ExpressionSet)
## [1] "hgu95av2"
table(sample.ExpressionSet$sex)
##
## Female Male
## 11 15
table(sample.ExpressionSet$type)
##
## Case Control
## 15 11
summary(sample.ExpressionSet$score)
data(golub,package= "multtest")
o bien que
m2 m1 500
golub[1,]
golub.gnames[1,]
## [1] "36"
## [2] "AFFX-HUMISGF3A/M97935_MA_at (endogenous control)"
## [3] "AFFX-HUMISGF3A/M97935_MA_at"
golub.cl
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [24] 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
golub.cl
## [1] ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL
## [12] ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL
## [23] ALL ALL ALL ALL ALL AML AML AML AML AML AML
## [34] AML AML AML AML AML
## Levels: ALL AML
108 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
3 3
El script de R con todo el preproce-
En el paquete Golub [2015] tenemos los datos originales. Tanto las sado descrito podemos encontrarlo en
http://svitsrv25.epfl.ch/R-doc/
muestras que se utilizaron para entrenar el procedimiento como las library/multtest/doc/golub.R y en
que se utilizaron para evaluarlo. la documentacin del paquete Pollard
et al. [2015].
library(Biobase)
library(ALL)
data(ALL)
bcell = grep("^B",as.character(ALL$BT))
types = c("NEG","BCR/ABL")
moltyp = which(as.character(ALL$mol.biol) %in% types)
bcrneg = ALL[,intersect(bcell,moltyp)]
ExpressionSet
Es una estructura de datos que nos permite mantener en un solo
objeto toda la informacin que relativa a un experimento con micro-
arrays.
Para poder utilizar esta clase necesitamos el paquete Gentleman
et al. [2015, Biobase]. Lo cargamos (la clase y los mtodos que luego
vamos a utilizar).
pacman::p_load(Biobase)
Qu necesitamos?
Supongamos que tenemos la informacin por separado y quere-
mos construir un ExpressionSet. Qu datos nos describen un ex-
110 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
pacman::p_load("tamidata")
finput = system.file("extdata","n06_expr.txt",package="tamidata")
exprs0 = read.table(file = finput,header = TRUE,sep="\t")
class(exprs0)
## [1] "data.frame"
exprs0 = as.matrix(exprs0[,-1])
class(exprs0)
## [1] "matrix"
dim(exprs0)
## [1] 22215 54
colnames(exprs0)
Y podemos ver
head(exprs0,n=1)
finput = system.file("extdata","n06_gene_attributes.txt",package="tamidata")
rn = read.table(file = finput,header = TRUE,sep="\t")
rownames(exprs0) = rn[,1]
Datos fenotpicos
Es la informacin que tenemos de las distintas muestras. Ser
una matriz de datos (un data.frame) con tantas filas como muestras,
n, y con tantas columnas como variables tenemos. Estas variables
que nos describen las muestras podemos llamarlas covariables (una
denominacin muy estadstica).
En nuestro caso los datos fenotpicos los tenemos en el fichero
sample_attributes.txt. Los leemos.
finput = system.file("extdata","n06_sample_attributes.txt",
package="tamidata")
pd0 = read.table(finput,sep = "\t",header=TRUE)
dim(pd0)
## [1] 54 14
rownames(pd0) = colnames(exprs0)
datos de microarrays 113
summary(pd0)
## 3rd Qu.:5.000
## Max. :9.000
## NA's :23
sapply(pd0,class)
sampleNames(datosfenotipo)
head(pData(datosfenotipo))
## CAMA1 5 <NA> NA
## DU4475 6 <NA> NA
save(neve06,file="neve06.rda")
dim(bdmy)
## Features Samples
## 6018 18
head(pData(bdmy),n=1)
geneplotter::multidensity(exprs(bdmy),xlim = c(0,8))
boxplot.matrix(exprs(bdmy),ylim=c(0,8))
library(reshape);library(ggplot2)
df = data.frame(gene = featureNames(bdmy),exprs(bdmy))
df1 = melt(df,id=c("gene"))
ggplot(df1,aes(x=value,colour=variable,group=variable)) +
geom_density(kernel = "epanechnikov",fill=NA)+
xlim(0,8) ## Estimadores densidad
ggplot(df1,aes(x=variable,y = value)) + geom_boxplot() +
ylim(0,8) + coord_flip()
118 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
(a) (b)
Figura 5.2: Datos bdmy estimadores de
densidad y diagramas de cajas antes de
normalizacin.
(a) (b)
Figura 5.3: Datos bdmy estimadores de
densidad y diagramas de cajas antes de
normalizacin utilizando Wickham and
Chang [2016, ggplot2].
datos de microarrays 119
library(limma)
bdmy.n = normalizeBetweenArrays(exprs(bdmy))
bdmy.norm = bdmy
exprs(bdmy.norm) = bdmy.n
head(pData(bdmy))
df = data.frame(gene = featureNames(bdmy.norm),exprs(bdmy.norm))
df1 = melt(df,id=c("gene"))
ggplot(df1,aes(x=value,colour=variable,group=variable)) +
geom_density(kernel = "epanechnikov",fill=NA)+ xlim(0,8)
ggplot(df1,aes(x=variable,y = value)) + geom_boxplot() + ylim(0,8) + coord_flip()
library(ALL)
(a) (b)
Figura 5.4: Datos bdmy.norm estimado-
res de densidad y diagramas de cajas
antes de normalizacin.
ALL
exprs(ALL)
pData(ALL)
annotation(ALL)
## [1] "hgu95av2"
names(pData(ALL))
ALL$BT
## [1] B2 B2 B4 B1 B2 B1 B1 B1 B2 B2 B3 B3 B3 B2 B3
## [16] B B2 B3 B2 B3 B2 B2 B2 B1 B1 B2 B1 B2 B1 B2
## [31] B B B2 B2 B2 B1 B2 B2 B2 B2 B2 B4 B4 B2 B2
## [46] B2 B4 B2 B1 B2 B2 B3 B4 B3 B3 B3 B4 B3 B3 B1
## [61] B1 B1 B1 B3 B3 B3 B3 B3 B3 B3 B3 B1 B3 B1 B4
## [76] B2 B2 B1 B3 B4 B4 B2 B2 B3 B4 B4 B4 B1 B2 B2
## [91] B2 B1 B2 B B T T3 T2 T2 T3 T2 T T4 T2 T3
## [106] T3 T T2 T3 T2 T2 T2 T1 T4 T T2 T3 T2 T2 T2
## [121] T2 T3 T3 T3 T2 T3 T2 T
## Levels: B B1 B2 B3 B4 T T1 T2 T3 T4
ALL[,selcol]
5.9 GSE21779
library(GEOquery)
gcel = getGEOSuppFiles("GSE21779")
Descomprimimos.
library(affy)
gse21779 = ReadAffy()
save(gse21779,file = "gse21779.rda")
save(gse21779,file=paste(dirTamiData,"gse21779.rda",sep=""))
library(ArrayExpress)
geod21779 = ArrayExpress("E-GEOD-21779")
geod21779.rma = rma(geod21779)
save(geod21779.rma,file=paste(dirTamiData,"geod21779.rma.rda",sep=""))
5.10 GSE1397
12 El sndrome de Down es una enfermedad causada por la apa- 12
El uso de estos datos y parte del
anlisis aparecen en un documento que
ricin de un copia extra total o parcial del cromosoma 21. Analiza-
se puede encontrar en esta direccin.
remos si los genes de este cromosoma muestra una sobre expresin. Tambin he utilizado parte del anlisis
Adems se ver que solamente es especfica de estos genes y no de que propone Rodrigo Santamara.
pacman::p_load("Biobase","GEOquery")
gse1397raw = getGEO("GSE1397")[[1]]
annotation(gse1397raw) = "hgu133a"
Los datos fenotpicos de las muestras los podemos ver con (no
mostramos)
pData(gse1397raw)
varLabels(gse1397raw)
head(pData(gse1397raw)[,"title"])
exprs(gse1397raw)
(ts21=c(grep("T.*21.*cerebrum", as.character(pData(gse1397raw)[,"title"])),
grep("TS21.*cerebellum", as.character(pData(gse1397raw)[,"title"]))))
(eu=c(grep("Euploid.*cerebrum)", as.character(pData(gse1397raw)[,"title"])),
grep("Euploid.*[Cc]erebellum", as.character(pData(gse1397raw)[,"title"]))))
pData(gse1397raw)[eu,"title"]
pData(gse1397raw)[ts21,"title"]
gse1397raw = gse1397raw[,c(eu,ts21)]
tissue = factor(rep(c(1,2,1,2),c(4,3,4,3)),levels=1:2,
labels=c("Cerebrum","Cerebellum"))
type = factor(c(rep(1,7),rep(2,7)),levels=1:2,labels=c("Euploid","TS21"))
GROUP = as.numeric(type) - 1
pData(gse1397raw) = data.frame(tissue,type)
save(gse1397raw,file="gse1397raw.rda")
13
Vamos a mostrar los estimadores kernel de la densidad en su 13
El anlisis que acabamos de ver
escala original. Primero cargamos el paquete Bolstad [2015, affyPLM] desde bajar los datos hasta obtener el
ExpressionSet lo podemos encontrar en
que, entre otras cosas, nos permite obtener estos estimadores con http://www.uv.es/ayala/docencia/
facilidad. tami/Rmd/gse1397.html.
library(affyPLM)
library(limma)
gse1397 = gse1397raw
exprs(gse1397) = normalizeBetweenArrays(exprs(gse1397raw))
df = data.frame(gene = featureNames(gse1397),exprs(gse1397))
df1 = melt(df,id=c("gene"))
ggplot(df1,aes(x=value,colour=variable,group=variable)) +
geom_density(kernel = "epanechnikov",fill=NA) + xlim(0,1000)
14
Los autores introdujeron informacin adicional sobre las filas
(genes) que podemos ver (no lo mostramos) con
fData(gse1397raw)
Figura 5.5: Estimadores de las den-
sidades de las distintas muestras de
Es un data.frame que contiene las siguientes variables sobre los GSE1397 normalizadas.
genes. 14
En http://www.uv.es/ayala/
docencia/tami/Rmd/gse1397.html
names(fData(gse1397raw)) tenemos un script que reproduce los
pasos anteriores.
## [1] "ID"
## [2] "GB_ACC"
## [3] "SPOT_ID"
## [4] "Species Scientific Name"
## [5] "Annotation Date"
## [6] "Sequence Type"
## [7] "Sequence Source"
## [8] "Target Description"
## [9] "Representative Public ID"
## [10] "Gene Title"
## [11] "Gene Symbol"
datos de microarrays 127
## [12] "ENTREZ_GENE_ID"
## [13] "RefSeq Transcript ID"
## [14] "Gene Ontology Biological Process"
## [15] "Gene Ontology Cellular Component"
## [16] "Gene Ontology Molecular Function"
los datos para pasar de los datos a nivel de sonda a datos de expre-
sin se realiz utilizando el mtodo GC-RMA (en concreto utilizaron
la funcin gcrma::gcrma del paquete Wu and with contributions from
James MacDonald Jeff Gentry [2015, gcrma].
La plataforma GEO16 es GPL570 que es su cdigo para Affymetrix 16
El cdigo que le dan en GEO a este
Human Genome U133 Plus 2.0 Array. Empezamos cargando paque- chip.
tes necesarios.
pacman::p_load("Biobase","GEOquery")
gcel = getGEOSuppFiles("GSE20986")
setwd("GSE20986/")
Adems nos ha bajado un fichero tar del cual hemos de extraer los
distintos ficheros CEL. En Linux lo haremos con17 17
En Windows podemos usar el Winrar.
gse20986raw = affy::ReadAffy()
save(gse20986raw,file="gse20986raw.rda")
pacman::p_load("gcrma","hgu133plus2probe")
gse20986 = gcrma::gcrma(gse20986raw)
data(gse20986raw,package="tamidata")
html.
5.12 GSE34764
library(GEOquery)
getGEOSuppFiles("GSE34764")
setwd("GSE30129/")
Para leer los datos vamos a utilizar el paquete Carvalho and Iri-
zarry [2016, oligo].
library(oligo)
celFiles = list.celfiles()
gse34774 = read.celfiles(celFiles)
save(gse34774,file="gse34774.rda")
5.13 GEOmetadb
5.14 ArrayExpress
5.15 Varios
data(gse1397,package="tamidata")
write.exprs(gse1397,file="gse1397.txt")
Y luego podemos abrir este fichero con Calc22 o con nuestra apli- 22
La versin libre de Excel que tenemos
cacin preferida. en LibreOffice.
pacman::p_load("EnrichmentBrowser")
data(gse1397,package="tamidata")
head(fData(gse1397),n=1)
## ID GB_ACC SPOT_ID
## 1007_s_at 1007_s_at U48705 <NA>
## Species Scientific Name Annotation Date
## 1007_s_at Homo sapiens Jun 9, 2011
## Sequence Type
## 1007_s_at Exemplar sequence
## Sequence Source
## 1007_s_at Affymetrix Proprietary Database
## Target Descripti
## 1007_s_at U48705 /FEATURE=mRNA /DEFINITION=HSU48705 Human receptor tyrosine kinase DDR gene, complete c
## Representative Public ID
## 1007_s_at U48705
datos de microarrays 131
## Gene Title
## 1007_s_at discoidin domain receptor tyrosine kinase 1
## Gene Symbol ENTREZ_GENE_ID
## 1007_s_at DDR1 780
## RefSeq Transcript ID
## 1007_s_at NM_001954 /// NM_013993 /// NM_013994
##
## 1007_s_at 0001558 // regulation of cell growth // inferred from electronic annotation /// 0001952 // re
##
## 1007_s_at 0005576 // extracellular region // inferred from electronic annotation /// 0005886 // plasma
##
## 1007_s_at 0000166 // nucleotide binding // inferred from electronic annotation /// 0004672 // protein k
View(fData(gse1397))
5.17 Ejercicios
Ej. 3 Se pide construir un ExpressionSet. Este ExpressionSet ha de
tener la siguiente matriz de expresin.
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21.54 20.78 23.86 24.39 23.77
## [2,] 22.53 22.60 23.45 25.21 23.42
## [3,] 23.60 22.92 21.94 24.30 24.72
## [4,] 22.93 21.61 23.97 22.99 22.92
## [5,] 24.91 24.05 22.04 23.17 21.61
## [6,] 24.25 22.70 21.44 22.90 22.53
## [7,] 22.48 22.06 23.72 23.66 21.63
## [8,] 20.89 22.84 24.50 23.59 21.79
## [9,] 21.59 24.18 23.32 22.37 23.17
## [10,] 21.73 22.07 23.25 23.47 24.23
## [11,] 21.42 24.76 22.89 23.20 23.74
## [12,] 23.69 23.23 22.16 23.79 22.73
## [13,] 22.19 23.93 23.92 22.23 20.53
## [14,] 23.27 22.01 21.85 21.89 20.04
## [15,] 23.22 25.33 22.79 24.03 22.28
## [16,] 24.64 21.48 23.92 22.31 25.05
## [17,] 21.59 22.02 23.37 22.67 22.85
## [18,] 23.95 20.39 23.46 23.83 24.28
## [19,] 23.95 24.81 22.68 22.89 25.82
## [20,] 22.62 24.18 22.12 22.73 23.85
6.1 Introduccin
1. Diseo experimental.
7.1 Introduccin
3. Cmo bajarlos?
7.2 Repositorios
DDBJ http://www.ddbj.nig.ac.jp
Utilizando ShortRead
Para trabajar con el formato FASTQ es til el paquete Morgan
et al. [2015b, ShortRead].
library(ShortRead)
fqsample = FastqSampler("SRR1293399_1.fastq",10000)
fq0 = yield(fqsample)
class(fq0)
## [1] "ShortReadQ"
## attr(,"package")
## [1] "ShortRead"
fq0
## class: ShortReadQ
## length: 10000 reads; width: 50 cycles
fq0[1]
## class: ShortReadQ
## length: 1 reads; width: 50 cycles
fq0[3:10]
## class: ShortReadQ
## length: 8 reads; width: 50 cycles
sread(fq0[1000])
sread(fq0)
width(fq0)
quality(fq0[1000])
## class: SFastqQuality
## quality:
## A BStringSet instance of length 1
## width seq
## [1] 50 ffffffffffffffffeff...fffeffefffff`ddbdd
encoding(quality(fq0))
## ; < = > ? @ A B C D E F G H I J
## -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10
## K L M N O P Q R S T U V W X Y Z
## 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
## [ \\ ] ^ _ ` a b c d e f g h i
## 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
fls = dir(paste(dirTamiData,"SRP042140/fastq",sep=""),"*fastq$",full=TRUE)
pblico.
evaluadas no tienen sentido.
Podemos ver la informacin contenida en SRP042140.qa con
show(SRP042140_1.qa)
## class: FastqQA(10)
## QA elements (access with qa[["elt"]]):
## readCounts: data.frame(1 3)
## baseCalls: data.frame(1 5)
142 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## readQualityScore: data.frame(512 4)
## baseQuality: data.frame(94 3)
## alignQuality: data.frame(1 3)
## frequentSequences: data.frame(50 4)
## sequenceDistribution: data.frame(357 4)
## perCycle: list(2)
## baseCall: data.frame(249 4)
## quality: data.frame(1800 5)
## perTile: list(2)
## readCounts: data.frame(0 4)
## medianReadQualityScore: data.frame(0 4)
## adapterContamination: data.frame(1 1)
SRP042140_1.qa[["readCounts"]]
SRP042140_1.qa[["baseCalls"]]
## A C G
_
## SRR1293399 1.fastq 10600637 12762822 12873094
## T N
_
## SRR1293399 1.fastq 13753938 9509
head(SRP042140_1.qa[["frequentSequences"]])
## sequence
## 1 GTGTCAGTCACTTCCAGCGGTCGTATGCCGTCTTCTGCTTGAAAAAAAAA
## 2 TAGCTTATCAGACTGATGTTGACGTGTCAGTCACTTCCAGCGGTCGTATG
## 3 TGTAAACATCCCCGACTGGAAGCGTGTCAGTCACTTCCAGCGGTCGTATG
## 4 AACTGGCCCTCAAAGTCCCGCTGTGTCAGTCACTTCCAGCGGTCGTATGC
## 5 TGTCAGTCACTTCCAGCGGTCGTATGCCGTCTTCTGCTTGAAAAAAAAAA
## 6 TGTAAACATCCCCGACTGGAAGCTGTGTCAGTCACTTCCAGCGGTCGTAT
## count type lane
## 1 94635 read SRR1293399_1.fastq
## 2 55085 read SRR1293399_1.fastq
## 3 37265 read SRR1293399_1.fastq
## 4 28687 read SRR1293399_1.fastq
## 5 18234 read SRR1293399_1.fastq
## 6 13152 read SRR1293399_1.fastq
datos de rnaseq 143
head(SRP042140_1.qa[["perCycle"]]$baseCall,n=10)
head(SRP042140_1.qa[["perCycle"]]$quality,n=10)
7.5 SRAdb
12
Vamos a ver cmo podemos buscar y bajar datos de secuencias 12
En esta seccin seguimos Zhu et al.
con el paquete Zhu and Davis [2015, SRAdb]. Por defecto trabaja [2013] as como la vieta de Zhu and
Davis [2015, SRAdb] y Sinha [2014, pg.
con NCBI SRA aunque tambin podemos utilizarlo para bajar datos 235].
de EBI ENA En la bsqueda que vamos a hacer consideraremos
datos que tengan que con cancer de mama y y en particular con
la actividad de los microRNA en este tipo de cncer. Cargamos el
paquete.
library(SRAdb)
144 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
Veamos cmo utilizarlo para bajar datos de SRA. Al ser una ba-
se de datos que se actualiza permanentemente hemos de bajar el
fichero fichero SRAdb SQLite de SRA. Lo hacemos con la funcin
SRAdb::getSRAdbFile. Fijamos el nombre del fichero local (por defec-
to, SRAmetadb.sqlite)
sqlfile = "SRAmetadb.sqlite"
SRAdb::dbDisconnect.
sraCon = dbConnect(SQLite(),sqlFile)
(sraTables = dbListTables(sraCon))
dbListFields(sraCon,"experiment")
## [1] "experiment_ID"
## [2] "bamFile"
## [3] "fastqFTP"
## [4] "experiment_alias"
## [5] "experiment_accession"
## [6] "broker_name"
## [7] "center_name"
## [8] "title"
## [9] "study_name"
## [10] "study_accession"
## [11] "design_description"
## [12] "sample_name"
## [13] "sample_accession"
datos de rnaseq 145
## [14] "sample_member"
## [15] "library_name"
## [16] "library_strategy"
## [17] "library_source"
## [18] "library_selection"
## [19] "library_layout"
## [20] "targeted_loci"
## [21] "library_construction_protocol"
## [22] "spot_length"
## [23] "adapter_spec"
## [24] "read_spec"
## [25] "platform"
## [26] "instrument_model"
## [27] "platform_parameters"
## [28] "sequence_space"
## [29] "base_caller"
## [30] "quality_scorer"
## [31] "number_of_levels"
## [32] "multiplier"
## [33] "qtype"
## [34] "sra_link"
## [35] "experiment_url_link"
## [36] "xref_link"
## [37] "experiment_entrez_link"
## [38] "ddbj_link"
## [39] "ena_link"
## [40] "experiment_attribute"
## [41] "submission_accession"
## [42] "sradb_updated"
dbGetQuery(sraCon,'PRAGMA TABLE_INFO(experiment)')
study.
class(busqueda)
## [1] "data.frame"
El nmero de registros es
dim(busqueda)
## [1] 12089 23
names(busqueda)
## [1] 186 66
unique(busqueda[,"study"])
table(busqueda[,"study"])
##
## DRP002326 DRP002330 DRP002835 ERP002221 ERP004396
## 4 32 2 6 4
## ERP004399 ERP013303 SRP011278 SRP013022 SRP014142
## 4 8 6 4 15
## SRP016507 SRP017190 SRP018427 SRP022047 SRP023533
## 2 4 6 10 8
## SRP033584 SRP034635 SRP036035 SRP042140 SRP045204
## 1 6 6 9 4
## SRP051374 SRP060224 SRP062974
## 2 4 39
busqueda[busqueda[,"study"] == "SRP042140","sample"]
Los bajamos.
rs[1,]
listSRAfile(muestras,sraCon,fileType = 'sra')
dirTamiActual = getwd()
setwd(dirTamiData) ##Fijamos dnde queremos los datos
getSRAfile( muestras, sraCon, fileType='sra')
setwd(dirTamiActual)
SRR1293399
SRR1293400
SRR1293401
SRR1293402
SRR1293403
datos de rnaseq 149
SRR1293404
SRR1293405
SRR1293406
SRR1293407
1. Instalamos STAR.
library(Rsamtools)
dirActualData = paste(dirTamiData,"SRP042140_sra/",sep="")
sampleTable = read.table(paste(dirActualData,"bamfiles.txt",sep=""))
fls = paste(dirActualData,"aligned/",sampleTable[,1],sep="")
bamLst = BamFileList(fls, index=character(),yieldSize=100000,obeyQname=TRUE)
library(GenomicFeatures)
gtffile = paste(dirTamiData,
"ENSEMBL.homo_sapiens.release-75/Homo_sapiens.GRCh37.75.gtf",sep="")
fragments=FALSE)
save(SRP042140.counts,
file=paste(dirTamiData,"SRP042140_sra/","SRP042140.counts.rda"),sep="")
7.9 Bowtie2
26 26
http://bowtie-bio.sourceforge.
net/bowtie2/manual.shtml
Es una herramienta software para alinear lecturas cortas sobre
secuencias de referencia largas. Soporta distintos modos de alinea-
miento: con huecos27 , locales y con lecturas apareadas28 . La salida 27
gapped
del programa la realiza en formato SAM. 28
Paired-end
El programa bowtie2 utiliza un fichero de ndices de clase Bow-
tie 2 y ficheros con lecturas secuenciadas y produce un fichero en
formato SAM.
Qu es alinear? Tomamos una lectura o secuencia corta y preten-
demos encontrar en una secuencia larga donde es ms similar, en que
punto hay una mayor similitud respecto de la secuencia larga o de
referencia. Cul es el resultado que obtenemos despus de alinear?
La secuencia corta es colocada sobre una parte de la secuencia de
referencia indicando en qu puntos se produce una correspondencia
e indicando los huecos29 que se han tenido que introducir en una 29
Gaps.
u otra de las secuencias para conseguir la mejor correspondencia
posible entre dichas secuencias.
Read: GACTGGGCGATCTCGACTTCG
||||| |||||||||| |||
Reference: GACTG--CGATCTCGACATCG
b o w t i e 2 x ~ /DOCENCIA/ tami d a t a / H o m o _ s a p i e n s /
, Ensembl / GRCh37 / S e q u e n c e / B o w t i e 2 I n d e x / genome
, U f a s t q / SRR1293399_1 . f a s t q S a l i g n e d /
, SRR1293399_1 . sam
154 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
gzip d Homo_sapiens_Ensembl_GRCh37 . t a r . gz
4. Alineamos con
t o p h a t 2 o f i l e _ t o p h a t _ o u t genome SRR479053_1 .
, f a s t q SRR479053_2 . f a s t q
samtools s o r t n f i l e _ t o p h a t _ o u t / a c c e p t e d _ h i t s .
, bam_sorted
gzip d Homo_sapiens_Ensembl_GRCh37 . t a r . gz
Alineamos.
t o p h a t 2 o f i l e _ t o p h a t _ o u t genome SRR479053_1 . f a s t q
, SRR479053_2 . f a s t q
samtools s o r t n f i l e _ t o p h a t _ o u t / a c c e p t e d _ h i t s .
, bam_sorted
load("maqc_eset.RData")
library(Biobase)
pData(maqc.eset)[,"tissue"]
data(parathyroidGenesSE,package="parathyroidSE")
se = parathyroidGenesSE
class(se)
## [1] "RangedSummarizedExperiment"
## attr(,"package")
## [1] "SummarizedExperiment"
Es un SummarizedExperiment::RangedSummarizedExperiment
y ser nuestra clase de referencia cuando trabajamos con datos de
RNASeq.34 Cuntos genes y muestras tenemos? 34
Es muy conveniente leer la vieta de
Morgan et al. [2016, SummarizedExpe-
riment].
dim(se)
## [1] 63193 27
Veamos las tres primeras filas (genes) y las tres primeras columnas
(muestras).
156 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
assay(se)[1:3,1:3]
colData(se)
Es un IRanges::DataFrame.
class(colData(se))
## [1] "DataFrame"
## attr(,"package")
## [1] "IRanges"
names(colData(se))
colData(se)[,"treatment"]
colData(se)$treatment
rowRanges(se)
rownames(se)
head(rownames(se))
37 37
En esta seccin hemos visto cmo
manejar un la clase GenomicRan-
ges::SummarizedExperiment y sus
7.13 GSE64099 mtodos asociados.
Construimos un ExpressionSet.
library(Biobase)
exprs0 = CountAll
rownames(exprs0) = EntrezAll
colnames(exprs0) = c("GSM1564328","GSM1564331","GSM1564329","GSM1564332",
"GSM1564327","GSM1564330","GSM1564333")
type = c(2,1,2,1,1,2,2)
type = factor(type,levels=1:2,labels=c("Wild-type","Smchd1"))
type = data.frame(type)
rownames(type) = colnames(exprs0)
158 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
nullsum = apply(exprs(gse64099),1,sum)==0
gse64099 = gse64099[!nullsum,]
x = read.table(file="GSE63776_PANC1_counts.txt",header=TRUE)
exprs0 = as.matrix(x[,-1])
rownames(exprs0) = x[,"Gene"]
type = factor(rep(1:2,each=3),levels=1:2,labels=c("siControl","siTCF7L2"))
pd0 = data.frame(type)
rownames(pd0) = colnames(exprs0)
datosfenotipo = new("AnnotatedDataFrame", data = pd0)
datosexperimento = new('MIAME',name='GSE63776',
lab='Seth Frietze and Farnham P',
contact ='seth.frietze@unco.edu',
title = ' ',abstract = 'We have compared the genome-wide effects on the
transcriptome after treatment with ICG-001 (the specific CBP inhibitor)
versus C646, a compound that competes with acetyl-coA for the Lys-coA
binding pocket of both CBP and p300. We found that both drugs cause
large-scale changes in the transcriptome of HCT116 colon cancer cells and
PANC1 pancreatic cancer cells, and reverse some tumor-specific changes in
gene expression. Interestingly, although the epigenetic inhibitors affect
cell cycle pathways in both the colon and pancreatic cancer cell lines,
the WNT signaling pathway was affected only in the colon cancer cells.
Notably, WNT target genes were similarly down-regulated after treatment
of HCT116 with C646 as with ICG-001.',
url = 'http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE63776',
other = list(notes = 'Public on Jan 07, 2015'))
gse63776 = new("ExpressionSet",exprs=exprs0,phenoData = datosfenotipo,
experimentData = datosexperimento,annotation =
"Illumina HiSeq 2000 (Homo sapiens)")
save(gse63776,file="gse63776.rda")
X1 X2
.
cN1 L + cN2 L
cN L cN2 L
= 1 L.
cN1 L + cN2 L
cN L cN2 L
= 1 L.
cN1 L + cN2 L
(r ) xij /m j
Mij = log2 = log2 ( xij /m j ) log2 ( xir /mr ),
xir /mr
y
(r ) 1
Aij = log2 ( xij /m j ) + log2 ( xir /mr )
2
(r )
Se eliminan los valores extremos tanto de los Mij como de los
(r )
Aij .46 En concreto eliminamos un porcentaje de los Mi ms peque- Recordemos que vara solamente i y
46
109 C
RPKM = . (7.4)
NL
Esta cuantificacin de la expresin del gen nos permite comparar
genes entre s dentro de una misma muestra o librera.
7.16.1 SRP064411
49 En esta seccin vamos a obtener los datos, mapear las lecturas, 49
Todo el anlisis incluido en
contar y finalmente normalizar los conteos para los datos SRP064411. esta seccin lo tenemos http:
//www.uv.es/ayala/docencia/tami/
La descripcin la podemos encontrar en http://www.ncbi.nlm.nih. org/SRP064411.html y podemos re-
gov/geo/query/acc.cgi?acc=GSE73681. producirlo ejecutando el cdigo como
se indica all. No se puede reproducir
1. Los datos los podemos bajar de ftp://ftp-trace.ncbi.nlm. exclusivamente con el material de esta
seccin.
nih.gov/sra/sra-instant/reads/ByStudy/sra/SRP%2FSRP064%
2FSRP064411/. Tambin los podemos bajar de http://www.ebi.ac.
uk/arrayexpress/experiments/E-GEOD-73681/?page=1&pagesize=
500.
f a s t q dump I s p l i t f i l e s SRR2549634 . s r a
gzip d Saccharomyces_cerevisiae_Ensembl_R64 1 1.
, t a r . gz
t a r xvf Saccharomyces_cerevisiae_Ensembl_R64 1 1.
, t a r
bowtie2 x d i r I n d i c e U SRR2549634_1 . f a s t q S
, SRR2549634_1 . sam
library(Rsamtools)
library(GenomicFeatures)
sampleTable = read.table("bamfiles.txt")
dirActualData = "/home/gag/DOCENCIA/tami-data/SRP064411/sra/"
fls = paste(dirActualData,sampleTable[,1],sep="")
bamLst = BamFileList(fls, index=character(),yieldSize=100000,obeyQname=TRUE)
gtfFile = "~/DOCENCIA/tami-data/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf"
txdb = makeTxDbFromGFF(gtffile, format="gtf")
genes = exonsBy(txdb, by="gene")
datos de rnaseq 165
library(GenomicAlignments)
SRP064411_SE = summarizeOverlaps(features = genes, read=bamLst,
mode="Union",
singleEnd=TRUE, ## No son lecturas apareadas
ignore.strand=TRUE,
fragments=FALSE)
10. Tenemos que aadir los metadatos o datos fenotpicos. Son los
siguientes donde lo que aparece en la primera columna es el nom-
bre que tiene la muestra en nuestro SummarizedExperiment, los
colnames.
SampleName = c("GSM1900735","GSM1900737","GSM1900739","GSM1900736",
"GSM1900738","GSM1900740")
Run = c("SRR2549634","SRR2549636","SRR2549638","SRR2549635",
"SRR2549637","SRR2549639")
Treatment = factor(c(0,0,1,0,1,1),levels=0:1,labels=c("wild-type","sec66del"))
Rep = c(1,3,2,2,1,3)
colData(SRP064411_SE) = DataFrame(SampleName,Run,Treatment,Rep)
save(SRP064411_SE,file="SRP064411_SE.rda")
7.17 Cufflinks
Expresin diferencial
8
Expresin diferencial marginal
8.1 Introduccin
N xij n xij
x j = N
; xi = n
.
i =1 j =1
{i : i = 1, . . . , N; ui q p1 (u); vi q p2 (v)},
library(Biobase)
library(ALL)
data(ALL)
bcell = grep("^B",as.character(ALL$BT))
types = c("NEG","BCR/ABL")
moltyp = which(as.character(ALL$mol.biol) %in% types)
bcrneg = ALL[,intersect(bcell,moltyp)]
bcrneg.iqr = apply(exprs(bcrneg),1,IQR)
bcrneg.median = apply(exprs(bcrneg),1,median)
sel.median = (bcrneg.median > quantile(bcrneg.median,0.5))
bcrneg.sd = apply(exprs(bcrneg),1,sd)
sel.sd = (bcrneg.sd > quantile(bcrneg.sd,0.5))
bcrneg.mean = apply(exprs(bcrneg),1,mean)
sel.mean = (bcrneg.mean > quantile(bcrneg.mean,0.5))
bcrneg2 = bcrneg[sel.sd & sel.mean,]
k sobre A
Otra opcin natural sera fijar un nivel de actividad mnima para
un gen y quedarnos con aquellos que superen este nivel mnimo de
actividad. Consideremos el siguiente criterio: si el nivel de expresin
expresin diferencial marginal 173
quantile(exprs(bcrneg))
c = 5.468801
overc[433,]
count.c = apply(overc,1,sum)
head(count.c)
table(sel.c)
## sel.c
## FALSE TRUE
## 4736 7889
library(Biobase)
library(genefilter)
f1 = kOverA(5, 5.468801)
ffun = filterfun(f1)
wh1 = genefilter(exprs(bcrneg), ffun)
table(wh1)
## wh1
## FALSE TRUE
## 4736 7889
expresin diferencial marginal 175
f1 = kOverA(5, 200)
f2 = sdOverc(150)
f3 = iqrOverc(72)
ffun = filterfun(f1,f2,f3)
wh123 = genefilter(exprs(bcrneg), ffun)
table(wh123)
## wh123
## FALSE
## 12625
## [1] "hgu95av2"
library(hgu95av2.db)
bcrneg.filt2 = nsFilter(bcrneg,var.func=sd,var.cutoff=0.5,
require.GOBP=TRUE)
sel = intersect(featureNames(bcrneg.filt1),
featureNames(bcrneg.filt2))
bcrneg1 = bcrneg[sel,]
8.4 Fold-change
10 Queremos comparar dos grupos. Denotamos los valores de 10
Lo que comentamos en esta seccin
expresin originales con xij (respectivamente yij ) para la i-sima ca- me ha costado de entender una en-
fermedad. Lo primero el porqu de
racterstica en la j-sima muestra del primer grupo (respectivamente utilizarlo y luego que hay una inde-
del segundo grupo). A los logaritmos (en base 2 o log2) de los valores finicin en el trmino en la literatura.
Vamos a intentar aclarar qu signifi-
originales los denotamos por uij = log2 ( xij ) y vij = log2 (yij ). Para ca- ca antes de que se me olvide. Porque
da gen, tendremos una expresin media para la i-sima caracterstica mucho inters en usarlo no tengo.
n x
en cada uno de los dos grupos xi = j=1 1 nij para la media en el pri-
1
mer grupo. Similarmente definimos yi , ui , vi . Qu se entiende por
fold-change? Dos son las interpretaciones de este valor. La primera
(Tusher et al. [2001]) lo define como
(1) xi
FCi = . (8.1)
yi
literatura de microarrays consiste en tomar el log2 del fold-change en no vamos a considerar en este manual.
y se sigue que
xi
2c .
yi
x1
Si log2 x2 < c entonces tendremos que
xi
2c ,
yi
178 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
o bien que
yi
2c .
xi
En este segundo caso el gen i se sobre expresa en el grupo 2 en re-
lacin con el primer grupo. El trmino que se utiliza es sobre regu-
lacin en el primer caso y de infra regulacin en el segundo.12 Se 12
Up (down) regulation.
utiliza con mucha frecuencia. Es sencillo, entendible y fcil de usar.
Pero no es una buena opcin. Lo fundamental, no se tiene en cuenta la
variabilidad de las medias que estamos comparando. Una opcin ms
correcta la vemos posteriormente en este tema y es la utilizacin de
un test de la t para comparar las medias de las dos poblaciones que
estamos comparando. O versiones modificadas del t-test clsico co-
mo la propuestas en Tusher et al. [2001] o en Smyth [2004] en donde
esencialmente se modifica la estimacin del error estndar.
data(golub,package="multtest")
golub.cl
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [24] 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
golub.cl = factor(golub.cl,levels=0:1,labels=c("ALL","AML"))
## [1] ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL
## [12] ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL
## [23] ALL ALL ALL ALL ALL AML AML AML AML AML AML
## [34] AML AML AML AML AML
## Levels: ALL AML
grep('Gdf5',golub.gnames[,2])
## [1] 2058
xGdf5 = golub[2058,]
boxplot(xGdf5 ~ golub.cl)
## [1] 1042
(a) (b)
xCCND3 = golub[1042,]
library(genefilter)
tt = rowttests(golub,golub.cl)
head(tt)
## statistic dm p.value
## 1 -2.5021067 -0.49226310 0.01702767
## 2 -1.1561671 -0.21787189 0.25522811
## 3 0.1099865 0.01993869 0.91303095
## 4 0.2726576 0.16946771 0.78667437
## 5 1.1866275 0.72659579 0.24314666
## 6 1.0922403 0.62997545 0.28198332
##
## FALSE TRUE
## 2006 1045
Con GeneSelector::RankingTstat
Vamos a obtener todos los t-tests con GeneSelector::RankingTstat.
pacman::p_load(GeneSelector)
data(golub,package="multtest")
ordT = RankingTstat(golub, golub.cl, type="unpaired")
class(ordT)
## [1] "GeneRanking"
## attr(,"package")
## [1] "GeneSelector"
Los Slots que contiene esta clase GeneRanking son los siguientes.
getSlots("GeneRanking")
## x y statistic ranking
## "matrix" "factor" "numeric" "numeric"
## pval type method
## "vector" "character" "character"
show(ordT)
## Ranking by ordinaryT,
## number of genes: 3051.
toplist(ordT)
Yi N (i , 2 ),
H0 : 1 = . . . = I , (8.3)
H1 : Existe i 6= j i 6= j . (8.4)
I
SS( Entre) = ni (yi y )2
i =1
SS( Entre)/( I 1)
F=
SS( Intra)/(n I )
Bajo la hiptesis nula de que todas las medias son la misma (y puesto que
asumimos una misma varianza) tendramos una distribucin comn
bajo todas las condiciones. Asumiendo la hiptesis nula el estadstico
F se distribuye como un F con I-1 y n-I grados de libertad,
F FI 1,n I .
data(gse20986,package="tamidata")
y = exprs(gse20986)[678,]
summary(aov(y ~ pData(gse20986)[,"tissue"]))
## Df Sum Sq Mean Sq
## pData(gse20986)[, "tissue"] 3 0.00531 0.001770
## Residuals 8 0.02022 0.002527
## F value Pr(>F)
## pData(gse20986)[, "tissue"] 0.7 0.578
## Residuals
library(multtest)
library(genefilter)
186 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
gse20986.aov =
rowFtests(gse20986, pData(gse20986)[,"tissue"])
head(gse20986.aov,n=2)
## statistic p.value
## 1007_s_at 9.778743 0.004720765
## 1053_at 14.134099 0.001459233
pacman::p_load(EnrichmentBrowser)
data(gse1397,package="tamidata") ## Leemos datos
eset = gse1397 ## Copiamos en eset
rm(gse1397) ## Ahorramos memoria
eset = probe.2.gene.eset(eset)
eset = de.ana(eset)
head(fData(eset))
## FC ADJ.PVAL limma.STAT
## 780 125.556888 0.9966808 0.8050639
## 5982 -8.444388 0.9966808 -0.7662723
## 3310 -45.025510 0.9966808 -1.5237154
## 7849 2.676276 0.9966808 0.2899802
## 2978 -5.051531 0.9966808 -0.3912285
## 7318 -17.124490 0.9966808 -2.7798388
8.11 Ejercicios
Ej. 7 Con los datos multtest::golub y utilizando las funciones
base::apply, stats::sd, stats::IQR se pide:
1.Determinar para cada gen (esto es, las expresiones de una fila
dada) el rango intercuartlico.
2.Una vez hemos calculado el rango intercuartlico para gen calcular
el percentil de orden 0.50 (o mediana).
3.Determinar las filas correspondientes a los genes cuyo rango inter-
cuartlico supera el percentil que hemos calculado en el apartado
anterior.
4.Determinar aquellas filas donde al menos 10 muestras de las 38
superan una expresin de 0.
5.Seleccionar en la matriz de expresin golub las filas que verifican
los criterios dados en los puntos 3 y 4.
Hiptesis nula No rechazadas Rechazadas Total Tabla 9.1: Errores tipo I y II en contraste
de mltiples hiptesis
Verdadera U V N0
Falsa T S N N0 = N1
Total N-R R N
En esta tabla conocemos N, esto es, el nmero de contrastes de
hiptesis. Una vez hemos realizado todos los contrastes y tomado
una decisin sobre si rechazamos o no cada hiptesis nula podemos
observar R que nos indica cuntas hiptesis nulas hemos rechazado.
Obviamente R es una variable aleatoria. Distintos datos nos darn
distintos valores de R. Los valores de S, T, U, V son tambin alea-
torios. Sin embargo, estas variables no son observables. La variable
aleatoria V nos est dando el nmero (desconocido) de falsos positi-
vos o errores tipo I (no hay expresin diferencial pero decidimos que
la hay de un modo errneo) mientras que T nos da el nmero de fal-
sos negativos o error tipo II (genes que se expresan diferencialmente
pero no admitimos que no lo hacen). Ambas variables indican error y
son importantes.
Cuando realizamos un solo contraste el procedimiento consiste en
fijar una cota al error tipo I, el nivel de significacin, con un valor de-
terminado que solemos denotar por . Supongamos que denotamos
por pi el p-valor asociado al i-simo contraste. Entonces si aplicamos
la regla de rechazar Hi cuando pi y en otro caso aceptarla (o no
rechazarla como se prefiera). Con este procedimiento sabemos que
tenemos controlado el error tipo I para el contraste i-simo a un ni-
vel . Pero, y esto es fundamental, solamente para el ese contraste.
No sabemos nada de lo que ocurre simultneamente para todos los
contrastes. Supongamos que tenemos un estadstico Ti que utilizamos
para contrastar Hi y supongamos adems que rechazamos la hip-
tesis nula para valores grandes de | Ti |2 En este caso tendremos un 2
Una situacin as la tenemos cuando
valor c tal que rechazamos la hiptesis Hi cuando {| Ti | > c } y se observamos las muestras bajo dos
condiciones distintas y utilizamos un
tendr que test de la t de comparacin de medias.
P(| Ti | > c | Hi ) = .
Esto es, la probabilidad de rechazar cuando es cierta la hiptesis nula
es . O la probabilidad de no rechazar cuando es cierta la hiptesis
comparaciones mltiples 191
E (V )
PCER = ,
N
es la proporcin esperada de errores tipo I entre las m decisiones
que tomamos.
FWER: Tasa de error global 4 4
Familywise error rate.
Esta medida de error es la que tiene una mayor tradicin en
Estadstica. Quizs es la forma natural de pensar: no quiero equi-
vocarme nunca rechazando una hiptesis nula cuando es cierta. La
definimos como
FWER = P(V 1 | i M0 Hi ),
pi = P(| Ti | ti | Hi ).
m N
j=1 1/j
pri = mn mn prk , 1 .
k =i,...,N k
data(gse1397,package ="tamidata")
eset = gse1397; y = pData(gse1397)[,"type"]
library(genefilter)
tt = rowttests(eset,y)
p0 = tt$p.value
head(p.BH$adjp)
comparaciones mltiples 199
## rawp BH
## [1,] 2.070655e-07 0.002765044
## [2,] 2.481752e-07 0.002765044
## [3,] 1.463473e-06 0.010870191
## [4,] 5.939862e-06 0.033089488
## [5,] 1.101446e-05 0.049087045
## [6,] 3.579137e-05 0.132923185
head(p.BH$index)
p.BH$adjp[p.BH$index == 1,]
## rawp BH
## 0.5478926 0.9901883
o la fila 23
p.BH$adjp[p.BH$index == 23,]
## rawp BH
## 0.3244182 0.9901883
head(p.ajustados$adjp,n=2)
Sin embargo, estos no son los genes que aparecan en las dos pri-
meras filas. Para obtener todos los p-valores en su orden original en
la matriz de expresin podemos hacer
p.ajustados2 = p.ajustados$adjp[order(p.ajustados$index),]
Y los genes que ocupaban las dos primeras filas en la matriz origi-
nal los podemos obtener con
p.ajustados2[1:2,]
round(p.ajustados2[1:2,],digits=3)
alpha = 0.05
p1 = mt.rawp2adjp(p0, "BH")
orden.original = order(p1$index)
p.BH = p1$adjp[orden.original,2]
Cuntos son?
table(significativos.BH$which)
##
## FALSE TRUE
## 22278 5
which(significativos.BH$which)[1:10]
mt.reject(p0, alpha)$r
## [1] 902
mt.reject(p.BH, alpha)$r
## [1] 5
202 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
mt.reject(p0, 0.01)$r
## [1] 183
mt.reject(p.BH, 0.01)$r
## [1] 2
9.9 El q-valor
p (1) . . . p ( N )
Qu es el q-valor?
Posiblemente el mejor modo de entender qu es el q-valor sea
ver un buen procedimiento para estimarlo propuesto en ? e imple-
mentado en el paquete with contributions from Andrew J. Bass et al.
[2015, qvalue]. Fijamos un valor t y consideremos que rechazamos Hi
cuando Pi t.11 Consideremos los siguientes valores 11
Como es habitual denotamos por Pi
el p-valor antes de ser observado, esto
es, el valor aleatorio antes de tomar los
V (t) = |{ Pi : Pi t; Hi es cierta; i = 1, . . . , N }| (9.6)
datos.
comparaciones mltiples 203
y
R(t) = |{ Pi : Pi t; i = 1, . . . , N }| (9.7)
Se puede aproximar la pFDR con
V (t)
E
R(t)
R(t) = |{ pi : pi t}|
P( Pi t| Hi ) = t.
Por tanto
EV (t) = N0 t.
Pero no conocemos N0 nmero de hiptesis nulas ciertas. Lo que
vamos a hacer es estimar la proporcin de hiptesis nulas ciertas
0 = N0 /N (notemos que el total de hiptesis, N, s es conocido).
Bajo Hi , el p-valor aleatorio Pi es uniforme en [0, 1], por tanto los
p-valores correspondientes a hiptesis nulas ciertas se distribuyen
sobre todo el intervalo [0, 1], sin embargo, aquellos p-valores muy
pequeos, muy prximos a cero, es ms probable que correspondan
a hiptesis nulas falsas. Fijamos un valor [0, 1], un estimador
razonable para 0 es
|{ pi : pi > ; i = 1, . . . , N }|
0 = .
N (1 )
\ = 0 Nt
pFDR .
|{ pi : pi t}|
El q-valor asociado a un contraste sera el mnimo valor de pFDR
que se alcanza cuando el contraste es rechazado. Es decir, el q-valor
asociado al test i-simo sera
q( pi ) = mn pFDR(t)
t pi
204 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
y su estimador sera
q( pi ) = mn pFDR
\ ( t ).
t pi
0 = f(1).
5. Calculamos
0 Nt
q( p(m) ) = mn = 0 p( N ) .
t p( N ) |{ pi : pi t}|
6. Para i = N 1, . . . , 1 calculamos
0 Nt 0 N p(i)
q( p(i) ) = mn = mn{ , q( p(i+1) )}.
t p (i ) |{ pi : pi t}| i
Calculando el q-valor
El mtodo de estimacin que hemos visto en 9.9 est implemen-
tado en el paquete with contributions from Andrew J. Bass et al.
[2015, qvalue].12 12
Tambin se pueden bajar programas
Utilizamos los datos tamidata::gse1397. que no requieren R para distintos
sistemas operativos. Se puede encontrar
en http://genomics.princeton.edu/
tt = rowttests(gse1397,pData(gse1397)[,"type"]) storeylab/qvalue/.
pvalue = tt$p.value
library(qvalue)
aa = qvalue(pvalue)
plot(aa)
q.value = qvalue(pvalue)$qvalues
9.10 tami::tm.descrip
library(tamidata)
eset = gse1397
y = pData(gse1397)[,"type"]
1.02
5
significant tests
1.00 4
^ 0()
3
0.98
2
0.96
^ 0 = 0.955
1
0.00 0.25 0.50 0.75 1.00 0.01 0.02 0.03 0.04
qvalue cutoff
expected false positives
0.04 0.20
qvalue
0.03 0.15
0.02 0.10
0.01 0.05
0.00
0e+00 3e06 6e06 9e06 1 2 3 4 5
pvalue significant tests
Figura 9.1:
comparaciones mltiples 207
tm.descrip = function(eset,y){
if(class(eset) != "ExpressionSet") return("eset is not an ExpressionSet \n")
if(!is.factor(y) | nlevels(y) != 2) return("The covariable y is not a factor
or its number of levels is not equal to 2 \n")
## Calculate t-statistic and p-value
tt = rowttests(eset,y)
tstat = tt$statistic
p.value = tt$p.value
## Calculate the adjusted p-value (Benjamini-Hochberg)
p0 = mt.rawp2adjp(p.value, "BH")
adjp.value = p0$adjp[order(p0$index),2]
## Calculate the Storey q-value
q.value = qvalue(p.value)$qvalues
## Make the data.frame
result = data.frame(tstat,p.value,adjp.value,q.value)
## Names of the variables in the data.frame
names(result) = c("statistic","p","adj.p","q")
## Assign the names of the features
rownames(result) = featureNames(eset)
## Return the resulting data.frame
result
}
library(genefilter);library(multtest);library(qvalue)
z = tm.descrip(eset,y)
z = tm.descrip(gse1397,pData(gse1397)[,"type"])
head(z)
## statistic p adj.p
_ _
## 1007 s at -0.6183648 0.54789263 0.9901883
## 1053_at 0.6022344 0.55822637 0.9901883
_
## 117 at 1.5635785 0.14389203 0.9901883
## 121_at -0.8738516 0.39934953 0.9901883
## 1255_g_at 0.3815208 0.70948639 0.9901883
208 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
9.11 Ejercicios
Ej. 10 Utilizando los datos tamidata::gse20986 se pide:
1.Seleccionar las muestras correspondientes a iris y huvec.
2.Aplicamos, a cada gen, un test de la t (asumiendo una misma va-
rianza). Obtener los t-estadsticos y los p-valores correspondientes.
14 14
Utilizad genefilter::rowttests.
3.Utilizando el mtodo de correccin de Benjamini-Hochberg obte-
ner los p-valores ajustados.15 15
Utilizad Pollard et al. [2015, multtest].
4.Si utilizamos un valor de FDR igual a 0.05: qu genes declaramos
como significativos?
5.Repetir los apartados anteriores comparando los muestras corres-
pondientes a retina y huvec.
6.Repetir los apartados anteriores comparando las muestras corres-
pondientes a coroides y huvec.
7.Utilizando la funcin base::intersect y la funcin Biobase::featureNames
determinar los genes comunes a cada par de comparaciones y los
comunes a las tres comparaciones.
y
1/n1 + 1/n2
a=
n1 + n2
212 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
Bajo la hiptesis nula de que no hay diferencias entre los dos gru-
pos los valores de d(i) y de d(i) debieran de ser similares.
y
l () = max{di : i es significativamente negativo}
expresin diferencial con microarrays 213
0 = mn{0 , 1}.
3 3
En la opcin en que estamos compa-
rando varios grupos que vemos ms
adelante los valores de d son todos
9. Multiplicamos la mediana, q0,5 (c), y el percentil 0.9, q0,90 (c), deter-
positivos y se trabaja con los percentiles
minados en el paso 7 por 0 . 0 y 0.5.
10.1.2 Clculo de s0
La seleccin de s0 se hace del siguiente modo:
() xi1 xi2
di = .
si + q ( s )
a) Se calcula
1 ()
vj = MAD ({di : si [q j/100 (s), q( j+1)/100 (s)]})
0,64
para j = 1, . . . , 100 donde MAD es la mediana de las desviacio-
nes absolutas respecto de la mediana ( 24.4).
b) Calculamos el valor CV (), el coeficiente de variacin de los
valores v j .4 4
El coeficiente de variacin es el cocien-
te de la media y la desviacin estndar.
c) Se elige como valor de : que minimiza CV ().
d) Finalmente tomamos para s0 : s0 = q (s).
pacman::p_load("samr")
data(golub,package="multtest")
fac0 = golub.cl +1
samfit = SAM(golub,fac0,resp.type="Two class unpaired",
nperms=1000,fdr.output=.001)
Qu valor de se ha utilizado?
samfit$del
## delta
## 1.466926
(sigtabla = samfit$siggenes.table)
por abajo indican los genes up y los genes down. En la figura 10.1
observed score
podemos ver los resultados.
0
plot(samfit)
donde s
nj=1 ( xij xij )2
i = , (10.8)
n2
y
xij = i0 + ri y j , (10.9)
i0 = xi ri y. (10.10)
data(bdmy.norm,package="tamidata")
pData(bdmy.norm)[,"tiempo"]
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 30 30 30
## [16] 60 60 60
pData(bdmy.norm)[,"tipo"]
## [1] gb gb gb gb gb gb gd gd gd gd gd gd gb gb gb
## [16] gb gb gb
## Levels: gb gd
bd.nor = bdmy.norm[,c(1:3,13:18)]
Y podemos comprobar que nos hemos quedado con las muestras adecua-
das.
pData(bd.nor)
library(samr)
tiempo.factor = factor(pData(bd.nor)[,"tiempo"])
Hacemos el anlisis.
samfit = SAM(exprs(bd.nor),tiempo.factor,resp.type="Multiclass")
samfit$del
## delta
## 0
observed score
2
(sigtabla = samfit$siggenes.table)
1
En la figura 10.2 tenemos el resumen grfico.
0
0 20 40 60 80 100 120
t0 = pData(bd.nor)[,"tiempo"]
samfit = SAM(exprs(bd.nor),t0,resp.type="Quantitative")
3
En la figura 10.3 tenemos una ilustracin de los resultados.
2
observed score
plot(samfit)
0
10.1.5 Ejercicios 4 2 0 2 4
expected score
Ejercicio 4. Utilizando los datos gse20986.gcrma se pide:
Figura 10.3: SAM para bdmy utilizando
1. Seleccionar las muestras correspondientes a iris y huvec. los tiempos como valores numricos
(que es lo que son).
10.2 Limma
1.
E( Xi ) = Ai (10.11)
var ( Xi ) = i2 Wi , (10.12)
i = C 0 i ,
y de su matriz de covarianzas es
var ( i ) = C 0 Vi Cs2i .
1. ij | ij , i2 N ( ij , vij i2 ).
2
2. s2i |i2 di 2d siendo di los grados de libertad residuales del
i i
modelo ajustado para el i-simo gen.
ij
tij =
si vij
1 1 2
.
i2 d0 s20 d0
ij
tij = 2 .
si vij
P( ij 6= 0|tij,s2 )
i
Oij = . (10.14)
P( ij = 0|tij,s2 )
i
pj
vij
1/2 t2ij + d0 + di (1d0 +di )/2
Oij = vij (10.15)
1 pj vij + v0j t2ij v + d o + di
ij + voj
Finalmente los autores proponen trabajar con los log-odds dados por
siendo
d0 2
s2,i = s2i + s .
di 0
Cada varianza muestral es incrementada un valor positivo en princi-
pio distinto para cada gen. La idea que vimos en 10.1 consista en
considerar
ij
t,ij =
(si + a) vij
donde a es un valor positivo determinado por un mtodo ad-hoc. En
este mtodo lo que se incrementa es la desviacin estndar y no la
varianza. El t-estadstico moderado incrementa la varianza. Adems
el incremento puede ser distinto para cada gen.
Y si queremos contrastar ms de un contraste al mismo tiempo?
En lugar de t-estadsticos moderados tendremos F-estadsticos mo-
derados. Se comprueba que los F-estadsticos moderados no son ms
que los F-estadsticos usuales en los cuales sustituimos las varianzas
s2i por s2i . Adems su distribucin es Fi Fr,d0 +di , siendo r el nmero
de contrastes linealmente independientes. Vemos que los grados de
libertad del denominador tambin se incrementan.
En las siguientes secciones vamos a considerar distintos diseos
experimentales y los analizaremos con Smyth et al. [2016, limma].19 19
Este paquete es una de los fundamen-
tales en el proyecto Bioconductor y de
los ms antiguos.
10.2.2 Datos yeastgrowthRA con limma
Leemos los datos tamidata::yeastgrowthRA.
224 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
data(yeastgrowthRA,package="tamidata")
pData(yeastgrowthRA)[,"growthrate"]
Cargamos Limma.
library(limma)
head(design)
## intercept growthrate
## 1 1 0.468
## 2 1 0.359
## 3 1 0.408
## 4 1 0.231
## 5 1 0.267
## 6 1 0.415
fit = lmFit(yeastgrowthRA,design)
fit1 = eBayes(fit)
topTable(fit1,coef=2,adjust ="BH")
data(bdmy.norm,package="tamidata")
pData(bdmy.norm)
## GROBY35C2 35 0 gb 2
## GROBY35C3 35 0 gb 3
## GRODMY230C1 30 0 gd 1
## GRODMY230C2 30 0 gd 2
## GRODMY230C3 30 0 gd 3
## GRODMY235C1 35 0 gd 1
## GRODMY235C2 35 0 gd 2
## GRODMY235C3 35 0 gd 3
## GROSALIDA30MIN1 30 30 gb 1
## GROSALIDA30MIN2 30 30 gb 2
## GROSALIDA30MIN3 30 30 gb 3
## GROSALIDA60MIN1 30 60 gb 1
## GROSALIDA60MIN2 30 60 gb 2
## GROSALIDA60MIN3 30 60 gb 3
pData(bdmy.norm)[,"temperatura"] = factor(pData(bdmy.norm)[,"temperatura"],
levels = c(30,35))
pData(bdmy.norm)[,"tiempo"] = factor(pData(bdmy.norm)[,"tiempo"],
levels = c(0,30,60))
bdmy0 = bdmy.norm[,c(1:3,13:18)]
tiempofac = factor(pData(bdmy0)[,"tiempo"])
design = model.matrix(~ tiempofac)
colnames(design) = c("Constante","tiempo30","tiempo60")
design
## 3 1 0 0
## 4 1 1 0
## 5 1 1 0
## 6 1 1 0
## 7 1 0 1
## 8 1 0 1
## 9 1 0 1
## attr(,"assign")
## [1] 0 1 1
## attr(,"contrasts")
## attr(,"contrasts")$tiempofac
## [1] "contr.treatment"
fit = lmFit(bdmy0,design)
(contrast.matrix = makeContrasts(d30_0=tiempo30-tiempo0,d60_0=tiempo60-tiempo0,
d60_30= tiempo60-tiempo30,levels = design))
## Contrasts
## Levels d30_0 d60_0 d60_30
## tiempo0 -1 -1 0
## tiempo30 1 0 -1
## tiempo60 0 1 1
Estimamos.
fit2 = contrasts.fit(fit,contrast.matrix)
fit2 = eBayes(fit2)
topTable(fit2,coef=1,adjust="BH")
## logFC AveExpr t
## YOR100C 2.5136226 1.3655296 8.644303
## YJR045C -5.2630878 6.3848940 -6.565071
## YPR149W -13.7037653 11.0575835 -6.479073
## YBR165W -0.7959899 0.8808426 -6.209708
## YEL048C -2.0717802 1.1634624 -5.534968
## YNL064C -6.2344916 5.9223733 -5.309262
## YOL043C 1.1065137 1.3632085 5.083399
## YPL261C -0.8374226 0.3987629 -5.064933
## YDR410C 1.8864594 2.1284332 5.018680
## YLR417W 2.0144745 1.4883402 5.619056
## P.Value adj.P.Val B
## YOR100C 4.667432e-05 0.2728114 1.4561972
## YJR045C 2.772472e-04 0.4400684 0.3979929
## YPR149W 3.011588e-04 0.4400684 0.3432432
## YBR165W 3.923343e-04 0.4586388 0.1650258
## YEL048C 7.903367e-04 0.5752984 -0.3295032
expresin diferencial con microarrays 229
topTable(fit2,coef=2,adjust="BH")
## logFC AveExpr t
## YBR165W -0.6860614 0.8808426 -5.352129
## YPR149W -10.7514770 11.0575835 -5.083245
## YOR309C 4.2192724 6.6964157 4.140894
## YPR158W -1.7839935 2.5266297 -4.076545
## YJR045C -3.1736369 6.3848940 -3.958732
## YPL261C -0.6208424 0.3987629 -3.755005
## YGR071C -0.9568706 1.8495317 -3.721032
## YKR027W -0.6202224 1.6255641 -3.718965
## YIL022W 0.7039574 1.4965868 3.610081
## YEL048C -1.3377910 1.1634624 -3.574042
## P.Value adj.P.Val B
## YBR165W 0.000965027 1 -3.531544
## YPR149W 0.001305025 1 -3.563088
## YOR309C 0.004076252 1 -3.703945
## YPR158W 0.004427069 1 -3.715612
## YJR045C 0.005157753 1 -3.737754
## YPL261C 0.006750125 1 -3.778541
## YGR071C 0.007064116 1 -3.785663
## YKR027W 0.007083726 1 -3.786099
## YIL022W 0.008204613 1 -3.809583
## YEL048C 0.008616657 1 -3.817574
topTable(fit2,coef=3,adjust="BH")
## logFC AveExpr t
## YOR100C -2.8011951 1.3655296 -9.633260
## YOR309C 5.6887259 6.6964157 5.583050
## YGL179C -1.8498412 3.6504421 -4.920033
## YER026C 2.2858372 2.7400017 4.906185
## YOL086C -3.2542226 6.6098929 -4.158577
## YMR287C -0.6125279 0.6348125 -4.091743
## YNR046W -5.2800172 2.6023856 -5.381302
230 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
(results = decideTests(fit2))
## TestResults matrix
## Contrasts
## d30_0 d60_0 d60_30
## YLR241W 0 0 0
## YHR212C 0 0 0
## YER136W 0 0 0
## YBR132C 0 0 0
## YFL009W 0 0 0
## 6013 more rows ...
bdmy0 = bdmy.norm[,1:12]
temptipo = factor(rep(c("f30.gb","f35.gb","f30.gd","f35.gd"),each=3))
fit = lmFit(bdmy0,design)
cont.matrix = makeContrasts(
gd_35_30=f35.gd-f30.gd,
gb_35_30=f35.gb-f30.gb,
g_t=(f35.gb-f30.gb)-(f35.gd-f30.gd),
levels = design)
fit2 = contrasts.fit(fit,cont.matrix)
fit2 = eBayes(fit2)
topTable(fit2,coef=1,adjust="BH")
topTable(fit2,coef=2,adjust="BH")
topTable(fit2,coef=3,adjust="BH")
pacman::p_load("SummarizedExperiment")
data(PRJNA297664,package="tamidata")
se = PRJNA297664
rm(PRJNA297664)
234 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
colData(se)[,"treatment"]
pacman::p_load("edgeR")
pvalor13 = edgeR::binomTest(assay(se)[,1], assay(se)[,3])
Podemos hacernos una idea de cmo son estos p-valores con una
estimacin de su funcin de densidad con (figura 11.1).
pacman::p_load(ggplot2)
df = data.frame(pvalor13)
ggplot2::ggplot(df,aes(x=pvalor13)) + geom_density()
pares = rbind(c(1,3),c(1,5),c(1,6),c(2,3),c(2,5),c(2,6),c(4,3),
c(4,5),c(4,6))
aux = function(rr) binomTest(assay(se)[,rr[1]], assay(se)[,rr[2]])
pvalores = apply(pares,1,aux)
11.2 edgeR
2 nj
li ( ) = log (yijk + 1 ) + log (n j 1 )
j =1 k =1
1 1
log (zij + n j ) n j log ( ) . (11.3)
Hi : i1 = i2 ,
Ki : i1 6= i2 .
W L(i ) = li (i ) + l (i ), (11.5)
expresin diferencial con datos rnaseq 239
2 li ( )
Ii () = E( Ji ), siendo Ji = . (11.7)
2
N
Si (0 )
Ii (0 )(1 + Ii (0 )02 )
1 = 0.
i =1
4. Fijamos
N
1/ = 02 Ii (0 ).
i =1
data(PRJNA297664,package="tamidata")
pacman::p_load("edgeR","SummarizedExperiment")
dge = DGEList(counts=assay(PRJNA297664),
group=colData(PRJNA297664)[,"treatment"])
dge.c = estimateCommonDisp(dge) ##Estimamos dispersin comn
dge.c$common.dispersion
## [1] 0.01170892
topTags(et.c)
topTags(et.t)
library(Biobase)
load("maqc_eset.RData")
library(edgeR)
dge = DGEList(counts=exprs(maqc.eset),group=pData(maqc.eset)[,"tissue"])
242 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
En dge$counts tenemos una matriz con los conteos por gen sien-
do las etiquetas de las filas los cdigos del gen en Ensembl.14 En 14
Como los autores haban indicado en
dge$samples tenemos un data.frame donde la variable group es el su ExpressionSet.
head(apply(dge$counts,2,sum))
dge.c = estimateCommonDisp(dge)
dge.c$common.dispersion
## [1] 0.0005323165
head(dge.c$pseudo.counts,n=1)
## SRX016359.1 SRX016359.2
## ENSG00000000003 1.38206 1.957434
## SRX016359.3 SRX016359.4
## ENSG00000000003 2.931757 4.692938
## SRX016359.6 SRX016359.7
## ENSG00000000003 2.855939 1.885639
## SRX016359.8 SRX016367.1
## ENSG00000000003 2.169403 14.07605
## SRX016367.2 SRX016367.3
## ENSG00000000003 19.29528 24.89895
## SRX016367.4 SRX016367.6
## ENSG00000000003 35.45236 19.05291
## SRX016367.7 SRX016367.8
## ENSG00000000003 11.25657 21.67744
Que son16 16
Podemos comprobar que el objeto que
vamos obteniendo cada vez contiene
la informacin previa ms informacin
head(dge.t$tagwise.dispersion)
adicional en cada paso.
(et.c = exactTest(dge.c))
(et.t = exactTest(dge.t))
11.3 SAMseq
n1 ( n + 1)
Ti = Rij ( Xi )
2
. (11.8)
jC1
Sera el muestreo Poisson. Para evitar empates entre los valores gene-
rados se sustituyen estos valores por
Xij0 + eij
246 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
1. Calculamos T1 , . . . , TN
a partir de nuestros datos.
N S
1
V =
S 1|Ti (s)|>c (11.11)
i =1 s =1
N
R = 1|Ti |>c (11.12)
i =1
[ (c) = 0 V .
FDR (11.13)
R
donde 0 es la proporcin de hiptesis nulas ciertas.22 El estima- 22
O proporcin de caractersticas que
dor de 0 utilizado es no son significativamente distintas entre
los dos grupos que comparamos.
2 iN=1 1|T |q
i
0 = ,
N
siendo q la mediana de {| Ti (s)| : i = 1, . . . , N; s = 1, . . . , S}.
expresin diferencial con datos rnaseq 247
pacman::p_load("SummarizedExperiment","samr")
data(PRJNA297664,package="tamidata")
print(PRJNA297664samseq)
plot(PRJNA297664samseq)
11.4 DESeq
11.5 cufflinks
Lo instalamos con
apt g e t i n s t a l l c u f f l i n k s
11.6 baySeq
11.7 NOIseq
11.8 Limma
11.9 Cuffdiff 2
11.10 EBSeq
library(Biobase)
data(gse20986,package="tamidata")
eset = gse20986
library(genefilter)
library(multtest)
eset = gse20986[, c(2, 3, 5, 10:12)]
tissue = factor(rep(1:2, each = 3), levels = 1:2,
labels = c("retina", "huvec"))
tt = rowttests(eset, tissue)
p.BH = mt.rawp2adjp(tt$p.value, "BH")
sig = which(p.BH$adjp[p.BH$index, 2] < 0.05)
head(sig)
El nmero de significativos es
nsig = length(sig)
pvalor = p.BH$adjp[1:nsig,1]
pajustado = p.BH$adjp[1:nsig,2]
library(annotate)
annotation(eset)
## [1] "hgu133plus2"
library(hgu133plus2.db)
ID = featureNames(eset)[sig]
head(ID)
O en Gene Ontology?
ls("package:hgu133plus2.db")
13.2 R2HTML
library(R2HTML)
ID = featureNames(eset)[sig] ## AffyID
Symbol = getSYMBOL(ID,"hgu133plus2.db") ## Smbolo
Name = as.character(lookUp(ID, "hgu133plus2.db", "GENENAME")) # Nombre
Ensembl = as.character(lookUp(ID, "hgu133plus2.db", "ENSEMBL")) # Ensembl
entrezid = as.character(lookUp(ID, "hgu133plus2.db", "ENTREZID")) # Entrez
Podemos tener campos vacos que hay que declarar como datos
faltantes.
tmp[tmp=="NA"] = NA
HTML(tmp,"reports/prueba.html",append=F)
browseURL("reports/prueba.html")
browseURL("reports/prueba.html")
13.3 ReportingTools
library(ReportingTools)
ID = featureNames(eset)[sig]
Name = as.character(lookUp(ID,"hgu133plus2.db", "GENENAME"))
entrezid = as.character(lookUp(ID, "hgu133plus2.db", "ENTREZID"))
ID[ID == "NA"] = NA
Name[Name == "NA"] = NA
entrezid = ifelse(entrezid == "NA",NA,
paste("<a href='http://www.ncbi.nlm.nih.gov/gene/?term=",
entrezid,"'>",entrezid,"</a>",sep=""))
foutput = "gse20986.DE"
htmlRep1 = HTMLReport(shortName = foutput,title = foutput,
reportDirectory = "./reports")
publish(df,htmlRep1)
finish(htmlRep1)
## [1] "./reports/gse20986.DE.html"
5 5
La funcin tami::tm.report1 contiene
una implementacin de esta seccin.
13.4 Ejercicios
3. Elegir al azar 100 genes con la funcin sample. Determinar sus AffyIDs
y los correspondientes en Ensembl, Gene Ontology y NCBI.
Reduccin de dimensin y
clasificacin
14
Componentes principales
14.1 Introduccin
library(multtest)
data(golub)
sel = grep("Cyclin",golub.gnames[,2])
golub.red = golub[sel,1:2]
1.5
1.0
golub.red[,2]
0.5
plot(golub.red)
0.0
en las dos muestras como xi = ( xi1 , xi1 ). Tenemos n filas y por lo 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0
tanto nuestros datos son xi con i = 1, . . . , n. golub.red[,1]
medias = colMeans(golub.red)
medias = apply(golub.red,2,mean)
golub.red = sweep(golub.red,2,medias)
plot(golub.red)
abline(v=mean(golub.red[,1]),col="red")
abline(h=mean(golub.red[,2]),col="red")
a.pca = prcomp(golub.red)
a.pca$rotation
## PC1 PC2
## [1,] -0.7619878 0.6475914
## [2,] -0.6475914 -0.7619878
colMeans(golub.red)
a.pca = prcomp(golub.red)
a.pca$rotation
## PC1 PC2
## [1,] -0.7619878 0.6475914
## [2,] -0.6475914 -0.7619878
predict(a.pca)
## PC1 PC2
## [1,] -2.50309193 -1.541823e-01
## [2,] 0.01368602 -2.024163e-01
## [3,] -2.38702381 3.714339e-03
## [4,] 0.33489688 -6.847077e-05
## [5,] 0.76608286 2.806154e-01
## [6,] 0.27144878 2.899820e-02
## [7,] 0.31169639 -2.876394e-01
## [8,] 2.22052303 -8.232084e-02
## [9,] -0.93221244 1.836866e-01
## [10,] -0.39946389 -7.239549e-03
## [11,] 0.08293509 3.191733e-01
## [12,] 2.22052303 -8.232084e-02
a.pca$sdev^2
var(golub.red[,1])
## [1] 1.266931
var(golub.red[,2])
## [1] 0.9245807
cuya suma es
var(golub.red[,1]) + var(golub.red[,2])
## [1] 2.191512
sum(a.pca$sdev^2)
## [1] 2.191512
variacion.total = sum(a.pca$sdev^2)
a.pca$sdev^2 / variacion.total
golub.pca = prcomp(golub,scale=FALSE,center=TRUE)
summary(golub.pca)
## Importance of components:
## PC1 PC2 PC3
## Standard deviation 5.0436 1.44073 1.11734
## Proportion of Variance 0.6694 0.05462 0.03285
## Cumulative Proportion 0.6694 0.72405 0.75691
## PC4 PC5 PC6
## Standard deviation 1.03505 0.85821 0.74399
## Proportion of Variance 0.02819 0.01938 0.01457
## Cumulative Proportion 0.78510 0.80448 0.81905
## PC7 PC8 PC9
## Standard deviation 0.72104 0.69232 0.63819
## Proportion of Variance 0.01368 0.01261 0.01072
## Cumulative Proportion 0.83273 0.84534 0.85606
## PC10 PC11 PC12
266 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
a = predict(golub.pca)
a[1,]
a = a[,1:5]
268 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
5
plot(a[,1],a[,2],xlab="Primera componente",ylab="Segunda componente")
Segunda componente
0
Es interesante observar los valores del vector asociado a la primera
componente.
golub.pca$rotation[,1]
5 0 5 10 15 20
## [1] 0.1715179 0.1690829 0.1650131 0.1726783 Primera componente
golub.pca$rotation[,2]
cada gen, la media de los niveles de expresin sobre los datos ALL
(leucemia linfoblstica aguda) con la media sobre los datos AML
(leucemia mieloide aguda).
tgolub.pca = prcomp(t(golub),scale=FALSE,center=TRUE)
summary(tgolub.pca)
## Importance of components:
## PC1 PC2 PC3
## Standard deviation 13.0934 10.17462 9.40357
## Proportion of Variance 0.1645 0.09934 0.08485
## Cumulative Proportion 0.1645 0.26385 0.34870
## PC4 PC5 PC6
## Standard deviation 7.9010 6.82616 6.62780
## Proportion of Variance 0.0599 0.04471 0.04215
## Cumulative Proportion 0.4086 0.45332 0.49547
## PC7 PC8 PC9
## Standard deviation 6.30435 5.83194 5.79413
## Proportion of Variance 0.03814 0.03264 0.03222
## Cumulative Proportion 0.53361 0.56625 0.59846
## PC10 PC11 PC12
## Standard deviation 5.15726 5.01893 4.90719
## Proportion of Variance 0.02552 0.02417 0.02311
270 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
20
library(affycoretools)
plotPCA(golub,legend = FALSE)
10
PC2
plotPCA(t(golub),legend = FALSE)
10
ducen los grupos que sabemos que previamente tenemos (aqu no hemos PC1
realizado ningn anlisis cluster previo). En la figura 14.6 mostramos la Figura 14.4: Dos primeras componentes
principales de los datos golub utilizan-
misma figura 14.4 pero diferenciando el tipo de muestra (segn el tipo de
do como variables las expresiones en
leucemia). los genes.
5
Podemos ver cmo la primera componente principal diferencia bastante
PC2
14.5 Tipificamos los datos?
5 0 5 10 15 20
Hemos trabajado hasta ahora con los datos centrados (restamos la
PC1
media muestral a cada variable) pero no hemos tipificado, esto es, no
Figura 14.5: Dos primeras componentes
hemos dividido cada variable por su desviacin estndar. Si los datos
principales de los datos golub utilizan-
tienen una escala similar esta es la opcin razonable. Para matrices de do como variables las expresiones en las
expresin esto es as, estamos midiendo lo mismo en distintas mues- muestras.
es scale = TRUE.
PC2
golub.pca = prcomp(golub,scale=TRUE,center=TRUE)
10
summary(golub.pca)
tgolub.pca = prcomp(t(golub),scale=TRUE,center=TRUE) 20 10 0 10 20
summary(tgolub.pca) PC1
data(gse20986r,package="tamidata")
pData(gse20986)[,"tissue"]
100
retina
choroides
huvec
Llama la atencin la clara diferenciacin de las tres muestras corres-
50
pondientes a huvec. Aparecen dispersas pero separadas de los dems las
PC2
correspondientes a la retina. Finalmente las muestras de iris y coroides no
50
Vemos que son informativas pero: qu proporcin de la variacin total
explican? Realizamos unas componentes principales de las muestras. Note- 60 40 20 0 20 40 60 80
que de lo contrario las componentes se estaran realizando sobre las mues- Figura 14.7: Datos GSE20986. Com-
tras. ponentes principales de los genes. Se
aprecia como el grupo huvec (tejido de
vena umbilical) se diferencia claramente
a.pca = prcomp(t(exprs(gse20986))) de los dems.
summary(a.pca)
## Importance of components:
## PC1 PC2 PC3
## Standard deviation 64.0229 58.2172 32.70677
## Proportion of Variance 0.3536 0.2924 0.09229
## Cumulative Proportion 0.3536 0.6461 0.73835
## PC4 PC5 PC6
## Standard deviation 27.38272 24.78311 21.58422
## Proportion of Variance 0.06469 0.05299 0.04019
## Cumulative Proportion 0.80304 0.85603 0.89622
## PC7 PC8 PC9
## Standard deviation 18.60405 17.9184 15.86808
## Proportion of Variance 0.02986 0.0277 0.02172
componentes principales 273
data(gse1397,package="tamidata")
pData(gse1397)
pData(gse1397)[,'type']
pData(gse1397)[,'tissue']
20000 10000
PC1
Las dos primeras componentes vemos como no nos diferencian el tipo de Figura 14.8: Dos primeras compo-
nentes principales de datos GSE1397
alteracin. Sin embargo, cuando consideramos el tejido de donde obtuvimos diferenciando el diagnstico.
la muestra se aprecia una mejor diferenciacin. De hecho la primera compo-
nente diferencia bastante bien los tejidos. Lo podemos ver en la figura 14.9.
Principal Components Plot
20000
Cerebrum
Cerebellum
10000
library(affycoretools)
plotPCA(gse1397, groups = pData(gse1397)[,'tissue'],
PC2
0
groupnames = levels(pData(gse1397)[,'tissue']))
20000 10000
PC1
T 0 T = = diag(1 , . . . , d ), (14.1)
Demostracin.
En cuanto al apartado primero tenemos que
Y 0 = (y1 , . . . , yn ) = T 0 ( x1 x, . . . , xn x ) (14.3)
kj=1 j
, con k = 1, . . . , d,
dj=1 j
15.1 Introduccin
15.2 Datos
library(cluster)
data(ruspini)
150
En la figura 15.1 mostramos estos datos.
100
plot(ruspini)
50
Son datos bivariantes. Visualmente vemos cmo se agrupan los
puntos. Parece (muy) claro que podemos distinguir cuatro grupos.
0
0 20 40 60 80 100 120
x
15.2.2 Un ejemplo con muestras
Figura 15.1: Datos ruspini
Un ejemplo con los datos golub. Empezamos cargando los datos.
library(multtest)
data(golub)
## [1] 1042
grep("Zyxin",golub.gnames[,2])
## [1] 2124
cz.data = data.frame(golub[1042,],golub[2124,])
colnames(cz.data) = c("CCND3 Cyclin D3","Zyxin")
plot(cz.data)
Zyxin
library(multtest)
data(golub)
x = apply(golub[,golub.cl == 0],1,mean)
y = apply(golub[,golub.cl == 1],1,mean)
sel = grep("Cyclin",golub.gnames[,2])
golub.gnames[sel,2]
cyclin.data = data.frame(x[sel],y[sel])
colnames(cyclin.data) = c("meanALL","meanAML")
plot(cyclin.data)
1.0
No parece, al menos visualmente, que tengamos muchos grupos.
De eso se trata. De saber si hay grupos y encontrarlos.
0.5
meanAML
0.0
15.3 Disimilaridades
0.5
1.0
d
d M ( x, y) = | x k y k |. (15.2)
k =1
1. d( x, y) = 1 r x,y ,
2. d( x, y) = (1 r x,y )/2,
3. d( x, y) = 1 |r x,y |,
q
4. d( x, y) = 1 r2x,y .
5 De un modo similar podemos definir disimilaridades sustituyendo 5
En http://research.
stowers-institute.org/efg/R/
el coeficiente de correlacin de Pearson con el coeficiente de correla-
Visualization/cor-cluster/ po-
cin de Spearman. demos encontrar un breve estudio
comparativo del funcionamiento de
estas disimilaridades en clustering
15.3.3 Matriz de disimilaridades jerrquico.
d ( x i , x j ) = d ( x j , x i ),
D = [d( xi , x j )]i,j=1,...,n
d( xi , xi ) = 0,
cz.dist.euclidea = dist(cz.data,method="euclidian")
De qu clase es cz.dist.euclidea.
class(cz.dist.euclidea)
## [1] "dist"
cz.dist.euclidea
cz.dist.manhattan = dist(cz.data,method="manhattan")
data(golub,package="multtest")
golub.cor1 = 1-cor(t(golub))
golub.cor2 = (1-cor(t(golub)))/2
golub.cor3 = 1-abs(cor(t(golub)))
golub.cor4 = sqrt(1-cor(t(golub))^2)
En este caso cz.dist s es una matriz completa (con todas sus filas
y columnas). La vamos a transformar a un objeto de clase dist.
golub.cor1 = as.dist(golub.cor1)
golub.cor2 = as.dist(golub.cor2)
golub.cor3 = as.dist(golub.cor3)
golub.cor4 = as.dist(golub.cor4)
d( A, B) = mn d( a, b)
a A,b B
d( A, B) = max d( a, b)
a A,b B
1
d( A, B) =
| A| | B| d( a, b)
a A,b B
100
Representamos el dendograma en la figura 15.4.
80
60
plot(ruspini.ag,which=2)
Height
40
Supongamos que decidimos quedarnos con cuatro grupos. Las clasifica-
20
ciones de los datos son las siguientes donde la etiqueta que se asigna a cada
43 44
45
61
38 41
9 7
60 58
35
1320
1
4746
6663
64
3531
65
2
14
8
1911
72
75
73
74
40
53
57
21
22
48
15
17
42
10
12
62
52
64
68
70
71
37
16
25
26
50
54
32
36
39
67
69
29
30
59
23
24
33
34
49
51
27
28
55
56
18
grupo es arbitraria.
cutree(ruspini.ag,4) ruspini
Agglomerative Coefficient = 0.95
150
figura 15.5.
100
Ejemplo 11 (cz.data). Apliquemos un cluster jerrquico aglomerativo
y
utilizando como disimilaridad entre grupos el enlace simple y como distancia
50
la de Manhattan.
0
cz.ag = agnes(cz.data,metric = "euclidean",method="single")
0 20 40 60 80 100 120
x
La figura 15.6 muestra el dendograma que obtenemos.
Figura 15.5: Clasificacin obtenida para
Supongamos que nos quedamos cinco grupos. Las clasificaciones son:
los datos ruspini utilizando un cluster
jerrquico con distancia eucldea,
cutree(cz.ag,5) promedio entre grupos y cuatro grupos.
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1
Dendrogram of agnes(x = cz.data, metric = "euclidean", method = "single")
## [24] 1 1 1 1 3 4 3 3 3 3 3 5 3 3 3
1.2
1.0
21
En la figura 15.7 tenemos los resultados de la clasificacin.
35
0.8
0.6
Height
plot(cz.data,col=cutree(cz.ag,5),pch=cutree(cz.ag,5))
29
0.4
34
0.2
30
25
26
4
38
2
14
17
18
24
37
13
15
0.0
33
28
31
32
36
16
7
9
11
23
20
8
27
1
10
19
3
6
5
12
Zyxin
golub.ag = agnes(golub.cor1,diss=TRUE,method="single")
plot(golub.ag,which=2)
cyclin.cofe = cophenetic(cyclin.ag)
cor(cyclin.manhattan,cyclin.cofe)
## [1] 0.8501727
ruspini.km = kmeans(ruspini,4)
ruspini.km$cluster
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
## 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
## 4 4 4 4 1 1 1 1 1 1 1 1 1 1 1 1
## 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
## 1 1 1 1 2 2 1 1 2 2 2 3 3 3 3 3
## 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
## 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4
## 65 66 67 68 69 70 71 72 73 74 75
## 4 4 4 4 4 4 4 4 4 4 4
cz.km = kmeans(cz.data,2)
cz.km$cluster
## [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [24] 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1
anlisis cluster 291
2
Supongamos que probamos con tres grupos.
1
Zyxin
cz.km = kmeans(cz.data,3)
0
plot(cz.data,col=cz.km$cluster,pch=cz.km$cluster)
1
Y finalmente con cuatro.
0.5 0.0 0.5 1.0 1.5 2.0 2.5
2
sentido calcular el vector de medias? Cmo promediar dos confi-
guraciones de puntos distintas? Cmo promediamos dos formas
1
distintas descritas numricamente? Cuando el concepto de promedio
Zyxin
aritmtico no tiene sentido podemos generalizar el procedimiento
de medias de los individuos de un mismo grupo por individuos bien 0.5 0.0 0.5 1.0 1.5 2.0 2.5
centrados, por individuos tpicos, que sustituyan a las medias. CCND3 Cyclin D3
Supongamos que tomamos k individuos de la muestra que denota- Figura 15.9: Clasificacin obtenida
mos por mi con i = 1, . . . , k. Particionamos la muestra en k grupos de utilizando el mtodo de las k-medias
aplicada a los datos cz.data con tres
modo que el grupo Ci est formado por los individuos ms prximos grupos.
a mi que a cualquier otro m j con j 6= i,
Ci = {l : d( xl , xi ) = mn d( xl , x j )}.
j 6 =i
2
k
d ( x j , x mi ). (15.5)
Zyxin
i =1 jCi
0
CCND3 Cyclin D3
Ejemplo 16 (ruspini). Aplicamos PAM.
Figura 15.10: Clasificacin obtenida
ruspini.pam = pam(ruspini,4) utilizando el mtodo de las k-medias
aplicada a los datos cz.data con cuatro
grupos.
La clasificacin obtenida corresponde con la que mostramos en la figura
15.5. Con los datos ruspini cualquiera de los mtodos que hemos utilizado
cuando decidimos quedarnos con 4 grupos nos da los mismos resultados de
clasificacion.
292 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
cz.pam = pam(cz.data,2)
2
Y representamos los resultados de la clasificacin en la figura 15.11
1
plot(cz.data,col=cz.pam$cluster,pch=cz.pam$cluster)
Zyxin
los resultados.
15.8 Silueta
2
Veamos cmo se construye la silueta. Para la observacin i y el gru-
1
po C consideramos
Zyxin
0
1
d ( x i , x j ),
d(i, C ) =
|C |
1
jC
la disimilaridad media i con los elementos del grupo C. Para cada 0.5 0.0 0.5 1.0 1.5 2.0 2.5
CCND3 Cyclin D3
observacin i, sea A el cluster al cual lo ha asignado el procedimiento
cluster que empleamos y calculamos a(i ) la disimilaridad media Figura 15.12: Clasificacin de los datos
cz.data con mtodo PAM y tres grupos.
de i con todos los dems individuos del grupo A, a(i ) = d(i, A).
Obviamente estamos asumiendo que A contiene al menos otro objeto.
Consideremos d(i, C ) para todos los grupos C 6= A y seleccionemos el
que tiene el mnimo valor:
b(i ) = mn d(i, C ).
C 6= A
a (i )
s (i ) = 1 si a(i ) < b(i ), (15.6)
b (i )
= 0 si a(i ) = b(i ), (15.7)
b (i )
= 1 si a(i ) > b(i ). (15.8)
a (i )
b (i ) a (i )
s (i ) = .
max{ a(i ), b(i )}
anlisis cluster 293
ruspini.pam = pam(ruspini,4)
summary(silhouette(ruspini.pam))
1 : 20 | 0.73
Tambin podemos representarla grficamente en la figura 15.13.
2 : 23 | 0.75
plot(silhouette(ruspini.pam))
3 : 17 | 0.67
4 : 15 | 0.80
15.9 Anlisis cluster y datos de expresin de gen 0.0 0.2 0.4 0.6 0.8 1.0
Silhouette width si
Average silhouette width : 0.74
7
Figura 15.13: Silueta de la clasificacin
de los datos ruspini con mtodo PAM y
cuatro grupos.
En las secciones previas hemos visto algunos mtodos de cla-
sificacin as como de valoracin de hay estructura cluster en un
7
Muchos comentarios e ideas de esta
seccin y del resto del captulo las he
conjunto de datos dados. Estos mtodos se aplican (sin modificacin) tomado de la excelente presentacin
en contextos muy diversos. Sin embargo, qu inters particular tiene Dudoit and Gentleman [2002].
su aplicacin para datos de expresin de gen? Lo primero a consi-
derar es que nos podemos plantear o bien la clasificacin de las filas
de la matriz de expresin o bien la clasificacin de las columnas. Es
decir, tiene sentido biolgico clasificar genes o bien las muestras.
Si clasificamos las filas lo que tenemos en cada fila es el perfil de
expresin del gen en todas las muestras del estudio. En este caso,
puede ser que los grupos que obtengamos nos puedan servir poste-
riormente (quizs cruzando informacin con alguna de las bases de
datos de anotacin de genes) para realizar un enriquecimiento del
conjunto.
Si clasificamos las columnas, las muestras, entonces podemos
estar, por ejemplo, buscando subclases de clulas tumorales. Esto es,
tenemos muestras que, a priori, son indistinguibles y posiblemente
tengamos alguna subclase que no podamos preveer.
Los resultados de la clasificacin de genes y muestras puede uti-
lizarse como control de calidad. Sobre todo en las muestras tenemos
un diseo experimental previo (habitualmente, el diseo grupo con-
trol frente a grupo de tratamiento).
15.10 Ejemplos
library("ALL")
data("ALL")
class(ALL)
## [1] "ExpressionSet"
## attr(,"package")
## [1] "Biobase"
bcell = grep("^B",as.character(ALL$BT))
types = c("NEG","BCR/ABL")
moltyp = which(as.character(ALL$mol.biol) %in% types)
all = ALL[,intersect(bcell,moltyp)]
tipos = ALL$mol.biol[intersect(bcell,moltyp)]
tipos = factor(tipos) ## Eliminamos categoras vacas
class(all)
## [1] "ExpressionSet"
## attr(,"package")
## [1] "Biobase"
library(cluster)
all1.d = dist(exprs(all1),method = "manhattan")
all1.km = kmeans(exprs(all1),2)
table(all1.km$cluster)
##
##
##
##
##
##
##
##
##
##
296
NEG
## tipos
15.10.1).
## 272 502
2
0.58120
Max.
## -0.09823
Min.
272
BCR/ABL 33
1
de las expresiones. 8
32 10
4
2
que hemos obtenido.
tipos.ag
0.24360
1st Qu.
table(tipos,tipos.ag)
plot(all1.ag,which=2)
## 0.2850402 0.4034623
502
plot(muestras.ag,which=2)
0.41460
Median
tipos.ag = cutree(muestras.ag,2)
## Individual silhouette widths:
all1.ag = agnes(all1.d,diss=TRUE)
muestras.ag = agnes(t(exprs(all1)))
Y mostramos la silueta en figura 15.14.
plot(silhouette(all1.km$cluster,all1.d))
summary(silhouette(all1.km$cluster,all1.d))
0.49150
3rd Qu.
Cluster sizes and average silhouette widths:
8
Height Height
01005
43007 41654_at
1287_at
37034_at
35312_at
39777_at
37348_s_at
36188_at
38826_at
38368_at
36654_s_at
38893_at
241_g_at
35323_at
35809_g_at
33447_at
39174_at
459_s_at
36181_at
181_g_at
12019
25003 37023_at
36963_at
37311_at
41485_at
36949_at
41320_s_at
32716_at
37159_at
38342_at
39045_at
35260_at
932_i_at
39327_at
37579_at
38521_at
34224_at
31528_f_at
32819_at
38671_at
08011
12007 37384_at
35769_at
37754_at
160029_at
38924_s_at
39897_at
32171_at
33456_at
36684_at
35271_at
39744_at
40861_at
36614_at
32563_at
140_s_at
37416_at
0.0
64001
24011 32804_at
36975_at
37318_at
39376_at
1512_at
840_at
32508_at
288_s_at
36198_at
32085_at
33543_s_at
34804_at
35325_at
37336_at
38357_at
41241_at
38114_at
38992_at
38075_at
37672_at
34745_at
33788_at
35163_at
40140_at
n = 774
12006
24010 35253_at
40437_at
39037_at
40122_at
39040_at
33770_at
31802_at
37100_at
34740_at
33821_at
40128_at
276_at
40063_at
32832_at
39163_at
36928_at
35787_at
39243_s_at
39131_at
43001
15005 34397_at
41651_at
39147_g_at
38704_at
40610_at
33683_at
41283_at
32597_at
37729_at
35848_at
32808_at
36938_at
35341_at
2039_s_at
31898_at
2042_s_at
227_g_at
39428_at
40268_at
62003 946_at
36958_at
33943_at
39003_at
38661_at
39436_at
40076_at
Figura 15.14:
1401612012 41155_at
34819_at
37569_at
36608_at
35983_at
32236_at
36620_at
35760_at
1695_at
1309_at
40891_f_at
38094_at
32756_at
39685_at
40774_at
36102_at
38251_at
34811_at
36170_at
37013 38085_at
947_at
723_s_at
40096_at
38451_at
503_at
1310_at
39184_at
36992_at
32579_at
33931_at
38060_at
38610_s_at
31432_g_at
36589_at
34651_at
38287_at
384_at
38621_at
22013 12026
11005 1506_at
35017_f_at
32070_at
37329_at
922_at
1268_at
36162_at
36482_s_at
1984_s_at
32794_g_at
37121_at
35816_at
1081_at
36537_at
37984_s_at
32842_at
33866_at
33305_at
38119_at
68003
08012 39070_at
38767_at
34033_s_at
32542_at
38994_at
41734_at
35350_at
40570_at
40936_at
35939_s_at
38359_at
38789_at
41356_at
40729_s_at
33705_at
35733_at
36174_at
32843_s_at
40369_f_at
35807_at
41724_at
32157_at
32336_at
2025_s_at
351_f_at
39767_at
0.2
22011
24001 411_i_at
35261_at
38976_at
33131_at
36937_s_at
935_at
41295_at
38733_at
36139_at
36899_at
2035_s_at
34400_at
32715_at
41221_at
32736_at
1795_g_at
32140_at
33813_at
37967_at
15001 04008 36678_at
37281_at
1373_at
38017_at
37988_at
34210_at
41609_at
36773_f_at
36785_at
37147_at
41213_at
1096_g_at
41202_s_at
41179_at
39507_at
40885_s_at
34278_at
40864_at
32833_at
24008 06002 32241_at
38050_at
36942_at
32183_at
36634_at
40841_at
38666_at
39044_s_at
36179_at
34782_at
40828_at
33102_at
40468_at
40203_at
2031_s_at
37294_at
39839_at
1636_g_at
39231_at
26001 08024 960_g_at
40698_at
40419_at
39072_at
277_at
36979_at
37645_at
32977_at
34183_at
40518_at
1105_s_at
33439_at
1005_at
2094_s_at
36669_at
37028_at
40490_at
32786_at
31870_at
22009 1519_at
33304_at
40396_at
35974_at
39420_at
40790_at
37536_at
38374_at
36021_at
34891_at
1065_at
41266_at
538_at
33232_at
37027_at
39182_at
33273_f_at
38968_at
37043_at
24018 20002
24017 40202_at
36023_at
32824_at
34892_at
34349_at
41635_at
32807_at
38393_at
39150_at
32628_at
37748_at
37670_at
32835_at
1463_at
32172_at
39691_at
41205_at
41823_at
35847_at
03002
04016 35145_at
35722_at
36578_at
34386_at
35289_at
41343_at
33443_at
33340_at
35268_at
35790_at
35719_at
41699_f_at
35739_at
32125_at
38980_at
34889_at
33337_at
34785_at
41335_at
04007
08001 35153_at
37683_at
40832_s_at
33830_at
35697_at
160_at
38805_at
41447_at
37676_at
1426_at
33799_at
39628_at
38098_at
37305_at
38031_at
40456_at
36913_at
34355_at
32569_at
1468_at
0.4
84004 37757_at
32173_at
35843_at
40129_at
37955_at
40417_at
1449_at
41460_at
41302_at
36185_at
40521_at
39079_at
41569_at
40587_s_at
1516_g_at
39109_at
40195_at
37910_at
36687_at
26003 09017 36002 39009_at
37692_at
36633_at
38764_at
41379_at
36093_at
37229_at
36814_at
37031_at
39762_at
36032_at
37242_at
32224_at
37338_at
40615_at
37615_at
36628_at
32849_at
40074_at
62002 40552_s_at
1801_at
38313_at
32623_at
37001_at
37343_at
41715_at
39779_at
32112_s_at
40522_at
39043_at
34176_at
41396_at
37981_at
577_at
32844_at
40955_at
36125_s_at
39112_at
all1.d
3101124022 1100_at
37507_i_at
735_s_at
752_s_at
1185_at
37003_at
430_at
32941_at
429_f_at
40514_at
175_s_at
36962_at
1318_at
35266_at
35763_at
34716_at
32506_at
854_at
40742_at
28036 41438_at
40777_at
402_s_at
32533_s_at
38391_at
35869_at
40296_at
38454_g_at
39814_s_at
32860_g_at
40505_at
1107_s_at
34814_at
38443_at
38011_at
36172_s_at
32695_at
40824_at
38990_at
2804327003
28006 33867_s_at
38864_at
36641_at
40160_at
40506_s_at
35321_at
31936_s_at
33380_at
36635_at
35802_at
40811_at
38688_at
35682_at
33885_at
Average silhouette width : 0.36
36511_at
34306_at
37509_at
37035_at
40108_at
36585_at
35656_at
t(exprs(all1))
43004 35937_at
35316_at
37350_at
35747_at
35793_at
33228_g_at
39097_at
33924_at
36601_at
traspuesta de la matriz A.
6200128044 33267_at
41000_at
1252_at
33219_at
38441_s_at
38908_s_at
41381_at
755_at
34866_at
1825_at
36062_at
41638_at
34654_at
37598_at
31851_at
35750_at
781_at
32160_at
36033_at
27004 41372_at
35845_at
40048_at
34326_at
35306_at
33861_at
39746_at
34735_at
0.6
28005 41253_s_at
32621_at
1039_s_at
1940_at
41634_at
38659_at
507_s_at
760_at
Silhouette width si
28047
28007 149_at
41454_at
1797_at
1622_at
40476_s_at
37585_at
31845_at
1814_at
32156_at
41542_at
34333_at
40030_at
37497_at
38392_at
37532_at
37359_at
32643_at
32668_at
40928_at
28024 49006 40961_at
35633_at
34337_s_at
1456_s_at
41503_at
2003_s_at
34268_at
40979_at
37947_at
33255_at
41400_at
34338_at
40546_s_at
41322_s_at
283_at
1470_at
37766_s_at
37668_at
41223_at
2201065005 35723_at
34311_at
35297_at
34773_at
39337_at
35818_at
36676_at
39092_at
1446_at
824_at
34368_at
37640_at
40827_at
32662_at
40198_at
1643_g_at
39348_at
38745_at
35731_at
5700128001 1085_s_at
32245_at
35741_at
37543_at
41406_at
1564_at
41829_at
39089_at
39180_at
39835_at
1830_s_at
36959_at
1630_s_at
41200_at
1498_at
37040_at
32825_at
41139_at
32207_at
28023 40117_at
1884_s_at
38116_at
41812_s_at
35340_at
38149_at
39929_at
37467_at
40143_at
32562_at
37716_at
32593_at
317_at
33977_at
38032_at
32319_at
1102_s_at
599_at
40088_at
28031 39175_at
1520_s_at
40007_at
40782_at
bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
4301228042 32749_s_at
1402_at
1693_s_at
36155_at
32775_r_at
41690_at
38717_at
32184_at
40631_at
37524_at
1292_at
39411_at
1633_g_at
1433_g_at
36207_at
39822_s_at
39695_at
33891_at
39809_at
34786_at
33690_at
38037_at
41779_at
40019_at
32227_at
37018_at
1.0
2 : 502 | 0.40
1 : 272 | 0.29
heatmap(exprs(all1),hclustfun=agnes)
41205_at
39691_at
41823_at
32172_at
35847_at
35145_at
34386_at
36578_at
35722_at
35289_at
41343_at
41638_at
33340_at
33443_at
35739_at
41699_f_at
35719_at
41635_at
34349_at
37670_at
38393_at
32807_at
39150_at
37748_at
32628_at
36023_at
32824_at
34892_at
35790_at
35268_at
35153_at
37683_at
41335_at
34889_at
33337_at
38980_at
40832_s_at
33830_at
1463_at
35697_at
160_at
34326_at
35845_at
35306_at
40048_at
33861_at
781_at
35750_at
34735_at
31851_at
41253_s_at
41372_at
32160_at
507_s_at
36033_at
1039_s_at
32621_at
1940_at
41634_at
32835_at
34786_at
39809_at
33799_at
39628_at
38805_at
38098_at
36641_at
40160_at
40506_s_at
149_at
41454_at
1797_at
1622_at
31845_at
40476_s_at
37585_at
1814_at
37035_at
40108_at
36585_at
37509_at
35793_at
35316_at
38659_at
39746_at
35656_at
35937_at
1456_s_at
34337_s_at
32125_at
36511_at
38441_s_at
34306_at
41381_at
38908_s_at
33885_at
41000_at
33267_at
40961_at
35633_at
32643_at
755_at
36062_at
1825_at
1252_at
35747_at
33228_g_at
34654_at
37598_at
40030_at
34866_at
40777_at
760_at
41438_at
1633_g_at
37497_at
33690_at
41569_at
40587_s_at
1516_g_at
dos grupos para las muestras. Vamos a clasificar con cada uno de
1081_at
38789_at
38359_at
41356_at
40729_s_at
35939_s_at
41734_at
35350_at
38767_at
34033_s_at
38994_at
32542_at
39070_at
36942_at
38050_at
32241_at
32183_at
1512_at
840_at
36634_at
38666_at
40841_at
40203_at
32833_at
40128_at
39231_at
39044_s_at
36179_at
40828_at
34782_at
41179_at
41202_s_at
40885_s_at
39507_at
40864_at
34278_at
40468_at
35809_g_at
33102_at
37294_at
39839_at
1636_g_at
32977_at
277_at
960_g_at
276_at
40490_at
37028_at
2031_s_at
36979_at
32786_at
1005_at
2094_s_at
36669_at
37645_at
34210_at
1105_s_at
40518_at
41221_at
32715_at
34400_at
2035_s_at
32736_at
35733_at
38733_at
41295_at
935_at
1795_g_at
38017_at
37967_at
33813_at
36678_at
36139_at
36899_at
32140_at
32843_s_at
40369_f_at
35807_at
36174_at
37281_at
37344_at
41609_at
36773_f_at
36937_s_at
41213_at
1096_g_at
37988_at
1373_at
36785_at
37147_at
31870_at
40396_at
33304_at
35974_at
34891_at
40790_at
39420_at
37536_at
38374_at
33439_at
1519_at
33131_at
40365_at
538_at
41266_at
33705_at
1065_at
39182_at
36398_at
37027_at
33232_at
1403_s_at
33336_at
37285_at
33516_at
36711_at
280_g_at
39120_at
los mtodos e intentar ver si hay relacin con la variabel tipos que
38968_at
40202_at
33273_f_at
37280_at
38604_at
37006_at
36638_at
38514_at
36131_at
37033_s_at
31481_s_at
36624_at
37720_at
36576_at
35363_at
38065_at
34392_s_at
38778_at
39864_at
38438_at
39370_at
595_at
36795_at
32806_at
35625_at
36224_g_at
32223_at
1424_s_at
32272_at
37026_at
37420_i_at
40771_at
35175_f_at
32318_s_at
32321_at
151_s_at
36097_at
40448_at
1173_g_at
40103_at
649_s_at
36629_at
31511_at
319_g_at
39755_at
41745_at
34091_s_at
32588_s_at
31508_at
1461_at
41138_at
41164_at
675_at
36591_at
1389_at
36021_at
37043_at
39318_at
41214_at
38355_at
32052_at
16009
64002
01010
68001
25006
48001
04010
33005
09008
28035
28037
28019
30001
28021
22010
57001
28001
28042
28023
43012
28031
49006
65005
03002
04016
36002
84004
08001
04007
28024
28007
28047
28005
27004
28044
43004
62001
27003
28006
28036
28043
24022
09017
31011
26003
62002
24017
20002
24018
22009
08024
26001
06002
04008
15001
24008
08012
22011
24001
68003
11005
24011
64001
08011
12007
25003
12019
01005
43007
12026
12012
22013
14016
37013
62003
15005
43001
12006
24010
contiene la biologa molecular.
##
## tipos 1 2
## BCR/ABL 26 11
## NEG 24 18
all1.km = kmeans(t(exprs(all1)),2)
table(tipos,all1.km$cluster)
##
## tipos 1 2
## BCR/ABL 27 10
## NEG 21 21
data(gse20986,package="tamidata")
gse = gse20986
library(genefilter)
gse0 = nsFilter(gse,var.func = mean, var.cutoff = 0.7)
gse1 = nsFilter(gse0$eset,var.func = IQR, var.cutoff = 0.7)
gse = gse1$eset
298 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
dim(exprs(gse))
## [1] 1849 12
d0 = dist(t(exprs(gse)),method = "manhattan")
Y aplicamos PAM.
library(cluster)
gse.pam = pam(d0,diss = TRUE,k=4)
La clasificacin original es
tipo0 = rep(1:4,rep(3,4))
table(tipo0,gse.pam$clustering)
##
## tipo0 1 2 3 4
## 1 1 1 1 0
## 2 2 1 0 0
## 3 3 0 0 0
## 4 0 0 0 3
15.12 Ejercicios
2. Quedarse con los genes (filas) que verifiquen las siguientes condiciones:
16.1 Introduccin
library(GSEABase)
data(gse20986,package="tamidata")
gse = gse20986
345:405
## [1] 345 346 347 348 349 350 351 352 353 354 355
## [12] 356 357 358 359 360 361 362 363 364 365 366
## [23] 367 368 369 370 371 372 373 374 375 376 377
## [34] 378 379 380 381 382 383 384 385 386 387 388
## [45] 389 390 391 392 393 394 395 396 397 398 399
## [56] 400 401 402 403 404 405
head(geneIds(egs))
details(egs)
## setName: Burjasot
## geneIds: 1552739_s_at, 1552740_at, ..., 1552822_at (total: 61)
## geneIdType: Annotation (hgu133plus2)
## collectionType: ExpressionSet
## setIdentifier: orugacanora:4992:2016-05-25 12:59:43:674614431
## description:
## organism: Homo sapiens
## pubMedIds:
## urls:
## contributor:
## setVersion: 0.0.1
## creationDate: Wed May 25 12:59:43 2016
gsc
## GeneSetCollection
## names: GO:0000002, GO:0000003, ..., GO:2001070 (15752 total)
## unique identifiers: 1555591_at, 201917_s_at, ..., 1552675_at (36835 total)
## types in collection:
## geneIdType: AnnotationIdentifier (1 total)
## collectionType: GOCollection (1 total)
gsc[["GO:0000122"]]
## setName: GO:0000122
## geneIds: 1487_at, 1552338_at, ..., AFFX-HUMISGF3A/M97935_MB_at (total: 1818)
## geneIdType: Annotation (hgu133plus2)
## collectionType: GO
## ids: GO:0000122 (1 total)
## evidenceCode: EXP IDA IPI IMP IGI IEP ISS ISO ISA ISM IGC IBA IBD IKR IRD RCA TAS NAS IC ND IEA
## ontology: CC MF BP
## details: use 'details(object)'
head(geneIds(gsc),n=1)
## $`GO:0000002`
## [1] "80119" "55186" "291" "4358" "1890"
## [6] "4205" "9361" "4976" "10000" "63875"
## [11] "84275" "92667"
grupos de genes 307
head(sapply(geneIds(gsc), length))
geneIds(gsc.filt)
library(org.Sc.sgd.db)
frame = toTable(org.Sc.sgdGO)
goframeData = data.frame(frame$go_id, frame$Evidence, frame$systematic_name)
goFrame = GOFrame(goframeData, organism = "Saccharomyces cerevisiae")
goAllFrame = GOAllFrame(goFrame)
gscSc = GeneSetCollection(goAllFrame, setType = GOCollection())
Y lo guardamos.
Habitualmente cuando queramos utilizar estos grupos tendremos
que hacer dos cosas:
data(bdmy,package="tamidata")
data(gse1397,package="tamidata")
library(annotate)
annotation(gse1397)
## [1] "hgu133a"
library(hgu133a.db)
library(GSEABase)
gse1397.gsc = GeneSetCollection(gse1397,setType=GOCollection())
names(gse1397.gsc) = unlist(lapply(gse1397.gsc,setName))
data(gse1397.gsc,package="tamidata")
gsc = gse1397.gsc
length(gsc)
## [1] 12681
grupos de genes 309
(g1 = gsc[[1]])
## setName: GO:0000002
## geneIds: 202825_at, 203466_at, ..., 219393_s_at (total: 11)
## geneIdType: Annotation (hgu133a)
## collectionType: GO
## ids: GO:0000002 (1 total)
## evidenceCode: EXP IDA IPI IMP IGI IEP ISS ISO ISA ISM IGC IBA IBD IKR IRD RCA TAS NAS IC ND IEA
## ontology: CC MF BP
## details: use 'details(object)'
geneIds(g1)
unlist(mget(geneIds(g1),hgu133aENTREZID))
unlist(mget(geneIds(g1),hgu133aENSEMBL))
## 202825_at 203466_at
## "ENSG00000151729" "ENSG00000115204"
## 204858_s_at 208328_s_at
## "ENSG00000025708" "ENSG00000068305"
## 209017_s_at 212607_at1
## "ENSG00000196365" "ENSG00000117020"
## 212607_at2 212609_s_at1
## "ENSG00000275199" "ENSG00000117020"
## 212609_s_at2 214684_at
## "ENSG00000275199" "ENSG00000068305"
310 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## 214821_at 217497_at
## "ENSG00000151729" "ENSG00000025708"
## 219393_s_at1 219393_s_at2
## "ENSG00000117020" "ENSG00000275199"
head(table(sapply(geneIds(gsc),length)))
##
## 1 2 3 4 5 6
## 2336 1661 1296 1039 740 608
Podemos ver que de tamao uno tenemos 2336 grupos. Nos que-
damos con aquellos grupos que, al menos, tienen 50 genes.
library(org.Sc.sgd.db)
frame = toTable(org.Sc.sgdGO)
goframeData = data.frame(frame$go_id, frame$Evidence, frame$systematic_name)
goFrame = GOFrame(goframeData, organism = "Saccharomyces cerevisiae")
goAllFrame = GOAllFrame(goFrame)
gscSc = GeneSetCollection(goAllFrame, setType = GOCollection())
save(gscSc,file="gscSc.rda")
data(gscSc,package="tamidata")
gsc1[[1]]
## setName: GO:0000001
## geneIds: YNL304W, YAL048C, ..., YNR035C (total: 29)
## geneIdType:
## collectionType: GO
## ids: GO:0000001 (1 total)
## evidenceCode: EXP IDA IPI IMP IGI IEP ISS ISO ISA ISM IGC IBA IBD IKR IRD RCA TAS NAS IC ND IEA
## ontology: CC MF BP
## details: use 'details(object)'
save(gscHs,file = paste(dirTamiData,"gscHs.rda",sep=""))
pacman::p_load(EnrichmentBrowser)
hsaKEGGgsc=get.kegg.genesets("hsa")
Qu tenemos?
class(hsaKEGGgsc)
## [1] "list"
312 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
head(names(hsaKEGGgsc))
## [1] "hsa00010_Glycolysis_/_Gluconeogenesis"
## [2] "hsa00020_Citrate_cycle_(TCA_cycle)"
## [3] "hsa00030_Pentose_phosphate_pathway"
## [4] "hsa00040_Pentose_and_glucuronate_interconversions"
## [5] "hsa00051_Fructose_and_mannose_metabolism"
## [6] "hsa00052_Galactose_metabolism"
hsaKEGGgsc[[3]]
o bien con
hsaKEGGgsc$"hsa00030_Pentose_phosphate_pathway"
sceKEGGgsc=get.kegg.genesets("sce")
16.8 Ejercicios
Ej. 13 Construir los grupos basados en Gene Ontology y en
KEGG para el ratn (Mus musculus).
conteos = matrix(c(30,120,40,156),ncol=2)
fisher.test(conteos,alternative = "greater")
##
## Fisher's Exact Test for Count Data
##
## data: conteos
## p-value = 0.589
## alternative hypothesis: true odds ratio is greater than 1
## 95 percent confidence interval:
## 0.6018802 Inf
## sample estimates:
## odds ratio
## 0.9750673
fisher.test(conteos,alternative = "less")
##
## Fisher's Exact Test for Count Data
##
## data: conteos
## p-value = 0.5179
## alternative hypothesis: true odds ratio is less than 1
## 95 percent confidence interval:
## 0.000000 1.571751
## sample estimates:
## odds ratio
## 0.9750673
318 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
0.6
1.8
0.5
0.4
1.6
Odds ratio
pvalores
0.3
1.4
0.2
1.2
0.1
1.0
0.0
k k
17.3.1 GSE1397
library(Biobase)
data(gse1397,package = "tamidata")
eset = gse1397
y = pData(eset)[,"type"]
remove(gse1397) ## Ahorramos memoria
library(genefilter);library(multtest)
tt = rowttests(eset,y)
p0 = tt$p.value
p1 = mt.rawp2adjp(p0, "BH")
orden.original = order(p1$index)
p.BH = p1$adjp[orden.original,2]
significativos = which(p.BH < 0.05)
Qu anotacin tienen?5 5
Es una base de datos asociada a un
chip.
320 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
annotation(eset)
## [1] "hgu133a"
library(hgu133a.db)
## [1] 6
## [1] 0
seleccionados = unlist(mget(featureNames(eset[significativos,]),
hgu133aENTREZID))
library(GO.db)
library(Category)
library(GOstats)
head(summary(overRepresented))
library(Rgraphviz)
plot(goDag(overRepresented))
library(Rgraphviz)
png(file=paste(dirTamiFigures,"GSE1397overRepresented.png",sep=""))
plot(goDag(overRepresented))
dev.off()
17.3.2 GSE20986
Leemos los datos normalizados y lo renombramos.
Biobase::annotation(gse)
## [1] "hgu133plus2"
library("hgu133plus2.db")
library(genefilter)
gse.filt = nsFilter(gse, var.func = IQR, var.cutoff = 0.6,
require.GOBP = TRUE)$eset
dim(gse.filt)
## Features Samples
## 5974 12
## [1] 0
test de fisher unilateral 323
## [1] 6
## [1] 0
library(multtest)
gse.aov = rowFtests(gse.filt2, pData(gse20986)[,"tissue"])
p.originales = gse.aov[, 2]
p.BH = mt.rawp2adjp(p.originales, "BH")
pvalores = p.BH$adjp[p.BH$index, 2]
sig.1234 = which(pvalores < 0.001)
selected = unlist(mget(featureNames(gse.filt2[sig.1234,]), hgu133plus2ENTREZID))
library(GO.db);library(Category);library(GOstats)
fl = tempfile()
htmlReport(overRepresented, file = fl)
browseURL(fl)
17.3.3 ALL
Esta seccin se reproduce el anlisis propuesto en http://www.
bioconductor.org/help/course-materials/2009/SSCMay09/gsea/
HyperG_Lecture.pdf. Utilizamos los datos Li [2009, ALL]. En 5.4
se indica cmo conseguir los datos bcrneg en donde hemos seleccio-
nado algunas muestras. Los datos los tenemos en bcrneg. Veamos
nmero de genes y muestras.
dim(bcrneg)
## Features Samples
## 12625 79
dim(bcrneg.filt)
## Features Samples
## 4032 79
names(rttPrb) = featureNames(bcrneg.filt)
ids = featureNames(bcrneg.filt)
map = hgu95av2ENTREZID
library(GO.db)
GOTERM[["GO:0006468"]]
## GOID: GO:0006468
## Term: protein phosphorylation
## Ontology: BP
## Definition: The process of introducing a
## phosphate group on to a protein.
## Synonym: protein amino acid phosphorylation
library(Category)
library(GOstats)
Veamos el resumen.
head(summary(overRepresented), n = 3)
fl = tempfile()
htmlReport(overRepresented, file = fl)
browseURL(fl)
17.4 EnrichmentBrowser
pacman::p_load(EnrichmentBrowser)
data(gse1397,package="tamidata")
gse1397 =probe.2.gene.eset(gse1397)
gse1397 = de.ana(gse1397) ## t-test moderados (limma)
hsaKEGGgsc = get.kegg.genesets("hsa")
gs.ranking(gse1397KEGGora)
## 1 hsa00190_Oxidative_phosphorylation
## 2 hsa05012_Parkinson's_disease
## 3 hsa05010_Alzheimer's_disease
## 4 hsa05016_Huntington's_disease
## 5 hsa05321_Inflammatory_bowel_disease_(IBD)
## 6 hsa05140_Leishmaniasis
## 7 hsa05132_Salmonella_infection
## NR.GENES NR.SIG.GENES P.VALUE
## <numeric> <numeric> <numeric>
## 1 106 2 0.00109
## 2 115 2 0.00128
## 3 148 2 0.00211
## 4 162 2 0.00253
## 5 61 1 0.03280
## 6 69 1 0.03710
## 7 74 1 0.03970
save(hsaGOBPgsc,file=paste(dirTamiData,"hsaGOBPgsc.rda",sep=""))
gs.ranking(gse1397GOBPora)
## 10 GO:0060333_interferon-gamma-mediated_signaling_pathway
## 11 GO:0009615_response_to_virus
## NR.GENES NR.SIG.GENES P.VALUE
## <numeric> <numeric> <numeric>
## 1 17 2 1.28e-05
## 2 90 2 3.74e-04
## 3 118 2 6.43e-04
## 4 14 1 4.96e-03
## 5 16 1 5.67e-03
## ... ... ... ...
## 7 36 1 0.0127
## 8 40 1 0.0141
## 9 46 1 0.0162
## 10 74 1 0.0260
## 11 103 1 0.0361
17.5 goseq
library(goseq)
data(PRJNA297664,package="tamidata")
library(GenomicRanges)
View(supportedGenomes())
View(supportedGeneIDs())
library(edgeR)
dge = DGEList(counts=assay(PRJNA297664),group=colData(PRJNA297664)[,"treatment"])
dge.c = estimateCommonDisp(dge) ##Estimamos dispersin comn
dge.t = estimateTagwiseDisp(dge.c) ##Dispersiones por gen
et.t = exactTest(dge.t)
genes=as.integer(p.adjust(et.t$table$PValue[et.t$table$logFC!=0],
method="BH")<.01)
names(genes)=row.names(et.t$table[et.t$table$logFC!=0,])
table(genes)
test de fisher unilateral 331
## genes
## 0 1
## 6114 590
pwf=nullp(genes,"sacCer3","sgdGene")
0.15
Proportion DE
0.10
0.05
length_sc3 = getlength(rownames(PRJNA297664),"sacCer3","sgdGene")
library(ggplot2)
df1 = data.frame(length_sc3)
ggplot(df1,aes(x=length_sc3))+geom_density()
6e04
4e04
density
2e04
0e+00
17.6 Ejercicios
Ejercicio 16
Utilizamos los datos tamidata::gse20986. En el problema 10 he-
mos determinado los genes significativos con un FDR de 0.05 para
las comparaciones entre las muestras obtenidas en el iris, retina y
coroides con las muestras huvec. Tenemos pues tres grupos de genes
significativos que podemos denotar Siris , Sretina y Scoroides .
18.1 Introduction
1 1
Lo tratado en este captulo tiene
mucho que ver con la obra teatral
de Lope de Vega, Fuenteovejuna. Se
El problema abordado en este captulo corresponde a lo que recomienda el video http://www.
youtube.com/watch?v=-IcuFn57nAo. -
se conoce como anlisis de conjunto de genes.2 Estudiamos si hay Quin mat al Comendador?
relacin entre conjuntos de genes previamente definidos y fenoti- - Fuenteovejuna, seor.
-Quin es Fuenteovejuna?
po.3 Estos grupos vendrn definidos segn distintos criterios. Por - Todo el pueblo, a una. Esta frase
ejemplo, corresponder a una ruta metablica, o localizados en un aparece repetida en la obra y es bsica
mismo cromosoma o bien definidos utilizando trminos de Gene On- en este tema. Este tema va de esto,
de la accin conjunta de un conjunto
tology. De un modo genrico, un conjunto de genes que represente de genes. Unos pocos habitantes no
algo interpretable desde un punto de vista biolgico. Ya no estamos pueden pero todos los habitantes de
Fuenteovejuna s que pueden.
interesados en un anlisis marginal o gen a gen de los datos de expre-
sin. En un anlisis de expresin diferencial el resultado final es una 2
En la literatura se refieren a este
problema como gene set analysis, gene set
lista ordenada de genes de modo que una mayor asociacin con la enrichment analysis, set based enrichment
covariable fenotpica produce una posicin ms alta en la lista. Un analysis.
procedimiento de tests mltiples nos produce una clasificacin en 3
Donde fenotipo se entiende en un
sentido amplio como en todo el texto.
genes significativos y no significativos. En definitiva un valor de corte
de la lista. En esta aproximacin no usamos ningn conocimiento previo
sobre relaciones conocidas entre genes que podran ser esenciales a la
hora de determinar la asociacin no ya gen-fenotipo sino conjunto de
genes-fenotipo.
X = [ Xij ]i=1,...,N;j=1,...,n
334 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
x = [ xij ]i=1,...,N;j=1,...,n
comp
Hiptesis nula competitiva H0 : Los genes en un grupo dado S estn
como mucho tan frecuentemente expresados de un modo diferen-
cial como los genes en G c .
18.4 Ejemplos
N = 1000; n = 50
set.seed(280562) ## Para obtener los mismos valores generados
et1 = matrix(rnorm(N*n),nrow = N,ncol = n)
et1[1:10,26:50] = et1[1:10,26:50] + 2.5
et1.tt = genefilter::rowttests(et1,y.et)$statistic
pacman::p_load("ggplot2")
0.3
df = data.frame(et1.tt)
ggplot(df,aes(x=et1.tt))+geom_density()
density
0.2
0.1
N = 1000; n = 50
set.seed(280562)
indices.temp = (0:49)*20 + 1
indices = NULL
for(i in indices.temp) indices = c(indices,i:(i+9))
et2 = matrix(rnorm(N*n),nrow = N,ncol = n)
et2[indices,26:50] = et1[1:10,26:50] + 2.5
et2.tt = genefilter::rowttests(et2,y.et)$statistic
0.06
pacman::p_load("ggplot2")
0.04
df = data.frame(et2.tt)
density
ggplot(df,aes(x=et2.tt))+geom_density()
0.02
50 40 30 20 10 0
et2.tt
El primer paso es cuantificar la asociacin entre los niveles de Figura 18.2: Densidad estimada de
expresin de cada gen y el fenotipo. Esta cuantificacin ser un es- et1.tt.
tadstico (una funcin de los datos que son las expresiones en la fila
de la matriz de expresin) cuya definicin depender del tipo de
informacin fenotpica disponible. Por ejemplo, si tenemos dos condi-
ciones entonces este estadstico ser (habitualmente pero no siempre)
el estadstico t que se utiliza en la comparacin de medias de dos po-
blaciones normales ( 8.7.1). Pero no necesariamente, por ejemplo, si
los tamaos muestras n1 y n2 son muy pequeos entonces muy pro-
bablemente un estadstico como la diferencia de medias es suficiente
(y menos peligroso).
Si las muestras las tenemos clasificadas en ms de dos grupos
entonces podemos utilizar el valor del estadstico F del anlisis de la
varianza ( 8.9).
En 10.1 se estudiaba el mtodo SAM (en el contexto de la expre-
sin diferencial marginal). Este mtodo propone, dependiendo de las
338 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
|{b : tb > t0 }|
pr = . (18.2)
B
En el caso en que una mayor asociacin se exprese como un valor
muy grande (positivo) o muy pequeo (negativo) de t entonces el p
valor vendra dado por
|{b : |tb | > |t0 |}|
pr = , (18.3)
B
ya que tendramos un test bilateral.
Ejemplo 21. Consideremos el ejemplo 19, en concreto, los valores del pri-
mer gen. La covariable y nos indica la pertenencia a control o tratamiento.
Como medida de asociacin consideramos el estadstico t (con varianzas
desiguales). Notemos que una asociacin grande supone un valor o muy
grande (positivo) o muy pequeo (negativo).
u = et1[1,]
t0 = t.test(u ~ y.et)$statistic
t0 = abs(t0)
B = 100
tb = rep(0,B)
for(i in 1:B) tb[i] = t.test(u ~ sample(y.et))$statistic
tb = abs(tb)
## [1] 0
18.8 Limma::genSetTest
library(limma)
geneSetTest(1:20,et1.tt,alternative ="up")
## [1] 0.9984722
geneSetTest(1:20,et1.tt,alternative ="down")
## [1] 0.00153168
pvalores = NULL
for(i in 0:49){
indices = (i * 20 + 1): (i * 20 + 10)
p.temp = geneSetTest(indices,et1.tt,alternative ="down")
pvalores = c(pvalores,p.temp)
}
data(gse1397,package="tamidata")
data(gse1397.gsc,package="tamidata")
gsc = gse1397.gsc
342 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
indices = is.element(featureNames(gse1397),geneIds(gsc[[1]]))
library(genefilter)
fac0 = pData(gse1397)[,"type"]
gse1397.tt = rowttests(gse1397,fac0)$statistic
geneSetTest(indices,gse1397.tt,alternative ="mixed")
## [1] 0.988849
(numgrupos = length(gsc))
pvalores = NULL
for(i in 1:numgrupos){
indices = is.element(featureNames(gse1397),geneIds(gsc[[i]]))
p.temp = geneSetTest(indices,gse1397.tt,alternative ="mixed")
pvalores = c(pvalores,p.temp)
} density.default(x = pvalores)
pdf("figures/gse1397gscpvalores.pdf")
1.0
plot(density(pvalores),xlim=c(0,1))
0.8
dev.off()
0.6
Density
p-valores observados.
0.2
gsc.ordenada = gsc[orden]
names(gsc.ordenada[1:10])
18.9 Limma::wilcoxGST
wilcoxGST(1:20,et1.tt,alternative ="down")
## [1] 0.00153168
wilcoxGST(1:20,et1.tt,alternative ="up")
## [1] 0.9984722
wilcoxGST(1:20,et1.tt,alternative ="mixed")
## [1] 2.837697e-08
wilcoxGST(21:30,et1.tt,alternative ="down")
## [1] 0.09546351
wilcoxGST(21:30,et1.tt,alternative ="up")
## [1] 0.904723
wilcoxGST(21:30,et1.tt,alternative ="mixed")
## [1] 0.8181643
344 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
18.10 Limma::CAMERA
El mtodo fue propuesto en Wu and Smyth [2012].14 Es un pro- El nombre es un acrnimo Correlation
14
normal.
18.11 GSA
19 Se utiliza la distribucin de permutacin a la que aplican una 19
En el paquete Efron and Tibshirani
reestandarizacin. La medida de enriquecimiento que proponen por [2010, GSA] se implementa el mtodo
propuesto en Efron and Tibshirani
defecto 20 es la siguiente: partimos de los valores ti que miden aso- [2007].
ciacin gen-fenotipo. Definimos t+ = max{t, 0} y t = mn{t, 0}. 20
Aunque lleva el promedio de los ti s y
ti+ el promedio de |ti | como otras opciones.
Consideramos un conjunto de genes S. Definimos t+
S = i S nS y
t
t
S = iS niS .
Finalmente la medida de enriquecimiento (que llamare-
mos el estadstico maxmean) es
t (S) = max{t+
S , tS }. (18.7)
anlisis de conjuntos de genes 345
Ejemplo 25. Efron and Tibshirani [2007, pgina 119] La medida de en-
riquecimento que acabamos de definir es robusta frente al caso en que
tengamos una medida extrema. El ejemplo que proponen los autores es
el siguiente: supongamos que tenemos 100 genes, 99 de los valores ti s
son -0.5 y el valor restante es 10. Tenemos que t+
S = 10/100 = 0,1 y
t
S = 99 ( 0,5 ) /100 = 0,495. Vemos que los valores negativos dominan
pues son la mayor parte de los datos. Si se tomara la media de las partes
positivas t+ y la media de las partes negativas t tendramos los valores
10 y -0.5 (es decir, solamente consideramos cuando el valor no es nulo) y la
medida de enriquecimiento vendra dominada por valores extremos.
library(GSA)
head(et1.gsa$GSA.scores)
summary(et1.gsa$GSA.scores[-1])
Los p-valores obtenidos para lo que ellos llaman genes negativos que
corresponden con genes que en la clase 2 tiene expresiones menores. Podemos
obtenerlos con
head(et1.gsa$pvalues.lo)
head(et1.gsa$pvalues.hi)
summary(et1.gsa$pvalues.hi[-1])
head(et1.gsa$gene.scores)
variabilidad del primer grupo y que se solape por la parte inferior con el
1
resto de los genes. El anlisis de grupo que hemos realizado lo diferencia sin
0
problemas.
1
Grupo 1 Resto
0.500
False discovery rate
o Negative
GSA.plot(et1.gsa) o Positive
0.050
Vemos cmo solamente admitimos un grupo con un valor bajo de FDR.
0.005
Ejemplo 27 (Ejemplo 20 con GSA). En el ejemplo 20 todos los grupos
0.001
considerados tienen el mismo comportamiento. Aunque todos tienen expre-
grupo = c(rep(1,25),rep(2,25))
et2.gsa = GSA(et2,grupo, genenames=genenames.et, genesets=gsc.et,
resp.type="Two class unpaired", nperms=100)
1.0
0.9
False discovery rate
0.8
GSA.plot(et2.gsa)
0.7
Es claro que ningn grupo se diferencia de los dems.
0.6
Ejemplo 28 (Datos GSE1397 y GSA). Leemos los datos.
0.5
pvalue
data(gse1397.gsc,package="tamidata")
gsc = gse1397.gsc Figura 18.6: Grupos significativos con
datos et2 en funcin de FDR.
gruposGrandes = which(sapply(geneIds(gsc),length) > 50)
gsc = gsc[gruposGrandes]
gse = gse1397
tipo.num = as.numeric(pData(gse)[,"type"])
library(tamidata)
data(gse1397.gsa)
0.500
0.050
GSA.plot(gse1397.gsa)
0.005
Fijamos una tasa de error de 0.05. Veamos qu grupos son los que o
bien con una asociacin negativa o bien con asociacin positiva son los que
0.001
presentan una mayor diferenciacin entre los dos grupos considerados (con 0.001 0.005 0.020 0.100 0.500
y sin sndrome de Down). Primero determinar los ndices de los grupos en pvalue
names(gsc[ind.lo])
y para otros
names(gsc[ind.hi])
Y ahora viene el trabajo del especialista para ver hasta qu punto lo que
sale tiene sentido o no. Y si no tiene sentido desde el punto de vista biolgico
se descarta.
data(gscSc,package="tamidata")
data(bdmy,package="tamidata")
library(limma)
exprs2 = normalizeBetweenArrays(exprs1)
subsettingGeneSet = function(gs0,fn0){
geneIds(gs0) = geneIds(gs0)[is.element(geneIds(gs0),fn0)]
gs0
350 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
}
bdmy.gsc = sapply(gscSc,subsettingGeneSet,fn0 = featureNames(bdmy))
bdmy.gsc = GeneSetCollection(bdmy.gsc)
GeneSets = NULL
for(i in 1:length(gsc)){
temp = cbind(geneIds(gsc[[i]]),rep(names(gsc)[i],
length(geneIds(gsc[[i]]))))
GeneSets = rbind(GeneSets,temp)
}
bdmy.gsc.piano = loadGSC(GeneSets)
library(genefilter)
bdmy.rtt = rowttests(exprs2,pData(bdmy)[,"tipo"])
bdmy.t = data.frame(bdmy.rtt[,"statistic"])
bdmy.p = data.frame(bdmy.rtt[,"p.value"])
rownames(bdmy.t) = featureNames(bdmy)
rownames(bdmy.p) = featureNames(bdmy)
Mtodo
Empezamos ordenando el universo de genes de acuerdo al grado
de asociacin gen-fenotipo utilizando algunos de los estadsticos
propuestos en 18.5. Tendremos la lista de genes ordenada, L.
1
h S (i ) =
ri S | t i | p
|t j | p , (18.8)
ji;r j S
Calculamos tambin
1
m S (i ) = N nS
, (18.9)
ji;r j
/S
y
eSk ,i
e = |{ k, i : eSk ,i < 0}|
.
k,i:eS <0
k ,i
y
eSk ,i , si e
Sk ,i > 0,
eSk ,i = eSe+,
k i , si eS , < 0.
e k i
Si e < 0 entonces
Utilizando piano
En esta seccin realizamos un anlisis con el mtodo GSEA de los
datos tamidata::bdmy utilizando el paquete Varemo and Nookaew
[2015, piano].
iS (ti tS )2 (nS 1)
E (2) = p N (0, 1) (18.12)
2( n S 1)
library(multtest)
library(genefilter)
Cargamos el ExpressionSet.
anlisis de conjuntos de genes 355
data(gse1397,package="tamidata")
data(gse1397.gsc,package="tamidata")
gsc = gse1397.gsc
gruposGrandes = which(sapply(geneIds(gsc),length) > 50)
gsc = gsc[gruposGrandes]
tstat = rowttests(exprs(gse1397),pData(gse1397)[,"type"])$statistic
fset = which(is.element(featureNames(gse1397),geneIds(gsc[[1]])))
tami.Irizarry09(tstat,fset)
Vemos que los p-valores obtenidos nos permiten afirmar que el grupo
tiene una asociacin con el fenotipo (en este caso el sndrome de Down).
Podemos calcularlo para todos los grupos.
allgsc = matrix(0,ncol=4,nrow=length(gsc))
colnames(allgsc) = c("E1","p1","E2","p2")
for(i in 1:length(gsc)){
fset = which(is.element(featureNames(gse1397),geneIds(gsc[[i]])))
a = tami.Irizarry09(tstat,fset)
allgsc[i,] = c(a$E1,a$p1,a$E2,a$p2)
}
ti
= E(tS ) = N
, (18.13)
iG
tS
Z= (18.15)
con y dados en las ecuaciones 18.13 y 18.14. Bajo la hiptesis nula
de que no hay ningn gen diferencialmente expresado en el conjun-
to de genes S entonces Z tiene aproximadamente una distribucin
normal estndar.
Z N (0, 1). (18.16)
18.16 EnrichmentBrowser
pacman::p_load("EnrichmentBrowser")
data(gse1397,package="tamidata")
gse1397=probe.2.gene.eset(gse1397)
gse1397 = de.ana(gse1397)
load("hsaKEGGgsc.rda")
gs.ranking(gse1397KEGGgsea)
load("hsaGOBPgsc.rda")
gs.ranking(gse1397GOBPgsea)
18.17 Piano
El paquete Piano31 Varemo and Nookaew [2015, piano] tiene como Platform for Integrative Analysis of
31
referencia asociada Vremo et al. [2013] y una vieta muy interesan- Omics data.
distintas.
pacman::p_load(piano)
data(gse1397,package = "tamidata")
gse1397.rtt = genefilter::rowttests(gse1397,pData(gse1397)[,"type"])
gse1397.t = data.frame(gse1397.rtt[,"statistic"])
gse1397.p = data.frame(gse1397.rtt[,"p.value"])
rownames(gse1397.t) = featureNames(gse1397)
rownames(gse1397.p) = featureNames(gse1397)
head(gse1397.t)
## gse1397.rtt....statistic..
## 1007_s_at -0.6183648
## 1053_at 0.6022344
## 117_at 1.5635785
## 121_at -0.8738516
## 1255_g_at 0.3815208
## 1294_at 2.9096918
pacman::p_load("GSEABase")
360 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
GeneSets = reshape2::melt(geneIds(gsc))
gse1397.gsc.piano = loadGSC(GeneSets)
Reporter features
Media muestral
Mediana
Suma
gse1397.t.gsa.piano
names(gse1397.t.gsa.piano)
head(GSAsummaryTable(gse1397.t.gsa.piano),n=1)
View(GSAsummaryTable(gse1397.t.gsa.piano))
GSAsummaryTable(gse1397.t.gsa.piano)[820,]
Podemos ver que el grupo tiene Genes (tot) genes, el valor agre-
gado o estadstico del grupo con los valores originales es Stat (dist.dir).
Utilizamos aleatorizacin por filas (gene sampling). La significa-
cin del estadstico Stat (dist.dir) para un test unilateral ha-
cia valores mayores es de p (dist.dir.up) y si lo ajustamos (por
Benjamini-Hochberg) vale p adj (dist.dir.up). Para un test hacia
valores menores es muy significativo, p (dist.dir.dn) y ajusta-
do p adj (dist.dir.dn). En definitiva con los valores originales
y el enriquecimiento medio tenemos que es significativamente me-
nor este grupo que otros grupos del mismo tamao elegido al azar.
Ahora consideramos el mdulo de los valores originales. El estads-
tico agregado o enriquecido es Stat (non-dir.) con un p-valor de
364 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
gse1397.s = GSAsummaryTable(gse1397.t.gsa.piano)
##
## FALSE TRUE
## 830 38
##
## FALSE TRUE
## 863 5
nw = networkPlot(gse1397.t.gsa.piano,class="non",significance = 0.01)
18.18 GSVA
18.19 ReactomePA
19.1 DEGraph
Mtodo
Se trata de proponer tests multivariantes para estudiar expresin
diferencial (bsicamente, cambios en el vector de medias) y que sean
coherentes con una estructura de grafo dada.
Consideremos un grafo con p genes. Este grafo es G = (V, E)
donde V es el conjunto de vrtices mientras que E es el conjunto de
aristas. Consideramos el vector R p que nos indicar la diferencia
en la expresin media entre dos condiciones.
Sea EG una funcin de energa definida sobre el grafo. Cmo
368 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
EG () = 0 QG , (19.1)
donde QG es L entonces
EG () = (i j )2 (19.2)
i,jV
p
donde di = j=1 | a ji |. Se comprueba que
EG () = 0 MG , (19.7)
1 0 0 1 0
siendo MG = ( I D A ) ( I D A ), D = diag(d1 , . . . , d
p)y
I = diag( I (d1 6= 0), . . . , I (d p 6= 0)) Una vez tenemos esta forma
5 5
El elemento I es no nulo si di 6= 0 y
cuadrtica podemos hacer su descomposicin en valores singulares, nulo en otro caso.
n1 n2
Tk2 = ( x x2 )0 U[k] (U[0k] SU[k] )1 U[0k] ( x1 x2 ) =
n1 + n2 1
n1 n2
( x x2 )0 U I[k] U 0 (U I[k] U 0 SU I[k] U 0 )+ U I[k] U 0 ( x1 x2 ). (19.10)
n1 + n2 1
donde A+ es la inversa generalizada de la matriz A. El estadstico
dado en 19.10 es el utilizado en el contraste.
370 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
Ejemplo
library(DEGraph)
Parte VI
Agregacin
20
Listas de caractersticas ordenadas
1 1
Este captulo est basado fundamen-
talmente en Boulesteix and Slawski
[2009] y su implementacin en el pa-
En temas anteriores hemos visto cmo cuando realizamos un quete Slawski and Boulesteix. [2015,
anlisis de cada caracterstica marginalmente obtenemos un estadsti- GeneSelector]. De hecho, no es ms que
un resumen. Una buena referencia es
co y un p-valor asociado. Por ejemplo, en la situacin ms simple de Chen et al. [2015].
comparacin de dos grupos de muestras (dos condiciones) podemos
utilizar un t-test (bilateral). De hecho ordenamos las caractersticas
segn el mdulo del estadstico es mayor o bien si el p-valor es ms
pequeo. Ambos criterios producen la misma ordenacin.2 2
Si es con el estadstico ordenamos de
En lo anterior estas listas las hemos usado slamente a fin de de- mayor a menor y si es con el p-valor la
ordenacin se hace de menor a mayor.
terminar en qu posicin cortar de modo que por encima del punto
de corte declaramos que un test es significativo y por debajo que no
lo es. Este es el nico uso que podemos realizar de esta ordenacin?
No, claro. Supongamos que obtenemos 1000 caractersticas signifi-
cativas con un FDR de 0.05. De qu nos sirve? El investigador va
a seguir estudiando cada uno de estos genes? No es probable que
tenga dinero para ello.3 Lo ms probable es que elija seguir estu- 3
Bueno, a lo mejor en Estados Unidos o
diando aquellos genes que aparecen en la parte superior de la lista Alemania. Eso dicen.
r j = i (i ) = j.
library(GeneSelector)
library(tamidata)
data(gse1397)
x = exprs(gse1397)
y = pData(gse1397)[,"type"]
fc = RankingFC(x,y)
tstat = RankingTstat(x,y)
limma = RankingLimma(x,y,proportion=0.01)
foxdimmic = RankingFoxDimmic(x,y,m=100)
shrinkt = RankingShrinkageT(x,y)
class(tstat)
## [1] "GeneRanking"
## attr(,"package")
## [1] "GeneSelector"
getSlots("GeneRanking")
## x y statistic ranking
## "matrix" "factor" "numeric" "numeric"
## pval type method
## "vector" "character" "character"
tstat@y
## [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2
## Levels: 1 2
head(tstat@ranking)
head(tstat@statistic)
head(tstat@pval)
tstat@type
## [1] "unpaired"
tstat@method
## [1] "ordinaryT"
toplist(tstat,top=10)
fc.top = toplist(fc,top=10,show=FALSE)
tstat.top = toplist(tstat,top=10,show=FALSE)
limma.top = toplist(limma,top=10,show=FALSE)
foxdimmic.top = toplist(foxdimmic,top=10,show=FALSE)
shrinkt.top = toplist(shrinkt,top=10,show=FALSE)
global.top = cbind(fc.top[,"index"],tstat.top[,"index"],limma.top[,"index"],
foxdimmic.top[,"index"],shrinkt.top[,"index"])
colnames(global.top) = c("fc","tstat","limma","foxdimmic","shrinkt")
Y obtenemos.
global.top
lista = list(fc,tstat,limma,foxdimmic,shrinkt)
genesel = GeneSelector(lista,maxrank=10)
show(genesel)
listareducida = list(tstat,limma,foxdimmic,shrinkt)
genesel = GeneSelector(listareducida,maxrank=10)
show(genesel)
which(slot(genesel,"selected") == 1)
## [1] 6303
genesel = GeneSelector(listareducida,maxrank=50)
show(genesel)
which(slot(genesel,"selected") == 1)
set.seed(1979)
Aplicamos jackknife con dejando fuera cada vez una de las mues-
tras originales. 11 Observemos que se impone una restriccin a esto y 11
En definitiva, un leaving-one-out.
es que cada clase ha de tener un tamao de, al menos, 6 muestras.
leave1out.tstat = RepeatRanking(tstat,leave1out,scheme="subsampling")
nal y las que tiene con los nuevos datos perturbados o modificados.
Es la figura ??.
400
300
plot(leave1out.tstat)
200
100
Tambin generamos muestras bootstrap imponiendo la misma Lo que significa que asignamos esa
12
toplist(boot.tstat,show = FALSE)
Vemos que nos muestra la tabla original con los diez primeros
genes, el t-estadstico y el p-valor. La siguiente tabla de frecuencias
muestras los genes que han aparecido al menos una vez entre los 10
primeros y la frecuencia de veces que aparece en cada una de las 10
primeras posiciones.
En la figura 20.1 mostramos las ordenaciones originales en abscisas
frente a las observadas cuando modificamos los datos segn los dis-
tintos procedimientos. Es ms que evidente la tremenda variabilidad
que obtenemos en las ordenaciones.
par(mfrow=c(2,2))
plot(leave1out.tstat, col="blue",
pch=".", cex=2.5, main = "jackknife")
plot(change1.tstat, col="blue",
listas de caractersticas ordenadas 381
400
200
200
0
0
0 50 150 0 50 150
bootstrap ruido
Ranks in perturbed datasets
2000
200
0
puesto.
merged = MergeMethods(lista)
Hemos de agregar las ordenaciones. La opcin ms bsica sera Figura 20.2: Heatmap para las or-
promediar, por gen, los rdenes obtenidos. denaciones obtenidas con distintos
estadsticos.
Secuencias
21
Secuencias
21.1 Biostrings
library(Biostrings)
DNA_ALPHABET
## [1] "A" "C" "G" "T" "M" "R" "W" "S" "Y" "K" "V"
## [12] "H" "D" "B" "N" "-" "+" "."
DNA_ALPHABET[1:4]
(sec = sample(DNA_ALPHABET[1:4],15,replace=TRUE))
## [1] "A" "T" "T" "T" "G" "C" "A" "C" "A" "C" "G"
## [12] "T" "G" "C" "T"
paste(sec,collapse="")
## [1] "ATTTGCACACGTGCT"
Qu tenemos?
bs
length(bs)
## [1] 52
(ds = paste(sample(DNA_ALPHABET[c(1:4,16)],30,replace=TRUE),collapse=""))
## [1] "CAGCCT-CGGACCC-GCGGCCCTAA-GCGC"
secuencias 387
(ds = DNAString(ds))
alphabetFrequency(ds)
## A C G T M R W S Y K V H D B N -
## 4 13 8 2 0 0 0 0 0 0 0 0 0 0 0 3
## + .
## 0 0
alphabetFrequency(ds,baseOnly=TRUE)
## A C G T other
## 4 13 8 2 3
alphabetFrequency(ds,baseOnly=TRUE,as.prob=TRUE)
## A C G T
## 0.13333333 0.43333333 0.26666667 0.06666667
## other
## 0.10000000
Biostrings::complement(ds)
reverse(ds)
Qu es la siguiente secuencia?
388 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
reverseComplement(ds)
ds[3]
ds[3:8]
subseq(ds,3,3)
subseq(ds,3,8)
(ds.v = Views(ds,start=c(3,6,10),end=c(8,15,20)))
Tendremos
secuencias 389
ds.v[1]
Y la secuencia con
ds.v[[1]]
ds.set = NULL
for(i in 1:5)
ds.set = c(ds.set,
paste(sample(DNA_ALPHABET[c(1:4,16)],sample(10:15,1),replace=TRUE),collapse=""))
ds.set
(ds.set = DNAStringSet(ds.set))
alphabetFrequency(ds.set,baseOnly=TRUE,as.prob=TRUE)
## A C G T
## [1,] 0.07692308 0.30769231 0.15384615 0.1538462
## [2,] 0.23076923 0.07692308 0.07692308 0.3846154
## [3,] 0.42857143 0.07142857 0.07142857 0.2142857
## [4,] 0.06666667 0.00000000 0.33333333 0.1333333
## [5,] 0.18181818 0.00000000 0.27272727 0.2727273
## other
## [1,] 0.3076923
## [2,] 0.2307692
## [3,] 0.2142857
## [4,] 0.4666667
## [5,] 0.2727273
data(yeastSEQCHR1)
nchar(yeastSEQCHR1)
## [1] 230208
yeastSEQCHR1 = DNAString(yeastSEQCHR1)
length(yeastSEQCHR1)
## [1] 230208
alphabet(yeastSEQCHR1)
## [1] "A" "C" "G" "T" "M" "R" "W" "S" "Y" "K" "V"
## [12] "H" "D" "B" "N" "-" "+" "."
alphabetFrequency(yeastSEQCHR1,baseOnly=TRUE,as.prob=TRUE)
## A C G T other
## 0.3033344 0.1939246 0.1987985 0.3039425 0.0000000
GENETIC_CODE
## TTT TTC TTA TTG TCT TCC TCA TCG TAT TAC TAA TAG
## "F" "F" "L" "L" "S" "S" "S" "S" "Y" "Y" "*" "*"
## TGT TGC TGA TGG CTT CTC CTA CTG CCT CCC CCA CCG
## "C" "C" "*" "W" "L" "L" "L" "L" "P" "P" "P" "P"
## CAT CAC CAA CAG CGT CGC CGA CGG ATT ATC ATA ATG
## "H" "H" "Q" "Q" "R" "R" "R" "R" "I" "I" "I" "M"
## ACT ACC ACA ACG AAT AAC AAA AAG AGT AGC AGA AGG
## "T" "T" "T" "T" "N" "N" "K" "K" "S" "S" "R" "R"
## GTT GTC GTA GTG GCT GCC GCA GCG GAT GAC GAA GAG
## "V" "V" "V" "V" "A" "A" "A" "A" "D" "D" "E" "E"
## GGT GGC GGA GGG
## "G" "G" "G" "G"
AMINO_ACID_CODE
## A R N D C Q E G
## "Ala" "Arg" "Asn" "Asp" "Cys" "Gln" "Glu" "Gly"
## H I L K M F P S
## "His" "Ile" "Leu" "Lys" "Met" "Phe" "Pro" "Ser"
## T W Y V U O B J
## "Thr" "Trp" "Tyr" "Val" "Sec" "Pyl" "Asx" "Xle"
## Z X
## "Glx" "Xaa"
RNA_GENETIC_CODE
## UUU UUC UUA UUG UCU UCC UCA UCG UAU UAC UAA UAG
## "F" "F" "L" "L" "S" "S" "S" "S" "Y" "Y" "*" "*"
## UGU UGC UGA UGG CUU CUC CUA CUG CCU CCC CCA CCG
## "C" "C" "*" "W" "L" "L" "L" "L" "P" "P" "P" "P"
## CAU CAC CAA CAG CGU CGC CGA CGG AUU AUC AUA AUG
## "H" "H" "Q" "Q" "R" "R" "R" "R" "I" "I" "I" "M"
## ACU ACC ACA ACG AAU AAC AAA AAG AGU AGC AGA AGG
## "T" "T" "T" "T" "N" "N" "K" "K" "S" "S" "R" "R"
## GUU GUC GUA GUG GCU GCC GCA GCG GAU GAC GAA GAG
392 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## "V" "V" "V" "V" "A" "A" "A" "A" "D" "D" "E" "E"
## GGU GGC GGA GGG
## "G" "G" "G" "G"
IUPAC_CODE_MAP
## A C G T M R W
## "A" "C" "G" "T" "AC" "AG" "AT"
## S Y K V H D B
## "CG" "CT" "GT" "ACG" "ACT" "AGT" "CGT"
## N
## "ACGT"
21.2 BSgenome
library(BSgenome)
head(available.genomes())
## [1] "BSgenome.Alyrata.JGI.v1"
## [2] "BSgenome.Amellifera.BeeBase.assembly4"
## [3] "BSgenome.Amellifera.UCSC.apiMel2"
## [4] "BSgenome.Amellifera.UCSC.apiMel2.masked"
## [5] "BSgenome.Athaliana.TAIR.04232008"
## [6] "BSgenome.Athaliana.TAIR.TAIR9"
library(BSgenome.Dmelanogaster.UCSC.dm3)
head(seqnames(Dmelanogaster))
alphabetFrequency(Dmelanogaster[["chr4"]],baseOnly=TRUE)
## A C G T other
## 430227 238155 242039 441336 100
secuencias 393
21.3 IRanges
library(IRanges)
(ir0 = IRanges(5,10))
## IRanges of length 1
## start end width
## [1] 5 10 6
str(ir0)
start(ir0)
## [1] 5
end(ir0)
## [1] 10
width(ir0)
## [1] 6
narrow(ir0, start=2)
## IRanges of length 1
## start end width
## [1] 6 10 5
narrow(ir0, end=5)
## IRanges of length 1
## start end width
## [1] 5 9 5
## IRanges of length 1
## start end width
## [1] 2 4 3
range(ir0)
## IRanges of length 1
## start end width
## [1] 5 10 6
reduce(ir0)
## IRanges of length 1
## start end width
## [1] 5 10 6
gaps(ir0)
## IRanges of length 0
disjoin(ir0)
## IRanges of length 1
## start end width
## [1] 5 10 6
21.3.1 Subsetting
Vamos a generar conteos con distribucin Poisson3 3
Siguiendo el ejemplo de la vieta de
Pages et al. [2016b].
secuencias 395
set.seed(0)
lambda = c(rep(0.001, 4500), seq(0.001, 10, length = 500),
seq(10, 0.001, length = 500))
x = rpois(1e7, lambda)
y = rpois(1e7, lambda[c(251:length(lambda), 1:250)])
head(x)
## [1] 0 0 0 0 0 0
tail(x)
## [1] 0 0 0 0 0 0
summary(x)
21.4 Rle
(r = Rle(c(1,1,1,0,0,-2,-2,-2,rep(-1,20))))
str(r)
as.numeric(r)
## [1] 1 1 1 0 0 -2 -2 -2 -1 -1 -1 -1 -1 -1 -1
## [16] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
21.5 GenomicRanges
library(GenomicRanges)
21.5.1 GRanges
La clase GRanges sirve para representar una coleccin de carac-
tersticas genmicas cada una de las cuales tiene un inicio y final
en el genoma (como transcritos o exones). La funcin GRanges nos
permite crear un objeto de esta clase.
gr = GRanges(seqnames =
Rle(c("chr1", "chr2", "chr1", "chr3"), c(1, 3, 2, 4)),
ranges = IRanges(1:10, end = 7:16, names = head(letters, 10)),
strand = Rle(strand(c("-", "+", "*", "+", "-")),c(1, 2, 2, 3, 2)),
score = 1:10,
GC = seq(1, 0, length=10))
gr
secuencias 397
seqnames(gr)
ranges(gr)
## IRanges of length 10
## start end width names
## [1] 1 7 7 a
## [2] 2 8 7 b
398 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## [3] 3 9 7 c
## [4] 4 10 7 d
## [5] 5 11 7 e
## [6] 6 12 7 f
## [7] 7 13 7 g
## [8] 8 14 7 h
## [9] 9 15 7 i
## [10] 10 16 7 j
strand(gr)
mcols(gr)
En particular
mcols(gr)[,"score"]
## [1] 1 2 3 4 5 6 7 8 9 10
La longitud total de las secuencias a las que los rangos estn ali-
neados las podemos almacenar en el objeto GRanges. Suponiendo
que son de los correspondientes cromosomas de Homo Sapiens en-
tonces podemos
secuencias 399
seqlengths(gr) = c(249250621,243199373,198022430)
names(gr)
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
length(gr)
## [1] 10
c(sp[[1]],sp[[2]])
o bien con
secuencias 401
append(sp[[1]],sp[[2]])
gr[c(3,5)]
gr[is.element(names(gr),c("c","e"))]
gr[7,"GC"]
gr0 = gr[c(1:3,10)]
start(gr0)
## [1] 1 2 3 10
end(gr0)
## [1] 7 8 9 16
width(gr0)
## [1] 7 7 7 7
range(gr0)
reduce(gr0)
gaps(gr0)
disjoin(gr0)
coverage(gr0)
## RleList of length 3
## $chr1
## integer-Rle of length 249250621 with 2 runs
## Lengths: 7 249250614
## Values : 1 0
##
## $chr2
404 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
(gr1 = gr[1:2])
IRanges::intersect(gr0,gr1)
IRanges::union(gr0,gr1)
## [2] chr2 [ 2, 9] +
## [3] chr3 [10, 16] -
## -------
## seqinfo: 3 sequences from an unspecified genome
IRanges::setdiff(gr0,gr1)
IRanges::setdiff(gr1,gr0)
21.5.2 GRangesList
Por ejemplo, cuando queramos representar un transcrito formado
por distintos exones. Cada exn vendra representado por un objeto
GRanges pero todo el transcrito sera un GRangesList.
Empezamos creando o definiendo un GRangesList.
gr1 =
GRanges(seqnames = "chr2", ranges = IRanges(3, 6),
strand = "+", score = 5L, GC = 0.45)
gr2 =
GRanges(seqnames = c("chr1", "chr1"),
ranges = IRanges(c(7,13), width = 3),
strand = c("+", "-"), score = 3:4, GC = c(0.3, 0.5))
grl = GRangesList("txA" = gr1, "txB" = gr2)
grl
406 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
seqnames(grl)
## RleList of length 2
## $txA
## factor-Rle of length 1 with 1 run
## Lengths: 1
## Values : chr2
## Levels(2): chr2 chr1
##
## $txB
## factor-Rle of length 2 with 1 run
## Lengths: 2
## Values : chr1
## Levels(2): chr2 chr1
ranges(grl)
## IRangesList of length 2
## $txA
## IRanges of length 1
## start end width
## [1] 3 6 4
##
secuencias 407
## $txB
## IRanges of length 2
## start end width
## [1] 7 9 3
## [2] 13 15 3
strand(grl)
## RleList of length 2
## $txA
## factor-Rle of length 1 with 1 run
## Lengths: 1
## Values : +
## Levels(3): + - *
##
## $txB
## factor-Rle of length 2 with 2 runs
## Lengths: 1 1
## Values : + -
## Levels(3): + - *
length(grl)
## [1] 2
names(grl)
seqlengths(grl)
## chr2 chr1
## NA NA
library(GenomicAlignments)
length(aln1)
## [1] 3271
head(seqnames(aln1))
seqlevels(aln1)
head(strand(aln1))
xnum = as.numeric(xcov$chr4[ranges(z)])
plot(xnum)
y <- readGAlignmentPairs(fl2)
ycov <- coverage(y)
ynum <- as.numeric(ycov$chr4[ranges(z)])
plot(xnum, type="l", col="blue", lwd=2)
lines(ynum, col="red", lwd=2)
library(biomaRt)
m = useMart("ensembl", dataset = "dmelanogaster_gene_ensembl")
lf <- listFilters(m)
lf[grep("name", lf$description, ignore.case=TRUE),]
## name
## 1 _
chromosome name
## 17 with_flybasename_gene
## 19 with_flybasename_transcript
## 23 with_flybasename_translation
## 53 external_gene_name
## 67 flybasename_gene
## 68 flybasename_transcript
## 69 flybasename_translation
## 95 wikigene_name
## 109 go_parent_name
## 210 so_parent_name
## description
## 1 Chromosome name
## 17 with FlyBaseName gene ID(s)
## 19 with FlyBaseName transcript ID(s)
## 23 with FlyBaseName protein ID(s)
## 53 Associated Gene Name(s) [e.g. BRCA2]
## 67 FlyBaseName Gene ID(s) [e.g. cul-2]
## 68 FlyBaseName Transcript ID(s) [e.g. cul-2-RB]
secuencias 411
## ensembl_gene_id flybasename_gene
## 1 FBgn0039907 lgs
require(GenomicFeatures)
require(TxDb.Dmelanogaster.UCSC.dm3.ensGene)
grl = exonsBy(TxDb.Dmelanogaster.UCSC.dm3.ensGene, by="gene")
map$ensembl_gene_id[1]
## [1] "FBgn0039907"
gene = grl[[map$ensembl_gene_id[1]]]
gene
## NULL
require(Gviz)
gtrack <- GenomeAxisTrack()
atrack <- AnnotationTrack(gene, name = "Gene Model")
plotTracks(list(gtrack, atrack))
Utilizando ggbio
Repetimos los dibujos anteriores utilizando Yin et al. [2016, ggbio].
require (ggbio)
autoplot(gene)
autoplot(fl1, which=z)
Y en la segunda muestra.
autoplot(fl2, which=z)
library(seqinr)
choosebank()
Elegimos GenBank.
choosebank("genbank")
query("kras0","k=kras",virtual=TRUE)
Y vemos el nmero.
kras0$nelem
## [1] 49
Y tenemos
krashs0$nelem
## [1] 34
krashs$nelem
## [1] 34
getName(krashs$req[1])
## [1] "AF493917"
getName(krashs$req)
sapply(krashs$req,getName)
sapply(krashs$req,getLength)
seq = sapply(krashs$req[1],getSequence)
getSequence(krashs$req[[1]])[1:15]
## [1] "a" "t" "g" "a" "c" "t" "g" "a" "a" "t" "a"
## [12] "t" "a" "a" "a"
getTrans(krashs$req[[1]])
## [1] "M" "T" "E" "Y" "K" "L" "V" "V" "V" "G" "A"
## [12] "G" "G" "V" "G" "K" "S" "A" "L" "T" "I" "Q"
## [23] "L" "I" "Q" "N" "H" "F" "V" "D" "E" "Y" "D"
## [34] "P" "T" "I" "E" "D" "S" "Y" "R" "K" "Q" "V"
## [45] "V" "I" "D" "G" "E" "T" "C" "L" "L" "D" "I"
## [56] "L" "D" "T" "A" "G" "Q" "E" "E" "Y" "S" "A"
## [67] "M" "R" "D" "Q" "Y" "M" "R" "T" "G" "E" "G"
## [78] "F" "L" "C" "V" "F" "A" "I" "N" "N" "T" "K"
416 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## [89] "S" "F" "E" "D" "I" "H" "H" "Y" "R" "E" "Q"
## [100] "I" "K" "R" "V" "K" "D" "S" "E" "D" "V" "P"
## [111] "M" "V" "L" "V" "G" "N" "K" "C" "D" "L" "P"
## [122] "S" "R" "T" "V" "D" "T" "K" "Q" "A" "Q" "D"
## [133] "L" "A" "R" "S" "Y" "G" "I" "P" "F" "I" "E"
## [144] "T" "S" "A" "K" "T" "R" "Q" "G" "V" "D" "D"
## [155] "A" "F" "Y" "T" "L" "V" "R" "E" "I" "R" "K"
## [166] "H" "K" "E" "K" "M" "S" "K" "D" "G" "K" "K"
## [177] "K" "K" "K" "K" "S" "K" "T" "K" "C" "V" "I"
## [188] "M" "*"
krashsAnot1 = getAnnot(krashs$req[[1]])
table(getSequence(krashs$req[[1]]))
##
## a c g t
## 210 81 133 143
count(getSequence(krashs$req[[1]]),1)
##
## a c g t
## 210 81 133 143
count(getSequence(krashs$req[[1]]),2)
##
## aa ac ag at ca cc cg ct ga gc gg gt ta tc tg tt
## 74 31 57 47 37 12 7 25 56 16 29 32 42 22 40 39
o trinucletidos.
secuencias 417
count(getSequence(krashs$req[[1]]),3)
##
## aaa aac aag aat aca acc acg act aga agc agg agt
## 28 8 21 16 18 4 3 6 23 7 13 14
## ata atc atg att caa cac cag cat cca ccc ccg cct
## 14 4 13 16 14 3 12 8 4 0 0 8
## cga cgc cgg cgt cta ctc ctg ctt gaa gac gag gat
## 5 0 1 1 7 4 5 9 19 13 13 11
## gca gcc gcg gct gga ggc ggg ggt gta gtc gtg gtt
## 7 4 1 4 14 4 5 6 13 4 10 5
## taa tac tag tat tca tcc tcg tct tga tgc tgg tgt
## 13 7 11 11 8 4 3 7 14 5 10 11
## tta ttc ttg ttt
## 8 10 12 9
21.10 Porcentaje de GC
GC(getSequence(krashs$req[[1]]))
## [1] 0.377425
GC1(getSequence(krashs$req[[1]]))
## [1] 0.4814815
o la segunda,
GC2(getSequence(krashs$req[[1]]))
## [1] 0.3280423
o la tercera.
GC3(getSequence(krashs$req[[1]]))
## [1] 0.3227513
418 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
kras = getSequence(krashs$req[[1]])
n = length(kras)
GCperc = double()
for(i in 1:(n-50))
GCperc[i] = GC(kras[i:(i+50)])
plot(GCperc,type="l")
0.5
GCperc
0.4
0.3
0.2
Index
round(rho(getSequence(krashs$req[[1]])),2)
##
## aa ac ag at ca cc cg ct ga gc
## 0.95 1.04 1.16 0.89 1.24 1.04 0.37 1.23 1.14 0.84
## gg gt ta tc tg tt
## 0.93 0.96 0.79 1.08 1.19 1.08
y los Z-valores
round(zscore(getSequence(krashs$req[[1]]),modele='base'),2)
##
## aa ac ag at ca cc cg ct
## -0.66 0.26 1.61 -1.18 1.76 0.15 -3.40 1.28
## ga gc gg gt ta tc tg tt
## 1.40 -0.84 -0.50 -0.34 -2.18 0.45 1.49 0.67
21.12 Alineamiento
kras = sapply(krashs$req,getSequence)
head(kras[[1]])
krasnr1 = c2s(kras[[1]])
subseq = "agacacaa"
countPattern(subseq,krasnr1,max.mismatch=0)
## [1] 1
matchPattern(subseq,krasnr1,max.mismatch=0)
matchPattern(subseq,krasnr1,max.mismatch=1)
matchPattern(subseq,krasnr1,max.mismatch=2)
Y as sucesivamente.
- A G C T Tabla 21.1:
A 2 -1 -1 -1
G -1 2 -1 -1
C -1 -1 2 -1
A -1 -1 -1 2
Tambin hemos de una penalizacin para el hueco (gap). La deno-
tamos por d y podemos darle en nuestro ejemplo el valor d = 2.
El siguiente alineamiento, donde - indica un hueco,
422 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
GAATTC
GATT-A
2 + 2 - 1 + 2 - 2 -2
## [1] 1
Inicio
F0j = d j; Fi0 = d i
Recursin
library(Biostrings)
mat = nucleotideSubstitutionMatrix(match = 2, mismatch = -1, baseOnly = TRUE)
pairwiseAlignment(DNAString("GAATTC"),DNAString("GATTA"),
secuencias 423
substitutionMatrix = mat,
gapOpening = -2, gapExtension = -2)
## Global PairwiseAlignmentsSingleSubject (1 of 1)
## pattern: [1] GAATTC
## subject: [1] GA-TTA
## score: 3
krasnr1 = c2s(kras[[1]])
krasnr2 = c2s(kras[[2]])
mat = nucleotideSubstitutionMatrix(match = 2, mismatch = -1, baseOnly = TRUE)
(a = pairwiseAlignment(DNAString(krasnr1),DNAString(krasnr2),
substitutionMatrix = mat,
gapOpening = -2, gapExtension = -2))
## Global PairwiseAlignmentsSingleSubject (1 of 1)
## pattern: [1] ATGACTGAATATAAACTTGT...AAAGTGTGTAATTATGTAA
## subject: [1] ATGACTGAATATAAACTTGT...AAAGTGTGTAATTATGTAA
## score: 1128
library(Biostrings)
data(BLOSUM50)
pairwiseAlignment(AAString("PAWHEAE"),AAString("HEAGAWGHEE"),
substitutionMatrix = "BLOSUM50",gapOpening=0,
gapExtension = -8,
scoreOnly=FALSE)
## Global PairwiseAlignmentsSingleSubject (1 of 1)
## pattern: [1] PA--W-HEAE
## subject: [2] EAGAWGHE-E
## score: 1
library(seqinr)
library(Biostrings)
data(BLOSUM50)
randallscore = double()
for (i in 1:1000) {
x = c2s(sample(rownames(BLOSUM50),7, replace=TRUE))
y = c2s(sample(rownames(BLOSUM50),10, replace=TRUE))
randallscore[i] = pairwiseAlignment(AAString(x), AAString(y),
substitutionMatrix = "BLOSUM50",gapOpening = 0, gapExtension = -8,
scoreOnly = TRUE)
}
sum(randallscore>1)/1000
## [1] 0.006
Parte VIII
Regulacin de la expresin
22
Modelos para la regulacin de la expresin
Los primeros trabajos son Goeman et al. [2004, 2006, 2011] que
estn implementados en Goeman et al. [2015, globaltest]. Un trabajo
reciente que extiende el mtodo a RNASeq es Rauschenberger et al.
[2016].
22.2 globaltest
es h de modo que
p
h( E(Yi | xi , )) = 0 + xij j . (22.1)
j =1
H0 : 2 = 0,
H1 : 2 > 0.
R = xi0 .
h( E(Yi | xi , )) = 0 + Ri , (22.2)
siendo:
1 0 1
1. U = m xx . Notemos que U = m 2
cov( R).
(Y ) 0 U (Y )
Q= (22.4)
2
var ( Q) 2
Q 2 . (22.5)
2EQ 2(EQ) /var(Q)
Q=
p
1 1
m 2 (xi0 (Y ))2 =
i =1
n n
1
2 Uij (Y i )(Yj ). (22.6)
i =1 j =1
Y = ( I H )(Y )
(Y )0 U (Y ) = (Y )0 ( I H )U ( I H )(Y ).
(Y )0 U (Y )
Q= (22.7)
donde es el estimador habitual de la desviacin estndar. 9 Cuando 9
El parmetro de dispersin que
consideramos la regresin logstica (respuesta binaria) entonces desconocemos cuando la familia con la
que se trabaja es la familia normal.
(Y )0 U (Y )
Q= (22.8)
(1 )
H = X + Z, (22.10)
H0 : =0
H0 : 6= 0.
globaltest
En secciones previas hemos visto la teora detrs de este proce-
dimiento. Vamos a utilizar Goeman et al. [2015, globaltest]. Para la
variable respuesta y el modelo asociado tenemos las siguientes opcio-
nes:
set.seed(1)
Y = rnorm(20)
X = matrix(rnorm(200), 20, 10)
X[,1:3] = X[,1:3] + Y
colnames(X) = LETTERS[1:10]
pacman::p_load("globaltest")
23.1 Introduccin
23.2 microRNA
23.2.1 miRbase
Cmo usar mirbase.db? En Reid [2013, mirbase.db] tenemos la base
de datos http://www.mirbase.org/.
library(mirbase.db)
ls("package:mirbase.db")
## [1] "contextNumber"
## [2] "contextOverlapSense"
## [3] "contextOverlapType"
## [4] "contextTranscriptID"
## [5] "contextTranscriptName"
## [6] "contextTranscriptSource"
## [7] "linksDbId"
## [8] "linksDbLink"
## [9] "linksDbSecondary"
## [10] "matureAccession"
## [11] "matureEvidence"
## [12] "matureExperiment"
## [13] "matureFrom"
## [14] "matureName"
## [15] "matureSimilarity"
## [16] "matureTo"
## [17] "mirbase"
## [18] "mirbaseACC2ID"
## [19] "mirbaseCHR"
## [20] "mirbaseCHRLOC"
## [21] "mirbaseCHRLOCEND"
## [22] "mirbaseCLUSTER"
## [23] "mirbaseCOMMENT"
## [24] "mirbaseCONTEXT"
## [25] "mirbase_dbconn"
## [26] "mirbase_dbfile"
## [27] "mirbase_dbInfo"
## [28] "mirbase_dbschema"
## [29] "mirbaseDESCRIPTION"
## [30] "mirbaseFAMILY"
## [31] "mirbaseHAIRPIN"
## [32] "mirbaseID2ACC"
## [33] "mirbaseID2SPECIES"
## [34] "mirbaseLINKS"
## [35] "mirbaseMAPCOUNTS"
## [36] "mirbaseMATURE"
## [37] "mirbaseMFE"
## [38] "mirbasePMID"
## [39] "mirbaseSEQUENCE"
## [40] "mirbaseSPECIES"
## [41] "mirbaseSPECIES2ID"
## [42] "pmidAuthor"
microrna 435
## [43] "pmidJournal"
## [44] "pmidMedline"
## [45] "pmidOrderAdded"
## [46] "pmidTitle"
class(mirbaseMATURE)
## [1] "mirbaseMatureBimap"
## attr(,"package")
## [1] "mirbase.db"
summary(mirbaseMATURE)
keys(mirbaseMATURE)[1:4]
Lkeys(mirbaseMATURE)[1:4]
436 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
Rkeys(mirbaseMATURE)[1:4]
Llength(mirbaseMATURE)
## [1] 21264
Rlength(mirbaseMATURE)
## [1] 25141
direction(mirbaseMATURE)
## [1] 1
mirbaseMATURE.df = toTable(mirbaseMATURE)
names(mirbaseMATURE.df)
mirbaseMATURE.hsa =
mirbaseMATURE.df[grep("^hsa",mirbaseMATURE.df[,"mirna_id"]),]
length(unique(mirbaseMATURE.hsa[,"mirna_id"]))
## [1] 1600
length(unique(mirbaseMATURE.hsa[,"mature_name"]))
## [1] 2042
microrna 437
R-miRBaseVersions.db.
23.2.2 targetscan
## [1] "Familyconservation"
## [2] "Maturesequence"
## [3] "MiRBaseAccession"
## [4] "MiRBaseID"
## [5] "miRFamily"
## [6] "MSAend"
## [7] "MSAstart"
## [8] "PCT"
## [9] "Seedm8"
## [10] "Seedmatch"
## [11] "Species"
## [12] "targetscan.Hs.eg"
## [13] "targetscan.Hs.eg_dbconn"
## [14] "targetscan.Hs.eg_dbfile"
## [15] "targetscan.Hs.eg_dbInfo"
## [16] "targetscan.Hs.eg_dbschema"
## [17] "targetscan.Hs.egFAMILY2MIRBASE"
## [18] "targetscan.Hs.egMAPCOUNTS"
## [19] "targetscan.Hs.egMIRBASE2FAMILY"
## [20] "targetscan.Hs.egMIRNA"
## [21] "targetscan.Hs.egTARGETS"
## [22] "targetscan.Hs.egTARGETSFULL"
## [23] "UTRend"
## [24] "UTRstart"
ls(targetscan.Hs.egMIRNA)
idsymbol = "SLC2A4"
get("6517", org.Hs.egSYMBOL)
## [1] "SLC2A4"
get(identrez,targetscan.Hs.egTARGETS)
## [1] "miR-150/5127"
## [2] "miR-199ab-5p"
## [3] "miR-17/17-5p/20ab/20b-5p/93/106ab/427/518a-3p/519d"
## [4] "miR-93/93a/105/106a/291a-3p/294/295/302abcde/372/373/428/519a/520be/520acd-3p/1378/1420ac"
## [5] "miR-31"
Todos los genes que son posibles targets los tenemos con
ids = head(ls(targetscan.Hs.egTARGETS),n=3)
mget(ids,targetscan.Hs.egTARGETS)
## $`100`
## [1] "miR-29abcd"
##
## $`1000`
## [1] "miR-26ab/1297/4465"
## [2] "miR-496"
## [3] "miR-544/544ab/544-3p"
## [4] "miR-124/124ab/506"
## [5] "miR-129-5p/129ab-5p"
## [6] "miR-208ab/208ab-3p"
## [7] "miR-204/204b/211"
microrna 439
## [8] "miR-218/218a"
## [9] "miR-221/222/222ab/1928"
## [10] "miR-543"
## [11] "miR-411"
## [12] "miR-320abcd/4429"
## [13] "miR-499-5p"
## [14] "miR-190/190ab"
## [15] "miR-145"
##
## $`10000`
## [1] "miR-17/17-5p/20ab/20b-5p/93/106ab/427/518a-3p/519d"
## [2] "miR-15abc/16/16abc/195/322/424/497/1907"
## [3] "miR-15abc/16/16abc/195/322/424/497/1907"
## [4] "miR-22/22-3p"
## [5] "miR-539/539-5p"
## [6] "miR-504/4725-5p"
## [7] "miR-150/5127"
## [8] "miR-320abcd/4429"
## [9] "miR-33a-3p/365/365-3p"
## [10] "miR-29abcd"
## [11] "miR-101/101ab"
ls(targetscan.Hs.egFAMILY2MIRBASE)
fams = tail(ls(targetscan.Hs.egFAMILY2MIRBASE),n=3)
mget(fams, targetscan.Hs.egFAMILY2MIRBASE)
## $`miR-96/507/1271`
## [1] "hsa-miR-96" "mmu-miR-96" "rno-miR-96"
## [4] "mml-miR-96" "ptr-miR-96" "hsa-miR-1271"
## [7] "xtr-miR-96" "mdo-miR-96" "oan-miR-96"
## [10] "cfa-miR-1271" "ptr-miR-1271" "bta-miR-96"
## [13] "cfa-miR-96" "bta-miR-1271" "eca-miR-96"
## [16] "eca-miR-1271" "eca-miR-507"
##
440 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## $`miR-9/9ab`
## [1] "mmu-miR-9" "hsa-miR-9" "rno-miR-9"
## [4] "gga-miR-9" "ptr-miR-9" "xtr-miR-9a"
## [7] "xtr-miR-9b" "xtr-miR-9" "mdo-miR-9"
## [10] "oan-miR-9" "mml-miR-9" "cfa-miR-9"
## [13] "bta-miR-9" "eca-miR-9a"
##
## $`miR-99ab/100`
## [1] "hsa-miR-99a" "hsa-miR-100" "mmu-miR-99a"
## [4] "mmu-miR-99b" "mmu-miR-100" "hsa-miR-99b"
## [7] "rno-miR-99a" "rno-miR-99b" "rno-miR-100"
## [10] "gga-miR-99a" "gga-miR-100" "mml-miR-99a"
## [13] "ptr-miR-99a" "ptr-miR-100" "mml-miR-100"
## [16] "bta-miR-99a" "xtr-miR-99" "xtr-miR-100"
## [19] "mdo-miR-100" "bta-miR-99b" "oan-miR-100"
## [22] "oan-miR-99" "mml-miR-99b" "cfa-miR-99b"
## [25] "cfa-miR-99a" "ptr-miR-99b" "bta-miR-100"
## [28] "eca-miR-100" "eca-miR-99b" "eca-miR-99a"
23.3 miRNApath
library(miRNApath)
23.4 miRNAtap.db
23.5 RmiR.Hs.miRNA
23.6 RmiR.hsa
23.9 Ejercicios
Ej. 17 Dado un gen del que conocemos su SYMBOL obtener,
utilizando los paquetes Reid [2013, mirbase.db] y Csardi [2013, tar-
getscan.Hs.eg.db], todas las familias de microRNAs que lo tienen
como target.
Probabilidad y Estadstica
24
Estadstica descriptiva
24.1 Datos
library(Biobase)
data(yeastgrowthRA,package="tamidata")
y = exprs(yeastgrowthRA)[3109,]
Es el gen
featureNames(yeastgrowthRA)[3109]
## [1] "YOR315W"
(z = pData(yeastgrowthRA)[,"background"])
df = data.frame(x =z,y=y)
24.2 Introduccin
1. De qu orden son?
mean(y)
## [1] 199.1748
length(y)
## [1] 21
sum(y)/length(y)
## [1] 199.1748
(yy = c(y,3400))
mean(y)
## [1] 199.1748
mean(yy)
## [1] 344.6669
mean(y,trim=.1)
## [1] 72.02143
mean(y,trim=.1)
## [1] 72.02143
mean(yy,trim=.1)
## [1] 99.3778
24.3.3 Percentiles
sort(y)
Fn = ecdf(y)
Fn(1)
## [1] 0.2857143
median(y)
## [1] 9.068
quantile(y,probs = 0.27)
## 27%
## 1.6702
O bien p = 0,76
quantile(y,probs = 0.76)
## 76%
## 114.4713
quantile(y,probs = c(0.25,0.75))
## 25% 75%
## 0.931 108.801
var(y)
## [1] 274136
sd(y)
## [1] 523.58
24.3.5 Rango
El mnimo y el mximo lo podemos obtener con
range(y)
o bien con
min(y)
## [1] 0.1974448
max(y)
## [1] 2393.409
max(y)-min(y)
## [1] 2393.212
o bien con
452 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
diff(range(y))
## [1] 2393.212
IQR(y)
## [1] 107.87
summary(y)
24.4 MAD
24.5 Ejercicios
Ej. 19 Consideremos los siguientes datos.
estadstica descriptiva 453
43.86 33.14 37.04 29.29 21.49 34.98 18.09 18.84 36.20 27.82 22.86 32.11
22.45 38.22 44.55 39.03 33.25 18.27 34.44 24.88 24.58 42.12 30.04 19.58
34.00 32.98 28.35 25.75 22.78 15.88 38.97 13.47 21.42 34.19 16.49 15.17
31.42 17.00 37.06 30.35 19.65 34.62 16.48 19.42 42.89 23.89 29.26 45.64
32.29 22.96 29.60 39.98 21.86 18.25 35.96 30.57 40.79 17.21 27.07 28.56
15.59 23.51 18.78 37.72 14.40 28.40 43.17 22.65 27.85 41.56 42.44 16.57
23.55 29.66 20.72 28.28 42.10 13.76 27.27 19.69 20.18 23.80 14.37 22.02
29.06 34.52 21.91 19.98 16.24 44.56 18.54 35.96 30.12 32.82 45.76 28.75
32.01 19.39 23.76 41.72 32.90 31.47 15.04 12.74 44.11 38.65 27.18 35.52
15.70 38.95 30.59 15.43 45.60 14.98 23.11 22.11 23.03 19.91 34.95 16.05
Se pide:
1.Leer los datos utilizando el mtodo que se prefiera.
2.Calcular la media, mediana, media recortada con una proporcin
del 0,05, los percentiles de orden 0,1 y 0,9.
3.Supongamos que se han seguido recogiendo datos. En concreto
una segunda muestra con los siguientes valores.
24.6.2 Frecuencias
La segunda variable que hemos introducido en el banco de datos
es la zona en que tomamos la medida. Es pues una variable categ-
rica que nos indica la pertenencia del dato a una categora, en este
caso, la zona en que se observa el dato. La descripcin bsica ms
454 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
table(z)
## z
## S288C W303
## 12 9
prop.table(table(z))
## z
## S288C W303
## 0.5714286 0.4285714
sum(table(z))
## [1] 21
table(z)/sum(table(z))
## z
## S288C W303
## 0.5714286 0.4285714
12.5
library(ggplot2) 5.0
df0 = data.frame(z)
ggplot(df0,aes(x = z)) + geom_bar() 2.5
0.0
escala que observamos en ordenadas. Figura 24.1: Diagrama de barras con las
frecuencias absolutas.
estadstica descriptiva 455
24.6.3 Histograma
Para una variable cuantitativa una buena opcin para observar la
distribucin de los datos es un histograma. La idea de un histograma
es (demasiado) simple. Si x1 , . . . , xn son los datos de los cuales que-
remos construir el histograma consideramos el intervalo que va del
mnimo al mximo, es decir, el intervalo
[ a, b] = [mn{ x1 , . . . , xn }, max{ x1 , . . . , xn }]
[ a, a + ), [ a + , a + 2), . . . , [ a + (k 1), b]
donde
ba
=
k
Dependiendo del software que utilicemos los valores de a y b suelen
elegirse como un poco menos que el mnimo y un poco ms que el
mnimo. El nmero de clases se elige de un modo automtico pero
siempre modificable por el usuario. Contamos el nmero de datos
que hay en cada clase. Representamos una barras (que se representan
pegadas una con otra lo que tambin nos permite diferenciarlo de un
diagrama de barras) cuya base coincide con el subintervalo y cuya
altura es proporcional al nmero de datos que hemos observado en
dicho subintervalo. Este es el dibujo. Veamos cmo hacerlo con R. 12.5
ggplot(df0,aes(x=y))+geom_histogram()
count
5.0
2.5
varias opciones para elegir el punto al que llegan los bigotes. Entre
otras opciones las dos ms habituales son:
df0 = data.frame(y)
qplot(t(y),geom="boxplot")
ggplot(df0,aes(y,group = z)) + geom_boxplot()
Figura 24.3: Diagrama de cajas.
y
K (u) = K (u),
1 1 2
K (u) = e 2 u .
2
df = data.frame(y) 0.006
ggplot(df,aes(x=y)) + geom_density()
0.004
density
Tenemos unos datos numricos x1 , . . . , xn y queremos saber si hay 0.002
alguno que se sale de madre. Si hay alguno que est muy alejado
de los dems. Que es anmalo. Lo primero es precisar qu entende-
mos por dato anmalo.4 Vamos a ver las dos definiciones ms habi- 0.000
[ x 3s, x 3s],
## named numeric(0)
## ra31
## 2393.409
Puede ser extremo por abajo si es menor que q25 1,5 IQR o por
arriba si es mayor que q75 + 1,5 IQR. Determinemos los extremos
del intervalo.
458 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## 25%
## -160.874
## 75%
## 270.606
## named numeric(0)
24.7 Ejercicios
Ej. 20 Vamos a realizar distintas representaciones grficas con los
datos del ejercicio 19. Se pide lo siguiente:
1.Realizar distintos histogramas de los datos que aparecen en el
ejercicio 19 modificando el nmero de clases. Hay un comporta-
miento consistente en la representacin grfica?
2.Representar grficamente un estimador kernel de la densidad.
Observar el valor que se ha utilizado para el ancho de banda.
3.Modificar el valor del ancho de banda observado en el apartado 2
doblando su valor y volver a representar el estimador kernel de la
densidad.
4.Modificar el valor del ancho de banda observado en el aparta-
do 2 considerando la mitad de su valor y volver a representar el
estimador kernel de la densidad.
5.Comparar los tres estimadores kernel que hemos obtenido. Qu
ocurre cuando incrementamos el ancho de banda? Y cuando lo
disminuimos?
por xx. Supongamos que los datos x han sido obtenidos en distintas
localizaciones. En concreto las localizaciones las tenemos codificadas
de un modo numrico. Son las siguientes.
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2
Se pide:
1.Introducir estos datos en un vector en R que denotaremos por y
utilizando la funcin c() de concatenacin.
2.Realizar un diagrama de cajas de la variable x.
3.Realizar diagramas de barras de los valores que tenemos en la va-
riable x para las distintas localizaciones que nos vienen indicadas
por la variable y.
4.Los datos adicionales que aparecen en el vector xx han sido ob-
tenidos en una cuarta localizacion. Completar el vector yy para
incluir esta localizacin, es decir, en xx tenemos los datos amplia-
dos mientras que en yy tendremos las localizaciones ampliadas.
5.Muestra un diagrama de barras comparativo de los valores xx
para las distintas localizaciones que aparecen en yy.
Ej. 22 x
22.24 21.04 23.89 22.49 25.22 22.15 22.49 27.51 23.57 25.22 23.47 18.91
21.64 24.29 21.68 24.51 22.32 24.77 18.30 23.03 22.03 21.09 23.32 21.15
21.21 25.53 19.34 25.89 23.06 25.90 20.09 25.65 27.76 29.14 22.88 31.40
22.79 23.68 22.15 21.50 22.40 24.39 20.34 17.53 25.59 20.25 20.76 23.08
20.66 20.47
y
27.60 24.02 33.97 27.84 33.12 37.32 37.53 38.95 29.80 32.72 30.04 26.45
26.34 32.82 28.91 29.37 32.39 29.43 37.83 24.46 37.82 32.19 34.51 32.64
30.44 38.70 29.84 29.35 32.78 34.01 36.24 41.86 35.96 35.57 33.84 27.69
29.32 41.71 34.08 27.64 33.06 39.98 36.62 29.72 33.51 31.49 33.51 33.24
25.02 39.78 31.96 37.69 44.01 29.07 32.94 30.47 33.33 24.34 35.99 32.25
36.51 33.47 35.37 31.82 38.49 25.67 29.36 36.64 24.14 39.54
Se pide:
1.Representar en dos grficos distintos los estimadores kernel de
ambas densidades.
2.Repetir el apartado anterior pero en la misma grfica.
3.Representar las funciones de distribucin de la primera muestra.
Haced lo mismo con la funcin de distribucin de la segunda
muestra.
460 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
= {cara, cruz}.
A = {2, 4, 6}.
A = {4, 5, 6}.
3
P(Mayor o igual a 4) = P({5, 5, 6}) = .
6
Qu probabilidad tenemos de obtener una cara al lanzar una
moneda? Por el mismo razonamiento:
1
P(Cara) = P({Cara}) = .
2
Un resultado es favorable y dos resultados son posibles cuando
lanzamos la moneda.
Omega = c("cara","cruz")
sample(Omega,1)
## [1] "cruz"
sample(Omega,1)
## [1] "cara"
sample(Omega,1)
## [1] "cara"
sample(Omega,30,replace=TRUE)
Y otras 30 veces.
sample(Omega,30,replace=TRUE)
Podemos contar cuntas veces nos ha salido cara y cruz (el que quiera
puede hacerlo manualmente).
x = sample(Omega,30,replace=TRUE)
table(x)
## x
## cara cruz
## 16 14
table(x) / 30
## x
## cara cruz
## 0.5333333 0.4666667
x = sample(Omega,100,replace=TRUE)
table(x) / 100
## x
## cara cruz
## 0.52 0.48
x = sample(Omega,1000,replace=TRUE)
table(x) / 1000
## x
## cara cruz
## 0.522 0.478
x = sample(Omega,100000,replace=TRUE)
table(x) / 100000
## x
## cara cruz
## 0.49986 0.50014
muestral.
(Omega = 1:6)
## [1] 1 2 3 4 5 6
sample(Omega,1)
## [1] 3
sample(Omega,20,replace=TRUE)
## [1] 6 1 4 1 5 4 4 1 3 4 3 6 5 2 1 1 5 6 5 3
x = sample(Omega,1000,replace=TRUE)
table(x) / 1000
## x
## 1 2 3 4 5 6
## 0.176 0.168 0.167 0.176 0.147 0.166
12 21 13 31 23 32
n ( n 1) . . . ( n k + 1).
n! = n (n 1) . . . 1.
12 21
{1,2} {2,1}
factorial(10)
## [1] 3628800
choose(10,5)
## [1] 252
13(42)(12
3 )4
3
.
(52
5)
## [1] 1098240
(casosposibles = choose(52,5))
## [1] 2598960
casosfavorables / casosposibles
## [1] 0.422569
(cartas = rep(1:13,4))
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2
## [16] 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4
## [31] 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6
## [46] 7 8 9 10 11 12 13
(mano = sample(cartas,5))
## [1] 11 10 12 8 11
Cmo s que tenemos una pareja? Una forma sencilla es contar la fre-
cuencia de cada nmero.
470 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
(conteosmano = table(mano))
## mano
## 8 10 11 12
## 1 1 2 1
length(conteosmano)
## [1] 4
nsimulaciones = 1000
exitos = 0
for(i in 1:nsimulaciones){
mano = sample(cartas,5)
conteosmano = table(mano)
if(length(conteosmano) == 4) exitos = exitos + 1
}
exitos / nsimulaciones
## [1] 0.416
2. P() = 1.
probabilidad 471
P ( A1 A2 ) = P ( A1 ) + P ( A2 ) P ( A1 A2 ). (25.4)
P ( A c ) = 1 P ( A ). (25.5)
25.2 Ejercicios
1
P({i }) = .
N
X: R
X ( ) = x.
x 0.000 1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000
P( X = x ) 0.107 0.268 0.302 0.201 0.088 0.026 0.006 0.001 0.000 0.000 0.000
Tabla 25.1: Funcin de probabilidad de
una variable discreta. En la primera fila
A partir de la funcin de probabilidad P( X = xi ) podemos calcu- el valor y en la segunda la probabilidad
lar cualquier otra probabilidad. Por ejemplo: de tomar este valor.
P ( X 2) = P ( X = 0) + P ( X = 1) + P ( X = 2),
474 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
o bien,
P( X 7) = P( X = 7) + P( X = 8) + P( X = 9) + P( X = 10).
Tambin
P (4 X 7) = P ( X = 4) + P ( X = 5) + P ( X = 6) + P ( X = 7).
P (4 < X 7) = P ( X = 5) + P ( X = 6) + P ( X = 7).
P (4 < X < 7) = P ( X = 5) + P ( X = 6).
De un modo genrico podemos escribir que
P( X A) = P ( X = x ),
x A
25.3.2 Ejercicios
Ejercicio 11. Consideremos el experimento aleatorio consistente en lanzar
dos veces un dado. Un resultado del experimento puede ser = (1, 3)
indicando que en primer lugar hemos obtenido un 1 y en el segundo lanza-
miento hemos obtenido un 3. Consideramos la variable aleatoria que asocia al
resultado obtenido la suma de los valores que obtenemos en el primer y en el
segundo lanzamiento. Si = (i, j) entonces X ( ) = i + j.
Z b Z b
P( a X b) = f ( x )dx = dx = b a, 0%
runif(1,min=0,max=1)
## [1] 0.6736497
1 dc
P(c X d) = f ( x )dx = dx = . 0 2 4 6
c c ba ba
Figura 25.4: Funcin de densidad de
Otra vez la probabilidad de que el valor aleatorio de X est en el intervalo una variable uniforme en el intervalo
[2, 5].
[c, d] solamente depende de lo largo que es el intervalo y no de dnde est
dentro de [ a, b].
25.3.4 Ejercicios
Ej. 23 Consideremos una variable aleatoria uniforme en el inter-
valo [0, 1]. Se pide:
1.Qu probabilidad tenemos de que la variable sea menor o igual
que 0,5? En otras palabras: cunto vale P( X 0,5)?
2.Y P( X < 0,5)?
probabilidad 477
FX ( x ) = F ( x ) = P( X x ). (25.6)
FX ( x ) = P ( X = x i ),
xi :xi x
0.2
FX ( x ) = f (t)dt. 0.0
La igualdad afirma que la probabilidad de que la variable sea es- stepfun(ee$x, c(0, cumsum(ee$probabilidad)))
trictamente mayor que a y menor o igual que b lo podemos obtener
1.0
0.6
F
0.4
0.2
0.0
0 2 4 6 8 10
x
478 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
en la figura 25.7.
0.8
0.6
Fn(x)
plot(ecdf(y))
0.4
ecdf(y)(37) x
o bien en 40,
ecdf(y)(40)
## [1] 0.5714286
library(Hmisc)
Ecdf(y)
1.0
0.8
Proportion <= x
25.3.7 Ejercicios
0.6
0.4
Ej. 25 Consideremos el experimento aleatorio consistente en lan-
zar dos veces un dado. Un resultado del experimento puede ser
0.2
= (1, 3) indicando que en primer lugar hemos obtenido un 1 y
0.0
en el segundo lanzamiento hemos obtenido un 3. Consideramos la 0 500 1000 1500 2000
variable aleatoria que asocia al resultado obtenido la suma de los n:21 m:0
y
valores que obtenemos en el primer y en el segundo lanzamiento. Si Figura 25.8: Funcin de distribucin
= (i, j) entonces X ( ) = i + j. Se pide: muestral con la funcin Ecdf.
x 0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00
P( X = x ) 0.20 0.11 0.13 0.24 0.27 0.02 0.01 0.01 0.00 0.01
Tabla 25.2: Funcin de probabilidad
de la variable aleatoria que nos da el
Podemos simular la seleccin aleatoria de una vivienda en esa poblacin
nmero de personas que residen en una
utilizando la funcin sample. vivienda.
x = 0:9
probabilidades = c(0.20,0.11,0.13,0.24,0.27,0.02,0.015,0.009,
0.0009,0.0051)
sample(x,size=1,replace=TRUE,prob=probabilidades)
## [1] 4
n = 100
(y = sample(x,size=n,replace=TRUE,prob=probabilidades))
## [1] 2 9 1 4 2 3 4 0 4 1 3 3 0 1 3 4 4 4 9 0 2 4
## [23] 1 3 3 1 4 4 4 2 4 3 6 0 3 4 3 2 1 3 4 3 4 4
## [45] 7 1 0 4 0 3 2 0 3 5 2 3 4 0 2 4 4 3 1 3 0 3
## [67] 4 3 4 3 2 2 3 4 3 4 3 4 4 1 3 0 2 3 0 3 4 3
## [89] 2 4 0 3 4 4 4 2 4 4 4 0
prop.table(table(y))
## y
## 0 1 2 3 4 5 6 7 9
## 0.13 0.09 0.13 0.27 0.33 0.01 0.01 0.01 0.02
y = sample(x,size=1000,replace=TRUE,prob=probabilidades)
prop.table(table(y))
## y
## 0 1 2 3 4 5 6 7
## 0.190 0.100 0.133 0.259 0.265 0.023 0.013 0.008
## 8 9
## 0.002 0.007
probabilidad 481
n n
y nx
yn = ni = xn
i =1 x =0
## [1] 2.4761
= 1 p + 0 (1 p) = p.
+
var ( X ) = 2 = E( X )2 = ( x i )2 P ( X = x i ).
i =1
482 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
i =1
X ( ) = 1 A ( ),
X Bi (1, p).
X Bi (n, p).
Observemos que los valores que puede tomar esta variable son
0, 1, 2, . . . , n, esto es, desde cero xitos hasta n xitos. Qu proba-
bilidad tenemos de observar un nmero determinado de xitos? Esta
probabilidad, P( X = x ) es la funcin de probabilidad de la binomial
y se prueba que tiene la siguiente expresin.
n x
P( X = x ) = p (1 p ) n x . (25.10)
x
dbinom(70,size=123,prob=0.5)
## [1] 0.02230619
## [1] 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1
## [24] 1 1 1 0 1 0 0
rbinom(30,size=1,prob=.5)
## [1] 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1
## [24] 1 0 1 1 1 1 0
rbinom(1,size=30,prob=.5)
## [1] 16
rbinom(1,size=30,prob=.5)
## [1] 16
rbinom(40,size=30,prob=.5)
## [1] 19 14 14 14 16 16 14 17 12 13 14 20 19 16 14
## [16] 17 11 22 13 13 15 15 16 16 17 13 20 18 11 13
## [31] 12 8 12 18 17 17 12 13 15 18
rbinom(40,size=30,prob=.6)
## [1] 18 20 17 21 20 20 24 20 19 17 22 22 16 17 15
## [16] 14 20 20 19 19 17 18 20 21 18 18 17 13 19 14
## [31] 19 17 17 22 20 15 25 18 18 17
dbinom(23,size=30,prob=.6)
## [1] 0.02634109
dbinom(0:30,size=30,prob=.6)
y
## [19] 1.473752e-01 1.396186e-01 1.151854e-01
## [22] 8.227527e-02 5.048710e-02 2.634109e-02 0.05
## [31] 2.210739e-07
0.00
0 10 20 30
x
En la figura 25.10 tenemos la representacin grfica de estas probabilida- Figura 25.10: Para una variable bino-
mial con n = 30 y una probabilidad de
des. xito de p = 0,6 mostramos la funcin
Tambin podemos obtener la funcin de la distribucin binomial en cual- de probabilidad que para cada x nos da
la probabilidad de que la variable tome
quier punto, es decir, la probabilidad P( X 12) es ese valor, P( X = x ).
pbinom(12,size=30,prob=.6)
20%
## [1] 0.02123988
15%
xito p = 0,6.
5%
25.6.1 Ejercicios
0%
Ej. 28 Se pide: 5 10
1.Simular 100 valores con distribucin binomial con 20 pruebas y Figura 25.11: Funcin de densidad de
una probabilidad de xito en cada prueba de 0,3. Guardar estos una normal con media 7 y varianza 4.
valores en el vector x.
1.00
0.25
0.00
0 10 20 30
x
1.P( X 23).
4.P( X 29).
6.P(34 X 45).
factor de proporcionalidad,
X Po ().
X Po ().
e x
lm P( Xn = x ) = .
n+ x!
Demostracin. Consideremos la sucesin de variables aleatorias Xn
Bi (n, pn ) en la que a medida que n aumenta, pn disminuye de forma
tal que npn . Ms concretamente, npn . Tendremos para la
funcin de probabilidad que
n x n!
P ( Xn = x ) = p n (1 p n ) n x = p x (1 p n ) n x ,
x x!(n x )! n
n x
x
n!
P ( Xn = x ) 1
x!(n x )! n n
x
n ( n 1) ( n x + 1) n x
= 1 1 .
x! nx n n
Al pasar al lmite,
n x
n ( n 1) ( n x + 1)
1, 1 e , 1 1,
nx n n
y tendremos
e x
lm f Xn ( x ) = .
n+ x!
P( X = 0) = P( A1 ) = p.
y cero en el resto.
k+r1 k
P( X = k) = p (1 p )r (25.15)
k
k+r1
=
k
( k + r 1) ! ( k + r 1) . . . r
= =
k!(r 1)! k!
(r )(r 1) . . . (r k + 1) r
(1)k = (1)k (25.16)
k! k
Se demuestra que
pr
E( X ) = = , (25.17)
1 p
y que su varianza viene dada por
pr
var ( X ) = 2 = . (25.18)
(1 p )2
probabilidad 491
(k + r ) k
P( X = k) = p (1 p )r (25.19)
k!(r )
con k = 0, 1, . . .
En lo anterior hemos parametrizado la familia utilizando k y r. Su-
pongamos que parametrizamos utilizando y r. Tendremos entonces
p = /(r + ) y sustituyendo
k r
(k + r )
r
P( X = k) = . (25.20)
k!(r ) r+ r+
Nota 2 (La normal estndar). Una variable aleatoria Z se dice que tiene
una distribucin normal estndar cuando su media es cero y su varianza es
uno: Z N (0, 1). Su funcin de densidad es
0.4
1 1 2
f ( x ) = e 2 x .
0.3
(25.23)
2
Densidad
0.2
La representacin grfica de esta densidad la tenemos en la figura 25.13.
0.1
Si Z es una normal estndar entonces la funcin de distribucin, esto es,
la funcin que para cada valor z nos da la probabilidad de que la variable sea
0.0
menor o igual que este valor z es la siguiente 6 4 2 0 2 4 6
x
Z z
1 1 2
(z) = e 2 x dx. (25.24) Figura 25.13: Funcin de densidad de
2 una normal estndar o tpica.
pnorm(1.3) 0.4
## [1] 0.9031995
0.3
0.2
X
aleatoria Z = sigue una distribucin normal con media 0 y con
varianza 1, esto es, se verifica 0.0
6 3 0 3 6
x
X
Z= N (0, 1). (25.25) Figura 25.14: La funcin de distribucin
de la normal estndar en el punto 1,3
13 corresponde con el rea de la zona
Esta transformacin recibe el nombre de tipificacin o estandarizacin de rayada.
la variable aleatoria X.
En la figura 25.16 mostramos la densidad de una variable X normal con 100%
50%
25%
0%
probabilidad 493
60 56 X 56 63 56
P(60 X 63) = P =
3 3 3
60 56 63 56 63 56 60 56
P Z =P Z P Z .
3 3 3 3
(25.26)
63 56 60 56 63 56 60 56
P Z P Z = .
3 3 3 3
63 56 60 56
P(60 X 63) = ,
3 3
b a
Densidad
P( a X b) = , (25.27)
0.05
x0 = seq(10,22,1)
dnorm(x0,mean= 16, sd= 2)
10 20 30 40
## [1] 0.1586553
0.50
y
10 15 20
x
pnorm(1,mean=0,sd=1) - pnorm(-1,mean=0,sd=1)
## [1] 0.6826895
P( X + ) = 0,6826895. (25.30)
P( 2 X + 2) = P(2 Z 2) (25.31)
pnorm(2,mean=0,sd=1) - pnorm(-2,mean=0,sd=1)
## [1] 0.9544997
P( 3 X + 3) = P(3 Z 3) (25.32)
que es igual a
pnorm(3,mean=0,sd=1) - pnorm(-3,mean=0,sd=1)
## [1] 0.9973002
P( 3 X + 3 ) 0.9973002
25.10 Ejercicios
Ej. 32 Se pide:
1.Simular 100 valores con distribucin normal con media 20 y des-
viacin tpica 3. Guardar estos valores en el vector x.
2.Calcular la media y varianza muestrales de los valores generados.
3.Comparar la media muestral observada con 20 y la varianza mues-
tral observada con 9 que corresponden con la media y la varianza
tericas.
4.Repetir los apartados anteriores sustituyendo las 100 simulacio-
nes por 1000, por 10000 y por 100000. Comparar en cada caso los
valores tericos con los valores muestrales.
N=2374560
X = rbinom(N,size=1,prob=.034)
498 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
X[1:10]
## [1] 0 0 0 0 0 0 0 0 0 0
X[100000]
## [1] 0
n = 100
x = sample(X,n)
x
## [1] 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
## [23] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [45] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
## [67] 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
## [89] 0 0 0 0 0 0 0 0 0 0 0 0
sum(x)
## [1] 4
x = sample(X,100)
sum(x)
## [1] 2
## [1] 3 5 5 2 3 2 3 7 6 4 4 0 4 4 2 4 6 3 3 2
sumas/n
## [1] 0.03 0.05 0.05 0.02 0.03 0.02 0.03 0.07 0.06
## [10] 0.04 0.04 0.00 0.04 0.04 0.02 0.04 0.06 0.03
## [19] 0.03 0.02
26.2.1 Ejercicios
Ej. 34 1 Muchos equipos de investigacin pretenden realizar un 1
Wilcox [2009, pg. 79, problemas 2-3]
estudio sobre el porcentaje de personas que tienen cncer de colon.
Si una muestra aleatoria de diez personas se pudo obtener, y si la
probabilidad de probabilidad de tener cncer de colon es 0,05, cul
es la probabilidad de que un equipo de investigacin obtenga p =
0,1? Y la de p = 0,05?
N = 237456
X = rnorm(N,mean=160,sd=10.23)
X[1:10] 20000
count
## [6] 172.3557 164.0881 176.9400 148.9404 142.8552
10000
Como conocemos toda la poblacin podemos conocer su media o 125 150 175 200
X
## [1] 160.0128
0.03
0.02
n = 100
x = sample(X,n) 0.01
## [1] 157.9384
x = sample(X,n)
mean(x)
## [1] 158.9058
160.5
Finalmente supongamos que tomamos muestras de tamao cre-
Media muestral
ciente y mostramos en abscisas el tamao de la muestra y en orde-
159.5
nadas la media muestral observada. En la figura 26.3 tenemos el
resultado. Lo repetimos. En la figura 26.4 tenemos las medias ob-
servadas. No obtenemos las mismas medias muestrales pero si un
158.5
comportamiento aleatorio similar. 0 5000 10000 15000 20000
Muestra
Si denotamos la muestra aleatoria que estamos extrayendo de la
poblacin con X1 , . . . , Xn entonces la media muestral (que utiliza- Figura 26.3: Generamos muestras
de tamao creciente. Calculamos la
remos para estimar la media poblacional) tiene una distribucin (o media muestral de cada muestra.
se distribuye como) una normal con media (la media poblacional) En el eje de abscisas mostramos el
2
y con varianza X2 = n , la varianza poblacional dividida por el tamao de la muestra que hemos
n generado. En el eje de ordenadas en
tamao de la muestra. De un modo resumido esto se expresa con valor observado de la media muestral.
La lnea horizontal muestra la media
2 poblacional. Vemos cmo las medias
Xn N (, ) (26.1) muestrales se aproximan a la media de
n
la poblacin.
si X1 , . . . , Xn son variables aleatorias independientes y con distribu-
cin
Xi N (, 2 ), con i = 1, . . . , n.
160.6
Xn
n N (0, 1) (26.2)
159.8
Nos interesa conocer probabilidades como
159.4
Muestra
Ejemplo 49. Por ejemplo, supongamos que nos interesa saber qu pro-
babilidad tiene la media muestral de ser menor que 162. Como estamos
suponiendo que conocemos toda la poblacin podemos tomar como varianza
la de toda la poblacin.
sigma = sd(X)
pnorm(162,mean=mu,sd=sigma/sqrt(n))
## [1] 0.9741615
pnorm(162,mean=mu,sd=sigma/sqrt(n)) -
pnorm(159,mean=mu,sd=sigma/sqrt(n))
## [1] 0.8135001
1 - pnorm(160,mean=mu,sd=sigma/sqrt(n))
## [1] 0.5050096
Si
( t )2
Z x
1
( x ) = exp dt.
2 22
lo que estamos haciendo con R es simplemente aplicar que
P( X b) = (b)
o
P( a X b) = (b) ( a)
o
P( a X ) = 1 ( a)
26.3.1 Ejercicios
Ej. 37 4 Supongamos n = 16, = 2 y = 30. Supongamos 4
Wilcox [2009, pg. 84, problema 8]
normalidad. Determinar:
1.P( X 29),
2.P( X > 30,5),
3.P(29 X 31).
distribucin muestral 503
Ej. 40 7 Una compaa afirma que las primas pagadas por sus 7
Wilcox [2009, pg. 85, problema 12]
clientes para el seguro de automviles tiene una distribucin normal
con media = 750 euros y desviacin estndar = 100 euros.
Suponiendo normalidad, cul es la probabilidad de que para n = 9
clientes elegidos al azar, la media muestral tome un valor entre 700
y 800 euros?
in=1 Xi
p = ,
n
p p
Z= p . (26.3)
p(1 p)/n
504 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
P( a p b) =
P( p b) P( p a) =
bp ap
P( Z p ) P( Z p ). (26.4)
p(1 p)/n p(1 p)/n
Xn
lm P z = P( Z z) (26.5)
n+ n
26.4.3 Ejercicios
Ej. 41 1.Supongamos una distribucin binomial con p = 0,5 y
n = 10 y queremos calcular la probabilidad de que p sea menor
o igual a 7/10. Obtener el valor exacto y el valor aproximado
utilizando la aproximacin dada por el teorema central del lmite.
2.Repetir el punto anterior obteniendo el valor exacto y el valor
aproximado de P(0,3 p 0,7).
27.1 Introduccin
27.2 La poblacin
Nota 6 (Estimando una media). Vamos a ilustrar los conceptos con una
poblacin finita. Y muy grande. Suponemos que tenemos una poblacin de
237456 personas que conocemos la altura de cada una de las personas.1 Los 1
Hemos tenido la santa paciencia de
datos los tenemos en el vector X. medir la estatura de cada uno de ellos.
Y ellos se han dejado.
Por ejemplo, las estaturas de las diez primeras personas (en centmetros)
son
(mu=mean(X))
## [1] 159.9979
n = 10
(x = sample(X,n))
(mediamuestral = mean(x))
## [1] 161.2925
mediamuestral - mu
## [1] 1.2946
density.default(x = estimaciones)
Veamos un resumen de los errores observados.
0.25
errores = estimaciones-mu
0.20
summary(errores)
0.15
Density
0.10
De hecho, en la figura 27.1 hemos representado un estimador kernel de las 154 156 158 160 162 164 166
estimaciones y una lnea vertical mostrando la media real. N = 100 Bandwidth = 0.4235
As es como funciona la estimacin puntual. Hemos visto una situa- Figura 27.1: Estimador kernel de la
cin irreal en que tenemos todos los valores que componen la poblacin y, densidad de las estimaciones obtenidas
eligiendo muestras de tamao 10 de la
poblacin. La lnea vertical tiene como
abscisa comn la media poblacional.
508 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
2
Xn N (, ) (27.1)
n
Si las distintas variables Xi que componen la muestra no siguen una
distribucin muestral entonces asumiendo que tenemos una muestra
grande el resultado que damos en 27.1 es aproximadamente cierto.
En cualquier caso, la varianza de la media muestral Xn
X
P c = 0,975
510 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
qnorm(0.975,mean=0,sd=1)
## [1] 1.959964
En resumen que
X
P 1,96 n 1,96 = 0,95
o, lo que es equivalente,
P X 1,96 X + 1,96 = 0,95.
n n
(x = sample(X,10))
media = mean(x)
s = sd(x)
## [1] 156.9302
## [1] 163.6551
estimacin 511
alpha = 0.01
## [1] 155.8736
y el superior
## [1] 164.7116
El intervalo es el siguiente:
c(extremo.inferior,extremo.superior)
El ltimo paso es rogar a Dios que las cosas hayan ido bien. Tenemos una
confianza de 1 (0,99 en el ejemplo) de que el valor real de la media est
en este intervalo. Pero esto no quiere decir que realmente lo est. Si repeti-
mos un gran nmero de veces el valor real de la media est en el intervalo
un (1 ) 100 % de la veces (un 99 % en el ejemplo) pero puede ocurrir
(desgracias de la vida) que estemos en el 100 (en el ejemplo un 1 %)
restante. En general la cosa va bien porque elegimos un nivel de confianza
grande (prximo a uno) pero no siempre va bien.
512 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
0.4
0.3
dt(u, df = 9)
0.2
0.1
0.0
3 2 1 0 1 2 3
0.4
t de Student con 2 grados de libertad en trazo discontinuo. Vemos que tienen
una forma similar, ambas estn centradas en cero. Sin embargo, la densidad
0.3
de la normal est ms concentrada alrededor de cero. La densidad de la t de
0.2
Student est ms repartida. Y esto ocurre para cualquier nmero de grados
de libertad.
0.1
Qu ocurre cuando incrementamos el nmero de grados de libertad?
0.0
Cuando se va incrementando el nmero de grados la densidad de la t de 3 2 1 0 1 2 3
Student se aproxima a la densidad de la normal. En la figura 27.4 se ilustra x
0.4
P(c T c) = 0,95.
0.3
En concreto verificar que
0.2
P( T c) = 0,975
0.1
mos con 3 2 1 0 1 2 3
S S
P( X tn1,1/2 X + tn1,1/2 ) = 1 . (27.4)
n n
alpha = 0.01
## [1] 154.7173
y el superior
## [1] 165.8679
El intervalo es el siguiente
c(extremo.inferior,extremo.superior)
5 5
Podemos comprobar que el intervalo
que obtenemos asumiendo varian-
Nota 8 (Obtencin del intervalo de confianza utilizando t.test). No za conocida es ms pequeo que el
que obtenemos asumiendo varianza
hace falta escribir todo lo anterior para calcular el intervalo de confianza. desconocida.
El intervalo de confianza para la media lo podemos obtener con la funcin
t.test. De hecho, nos da el intervalo de confianza y alguna cosa ms que, de
momento, no necesitamos.
alpha = 0.05
t.test(x,conf.level=1-alpha)
##
## One Sample t-test
estimacin 515
##
## data: x
## t = 93.434, df = 9, p-value = 9.343e-15
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 156.4117 164.1735
## sample estimates:
## mean of x
## 160.2926
alpha = 0.05
t.test(x,conf.level=1-alpha)$conf.int
100
tiene al verdadero valor de la media. Generamos 100 intervalos con muestras
de tamao n = 100. En la figura 27.5 hemos representado los 100 interva-
los que hemos obtenido. La lnea vertical indica la media poblacional. Cada 80
60
de confianza.
0
Ejemplo 50 (Datos Kola). Empezamos cargando los datos del proyecto 156 158 160 162 164
Kola. 6 En concreto vamos a utilizar los datos chorizon. Con la funcin Intervalos de confianza
attach podemos usar los nombres de las variables. 7 Figura 27.5: Intervalos de confianza
de la media en una poblacin normal.
Hemos simulado 100 intervalos. La
data(chorizon,package="StatDA") lnea vertical tiene como abscisa el valor
attach(chorizon) real de la media. Cuntos intervalos no
contienen a la media real? Cuntalos.
6
http://www.ngu.no/Kola/
Vamos a obtener el intervalo de confianza para la concentracin media 7
Se recomienda hacer help(chorizon)
de escandio en Noruega. En primer lugar guardamos en Sc.Nor los datos para conocer ms sobre los datos.
correspondientes a Noruega.
t.test(Sc.Nor)
##
## One Sample t-test
##
## data: Sc.Nor
## t = 18.342, df = 127, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 2.479107 3.078706
## sample estimates:
## mean of x
## 2.778906
Sc.t = t.test(Sc.Nor)
Sc.t$conf.int
o simplemente
t.test(Sc.Nor)$conf.int
t.test(Sc.Nor,conf.level=.90)$conf.int
t.test(Sc.Nor,conf.level=.99)$conf.int
media = 5.021
desviacion.estandar = 2.077
n = 4499
alpha = .01
(extremoinferior = media - qt(1-alpha/2,df=n-1) *
desviacion.estandar/ sqrt(n))
## [1] 4.941204
## [1] 5.100796
media = 4.969
desviacion.estandar = 1.909
n = 1724
alpha = .01
(extremoinferior =
media - qt(1-alpha/2,df=n-1) * desviacion.estandar/ sqrt(n))
## [1] 4.850441
(extremosuperior =
media + qt(1-alpha/2,df=n-1) * desviacion.estandar / sqrt(n))
## [1] 5.087559
media = 5.054
desviacion.estandar = 2.174
n = 2775
alpha = .01
(extremoinferior = media - qt(1-alpha/2,df=n-1) *
desviacion.estandar/ sqrt(n))
## [1] 4.947624
## [1] 5.160376
estimacin 519
27.6.3 Ejercicios
Ejercicio 12. Determinar el intervalo de confianza para la concentracin
media de escandio en Finlandia y Rusia. Se pide utilizar como niveles de
confianza 0,90, 0,95 y 0,99.
Ejercicio 14. En este ejercicio utilizamos los datos de la tabla 27.1. Se pide:
t.test(Sc.Nor,conf.level=.95)$conf.int
mean(Sc.Nor)
## [1] 2.778906
## [1] 0.5995994
Sc.ci = t.test(Sc.Nor,conf.level=.95)$conf.int
(Sc.ci[2] - Sc.ci[1]) / 2
## [1] 0.2997997
length(Sc.Nor)
## [1] 128
table(COUN)
## COUN
## FIN NOR RUS
## 187 128 290
S
tn1,1
2 n
alpha = .05
n = length(Sc.Nor)
qt(1-alpha/2,df=n-1)*sd(Sc.Nor)/sqrt(n)
## [1] 0.2997997
sd0 = sd(Sc.Nor)
delta = 0.2
S
tn1,1
2 n
m = n + 10
qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)
## [1] 0.2885306
m = n + 100
qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)
## [1] 0.2236826
m = n + 200
qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)
## [1] 0.1861879
m = n + 150
qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)
## [1] 0.2023752
for(m in 280:290)
print(c(m,qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)))
27.7.1 Ejercicios
Ejercicio 15. Utilizamos los datos chorizon del paquete StatDA. Se quiere
estimar la la concentracin media de escandio en Finlandia y en Rusia.
Queremos estimar estas medias con un error mximo de 0,20.
( n 1) S2
Estamos diciendo que la variable aleatoria 2 tiene una distri-
bucin ji-cuadrado con n-1 grados de libertad. 9 En la figura 27.6 9
La densidad de una distribucin
hemos representado la funcin de densidad de una ji-cuadrado con ji-cuadrado con k grados de libertad es
10 grados de libertad. 1 k x
f (x) = x 2 1 e 2 para x 0 y cero en otro caso
2k/2 (k/2)
Con objeto de ver cmo cambia la forma de la funcin de densi-
dad cuando cambia el nmero de grados de libertad en la figura 27.7
mostramos las densidades de la ji-cuadrado con 10 grados de libertad
(trazo continuo) y con 20 grados de libertad (trazo discontinuo).
0.10
Denotamos el percentil de orden p de una ji-cuadrado con k gra-
0.08
dos de libertad como p,k . Es decir, si la variable X se distribuye
dchisq(x, df = 10)
0.06
como una ji-cuadrado con k grados de libertad, X 2k , entonces
0.04
P( X 2p,k ) = p.
0.02
El valor anterior lo podemos obtener con la funcin qchisq.
0.00
0 5 10 15 20 25 30
p = 0.75 x
## [1] 15.98391
( n 1) S2
P 2/2,n1 2
1/2,n1 = 1 .
dchisq(x, df = 10)
2
0.06
0.04
Y por lo tanto,
0.02
( n 1) S2 ( n 1) S2
2
P = 1 .
0.00
21/2,n1 2/2,n1 0 10 20 30 40 50
x
Es decir el intervalo
Figura 27.7: Funcin de densidad de
( n 1) S2 ( n 1) S2
una ji-cuadrado con 10 grados de
, libertad (trazo continuo) y con 20
21/2,n1 2/2,n1
grados de libertad (trazo discontinuo).
524 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
n = 100
x = sample(X,100)
alpha = .05
s2 = var(x)
(extremoinferior = (n-1)*s2 / qchisq(1-alpha/2,df=n-1))
## [1] 18.5795
## [1] 32.52428
27.8.1 Ejercicios
Ejercicio 17. Consideremos los datos StatDA::chorizon. Se pide:
1. Utilizando el cdigo
help(chorizon)
28.1 Introduccin
H0 : 1500,
H1 : > 1500,
siguiente
Xn 1500
T= . (28.1)
S/ n
Si consideramos los valores observados tenemos
xn 1500
t0 = , (28.2)
s/ n
## [1] 2.106962
Tc
Xn 1500
T= t n 1 . (28.3)
S/ n
P( T c) = 0,05, (28.4)
o, equivalentemente, que
qt(.95,df=99)
## [1] 1.660391
t0
## [1] 2.106962
superior a 1500.
Grficamente podemos representar lo que acabamos de hacer. En la figura 0.3
y
estadstico t0 .
0.1
10 5 0 5 10
H0 : 0 , valores.x
Xn 0
T= (28.6)
S/ n
y el valor observado
xn 0
t0 = . (28.7)
s/ n
Bajo la hiptesis de que la media poblacional vale 0 , = 0 , se
tiene que
Xn 0
T= t n 1 , (28.8)
S/ n
y t0 sera un valor observado de una variable aleatoria con distribu-
cin t con n-1 grados de libertad.
Supongamos que queremos (es una eleccin del decisor que somos
nosotros) un error tipo I que sea menor o igual a (habitualmente
0,05, 0,01 o 0,1) entonces la regla de decisin es:
p = P( T t0 )dondeT tn1 .
(pvalor=1-pt(t0,df=n-1))
## [1] 0.01882416
0.4
tanto, la misma regla de decisin que estamos empleando se puede
0.3
formular como: rechazamos la hiptesis nula H0 si p < y no rechazamos
dt(valx, df = n 1)
si p . En la figura 28.2 el p-valor es el rea de la zona en color
0.2
negro.
0.1
Ejemplo 53 (Funcin t.test para contrastar). Vamos a realizar el contras-
0.0
t0
te utilizando la funcin t.test. 4 2 0 2 4
valx
H0 : 20,
H1 : > 20.
data(chorizon,package="StatDA")
attach(chorizon)
Ni.Rus = Ni[which(COUN == "RUS")]
t.test(Ni.Rus,alternative="greater",mu=20)
##
## One Sample t-test
##
## data: Ni.Rus
## t = 2.8777, df = 289, p-value = 0.002152
## alternative hypothesis: true mean is greater than 20
## 95 percent confidence interval:
## 21.69218 Inf
## sample estimates:
## mean of x
## 23.9669
Vemos que el p-valor vale 0.9978 que es menor que 0,05. Rechazamos la
hiptesis nula.
H0 : 0 ,
H1 : < 0 .
n = 134
mu0 = 34
(t0 = (mean(x) - mu0) / (sd(x)/sqrt(n)))
## [1] -4.724447
alpha = 0.05
qt(alpha,df=n-1)
## [1] -1.656391
t.test(x,mu=mu0,alternative="less")
##
## One Sample t-test
##
## data: x
## t = -4.7244, df = 133, p-value = 2.894e-06
## alternative hypothesis: true mean is less than 34
## 95 percent confidence interval:
## -Inf 32.1787
## sample estimates:
## mean of x
## 31.19542
H0 : = 0 ,
H1 : 6 = 0 .
H0 : = 23,
H1 : 6= 23.
t.test(Ni.Rus,alternative="two.sided",mu=23)
##
## One Sample t-test
##
## data: Ni.Rus
## t = 0.70141, df = 289, p-value = 0.4836
## alternative hypothesis: true mean is not equal to 23
## 95 percent confidence interval:
## 21.25373 26.68006
## sample estimates:
## mean of x
## 23.9669
H0 : = 24,
H1 : 6= 24.
Realizamos el contrate.
contraste de hiptesis 537
t.test(Ni.Rus,alternative="two.sided",mu=24)
##
## One Sample t-test
##
## data: Ni.Rus
## t = -0.024014, df = 289, p-value = 0.9809
## alternative hypothesis: true mean is not equal to 24
## 95 percent confidence interval:
## 21.25373 26.68006
## sample estimates:
## mean of x
## 23.9669
H0 : = 0 ,
H1 : 6 = 0
contraste bilateral
H0 : = 0 ,
H1 : 6 = 0
t.test(Ni.Rus,alternative="two.sided",mu=23,conf.level=0.95)
##
## One Sample t-test
##
## data: Ni.Rus
## t = 0.70141, df = 289, p-value = 0.4836
## alternative hypothesis: true mean is not equal to 23
## 95 percent confidence interval:
## 21.25373 26.68006
## sample estimates:
## mean of x
## 23.9669
(a) (b)
(c) (d)
Figura 28.3: Datos x: histograma (a) y
estimador kernel de la densidad de x
(b). Datos y: histograma (c) y estimador
kernel de la densidad de x (d).
contraste de hiptesis 541
o bien
= 0,5. (28.12)
Una vez hemos elegido estos valores pi hemos de determinar los
valores de la abscisa y la ordenada del i-simo punto. Si xi con
i = 1, . . . , n son los datos entonces los ordenamos obteniendo los
estadsticos ordenados x(i) que verifican
x (1) . . . x ( n ) .
qqnorm(x)
qqnorm(x)
qqline(x)
Estn sobre una lnea recta los puntos en cada una de las grficas?
Podemos ver que para la figura 28.4(b) correspondiente a la muestra x los
datos parecen bien alineados. Esto no parece tan cierto para los datos de la
muestra y que aparecen en la figura 28.4(d). Rechazaramos grficamente
la normalidad de la muestra y mientras que no la rechazaramos para la
muestra x.
En http://en.wikipedia.org/wiki/Q-Q_plot se tiene una explicacin muy
completa de este grfico.
(a) (b)
(c) (d)
Figura 28.4: (a) Dibujo q-q o cuantil-
cuantil para datos x. (b) Dibujo q-q
o cuantil-cuantil para la muestra x
aadiendo la lnea que pasa por el
primer y tercer cuartil. Vemos cmo los
puntos estn muy prximos a la lnea.
No podemos rechazar la normalidad
de los datos utilizando este dibujo. (c)
Dibujo q-q o cuantil-cuantil para datos
y. (d) Dibujo q-q o cuantil-cuantil para
la muestra y aadiendo la lnea que
pasa por el primer y tercer cuartil. Los
puntos estn alejados de la lnea. Parece
razonable rechazar la normalidad de los
datos utilizando este grfico.
544 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
shapiro.test(x)
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.98523, p-value = 0.158
shapiro.test(y)
##
## Shapiro-Wilk normality test
##
## data: y
## W = 0.79546, p-value = 1.082e-11
library(nortest)
pearson.test(x)
##
## Pearson chi-square normality test
##
## data: x
## P = 20.925, p-value = 0.05148
Y despus a la muestra y.
contraste de hiptesis 545
pearson.test(y)
##
## Pearson chi-square normality test
##
## data: y
## P = 66.785, p-value = 4.967e-10
lillie.test(x)
##
## Lilliefors (Kolmogorov-Smirnov) normality
## test
##
## data: x
## D = 0.074098, p-value = 0.06842
lillie.test(y)
##
## Lilliefors (Kolmogorov-Smirnov) normality
## test
##
## data: y
## D = 0.17916, p-value = 3.019e-10
29.1 Introduccin
## [1] 23.1 22.9 22.3 24.1 21.4 21.6 23.5 23.8 23.9
## [10] 21.5 21.5 21.6 22.7 27.8 24.7 21.0 21.7 26.7
## [19] 22.3 20.1 20.9 22.3 21.7 21.1 21.0 22.5 21.9
## [28] 21.9 20.8 22.2 23.9 22.9 23.0 22.2 22.9 25.5
## [37] 16.4 18.1 27.9 22.4 23.8 21.2 21.4 23.6 23.7
round(y,1)
## [1] 29.4 29.2 32.2 31.3 33.6 30.2 26.0 33.5 29.0
## [10] 25.3 28.6 29.6 29.8 24.1 36.4 29.7 29.3 22.5
## [19] 35.3 30.1 30.6 24.4 32.1 31.0 33.5 26.8 31.6
## [28] 28.6 29.8 28.4 35.6 32.1 33.5 28.0 33.6 30.0
## [37] 28.6 33.0 32.4 28.5 34.5 28.5 30.4 33.7 27.1
## [46] 35.2 28.8 35.0 36.2 26.5 26.5 26.6 27.1 27.6
mean(x)
## [1] 22.51776
sd(x)
## [1] 2.065475
y para la segunda
mean(y)
## [1] 30.19877
sd(y)
## [1] 3.274895
(a) (b)
(c) (d)
Figura 29.1: Datos x: histograma (a) y
estimador kernel de la densidad de x
(b). Datos y: histograma (c) y estimador
kernel de la densidad de x (d).
550 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
density
x
hacer.
Cuando comparamos dos poblaciones hay que hacerse varias pre-
guntas y en funcin de las respuestas que obtengamos planteamos la
0.0
( x X )2
1 12
2
f (x) = e X (29.1)
2X
t.test(x)$conf.int
y para la segunda
t.test(y)$conf.int
Xn Ym t,1/2 SE( Xn Ym ).
t.test(x,y,var.equal=TRUE)$conf.int
t.test(x,y,var.equal=FALSE)$conf.int
Si asumimos que las dos varianzas son iguales, esto es, asumimos
la hiptesis de que X2 = Y2 , denotaremos por 2 el valor comn:
2 = X2 = Y2 . El valor comn 2 de la varianza se puede estimar con
(n 1)S2X + (m 1)SY2
S2p = .
n+m2
q
1 1
De hecho, lo que tenemos es que SE( Xn Ym ) = S p n + m y
X Y ( X Y )
T= q t n + m 2 , (29.3)
S p n1 + m1
554 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
t.test(x,y,var.equal=TRUE,conf.level=0.95)$conf.int
t.test(x,y,var.equal=TRUE,conf.level=0.99)$conf.int
Ejemplo 61. Con los datos que estamos analizando los intervalos para la
diferencia de medias con niveles de confianza 0,95 y 0,99 son
t.test(x,y,var.equal=FALSE,conf.level=0.95)$conf.int
t.test(x,y,var.equal=FALSE,conf.level=0.99)$conf.int
H0 : X = Y ,
H1 : X 6 = Y .
siendo
X Y
T0 = q , (29.5)
S p n1 + 1
m
p = P( T0 |t0 |)
t.test(x,y,var.equal=TRUE)
##
## Two Sample t-test
##
## data: x and y
## t = -13.63, df = 97, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -8.799484 -6.562526
## sample estimates:
## mean of x mean of y
## 22.51776 30.19877
Vemos que el p-valor 0 es muy pequeo (menor que ) y por ello rechaza-
mos la igualdad de las medias. Qu pasa si no asumimos la igualdad de las
varianzas? Cambia el resultado del test? Para varianzas desiguales:
X Y
T= q 2 2
(29.7)
SX SY
n + m
y
S2X 2
SY
n + m
= .
(S2X /n)2 (SY2 /m)2
n 1 + m 1
El p-valor viene dado por
p = P(| T | t0 )
siendo t0 el valor observado de T en cada caso.
t.test(x,y,var.equal=FALSE)
##
## Welch Two Sample t-test
##
## data: x and y
## t = -14.18, df = 90.763, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -8.757018 -6.604992
## sample estimates:
## mean of x mean of y
## 22.51776 30.19877
comparacin de dos poblaciones 557
H0 : X Y ,
H1 : X > Y .
H0 : X Y ,
H1 : X < Y .
data(chorizon,package="StatDA")
attach(chorizon)
t.test(Ba[COUN=="RUS"],Ba[COUN=="NOR"],var.equal=TRUE)
##
## Two Sample t-test
##
## data: Ba[COUN == "RUS"] and Ba[COUN == "NOR"]
## t = 2.618, df = 416, p-value = 0.009166
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 5.865386 41.212405
## sample estimates:
## mean of x mean of y
## 69.18655 45.64766
t.test(Ba[COUN=="RUS"],Ba[COUN=="NOR"],var.equal=TRUE)
##
## Two Sample t-test
##
## data: Ba[COUN == "RUS"] and Ba[COUN == "NOR"]
## t = 2.618, df = 416, p-value = 0.009166
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 5.865386 41.212405
## sample estimates:
## mean of x mean of y
## 69.18655 45.64766
29.3.4 Ejercicios
Ej. 43 Los bioslidos de una planta de tratamiento de aguas resi-
duales industriales se aplicaron a 10 parcelas que fueron selecciona-
dos aleatoriamente de un total de 20 parcelas de ensayo de las tierras
agrcolas. El maz se cultiva en el grupo tratado (T) y no tratados
(UT), las parcelas, con los siguientes rendimientos (fanegas / acre).
Grupo T
126 122 90 135 95 180 68 99 122 113
Grupo no tratado NT
144 122 135 122 77 149 122 117 131 149
Se pide:
1.Calcular el intervalo de confianza con un nivel de confianza del
95 % para la diferencia de las medias.
2.Existen diferencias significativas entre las medias.
n = 45
m = 54
x = rnorm(n,mean=23,sd=2.45)
y = rnorm(m,mean=30,sd=3.45)
S2X
(29.8)
SY2
que con nuestros datos vale 0.779 indicando que la primera varianza
es menor que la segunda. Bien, nos hemos centrado en la estimacin
de X2 /Y2 . Siempre que estimamos damos una estimacin puntual
(que acabamos de ver en 29.8) y un intervalo de confianza. Para
obtenerlo utilizamos la cantidad pivotal siguiente:
S2X /X2
F (n 1, m 1) (29.9)
SY2 /Y2
560 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
libertad.
Los tamaos muestrales de nuestros datos son n=45 y m=54. La
S2X /X
2
funcin de densidad de SY2 /2 aparece en la figura 29.4. 1.0
Y
Denotemos por Fp (n 1, m 1) el percentil de orden p de la dis-
y0
tribucin F (n 1, m 1), es decir, el punto que a su izquierda tiene
0.5
un rea p. Por ejemplo, si tomamos los valores de n y m anteriores y
p = 0,975 entonces el percentil viene dado como
0.0
qf(0.975,df1=n-1,df2=m-1)
0.0 0.5 1.0 1.5 2.0 2.5
x0
SY2 SY2
1 1
,
S2X F1/2 (n 1, m 1) S2X F/2 (n 1, m 1)
H0 : X2 = Y2 ,
H1 : X2 6= Y2 .
X2
Bajo la hiptesis de que H0 : X2 = Y2 (o H0 : Y2
= 1) tenemos que
S2X
F= F (n 1, m 1) (29.10)
SY2
var(Ba[COUN=="RUS"])
## [1] 9730.406
var(Ba[COUN=="NOR"])
## [1] 1372.308
var.test(Ba[COUN=="RUS"],Ba[COUN=="NOR"])
##
## F test to compare two variances
##
## data: Ba[COUN == "RUS"] and Ba[COUN == "NOR"]
## F = 7.0905, num df = 289, denom df = 127,
## p-value < 2.2e-16
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 5.227669 9.452443
## sample estimates:
## ratio of variances
## 7.090539
var.test(Ba[COUN=="NOR"],Ba[COUN=="FIN"])
##
## F test to compare two variances
##
## data: Ba[COUN == "NOR"] and Ba[COUN == "FIN"]
## F = 0.84466, num df = 127, denom df = 186,
## p-value = 0.3082
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.6161697 1.1692619
562 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## sample estimates:
## ratio of variances
## 0.8446567
29.4.3 Ejercicios
Ej. 45 Estamos analizando dos catalizadores con objeto de deter-
minar como afectan a la produccin media de un proceso qumico.
Teniendo en cuenta que el segundo catalizador es ms barato, ste
sera el elegido suponiendo que la produccin media no se modifica
manifiestamente. Se tomaron dos muestras, una por catalizador, y se
obtuvieron los resultados siguientes: en la muestra 1;
91.50, 94.18, 92.18, 95.39, 91.79, 89.07, 94.72, 89.21
y en la segunda muestra,
89.19, 90.95, 90.46, 93.21, 97.19, 97.04, 91.07, 92.75.
Se pide:
1.Podemos considerar que la varianza de las muestras es la misma?
2.Comparar las medias teniendo en cuenta la respuesta que hemos
dado en el apartado anterior.
cbind(x[1:10],y[1:10])
## [,1] [,2]
## [1,] 30.61658 28.53455
## [2,] 30.10692 47.87045
## [3,] 30.80347 41.79665
## [4,] 37.04003 33.56073
## [5,] 30.60876 45.47136
## [6,] 34.88646 35.36571
## [7,] 31.45861 43.71433
## [8,] 30.57623 27.09129
## [9,] 36.24498 44.83600
## [10,] 32.55562 37.24129
d = x -y
d[1:10]
t.test(d)
##
## One Sample t-test
##
## data: d
## t = -6.2294, df = 144, p-value = 4.864e-09
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -5.869897 -3.042132
## sample estimates:
## mean of x
## -4.456014
comparacin de dos poblaciones 565
t.test(x,y,paired=TRUE)
##
## Paired t-test
##
## data: x and y
## t = -6.2294, df = 144, p-value = 4.864e-09
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -5.869897 -3.042132
## sample estimates:
## mean of the differences
## -4.456014
(x = c(265,240,258,295,251,245,287,314,260,279,283,240,238,225,247))
## [1] 265 240 258 295 251 245 287 314 260 279 283
## [12] 240 238 225 247
(y = c(229,231,227,240,238,241,234,256,247,239,246,218,219,226,233))
## [1] 229 231 227 240 238 241 234 256 247 239 246
## [12] 218 219 226 233
t.test(x,y,paired=T)
##
## Paired t-test
##
## data: x and y
## t = 5.4659, df = 14, p-value = 8.316e-05
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 16.32430 37.40904
566 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
## sample estimates:
## mean of the differences
## 26.86667
t.test(x,y,paired=T,alternative = "greater")
##
## Paired t-test
##
## data: x and y
## t = 5.4659, df = 14, p-value = 4.158e-05
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
## 18.20922 Inf
## sample estimates:
## mean of the differences
## 26.86667
29.5.1 Ejercicios
Ej. 48 1 Se ha evaluado la concentracin de antimonio en tres 1
Berthouex and Brown [2002, problema
muestras de pescado. Cada muestra fue evaluada con el mtodo 17.1]
0.10
En la figura 29.5 tenemos los estimadores kernel de las densidades
0.08
de dos muestras que pretendemos comparar. Vemos claramente que
Density
0.06
las formas de las densidades estimadas no se parecen en nada a los
0.04
de una normal.
0.02
Un dibujo q-q para la muestra x aparece en la figura 29.6 y para la
0.00
muestra y en la figura 29.7. Vemos que en ambas figuras los puntos
0 10 20 30
se alejan de la lnea. Ninguna de las dos muestras puede considerarse
N = 45 Bandwidth = 2.193
normal. Finalmente, si aplicamos un test de normalidad a las mues-
tras (en concreto, vamos a utilizar el test de Shapiro-Wilk) obtenemos Figura 29.5: Estimadores kernel de
la densidad de x (trazo continuo) e y
los siguientes resultados. (trazo discontinuo).
shapiro.test(x)
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.91252, p-value = 0.00238
shapiro.test(y)
##
## Shapiro-Wilk normality test
##
## data: y
## W = 0.81183, p-value = 7.882e-07
30
570 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
25
Sample Quantiles
20
15
pecfico. Esto suena bien. De hecho es bueno pero tambin tiene su
10
5
con menos potencia. Les cuesta ms rechazar la hiptesis nula.
0
La hiptesis nula que pretendemos contrastar la podemos formu- 2 1 0 1 2
Theoretical Quantiles
lar como:
Figura 29.6: Dibujo q-q de la muestra
H0 : Las muestras han sido extradas de una misma poblacin. x. Vemos que los punto se alejan de la
lnea indicando que no hay normalidad
H1 : Las muestras han sido extradas de poblaciones distintas. en los datos.
20
como en los test anteriores. Denotamos las muestras como x1 , . . . , xn
Sample Quantiles
15
10
5
|{ xi : xi z}|
Fn (z) = .
0
n 2 1 0 1 2
Donde | | denota el cardinal del conjunto. En resumen, Fn (z) est Theoretical Quantiles
contando el nmero de valores en la muestra x que son menores o Figura 29.7: Dibujo q-q de la muestra
y. Vemos que los punto se alejan de la
iguales que z. La funcin Gm se define de un modo anlogo con la
lnea indicando que no hay normalidad
segunda muestra. En la figura 29.8 mostramos las dos funciones Fn y en los datos.
Gm .
El estadstico del test es
2
funciones, esto es, el valor del estadstico D. Por la definicin del es-
Proportion <= x
0.6
p = P ( D d ),
0.0
0 5 10 15 20 25 30
donde en la probabilidad anterior asumimos la hiptesis nula.
z
n:99 m:0
Ejemplo 68 (Funcin ks.test). El test de Kolmogorov-Smirnov para dos Figura 29.8: Funciones de distribucin
muestras lo podemos aplicar con la funcin ks.test del siguiente modo: empricas de ambas muestras. Vemos
que la funcin de distribucin de la
segunda muestra (la muestra y indicada
ks.test(x,y) en la grfica con el nmero 2) es mayor
que la funcin de distribucin emprica
## de la primera muestra (muestra x indi-
cada con 1 en la grfica). La longitud de
## Two-sample Kolmogorov-Smirnov test
la lnea punteada nos muestra la mxi-
## ma diferencia entre ambas funciones de
distribucin. Esta longitud es el valor
del estadstico de
comparacin de dos poblaciones 571
## data: x and y
## D = 0.43333, p-value = 0.000117
## alternative hypothesis: two-sided
p N ( p, p(1 p)/n).
p p
P Z1/2 p Z1/2 = 1 .
p(1 p)/n
574 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
in=1 Xi
p = .
n
Nota de R 3 (R y lo buena que es la aspirina). Vamos a obtener este
intervalo de confianza utilizando R. Los datos con los que vamos a trabajar
consideran si una persona toma aspirina o placebo y si ha sufrido un ataque
cardaco o no. Aparecen en la tabla 30.1.
library(Hmisc,T)
binconf(x=189, n=11034, method="asymptotic")
30.1.1 Ejercicios
Ejercicio 19. Para los datos de la tabla 27.1 se pide:
Ejercicio 20. Wilcox [2009, pg. 120, problema 21] Se observan los si-
guientes xitos y fracasos: 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0. Calcule un
intervalo de confianza con nivel 0,95 para la probabilidad de xito p.
Ejercicio 21. Wilcox [2009, pg. 120, problema 22] Teniendo en cuenta los
siguientes resultados para una muestra de una distribucin binomial, calcule
el error estndar de p cuando:
1. n = 25, X = 5.
2. n = 48, X = 12.
3. n = 100, X = 80.
4. n = 300, X = 160.
Ejercicio 22. Wilcox [2009, pg. 120, problema 23] Entre los 100 adultos
seleccionados al azar, 10 se encontraron desempleados. Dar una intervalo de
confianza con un nivel de 0,99 para el porcentaje de adultos desempleados.
Ejercicio 23. Wilcox [2009, pg. 121, problema 31] Una compaa de
cosmticos encontr que 180 de cada 1000 mujeres seleccionadas al azar en
Nueva York han visto el anuncio de televisin de la empresa. Calcule un
intervalo de confianza al 0,95 para el porcentaje de mujeres en la ciudad de
Nueva York que han visto el anuncio.
30.2.1 Ejercicios
Ejercicio 24. Pretendemos estimar la proporcin de palmeras afectadas por
el picudo. Se ha tomado una primera muestra de 100 palmeras al azar. Se
han observado 23 palmeras afectadas. Se pide:
ij = P( X = i, Y = j),
I I
j = P (Y = j ) = P(X = i, Y = j) = ij
i =1 i =1
578 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
P( X = i, Y = j) = P( X = i ) P(Y = j)
esto es
ij = i j .
En particular, la condicionada es igual a la marginal.
j|i = j con j = 1, . . . , J.
Ataque fatal Ataque no fatal No ataque Tabla 30.2: Tabla de contingencia para
X= toma aspirina o placebo (I = 2) e Y
Placebo 18 171 10845 = sufre ataque cardaco o no (J = 2).
Aspirina 5 99 10933
P (Y = 1 | X = i ) = i , (30.4)
P (Y = 2 | X = i ) = 1 i . (30.5)
j|i Test positivo Test negativo Total Tabla 30.5: Distribucin condicionada
estimada de Y a X.
Enfermo n11 /n1 n11 /n1 1
No enfermo n21 /n2 n22 /n2 1
Este cociente de odds (odds ratio en ingls) es muy til como medida
de asociacin en una tabla 2 2. Se comprueba fcilmente3 que 3
Tenemos que
11 22 1 / (1 1 ) 1|1 / (1 1|1 )
= . = = ,
2 / (1 2 ) 1|2 / (1 1|2 )
12 21
(30.6)
pero j|i = ij /i y sustituyendo se
Por ello tambin se le llama el cociente de los productos cruzados. El sigue inmediatamente el resultado.
cociente de los odds tiene las siguientes propiedades:
(nt1 )(nn12 t)
p(t) = P(n11 = t) =
(nn1 )
donde los valores posibles son
m n11 m
H0 : = 1
H1 : > 1
datos categricos 581
Ejemplo 69. Muriel Bristol indic en una ocasin a R.A. Fisher que era
capaz de diferenciar si en un t con leche se haba servido primero el t y
luego la leche o bien primero la leche y luego el t.4 Se realiza la experiencia 4
Realmente Fisher lo comenta en
consistente en darle a probar 8 tazas de t a dicha seora. Ella sabe que hay su libro The Design of Experiments
y ms que probablemente es una
cuatro tazas preparadas en el orden te y luego leche y cuatro tazas prepa- bonita leyenda pero que le da inters al
radas en el orden leche y luego t. Saba esta seora diferenciar el orden o problema.
responda de un modo aleatorio? Este es el problema conocido como la se-
ora probando el t. En la tabla 30.6 mostramos un posible resultado de la
experiencia.
library(Biobase)
data(yeastgrowthRA,package="tamidata")
y = exprs(yeastgrowthRA)[3109,]
Qu gen es?
featureNames(yeastgrowthRA)[3109]
## [1] "YOR315W"
x = pData(yeastgrowthRA)[,"growthrate"]
1500
plot(x,y)
y
1000
tasa de crecimiento.
0
in=1 ( xi xn )(yi yn )
r= q q .
in=1 ( xi xn )2 in=1 (yi yn )2
cor(x1,y1)
## [1] 0.8448371
(a) (b)
(c) (d)
Figura 31.3: Ejemplo con fuerte aso-
ciacin lineal: datos (a) y los datos
En la figura 31.3(a) mostramos los datos con fuerte asociacin diferenciando el signo del producto
lineal. Distinguimos por el signo del producto cruzado en la figura cruzado. Las figuras (c) y (d) son los
dibujos anlogos con datos en los que
31.3(b) Vemos cmo hay muchos puntos azules. El nuevo coeficiente apenas hay asociacin lineal entre las
de correlacin lineal de Pearson es abscisas y las ordenadas.
cor(x2,y2)
## [1] 0.9917371
586 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
cor(x3,y3)
## [1] -0.01681442
E( X X )(Y Y ),
1 1.
de modo que
s11 ... s1d
n
. .. .. 1
. = n 1 (yi y)(yi y) .
0
..
S= .
i =1
sd1 ... sdd
588 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
cov(M)
cov(t(M))
cor(M)
cor(t(M))
Y N ( E [Y | x ] , 2 ) . (31.3)
En el modelo de regresin ms simple con el que se trabaja se asume
que la media condicionada E[Y | x ] es una funcin lineal de x, en
otras palabras, se asume que
E[Y | x ] = 0 + 1 x. (31.4)
Y = 0 + 1 x + e, (31.5)
590 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
donde
e N (0, 2 ). (31.6)
En la formulacin de 31.5 expresamos el valor aleatorio de Y como
suma de una parte que sistemticamente depende de x (la componen-
te sistemtica del modelo) y un trmino aleatorio con distribucin
normal, un trmino de error o desajuste del modelo. En esta variable
normal con media cero y varianza constante 2 estamos incluyendo
todas las posibles causas que influyen el valor de Y y que no vienen
dadas por la variable predictora.
No consideramos un solo valor aleatorio de Y dado un valor fijo
de x. Realmente, tenemos n valores observados cuyos valores son
independientes entre s pero no tienen la misma distribucin. Hemos de
pensar que cad a Yi tiene una variable predictora distinta que influye
en la distribucin de Yi . Tenemos pares ( xi , Yi ) donde la xi viene
dada y consideramos la distribucin de Yi condicionada a xi , es decir,
Yi | xi .
Resumiendo, estamos asumiendo que Yi N ( 0 + 1 xi , 2 ) y que
los distintos Yi son independientes entre si. Utilizando propiedades
de la distribucin normal multivariante tenemos que estas hiptesis
las podemos expresar conjuntamente diciendo que
Y Nn ( X, 2 Inn ), (31.7)
donde
Y1 1 x1 " #
. . .. 0
..
Y= X = .. . =
1
Yn 1 xn
Si consideramos que
e1
.
e = ..
en
Y = X + e, (31.8)
Y = f ( x1 , . . . , xn ) + e, (31.9)
Y = X + e. (31.10)
(y X)0 (y X) = y0 y 20 X 0 y + + 0 X 0 X.
X 0 X = X 0 y. (31.12)
X = X ( X 0 X )1 X 0 y = Hy. (31.14)
y = Hy = X . (31.15)
Tambin tenemos los residuos, esto es, las diferencias entre los va-
lores observados originalmente y las predicciones que de ellos ha-
cemos. Los residuos en trminos de la matriz H vienen dados por
e = y Hy = ( I H )y. (31.16)
Finalmente, hemos determinado los coeficientes que nos minimiza-
ban la suma de cuadrados. El valor mnimo que hemos obtenido que
recibe el nombre de suma de cuadrados residual o suma de cuadra-
dos del error que viene dada por
n
SS( Error ) = (yi yi )2 , (31.17)
i =1
e0 e = y0 ( I H )( I H )y = y0 ( I H )y. (31.18)
1 x1 x
. ..
X = ..
.
1 xn x
con
" #
0 n 0
XX= n
0 i=1 ( xi x )2
Finalmente se comprueba sin dificultad que
in=1 ( xi x )yi
= (31.24)
in=1 ( xi x )2
594 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
31.7 Verosimilitud
y la logverosimilitud sera
n 1
l ( , ) = log(2 ) n log 2 (y X)0 (y X). (31.26)
2 2
El estimador mximo verosmil de se obtiene maximizando cual-
quiera de las dos funciones anteriores. Es obvio que el mximo res-
pecto de se obtiene como el valor que minimiza (y X)0 (y X),
en definitiva, que los estimadores mximo verosmiles no son ms
que los estimadores mnimo cuadrticos.
E = ( X 0 X )1 X 0 ( EY ) = , (31.27)
var ( ) = ( X 0 X )1 X 0 (2 I ) X ( X 0 X )1 = ( X 0 X )1 2 . (31.28)
c ( ) = ( X 0 X )1 2 .
var (31.31)
c ( i ) = aii .
SE (31.32)
Np ( , ( X 0 X )1 2 ). (31.33)
SS( Error ) pequeo en relacin con SS( Total ). Esa es la idea del coefi-
ciente de determinacin. Toma valores entre 0 y 1 y cuanto ms cerca
de 1 mejor es el ajuste.
Tiene un pequeo inconveniente y es que no tiene en cuenta el n-
mero de variables predictoras que estamos utilizando para predecir
la variable respuesta. Una pequea modificacin de R2 para incorpo-
rar esta informacin es el coeficiente de determinacin ajustado que
podemos denotar R2 -ajustado y se define como
in=1 (yi yi )2 /(n p)
R2 ajustado = 1 , (31.36)
in=1 (yi y)2 /(n 1)
donde suponemos que tenemos p 1 variables predictoras.
Ejemplo 72. Los datos que vamos a utilizar para valorar las hiptesis
del modelo son los datos tamidata::yeastgrowthRA. Se pretende estudiar
la relacin que liga el nivel de expresin observado del gen con el medio de
cultivo y la tasa de crecimiento celular. El siguiente diagrama de puntos
muestra en abscisas las predicciones y en ordenadas los residuos. No parece
en principio que no podamos asumir una varianza constante. Vemos tambin
que nos indica los tres pases con los residuos ms extremos: Chile, Filipinas
y Zambia.
y = exprs(yeastgrowthRA)[3109,]
x1 = pData(yeastgrowthRA)[,"background"]
x2 = pData(yeastgrowthRA)[,"growthrate"]
ra31
plot(gen3109.lm, which = 1)
500
ra3
par(mfrow=c(2,2))
for(i in 1:4)
plot(1:50,rnorm(50))
par(mfrow=c(1,1))
1
0 1 2
rnorm(50)
rnorm(50)
2
2
0 10 20 30 40 50 0 10 20 30 40 50
1:50 1:50
rnorm(50)
rnorm(50)
0 10 20 30 40 50 0 10 20 30 40 50
1:50 1:50
par(mfrow=c(2,2))
for(i in 1:4)
plot(1:50,(1:50)*rnorm(50))
par(mfrow=c(1,1))
par(mfrow=c(2,2))
for(i in 1:4)
plot(1:50,(1:50)*rnorm(50))
par(mfrow=c(1,1))
(1:50) * rnorm(50)
(1:50) * rnorm(50)
50
50
50 0
50
0 10 20 30 40 50 0 10 20 30 40 50
1:50 1:50
(1:50) * rnorm(50)
(1:50) * rnorm(50)
50
50
50 0
50
0 10 20 30 40 50 0 10 20 30 40 50
1:50 1:50
par(mfrow=c(2,2))
for(i in 1:4)
plot(1:50,sqrt((1:50))*rnorm(50))
par(mfrow=c(1,1))
sqrt((1:50)) * rnorm(50)
sqrt((1:50)) * rnorm(50)
10
0 5
10
10
0 10 20 30 40 50 0 10 20 30 40 50
1:50 1:50
sqrt((1:50)) * rnorm(50)
sqrt((1:50)) * rnorm(50)
5 10
10
5 0
10
0 10 20 30 40 50 0 10 20 30 40 50
1:50 1:50
31.10.2 Normalidad
La siguiente hiptesis a valorar es la normalidad de los errores. La
herramienta grfica ms habitual es el dibujo q-q o la representacin
cuantil-cuantil. Ordenamos los residuos y representamos los residuos
ordenados en funcin de 1 ( n+i 1 ) para i = 1, . . . , n. Si los resi-
duos tienen una distribucin normal entonces deben estar alineados.
modelos lineales 601
par(mfrow=c(2,2))
for(i in 1:4)
plot(1:50,cos((1:50)*pi/25)+rnorm(50))
par(mfrow=c(1,1))
cos((1:50) * pi/25) + rnorm(50)
1
1
1
3
0 10 20 30 40 50 0 10 20 30 40 50
1:50 1:50
cos((1:50) * pi/25) + rnorm(50)
3 1
0 10 20 30 40 50 0 10 20 30 40 50
1:50 1:50
ra31
plot.lm).
4
Standardized residuals
3
plot(gen3109.lm,which=2)
2
1
En la figura 31.11 aparece un dibujo q-q utilizando las funciones qq-
0
norm que construye el dibujo y qqline que aade una lnea uniendo el
ra3 ra1
1
primer y tercer cuartil. Como vemos es el mismo dibujo.
2 1 0 1 2
Theoretical Quantiles
lm(y ~ x1 + x2)
qqnorm(residuals(gen3109.lm),ylab="Residuos")
Figura 31.10: Dibujo cuantil-cuantil.
qqline(residuals(gen3109.lm))
Normal QQ Plot
Hemos visto cmo es una dibujo q-q cuando tenemos normalidad.
2000
1500
sante saber qu tenemos que buscar para detectar que los residuos no
siguen una distribucin normal.
1000
Residuos
500
Ejemplo 75 (Dibujos cuantil-cuantil y error no normal). Veamos c-
0
En esta nota consideramos cuatro distribuciones de probabilidad. En la si-
Theoretical Quantiles
la correspondiente a la distribucin normal. Luego tenemos la lognormal, la
densidad de una Cauchy y la densidad uniforme. La lognormal se toma como Figura 31.11: Dibujo cuantil-cuantil
utilizando qqnorm y qqline.
ejemplo de distribucin asimtrica, la Cauchy como ejemplo de una distribu-
cin con las colas ms largas que la normal y finalmente la uniforme como
ejemplo de distribucin con las colas ms cortas. Las funciones de densidad
correspondientes aparecen en la figura 31.12.
par(mfrow=c(2,2))
curve(dnorm,xlim=c(-3,3))
curve(dlnorm,xlim=c(-3,3))
curve(dcauchy,xlim=c(-3,3))
curve(dunif,xlim=c(-3,3))
par(mfrow=c(1,1))
En la figura 31.13 tenemos nueve dibujos q-q realizados con datos simu-
lados con una distribucin normal.
par(mfrow=c(2,2))
for(i in 1:4){
modelos lineales 603
0.4
0.6
dlnorm(x)
dnorm(x)
0.2
0.3
0.0
0.0
3 1 1 2 3 3 1 1 2 3
x x
0.8
dcauchy(x)
dunif(x)
0.20
0.4
0.05
0.0
3 1 1 2 3 3 1 1 2 3
x x
residuos = rnorm(50)
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))
par(mfrow=c(2,2))
for(i in 1:4){
residuos = exp(rnorm(50))
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))
La figura 31.15 que sigue muestra el dibujo q-q con datos simulados
correspondientes a la distribucin de Cauchy.
par(mfrow=c(2,2))
for(i in 1:4){
residuos = rcauchy(50)
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))
La figura 31.16 que sigue muestra el dibujo q-q con datos simulados
correspondientes a la distribucin de uniforme.
par(mfrow=c(2,2))
for(i in 1:4){
residuos = runif(50)
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))
par(mfrow=c(2,2))
for(i in 1:4){
residuos = exp(rnorm(50))
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))
Sample Quantiles
0 2 4 6 8
12
2 1 0 1 2 2 1 0 1 2
Sample Quantiles
12
8 12
8
2 1 0 1 2 2 1 0 1 2
par(mfrow=c(2,2))
for(i in 1:4){
residuos = rcauchy(50)
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))
Sample Quantiles
400 800
5
5
15
2 1 0 1 2 2 1 0 1 2
Sample Quantiles
20
100
50
20
2 1 0 1 2 2 1 0 1 2
par(mfrow=c(2,2))
for(i in 1:4){
residuos = runif(50)
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))
Sample Quantiles
0.8
0.6
0.4
0.2
0.0
2 1 0 1 2 2 1 0 1 2
1.0
Sample Quantiles
Sample Quantiles
0.6
0.6
0.2
0.2
2 1 0 1 2 2 1 0 1 2
residuals(gen3109.lm)
shapiro.test(residuals(gen3109.lm))
##
## Shapiro-Wilk normality test
##
## data: residuals(gen3109.lm)
## W = 0.53133, p-value = 4.009e-07
library(lmtest)
dwtest(gen3109.lm)
##
## Durbin-Watson test
##
## data: gen3109.lm
## DW = 1.5844, p-value = 0.1085
## alternative hypothesis: true autocorrelation is greater than 0
gen3109.inf = influence(gen3109.lm)
gen3109.inf$hat
4
## 0.34826991
Standardized residuals
3
1
Y las representamos en la figura 31.17.
2
0.5
1
Otra posibilidad es para encontrar observaciones anmalas consis-
0
te en trabajar con los residuos estudentizados. Veamos su definicin.
ra3 ra1
1
Notemos que var (ei ) = 2 (1 hi ) lo que sugiere tomar Cook's distance
Puesto que cada uno de los ti sigue una distribucin conocida po-
demos contrastar si tenemos una observacin anmala. En prin-
cipio el procedimiento sera simplemente fijar un nivel de signifi-
cacin y determinar el percentil 1 2 de una distribucin t de
Student con n p 1 grados de libertad. Si denotamos el percen-
til como tn p1,1 entonces residuos que no estn en el intervalo
2
[tn p1,1 2 , tn p1,1 2 ] seran sospechosos. Esto no es adecua-
do. Porque estamos analizando n residuos estudentizados. Con uno
slo s que sera aplicable el razonamiento. Tenemos un problema
de muchos tests simultneamente considerados. Si aplicamos la
correccin de Bonferroni tendramos que corregir el nivel de signi-
ficacin y trabajar con /n. Por tanto, consideramos como sospe-
chosos aquellos residuos estandarizados que estn fuera del intervalo
[tn p1,1 , tn p1,1 ].
2n 2n
gen3109.rs = rstudent(gen3109.lm)
ra31
Ejemplo 80. Con los datos gen3109 representamos las distancias de Cook
0.5
y las obtenemos utilizando la funcin Cooks.distance. Lo tenemos en la
0.4
Cook's distance
figura 31.18.
0.3
Tambin podemos ver los valores de la distancia de Cook.
0.2
0.1
ra1
cooks.distance(gen3109.lm) ra3
0.0
5 10 15 20
## ra1 ra2 ra3
Obs. number
## 6.439607e-02 1.412936e-02 3.548163e-02 lm(y ~ x1 + x2)
max( ,)0 L( , )
= (31.42)
max( ,) L( , )
siendo L( , ) = 1
n exp{ 21 2 (y X)0 (y X)}, 0 =
(2 ) 2 n
{( , ) R p (0, +) : i1 = . . . = ir = 0} y = R p (0, +).
Como es habitual en un test del cociente de verosimilitudes recha-
zaramos la hiptesis nula si es pequeo (menor que una cierta
constante) que se prueba es equivalente a que
sea grande (mayor que una cierta constante). Denotamos por SS( Error )0
la suma de cuadrados del error bajo la hiptesis nula y SS( Error ) la
suma de cuadrados sobre todo el espacio paramtrico. Bajo la hipte-
sis nula se verifica que
F = t2i .
o bien si
F = t2i > F1,n p,1 .
2
summary(gen3109.lm)
##
## Call:
## lm(formula = y ~ x1 + x2, data = yeastgrowth3109)
##
## Residuals:
## Min 1Q Median 3Q Max
## -401.61 -224.37 -38.54 -16.37 2040.61
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 53.53 508.75 0.105 0.917
## x1W303 -286.64 235.09 -1.219 0.238
## x2 855.05 1478.84 0.578 0.570
##
## Residual standard error: 520.6 on 18 degrees of freedom
## Multiple R-squared: 0.1101,Adjusted R-squared: 0.01126
## F-statistic: 1.114 on 2 and 18 DF, p-value: 0.3499
modelos lineales 615
i tn p,1 SE( i ).
2
confint(gen3109.lm)
## 2.5 % 97.5 %
## (Intercept) -1015.3096 1122.3790
## x1W303 -780.5354 207.2582
## x2 -2251.8728 3961.9699
E[Y | x0 ] = x00 .
x00 ,
c ( x00 ) = x00 ( X 0 X )1 x0 2 .
var
x00
var ( x00 ) + 2
616 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
Ejemplo 83. Con los datos gen3109 consideramos cmo obtener las pre-
dicciones, intervalos de confianza para las medias y para las predicciones.
Utilizamos los propios datos que se han utilizado para ajustar el modelo.
Con la funcin predict obtenemos las predicciones as como los intervalos de
confianza para las medias de las predicciones (predict con la opcin inter-
val=confidence) y los intervalos de confianza para las observaciones (predict
con la opcin interval="prediction").
Primero obtengamos las predicciones para los propios datos.
predict(gen3109.lm)
library(MASS)
stepAIC(gen3109.lm)
## Start: AIC=265.47
## y ~ x1 + x2
##
## Df Sum of Sq RSS AIC
## - x2 1 90613 4969500 263.86
## - x1 1 402963 5281850 265.14
## <none> 4878887 265.47
##
## Step: AIC=263.86
## y ~ x1
##
## Df Sum of Sq RSS AIC
## <none> 4969500 263.86
## - x1 1 513221 5482721 263.92
##
## Call:
## lm(formula = y ~ x1, data = yeastgrowth3109)
##
## Coefficients:
## (Intercept) x1W303
## 334.6 -315.9
32.1 Verosimilitud
n1 r
L(; n) = (1 ) n r
r1
conceptos fundamentales de estadstica 623
32.2 Estimacin
MSE() = E[ ]2 = E[ + ]2 = E[ ]2 + [ ]2
(32.5)
La diferencia entre la media del estimador y el parmetro, ,
recibe el nombre de sesgo. Finalmente lo que nos dice la ecuacin an-
terior es que el error cuadrtico medio MSE() lo podemos expresar
como la suma de la varianza del estimador, E[ ]2 , ms el sesgo
al cuadrado, [ ]2 .
A la raz cuadrada de la varianza de un estimador, es decir, a su
desviacin tpica o estndar se le llama error estndar. La expresin
error estndar se usa en ocasiones indistintamente para referirse o
bien dicha desviacin tpica o bien al estimador de la misma.
n
E (Yi Y )2 =
i =1
n n
E [(Yi ) (Y )2 )]2 = E(Yi )2 nE(Y )2 , (32.8)
i =1 i =1
de donde,
n
1
n 1 i
ES2 = E (Yi Y )2 = 2 ,
=1
de modo que
S11 ... S1d
n
= 1 (Yi Y )(Yi Y )0 = 1 Q.
. .. ..
S = ..
. . n 1 i =1 n1
Sd1 ... Sdd
= f ( ). (32.13)
2
l ( )
E (32.14)
j k
p (1 p )
En consecuencia asintticamente p tiene varianza n lo cual era
de prever pues si consideramos la variable Y que nos da el nmero
de xitos entonces sabemos que EY = np y que var (Y ) = np(1 p).
H0 : 0 (32.19)
H1 : 1 (32.20)
H0 H1
Rechazamos H0 Error tipo I
No rechazamos H0 Error tipo II
H0 : = 0 , (32.22)
H1 : 6= 0 . (32.23)
in=1 ( Xi X )2
Siendo S2 = n 1 , el estadstico habitualmente utilizado es el
siguiente
X 0
.
T=
S/ n
Bajo la hiptesis nula este estadstico sigue una distribucin t de
Student con n 1 grados de libertad,
T t ( n 1).
| T | > tn1,1 2 .
L0
2 log = 2 log = 2 ( l0 l1 ) (32.25)
L1
H0 : = 0 , (32.26)
H1 : 6= 0 . (32.27)
0
z= (32.28)
SE( )
Xn
t n 1 . (32.30)
S/ n
X
Vemos cmo S/n n depende tanto de la muestra que conocemos como de un
parmetro (la media ) que desconocemos. Fijamos un valor de (habitual-
mente tomaremos = 0,05) y elegimos un valor tn1,1/2 tal que
Xn
P(tn1,1/2 tn1,1/2 ) = 1 . (32.31)
S/ n
S S
P( Xn tn1,1/2 Xn + tn1,1/2 ) = 1 . (32.32)
n n
| 0 |
{ 0 : < Z1/2 } (32.34)
SE( )
33.1 Introduccin
4. Consideramos1 1
En la implementacin original del
x mx procedimiento c = 1 y e = 0.
ui = i ,
cmd + e
con i = 1, . . . , n. Los valores por defecto son c = 5 y e = 0,0001
(con el valor de e evitamos la divisin por cero).
634 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
in=1 w(ui ) xi
Tbi ( x1 , . . . , xn ) = .
in=1 w(ui )
x = c(12,3,45,21,34,35,21,456)
library(affy)
tukey.biweight(x, c = 5, epsilon = 1e-04)
## [1] 25.1902
yij = m + ai + b j + eij
Mediana{b1 , . . . , b J } = 0.
7.
y = matrix(c(18,11,8,21,4,13,7,5,16,7,15,6,7,16,6,19,15,12,18,5),
ncol=5)
rownames(y) = paste("chip",1:4)
colnames(y) = paste("sonda",1:5)
medpolish(y)
## 1: 82
## Final: 82
##
## Median Polish Results (Dataset: "y")
##
## Overall: 10.5
##
## Row Effects:
## chip 1 chip 2 chip 3 chip 4
## 5 2 -2 -4
##
## Column Effects:
## sonda 1 sonda 2 sonda 3 sonda 4 sonda 5
## 1.0 -1.5 0.0 0.5 -0.5
##
## Residuals:
## sonda 1 sonda 2 sonda 3 sonda 4 sonda 5
## chip 1 1.5 -10 0.5 -9 0
## chip 2 -2.5 2 -5.5 3 0
## chip 3 -1.5 0 6.5 -3 10
## chip 4 13.5 0 -0.5 12 -1
34
Meta-anlisis
con una distribucin comn Pi U (0, 1). Fisher propuso como forma
de combinar estos valores el siguiente estadstico
k
X 2 = 2 ln Pi . (34.1)
i =1
ik=1 Zi
Z= , (34.3)
k
siendo Zi = 1 (1 Pi ).
Notemos que el mtodo de Fisher suma los valores 2 ln( pi ). Por
otro lado el Z-valor de Stouffer lo que propone es (por una constante)
una suma de Zi valores. En ambos casos sumamos la contribucin de
cada test que en un caso lo cuantificamos con 2 ln( pi ) y en otro con
1 (1 pi )/ k. En la figura ?? comparamos los sumandos con el
siguiente cdigo.
2
p = seq(.01,.99,.001)
1
plot(-log(p),qnorm(1-p),type="l",xlab = expression(-ln(p)),
0
z
ylab = "z") 1
2
0 1 2 3 4
ln(p)
Investigacin reproducible
35
Investigacin reproducible
35.1 Introduccin
35.2 Markdown
35.3 R/Markdown
# Generacin de datos
## Generacin de x e y
- Generamos la variable **x** segn una distribucin normal con media 20 y
desviacin estndar 2. Se generan 100 valores.
```{r generacionx}
x = rnorm(100,mean= 20, sd = 2)
```
- Y ahora generamos la variable **y**.
```{r generaciony}
y = x + rnorm(100,mean= 0, sd = 0.5)
```
## Diagrama de puntos
- Representamos la
35.4 Software
emacs y R/Markdown %
1. En /home/gag/emacs.d/6 ejecutamos 6
Sustituimos por el directorio personal
correspondiente.
git clone https://github.com/vitoshka/polymode.git
644 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor
library(knitr)
Y ejecutamos
knit("prueba.Rmd")
35.5 RMarkdown
A.1 Introduccin
B.1 TCGA
Lo encontramos en https://www.ebi.ac.uk/gxa/home
C
Datos
Datos html org Rmd Tipo Tabla C.1: Datos RNASeq utilizados
GSE1397 html gse1397.Rmd ExpressionSet
PRJNA297798 html PRJNA297798.org RangedSummarizedExperiment
PRJNA266927 html PRJNA266927.org RangedSummarizedExperiment
SRP064411 html SRP064411.org RangedSummarizedExperiment
D
Soluciones ejercicios
Por tanto los nombres abreviados de los genes los tendremos con
keys(org.Hs.eg.db, keytype="SYMBOL")
data(gse20986,package="tamidata")
Qu columnas ocupan?
pacman::p_load("Biobase")
pData(gse20986)[,"tissue"] == "iris" | pData(gse20986)[,"tissue"] == "huvec"
De otro modo:
(sel = which(is.element(pData(gse20986)[,"tissue"],c("iris","huvec"))))
## [1] 1 4 6 10 11 12
eset = gse20986[,sel]
pData(eset)[,"tissue"] = factor(pData(eset)[,"tissue"])
2.Con genefilter::rowttests.
tt = genefilter::rowttests(eset,pData(eset)[,"tissue"])
soluciones ejercicios 653
3.tt1 = multtest::mt.rawp2adjp(tt[,"p.value"],"BH")
tt1$adjp[,2]
## [1] 1828
sigIH = tt1$index[1:1828]
5.sel = which(is.element(pData(gse20986)[,"tissue"],c("retina","huvec")))
eset = gse20986[,sel]
pData(eset)[,"tissue"] = factor(pData(eset)[,"tissue"])
tt = genefilter::rowttests(eset,pData(eset)[,"tissue"])
tt1 = multtest::mt.rawp2adjp(tt[,"p.value"],"BH")
sigRH = tt1$index[1:sum(tt1$adjp[,2] < 0.05,na.rm = TRUE)]
6.sel = which(is.element(pData(gse20986)[,"tissue"],c("coroides","huvec")))
eset = gse20986[,sel]
pData(eset)[,"tissue"] = factor(pData(eset)[,"tissue"])
tt = genefilter::rowttests(eset,pData(eset)[,"tissue"])
tt1 = multtest::mt.rawp2adjp(tt[,"p.value"],"BH")
sigCH = tt1$index[1:sum(tt1$adjp[,2] < 0.05,na.rm = TRUE)]
7.sigIR = intersect(sigIH,sigRH)
sigIRC = intersect(sigIR,sigCH)
sigIRC
featureNames(gse20986[sigIRC,])
1.tt = genefilter::rowttests(eset,pData(eset)[,"type"])
2.tt = multtest::mt.rawp2adjp(pvalor13,"BH")
pvalor13.BH = tt$adjp[,"BH"]
5.intersect(sig13,sig25)
entrez2maturemiRs = function(id){
fam = get(id,targetscan.Hs.egTARGETS)
mir = mget(fam,targetscan.Hs.egFAMILY2MIRBASE)
mirs = NULL
for(i in 1:length(mir))
mirs = c(mirs,mir[[i]][grep("^hsa",mir[[i]])])
mirs = tolower(mirs)
mirs = unique(mirs)
mirs = mirs[is.element(mirs,keys(mirbaseMATURE))]
if(length(mirs) > 0)
maturemirs = matureAccession(get(mirs,mirbaseMATURE))
else
maturemirs = NA
maturemirs
}
Yoav Benjamini and Daniel Yekutieli. The control of the false dis-
covery rate in multiple testing under dependency. The Annals of
Statistics, 29(4):11651188, 2001.
Ben Bolstad. affyPLM: Methods for fitting probe-level models, 2015. URL
https://github.com/bmbolstad/affyPLM. R package version 1.46.0.
Min Chen, Miao Zang, Xinlei Wang, and Guanghua Xiao. A po-
werful bayesian meta-analysis method to integrate multiple gene
set enrichment studies. Bioinformatics, 29(7):862869, 2013. doi:
10.1093/bioinformatics/btt068. URL http://bioinformatics.
oxfordjournals.org/content/29/7/862.abstract.
Sean Davis. GEOquery: Get data from NCBI Gene Expression Omnibus
(GEO), 2015. URL https://github.com/seandavi/GEOquery. R
package version 2.36.0.
bibliografa 661
Brad Efron and R. Tibshirani. GSA: Gene set analysis, 2010. URL
https://CRAN.R-project.org/package=GSA. R package version 1.03.
Kyle Furge and Karl Dykema. PGSEA: Parametric Gene Set Enrich-
ment Analysis, 2012. R package version 1.44.0.
Juergen Gross and Uwe Ligges. nortest: Tests for Normality, 2015.
URL https://CRAN.R-project.org/package=nortest. R package
version 1.0-4.
Jason A. Hackney, Melanie Huntley, Jessica L. Larson, Christina
Chaivorapol, Gabriel Becker, and Josh Kaminker. ReportingTools:
Tools for making reports in various formats, 2015. R package version
2.10.0.
http://biostatistics.oxfordjournals.org/content/4/2/249.
abstract.
R.A. Irizarry, C. Wang, Y. Zhou, and T.P. Speed. Gene set enrich-
ment analysis made simple. Statistical Methods in Medical Research,
18(6):565575, December 2009. Gene set analysis.
Herve Pages, Marc Carlson, Seth Falcon, and Nianhua Li. Anno-
tationDbi: Annotation Database Interface, 2015. R package version
1.32.3.
Weiliang Qiu, Mei-Ling Ting Lee, and George Alex Whitmore. size-
power: Sample Size and Power Calculation in Micorarray Studies, 2015. R
package version 1.40.0.
C.R. Rao. Linear Statistical Inference and Its Applications. Wiley, 1967.
Emily Chia-Yu Su, Yu-Sing Chen, Yun-Cheng Tien, Jeff Liu, Bing-
Ching Ho, Sung-Liang Yu, and Sher Singh. Chemirs: a web ap-
plication for micrornas and chemicals. BMC Bioinformatics, 17(1):
110, 2016. ISSN 1471-2105. doi: 10.1186/s12859-016-1002-0. URL
http://dx.doi.org/10.1186/s12859-016-1002-0.
Maarten van Iterson. SSPA: General Sample Size and Power Analysis
for Microarray and Next-Generation Sequencing Data, 2015. URL http:
//www.humgen.nl/MicroarrayAnalysisGroup.html. R package
version 2.10.0.
John Verzani. UsingR: Data Sets, Etc. for the Text sing R for Introduc-
tory Statistics", Second Edition, 2015. URL https://CRAN.R-project.
org/package=UsingR. R package version 2.0-5.
Leif Vremo, Jens Nielsen, and Intawat Nookaew. Enriching the ge-
ne set analysis of genome-wide data by incorporating directionality
of gene expression and combining statistical hypotheses and met-
hods. Nucleic Acids Research, 41(8):43784391, 2013. doi: 10.1093/na-
r/gkt111. URL http://nar.oxfordjournals.org/content/41/8/
4378.abstract.
Gregory R. Warnes, Peng Liu, and Fasheng Li. ssize: Estimate Micro-
array Sample Size, 2012. R package version 1.44.0.
E. Wit and J.D. McClure. Statistics for microarrays: design, analysis, and
inference. Wiley, 2004.
Matthew Young. goseq: Gene Ontology analyser for RNA-seq and other
length biased data, 2015. R package version 1.22.0.
Shilin Zhao, Chung-I Li, Yan Guo, Quanhu Sheng, and Yu Shyr.
RnaSeqSampleSizeData: RnaSeqSampleSizeData, 2014. R package
version 1.2.0.
Shilin Zhao, Chung-I Li, Yan Guo, Quanhu Sheng, and Yu Shyr.
RnaSeqSampleSize: RnaSeqSampleSize, 2015. R package version 1.2.0.
SRA NCBI SRA (Sequence Read Archive) es una base de datos con
datos de secuenciacin de DNA en forma de lecturas cortas gene-
radas mediante secuenciacin de alto rendimiento. Su direccin
es http://www.ncbi.nlm.nih.gov/sra. En http://www.ncbi.nlm.
nih.gov/books/NBK47528/ tenemos ms informacin. Si no fun-
ciona el enlace buscamos en Google SRA handbook.. 137, 144, 148,
149
TopHat https://ccb.jhu.edu/software/tophat/index.shtml. En
Debian/Ubuntu instalamos con apt-get install tophat.. 165