Está en la página 1de 681

G U I L L E R M O A YA L A G A L L E G O

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

1 Estadstica y datos micos 13

2 R y Bioconductor 19

3 Anotacin 45

II Datos 77

4 Microarrays 79

5 Datos de microarrays 103

6 RNASeq 133

7 Datos de RNASeq 137

III Expresin diferencial 167

8 Expresin diferencial marginal 169


4

9 Comparaciones mltiples 189

10 Expresin diferencial con microarrays 211

11 Expresin diferencial con datos RNASeq 233

12 Tamao muestral y potencia 249

13 Generando un informe 251

IV Reduccin de dimensin y clasificacin 257

14 Componentes principales 259

15 Anlisis cluster 277

V Anlisis de grupos de genes 301

16 Grupos de genes 303

17 Test de Fisher unilateral 315

18 Anlisis de conjuntos de genes 333

19 Enriquecimiento de grafos 367

VI Agregacin 371

20 Listas de caractersticas ordenadas 373


5

VII Secuencias 383

21 Secuencias 385

VIII Regulacin de la expresin 425

22 Modelos para la regulacin de la expresin 427

23 microRNA 433

IX Probabilidad y Estadstica 443

24 Estadstica descriptiva 445

25 Probabilidad 461

26 Distribucin muestral 497

27 Estimacin 505

28 Contraste de hiptesis 527

29 Comparacin de dos poblaciones 547

30 Datos categricos 573

31 Modelos lineales 583

32 Conceptos fundamentales de Estadstica 621


6

33 Miscelnea 633

34 Meta-anlisis 637

X Investigacin reproducible 639

35 Investigacin reproducible 641

A Datos faltantes 645

B Datos multimodales 647

C Datos 649

D Soluciones ejercicios 651

Bibliografa 657

ndice alfabtico 675

Glossary 677
Prlogo

Estas notas tratan de la aplicacin de procedimientos estadsticos al


anlisis de datos de alto rendimiento. Bonito el nombre pero: qu son
datos de alto rendimiento? Datos que rompen lo que tradicional-
mente era un prerrequisito en Estadstica (multivariante). Muchos
procedimientos estadsticos empiezan indicando que el nmero de
observaciones, n, ha de ser mayor que el nmero de variables por
observacin, p. Actualmente es frecuente (mejor habitual) que los
datos no los recoja un experimentador con un lpiz y un papel y
luego los introduzca con mucho trabajo en una hoja de clculo. Lo
hacen disposivos electrnicos conectados con ordenadores. Por eso
los datos tienen dimensiones p que marean: miles de variables frente
a decenas (con suerte algo ms de un centenar) de observaciones o
muestras. Y qu hacemos para analizar esto? Lo que se pueda.1 De 1
Uno no est obligado ms que a hacer
esto van estas notas, de lo que se pueda. Son unas notas en progreso. Se las cosas lo mejor que pueda y no ms.

van aadiendo ideas, tcnicas, software y se ve cmo incorporar estos


anlisis en nuestro trabajo. Tambin2 voy incorporando nuevos tipos 2
En la medida en que me voy encon-
de informacin. De momento, analizamos datos de expresin de gen trando con nuevos tipos de datos que
entienda.
(o expresin gnica) sabiendo que (la mayor parte de) lo que hacemos
es aplicable en otros contextos. El tema 4 est dedicado a este tipo
de datos, sus caractersticas y tcnicas de preprocesado. Es el tema
especfico de esta informacin. Si se sustituye este captulo por otro
dedicado a otra tcnica de adquisicin de informacin casi todo lo
que sigue es aplicable.

Sobre la parte biolgica. El objetivo es que estas notas ayuden a quien


lee y no que demuestren que sabe el que las escribe. 3 En lo biolgi- 3
Sobre esta cuestin yo dira que que el
co hay imprecisin por ignorancia, en lo probabilstico y estadstico autor se apaa como puede (que no es
mucho) con los conceptos biolgicos.
hay imprecisin porque pretenden ser unas notas para un pblico
interesado en estos temas pero con formacin en Biologa, Bioqu-
mica o Medicina fundamentalmente. Hay que tener inters en la
Estadstica y la Informtica en cualquier caso para poder seguirlas.
En ?? se incluye un repaso de procedimientos estadsticos de modo
que podamos referenciarlos en el resto de temas segn se utilizan.
En el apndice ?? se introduce lo bsico del uso de R mientras que
8

en apndice ?? comentamos cmo definir funciones y proponemos


ejemplos sencillos.

Sobre R/Bioconductor. Estas notas utilizan sistemticamente R/Bio-


conductor. Y ningn otro software. 4 4
En Huber et al. [2015] podemos
Cuando empec con esto de la Probabilidad y la Estadstica uno ver un trabajo interesante sobre las
prestaciones de Bioconductor.
lea libros y artculos, entendas aquello y luego intentabas descifrar
cmo aplicaba (mejor implementaba) estas tcnicas el software co-
mercial (en mi caso SPSS). Lo primero era bonito. Los autores inten-
tan que les entiendas porque tratan de transmitir ideas. Sin embargo,
el software comercial no piensa as (y esto no es necesariamente ma-
lo). El software comercial intenta dar un producto bueno y fcilmente
utilizable para llegar a un mximo de usuarios. Solamente suelen
considerar temas sobre los que hay mucho inters y muchos (poten-
ciales) usuarios. Y esto es correcto. No es la opcin elegida en estas
notas. Hemos elegido trabajar con software libre. Tanto R como Bio-
conductor son el resultado de un gran trabajo coordinado de muchas
personas. Algunos son proceden del mundo acadmico. En otros oca-
siones proceden de empresas para las cuales les resulta interesante
que se disponga de software que permita utilizar su hardware.
En lo que sigue hay distintos niveles de lectura en un mismo texto.
Es un material que se utiliza en dos cursos claramente diferenciados.

TAMI Uno es una breve introduccin en 20 horas lectivas en tercer


curso del grado de Bioctecnologa de la Universidad de Valencia.
En este curso se utilizan las herramientas ms bsicas, la opcin
simple y rpida. Se pretende ver cosas interesantes y mantener (en
lo que se pueda) la programacin con R/Bioconductor simple.

Bioinformtica Estadstica El segundo curso es un mdulo en Bioinfor-


mtica Estadstica en el master de Bioinformtica de la Universi-
dad de Valencia. Utilizamos todo el material.

Sobre la investigacin reproducible. Es ingente la cantidad de publi-


caciones cientficas que llevan tratamientos estadsticos. En muchas
de ellas no es claro qu es lo que realmente han hecho. Citan un
procedimiento estadstico y no indican el software utilizado si est
disponible en la red o, en el caso de que sea propio de los autores,
dnde se puede conseguir.
Sin duda alguna el control de la calidad de los tratamientos es-
tadsticos descansa en que cada lector de una publicacin cientfica
tenga a su disposicin el artculo (que bsicamente es la explicacin
de lo que se ha hecho) as como los datos 5 y todo el cdigo necesa- 5
Los datos sin ningn tipo de preproce-
rio para reproducir todo el tratamiento estadstico realizado con los samiento. Por ejemplo, si tenemos datos
de expresin con Affymetric GeneChip
datos. Se repite todo porque en muchas ocasiones lo que se ha des- se debiera de disponer de los ficheros
.CEL.
9

cartado puede ser tan interesante como lo que se ha publicado. Este


es el conocido sesgo a publicar los resultados significativos descar-
tando los no significativos. Sin esto, no se puede realizar un control
adecuado de un tratamiento estadstico de datos de alto rendimiento
(de hecho, de ningn tipo de datos). Esto nos lleva a los concep-
tos de programacin literaria o comentada (literate programming)
propuesto por Donald K. Knuth6 y, de un modo ms genrico, a la 6
http://en.wikipedia.org/wiki/
Literate_programming
investigacin reproducible 7 . R/Bioconductor incorpora muchas he- 7
http://en.wikipedia.org/wiki/
rramientas para realizar investigacin reproducible.8 En particular, Reproducibility
este texto est realizado utilizando Xie [2016, knitr]. Todos los datos 8
http://cran.r-project.org/web/
que se utilizan estn disponibles en bases de datos pblicas como views/ReproducibleResearch.html

(sobre todo) GEO o ArrayExpress. No de todos los datos que se utili-


zados tenemos los datos sin procesado previo. Los usamos por haber
sido analizados en otros textos o en ejemplos de R/Bioconductor o,
simplemente, porque son bonitos de estudiar.
Es de destacar que recientemente Nature Genetics ha refrendado el
uso de Bioconductor.

Sobre la generacin simple de informes. Hemos de poder realizar un


anlisis de datos y generar un informe de un modo sencillo. Esto
excluye el uso de herramientas como Word, Excel o similares. En este
texto utilizaremos la opcin R/Markdown.

Cmo usar el texto. Se intenta explicar Estadstica aplicada a la Bio-


informtica. Por ello es un texto que combina ambas cosas. En oca-
siones se utiliza R/Bioconductor como herramienta pedaggica para
ilustrar un concepto. En otras casi hacemos de manual tcnico para
usar un paquete de R. En principio, la idea es que vamos leyendo y
ejecutando el cdigo que se inserta. Lo lgico es tener R funcionando
y, con un copiar y pegar, podemos ir ejecutando el cdigo.9 9
Solamente tener en cuenta que los
caminos hay que modificarlos adaptn-
dolos a donde tengamos los datos en
Bioconductor es la nica opcin? Por supuesto que no. Y tampoco nuestro ordenador.
tengo muy claro que sea la mejor. Indudablemente es una de las
mejores. En estas notas el enfasis est en el anlisis de datos y, en
particular, en el anlisis estadstico de datos. Y desde el punto de
vista de la Estadstica s que podemos afirmar que R es la mejor
opcin y Bioconductor es su opcin natural.10 En este texto utiliza- 10
Sin embargo, en http://neurolex.
org/wiki/Category:Resource:
mos R/Bioconductor. Es muy recomendable consultar la direccin
Gene_Ontology_Tools (en concreto
http://www.bioconductor.org/help/workflows/ en donde podemos buscamos dentro de la pgina la expre-
encontrar anlisis completos de datos. sin Statistical analysis) tenemos una
buena muestra de qu podemos hacer y
sobre todo con qu hacerlo.
Qu necesitamos instalar para poder utilizar estas notas? En http:
//www.uv.es/ayala/docencia/tami/AllTami.R tenemos el modo de
instalar todos los paquetes que se utilizan en estas notas.11 11
Quizs no es necesario instalarlo de
una vez. Lo ms conveniente es instalar
los paquetes en la medida en que los
necesitemos en los distintos captulos.
10

Funciones y paquetes. A lo largo de las notas utilizamos muchas fun-


ciones que corresponden a paquetes distintos. Una funcin no puede
ser utilizada si no hemos cargado previamente el paquete correspon-
diente. Si intentamos utilizar la funcin sin cargar previamente el
paquete entonces R nos indica que no la encuentra. Con frecuencia
indicaremos el nombre de la funcin y su paquete conjuntamente.
Por ejemplo, si en el texto vemos annotate::annotation estamos refi-
rindonos a la funcin annotation que se encuentra en el paquete
Gentleman [2015, annotate].

Sobre la estructura del documento. Empezamos en I indicndo qu se


entiende por Estadstica de datos micos y con una breve introduc-
cin a R. Acabamos esta parte hablando de anotacin. Necesitamos
tener bases de datos (locales u online) que nos permitan saber qu
a qu se refieren nuestras caractersticas (variables). Qu gen o que
transcrito o qu exn tengo? Qu relaciones hay entre ellos? Por
ejemplo: qu exones componen un exon? O bien: qu isoformas
tengo de un gen?
En II mostramos los datos con los que trabajamos posteriormente.
Se comenta el tipo de dato, dnde se puede conseguir en bases de
datos pblicas y cmo preprocesarlo (normalizarlo). Finalmente se
ve con cierto detalle los bancos de datos que utilizamos en el resto
del libro. Los datos procesados y preparados para hacer anlisis
estadstico los tenemos en el paquete ?, tamidata.12 En el momento 12
Es un paquete propio que lo alojo
actual consideramos datos de expresin obtenidos con microarrays y en una pgina de la Universidad de
Valencia.
con la tcnica RNASeq.13 13
Aunque se pretende ampliar a otros
Expresin diferencial, III, es el tema fundamental desde el punto datos micos.
de vista estadstico que es la opcin de este manual. Se estudian los
problemas de comparaciones mltiples as como tcnicas de expre-
sin diferencia en microarrays y RNASeq.
En IV hablamos de componentes principales y clustering. Desde
mi (muy) personal punto de vista no son tcnicas multivariantes que
deban de usar en exceso en este contexto. Sin embargo, se usan y por
ello se tratan aqu.14 14
Faltara un tema de clasificacin
En III nos ocupamos de la expresin diferencial gen a gen (o en supervisada que no acabo de ver su
inters en este contexto.
lenguaje ms estadstico, marginal).
En VIII nos ocupamos de distintas aplicaciones de modelos linea-
les o lineales generalizados para la modelizacin de la interdepen-
dencia entre la expresin de los genes y otros posibles genes (como
microRNA) o de variables fenotpicas.
Parte I

Introduccin
1
Estadstica y datos micos

Estas notas se ocupan de revisar y aplicar tcnicas estadsticas


a datos micos. En lo fundamental nos ocuparemos de datos de
transcripcin y proteomas. No estamos interesados en el detalle
exhaustivo del tratamiento de cada tipo de dato. Nos centraremos
en lo que tienen en comn y comentaremos lo que diferencia su
tratamiento.

1.1 Estructura de los datos

En lo que sigue tendremos distintos tipos de datos pero con una


estructura similar. En concreto, observaremos un gran nmero de
caractersticas1 sobre un pequeo nmero de muestras. Cada caracte- 1
Features.
rstica medir la abundancia de molculas utilizando distintos proce-
dimientos. Esta abundancia puede estar asociada a una sonda o a un
grupo de sondas en un microarray. O bien la informacin correspon-
de a un gen o a un exon, a un pptido, a una protena. Adems esta
abundancia se cuantifica con distintos procedimientos (con frecuencia
dependientes del fabricante del dispositivo). Hablaremos de caracte-
rsticas sin ms. El nmero lo denotamos por N donde este valor es
grande (como mnimo miles). Estas caractersticas las observaremos
en unas pocas muestras. El nmero de muestras es n. Lo bsico2 es 2
Y a lo largo de las notas lo repetiremos
que N es mucho mayor que n: n  N. En un contexto estadstico muchas veces.

clsico N es el nmero de variables y n es el nmero de muestras. Y


justo lo conveniente es la situacin contraria. De hecho, muchos pro-
cedimientos estadsticos suponen que el tamao de la muestra supera
el nmero de variables. En Estadstica de alto rendimiento esto no
es as. Y eso da novedad a los procedimientos. Obviamente limita las
posibilidades pero abre un nuevo campo de trabajo.
Las abundancias las recogemos en una matriz3 que denotaremos 3
Que podemos llamar matriz de ex-
por X = [ xij ]i,j=1,...,n : el valor xij nos cuantifica la abundancia de la presin aunque no necesariamente
hablamos de expresin de un gen pero
no parece malo utilizar esta nomencla-
tura.
14 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

caracterstica i en la muestra j. 4 El valor xij ser un valor (usualmen- 4


Una matriz de datos en Estadstica
te) positivo. Si corresponde un DNA microarray entonces mide un suele ser justo al contrario, esto es, con
los subndices invertidos. Es decir, la
nivel de fluorescencia y tomar valores positivos.5 Sea positivo a no matriz transpuesta de la que vamos a
un valor mayor indicar una mayor expresin del gen. Si trabajamos utilizar aqu. En ocasiones se utiliza en
la forma clsica pero es ms frecuente
con datos obtenidos con RNASeq entonces tendremos conteos, esto esta forma de disponer los datos.
es, nmero de lecturas cortas alineadas sobre un gen o sobre un exon 5
Algunos procedimientos de procesado
o sobre una zona genmica de inters. En definitiva el dato primario previo de los datos conocidos como
normalizacin pueden dar lugar a
es un nmero entero. Ms lecturas indicar ms expresin otra vez. expresiones negativas.
Los valores observados en una misma fila (una misma caractersti-
cas sobre todas las muestras) se suele decir que son un perfil6 (de un 6
Expression profile.
modo genrico perfil de expresin).
En la matriz de expresin los valores observados para las distin-
tas muestras son independientes aunque posiblemente observados
bajo distintas circunstancias. No son pues rplicas de una misma
condicin experimental pero s se observan independientemente. Los
valores de expresin para las distintas filas ya no son independientes.
Por ejemplo, los genes actan de un modo coordinado.
Los datos de la matriz de expresin no son directamente com-
parables. El nivel de ruido es grande y por ello se han desarrolla-
do tcnicas para corregirlo. Son mtodos de correccin de fondo y
normalizacin. Veremos algunos. En sentido estricto cuando norma-
lizamos los datos estos dejan de ser independientes. Sin embargo,
esto no se suele considerar en la literatura. Los datos despus de la
normalizacin siguen considerndose independientes por columnas
(muestras) y dependientes por filas.7 7
Lo cual no deja de ser paradjico.
De cada muestra tendremos informacin. Por ejemplo, si es una
muestra control o bien corresponde a una muestra tomada bajo un
tratamiento. 8 A esta informacin o variables que nos describen a las 8
La palabra tratamiento se utiliza en el
muestras las llamaremos los metadatos o variable fenotpicas9 Usual- sentido amplio de diseo experimental:
tiempo, una cepa salvaje frente a una
mente tendremos varias variables fenotpicas aunque usualmente mutada por ejemplo.
trabajaremos con una cada vez. Denotaremos por y = (y1 , . . . , yn ) 9
Entendido en un sentido amplio:
los valores observados de una variable en las n muestras. El caso mas Por variable fenotpica podemos estar
entendiendo el tiempo en que se ha
frecuente de variable fenotpica ser cuando tengamos dos grupos observado la evolucin de una muestra.
de muestras (casos y controles). En este caso tendremos yi = 1 si es
un caso e yi = 0 si es un control.10 Si tenemos ms de dos grupos de 10
Los valores 0 y 1 son arbitrarios.
muestras a comparar, por ejemplo k grupos, entonces yi {1, . . . , k} Podemos tomar cualquier otro par de
valores.
para i = 1, . . . , n.

1.2 Anlisis de datos

Y qu vamos a hacer con la matriz de expresin y con las va-


riables fenotpicas? Como siempre lo mejor que podamos. A veces
no mucho. Las tcnicas estadsticas que se utilizan son aplicaciones
de procedimientos diseados en muchas ocasiones para el contexto
estadstica y datos micos 15

habitual en que tienes ms muestra que variables. Y se usan aqu


adaptndolos con mayor o menor fortuna. Yo dira con mayor o me-
nos sentido en ocasiones.
El problema ms importante es el que se conoce como expresin
diferencial. Nos fijamos en una variable fenotipica y en una caracte-
rstica (gen por ejemplo). Hay asociacin entre el perfil de expresion
y la variable fenotpica? Veremos distintos procedimientos para res-
ponder esta pregunta para cada caracterstica. Utilizaremos la deno-
minacin de anlisis de expresin diferencial marginal. Sin embargo, en
la literatura biolgica es ms hablar de anlisis de expresin diferencial
gen-a-gen.
Las distintas caractersticas son dependientes entre si. Una eva-
luacin de la posible asociacin entre cada caracterstica y la variable
fenotpica es limitada. Nos puede hacer perder informacin sobre
procesos biolgicos de los cuales distintas caractersticas nos es-
tn dando informacin de modo que cada una de ellas recoge una
variacin no muy grande pero que conjuntamente es notable. En defi-
nitiva, el problema ser estudiar la posible asociacin entre grupos de
caractersticas (grupos de filas en la matriz de expresin) y la variable
fenotpica de inters. Es lo que se conoce como anlisis de grupos de
genes.11 11
Este problema puede encontrarse
Tambin se vern problemas de reduccin de dimensin. En con- bajo distintas denominaciones como:
Gene set analysis, gene set enrichment
creto la tcnica ms utilizada, anlisis de componentes principales. Es analysis, functional enrichment testing.
una tcnica instrumental con muchas posibilidades de utilizacin en
un contexto como es este con datos de alta dimensin.
Y clasificaremos tanto las caractersticas como las muestras como
una herramienta exploratoria. Lo que se conoce como anlisis cluster.

En lo que sigue se aborda tambin problemas de clculo del tama-


o muestral que est ligado al problema de la potencia del test.
Y todo esto siempre atendiendo al tipo de dato que estemos uti-
lizando. Sin duda, el ms desarrollado son las datos de expresin
de gen utilizando microarrays. Ser nuestro tipo de dato de referen-
cia pero vamos introduciendo otros tipos de datos como pueden ser
RNASeq o datos de abundancia de protenas.

1.3 Sobre herramientas online

En este texto la opcin elegida es R/Bioconductor. Una opcin


alternativa 12 es la utilizacin de aplicaciones online. Una buena 12
Que puede ser complementaria.
opcin que cubre muchos de los contenidos de este manual es Xia
et al. [2015, NetworkAnalyst] y la aplicacin se localiza en http:
//www.networkanalyst.ca. En particular es de inters la tabla 1 en
Xia et al. [2015, pg. 824] en donde se muestra una comparativa entre
16 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

distintas herramientas online. En particular se consideran:


NetworkAnalyst http://www.networkanalyst.ca.

DAVID http://david.abcc.ncifcrf.gov.

g:Profiler http://biit.cs.ut.ee/gprofiler/.

InnateDB con Cytoscape http://www.innatedb.ca y http://www.


cytoscape.org.

Gitools http://www.gitools.org.

1.4 Paquetes transversales

Algunos paquetes que vamos a manejar pretenden cubrir una gran


cantidad de contenidos que vamos a tratar: lectura de la informacin
generando las clases adecuadas (como Biobase::ExpressionSet o Sum-
marizedExperiment::RangedSummarizedExperiment); normalizacin;
anlisis de expresin diferencial marginal o gen a gen; anlisis de
enriquecimiento para grupos o bien para grafos. En fin, tienen una
pretensin de anlisis global. Usualmente lo que hacen es utilizar
distintos paquetes segn realiza una u otra funcionalidad. Dentro de
esta categora entran Geistlinger et al. [2016, EnrichmentBrowser] o
Varemo and Nookaew [2015, piano]. Los usaremos aunque siempre
suponen una limitacin en el anlisis que se realiza. Soy ms par-
tidario de utilizar funcionalidades concretas del paquete ms que
utilizarlo para todo el anlisis.

1.5 Jerga

En un campo como es la Bioinformtica un problema mayor es el


lenguaje que se utiliza. Un texto de Estadstica o un texto de Gen-
tica tiene una jerga consolidada. Son campos de trabajo maduros.13 13
Sin ser peyorativo, campos de investi-
Prcticamente cada campo de investigacin va desarrollando una gacin viejos.

jerga14 en donde suele haber una parte interesada. Impedir el acceso 14


Mejor una jerigonza.
a los que no son de este campo. Aqu el problema es grave porque se
mezclan jergas al mismo tiempo que se desarrolla una nueva. Para
intentar evitar esta barrera he incluido un glosario al final del texto
que intenta aclarar los trminos y sirva de referencia rpida. Sin em-
bargo, quizs la mayor dificultad de esta disciplina sea este, entender
la jerga de los dems.15 15
En mi caso de los bilogos. A los
informticos los entiendo. Hablan
menos de hecho.
1.6 Bibliografa

A lo largo del manual se presta mucha atencin a citar con pre-


cisin las referencias originales del material. Esto es un manual de
estadstica y datos micos 17

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

Nuestra opcin de trabajo es la utilizacin de R y Bioconductor.


En adelante, hablaremos de R/Bioconductor. No es la nica opcin.
Dos buenas opciones de software libre son Babelomics o DAVID
Bioinformatics. Y una opcin comercial es Partek Genomics Suite. Sin
embargo, cuando hablamos de anlisis estadstico de datos de alto
rendimiento s que, en el momento actual, es en mi opinin la mejor
opcin. Y en este manual sobre todo hablamos de anlisis de datos.

2.1 Sobre R

2.1.1 De cmo instalarlo


Instalacin Los pasos a seguir son los siguientes:

1. Bajamos el programa de la siguiente direccin http://cran.r-


project.org/.
2. Elegimos versin.1 1
Se recomienda cualquier versin de
Linux. Si utilizas Windows (en esto
3. Una vez hemos bajado el paquete se instala ejecutndolo con el mundo es bastante libre) elige la
las opciones por defecto. correspondiente versin para Windows.

Inicio de una sesin En el escritorio tenemos el icono de R. Simple-


mente clicando2 el icono iniciamos la sesin de trabajo. 2
Dios nos perdone por usar esta pala-
bra.
Instalacin de un paquete R tiene muchos paquetes que extienden
el R base que acabamos de instalar. De hecho, es casi imposible
realizar un anlisis estadstico por sencillo que sea sin utilizar
paquetes adicionales de R. Vamos a instalar el paquete Verzani
[2015, UsingR]. Es un paquete con herramientas para la enseanza
de Estadstica bsica. La opcin ms simple es escribir en lnea de
comandos.
20 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

install.packages(``UsingR'')

Cargando un paquete Una vez instalado el paquete, para poder usar


las funciones o datos que contenga, debemos cargarlo mediante

library(UsingR)

Ahora podemos utilizar las extensiones que proporciona a R


este paquete.

A lo largo de estas notas iremos aprendiendo a utilizar (lo que


necesitamos de) R segn lo necesitemos. Sin embargo, una refe-
rencia rpida a la sintaxis de R la podemos encontrar en http:
//cran.r-project.org/doc/contrib/Short-refcard.pdf.3 . 3
Una buena idea es imprimirla y
Otra opcin para instalar es utilizar Rinker and Kurkiewicz [2016, tenerla a mano.

pacman]. La instalacin de Verzani [2015, UsingR] sera4 4


Elegimos como repositorio https:
//ftp.cixug.es/CRAN.
pacman::p_install("UsingR",repos="https://ftp.cixug.es/CRAN/")

2.1.2 Lectura y escritura de datos


Supongamos que hemos recogido unos datos y queremos analizar-
los con R. Hemos de leer estos datos desde R. Hay muchas opciones para
hacerlo. Lo primero que necesitamos es algn programa para intro-
ducirlos en un fichero que luego leeremos desde R. Utilizamos unos
datos reales. En concreto son las temperaturas mxima y mnima en
la ciudad de Alicante en los aos 1939 y 1940 durante cada uno de
los 12 meses del ao. Tenemos pues 12 observaciones (meses) y, para
cada observacin, las temperaturas mxima y mnima en el ao 1939
y 1940. Estas temperaturas son las variables observadas. Los datos
(en dcimas de grado) son los siguientes: tenemos 12 observaciones
(corresponden con las distintas filas) y hemos observado 4 variables
(que corresponden con las cuatro columnas).
1 182 154 82 62
2 180 79
3 183 209 64 93
4 205 224 88 100
5 239 255 112 123
6 267 275 149 150
7 302 303 183 180
8 310 313 189 195
9 291 287 181 164
10 241 237 139 119
11 211 201 90 90
12 176 166 70 54
r y bioconductor 21

Hemos de darle un nombre a las columnas que nos identifique la


variable. Por ejemplo, los nombres que vamos a usar pueden ser las
siguientes

id Un identificador de la fila (podra ser un identificador de un gen,


de momento, nos conformamos con que sea un nmero).

m1 Temperaturas en la primera muestra.

m2 Temperaturas en la segunda muestra.

m3 Temperaturas en la tercera muestra.

m4 Temperaturas en la cuarta muestra.

Es importante notar que hay huecos. A qu corresponden estos hue-


cos? Son datos faltantes que no se recogieron en su momento. En
concreto podemos ver en la segunda fila que no se observ la expre-
sin en la segunda y tercera muestra. Cmo podemos introducir
estos datos en un fichero de algn tipo que luego leamos desde R?

Con Calc de LibreOffice Podemos utilizar una aplicacin como Calc


(de LibreOffice) 5 que nos produzca un fichero texto y luego utili- 5
La suite LibreOffice la podemos conse-
zaremos la funcin base::read.table para leer los datos. Es frecuente guir en http://www.libreoffice.org/. En
este curso todo el software que se utili-
que se introduzcan datos utilizando una hoja de clculo. Una op- za es software libre. Soy de la opinin
cin cmoda y segura es Calc, versin libre de Excel, incluida en de que en educacin se debe utilizar
exclusivamente software libre.
LibreOffice. Se encuentra disponible en la versin Windows y todos
los sistemas operativos. Los pasos a seguir son los siguientes

1. Empezamos por abrir un documento LibreOffice y elegimos la


opcin Calc.

2. En la primera lnea es conveniente (pero no imprescindible) poner


los nombres de las variables. Podemos utilizar los nombres que
sugerimos para nuestros datos. En cualquier caso los nombres
de las variables no han de tener blancos y han de empezar con
letra. Aunque no es necesario un conjejo es que contengan letras y
nmeros exclusivamente. Notemos que R diferencia maysculas y
minsculas.

3. En la columna correspondiente introducimos los datos anteriores,


cada variable en una columna distinta. Si no disponemos del dato
(como as es en un par de casos) dejamos en blanco la casilla.
Dependiendo de la configuracin que tengamos es probable que
Calc necesite la coma para indicar la coma decimal.6 6
Si lo tenemos configurado para nota-
cin espaola.
4. En Archivo-Guardar como elegimos Texto CSV. Indicamos un nom-
bre para el fichero, por ejemplo, temperaturas.csv.
5. Marcamos Editar configuracin de filtros.
22 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

6. Como separador de campo elegimos ;.7 7


Tiene la ventaja de que no confundi-
mos con la coma decimal.
7. Y ya tenemos un fichero texto.

Nos falta leerlo desde R.

Lectura de un fichero texto Si tenemos los datos en un fichero texto de


modo que en cada lnea tenemos una observacin y en cada columna
una variable. El fichero a leer ser temperaturas.csv. Cmo leemos
estos datos desde R? Una opcin sencilla es con base::read.table.

x = read.table(file="temperaturas.csv",dec=".",
sep = ";",header = TRUE)

Si el punto decimal lo indicamos con una coma entonces cam-


biamos dec=. por dec=,.8 en la primera fila de los datos hemos 8
Un consejo, olvidad el sistema espaol
puesto los nombres de las variables y esto lo indicamos con header = e indicad siempre el decimal con un
punto. Evitaris problemas.
TRUE. Podemos ver los datos que acabamos de introducir con

2.1.3 Sobre lo imprescindible en R


La funcin c Otro modo (menos elegante) de declararle a R datos es
la siguiente.

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.

## [1] 35.84122 28.95458 36.02971 33.13809 39.55091


## [6] 39.48182 27.52009 32.58105 31.54865 36.73312
## [11] 33.87558 30.05730 29.45515 38.70321 34.80034
## [16] 35.86523 32.76480 35.94576 30.44356 38.75483
## [21] 31.21475 33.15148 36.17373 28.34059 40.52086
## [26] 39.34035 34.26828 41.92718 34.83630 43.46855

Seleccin de casos Cul es el primer valor de este vector de datos?


r y bioconductor 23

x[1]

## [1] 35.84122

Y el que ocupa la posicin 13?

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

Cuando ponemos dos enteros separados por : nos devuelve todos


los enteros entre el primero y el segundo. Ahora podemos ver los
datos que ocupan estas posiciones en el vector x.

x[13:23]

## [1] 29.45515 38.70321 34.80034 35.86523 32.76480


## [6] 35.94576 30.44356 38.75483 31.21475 33.15148
## [11] 36.17373

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

y los valores de x seran

x[c(7,9,20:25)]

## [1] 27.52009 31.54865 38.75483 31.21475 33.15148


## [6] 36.17373 28.34059 40.52086

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

## [1] TRUE FALSE TRUE FALSE TRUE TRUE FALSE


## [8] FALSE FALSE TRUE FALSE FALSE FALSE TRUE
## [15] FALSE TRUE FALSE TRUE FALSE TRUE FALSE
## [22] FALSE TRUE FALSE TRUE TRUE FALSE TRUE
## [29] FALSE TRUE

Vemos que nos devuelve un vector dicindonos si es cierta o no la


condicin que hemos preguntado, si es mayor o igual a 35. Pero: qu
valores son? Si hacemos

x[x >= 35]

## [1] 35.84122 36.02971 39.55091 39.48182 36.73312


## [6] 38.70321 35.86523 35.94576 38.75483 36.17373
## [11] 40.52086 39.34035 41.92718 43.46855

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

x[x > 37]

## [1] 39.55091 39.48182 38.70321 38.75483 40.52086


## [6] 39.34035 41.92718 43.46855

o bien los datos que son mayores que 35 y menores o iguales que
37.

x[x > 35 & x <= 37]

## [1] 35.84122 36.02971 36.73312 35.86523 35.94576


## [6] 36.17373

Podemos querer que los casos que estamos seleccionando estn en


un nuevo vector.

y = x[x > 35 & x <= 37]

y podemos ver los valores de y.

## [1] 35.84122 36.02971 36.73312 35.86523 35.94576


## [6] 36.17373

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

De cmo ordenar un vector Supongamos que queremos ordenar el


vector x.

sort(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

Nos devuelve los valores ordenados. Sin embargo, con frecuencia


necesitamos saber la posicin que ocupaban en el vector original
estos valores.

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

Hemos ordenado el vector x de menor a mayor. Vamos a ordenar


de mayor a menor.

sort(x,decreasing = TRUE,index.return = TRUE)

## $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()

De cmo conseguir ayuda con R Supongamos que buscamos ayuda


sobre las opciones de la funcin que nos dibuja un histograma, hist.
Lo ms simple es utilizar la ayuda en html. Utilizamos la siguiente
funcin.

help.start()

Vemos que nos abre el navegador y nos ofrece distintas opciones.


Quizs la opcin ms simple sea utilizar la herramienta de bsqueda.
Otra opcin es, en lnea de comandos escribir

?hist

O simplemente,

help(hist)

De cmo trabajar con R Hay dos formas de trabajar con R. La primera


opcin es utilizar un editor en el que escribimos cdigo de R. Lo
copiamos y luego lo pegamos en la lnea de comandos de R.11 Dentro 11
Es la opcin ms educativa en donde
de esta manera de trabajar podemos utilizar distintas editores (que aprendemos realmente a trabajar con el
programa.
llevan herramientas para facilitarnos el trabajo).

Con el editor de R El propio programa lleva un editor incorporado. Es


bsico pero suficiente. Es la opcin que utilizaremos en las clases
prcticas.

TinnR En Windows se puede usar el programa TinnR que lo pode-


mos descargar desde http://sourceforge.net/projects/tinn-r/.

Bloc de notas Por ltimo una opcin simple y efectiva es abrir un


editor de textos (como el bloc de notas pero no el Word) e ir escri-
biendo el cdigo all. Luego aplicamos el famoso copiar y pegar.
r y bioconductor 27

RStudio Quizs ahora mismo sea la mejor opcin. Es un programa


que incorpora el editor, nos muestra las salidas, los grficos y la
historia previa. De manejo muy simple. http://rstudio.org/.

Otra opcin es utilizar un interfaz grfico. La opcin a la que ms


acostumbrados estamos y, creemos, es ms sencilla.12 12
No es mi opinin. Encuentro mucho
ms difcil esta opcin pero para gustos
...
2.2 Sobre Bioconductor

En este curso tan (o ms) importante que el propio R es Biocon-


ductor. Es software libre y son una coleccin de paquetes de R para
Bioinformtica. Se instala con

source("http://www.bioconductor.org/biocLite.R")
biocLite()

Una vez instalado la parte bsica de Bioconductor podemos insta-


lar algn paquete adicional (como ALL).

source("http://www.bioconductor.org/biocLite.R")
biocLite("ALL")

Paquetes necesarios En este manual utilizamos muchos paquetes. El


fichero http://www.uv.es/ayala/docencia/tami/all.tami.R permite
instalar los paquetes necesarios:

Si pretendemos una instalacin de los paquetes bsicos utilizados


en el manual podemos hacerlo con

TIPO = BASICO; source("http://www.uv.es/docencia/tami/all.tami.R")

Todos los paquetes utilizados en este manual pueden ser instala-


dos con el siguiente cdigo.

TIPO = TODO; source("http://www.uv.es/docencia/tami/all.tami.R")

Sobre la eleccin de repositorios. Podemos elegir el repositorio desde el


cual instalamos los paquetes de Bioconductor con

chooseBioCmirror()

Tambin podemos elegir interactivamente el repositorio con


28 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

setRepositories()

2.3 Datos golub

Los datos golub son banco de datos de expresin de genes que


vamos a utilizar. Aparecen en multtest::golub y fueron utilizados en
Golub et al. [1999]. Los datos son los niveles de expresin de 3051
genes (que aparecen en filas) para 38 pacientes de leucemia. De estos
pacientes, 27 de ellos tienen leucemia linfoblstica aguda (ALL) y los
restantes 11 tienen leucemia mieloide aguda (AML). El tipo de tumor
viene indicado por el vector golub.cl donde ALL corresponde con 0
y AML corresponde con 1. Los nombres de los genes los tenemos en
golub.gnames. Cargamos los datos.

data(golub,package = "multtest")

Al cargar estos datos hemos ledo varias cosas:


golub.cl Es un vector numrico que toma valores 0 y 1 indicando si la
muestra ha sido obtenida de un enfermo con leucemia linfoblstica
aguda (0) o leucemia mioloide aguda (1).

golub Es una matriz de expresin donde cada fila corresponde con


un gen y cada columna con una muestra distinta.

golub.gnames Es una matriz con el mismo nmero de filas de la ma-


triz golub de modo que la fila i-sima de golub.gnames nos da
informacin sobre el gen de cuyos niveles de expresin aparecen
en la fila i-sima de la matriz golub.
Empezamos jugando con el vector golub.cl. Podemos ver los valo-
res.

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

Qu tipo de dato tenemos?

class(golub.cl)

## [1] "numeric"

Vemos que son nmeros. Son nmeros que, realmente, indican


la pertenencia a un tipo de cncer u otro. Por ello es ms natural
definirlo como un vector tipo factor.13 Lo hacemos con base::factor. 13
Como en R codificamos las variables
categricas.
r y bioconductor 29

(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

Cuntas muestras tenemos de cada tipo? Un par de opciones para


hacerlo son utilizando la funcin base::table.

table(golub.fac)

## golub.fac
## ALL AML
## 27 11

o utilizando la funcin base::summary.

summary(golub.fac)

## ALL AML
## 27 11

Si queremos mostrar la distribucin de los dos tipos en forma de


diagrama de barras lo podemos hacer con (ver figura 2.2)

library(ggplot2)
qplot(golub.fac)

Sustituye en el cdigo anterior golub.fac por golub.cl y vers que el


resultado no es el deseable. Por qu? Quizs los nmeros no es una
buena forma de representar categoras o clases.
Un cdigo equivalente al anterior es 14 14
En este manual usamos ggplot2]R-
ggplot2 para dibujar como podemos
ver. Creo que es la mejor opcin dentro
library(ggplot2)
de R ahora mismo.
df0 = data.frame(golub.fac)
ggplot(df0,aes(x=golub.fac))+geom_bar()

Nos fijamos en golub. Qu tipo de dato es?


20

class(golub)
count

## [1] "matrix" 10

Es una matriz. En una matriz lo primero es saber cuntas filas


(caractersticas aqu) tenemos
0

ALL AML
golub.fac

Figura 2.2: Diagrama de barras con las


frecuencias absolutas de cada tipo de
leucemia.
30 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

nrow(golub)

## [1] 3051

El nmero de columnas corresponde con el nmero de muestras.

ncol(golub)

## [1] 38

Tambin podemos obtener las dimensiones de la matriz conjunta-


mente con

dim(golub)

## [1] 3051 38

En la fila i y columna j tiene una cuantificacin de la expresin del


gen i-simo15 en la j-sima muestra de nuestra experimentacin. Por 15
Ya veremos ms adelante de qu gen
ejemplo, el gen en fila 2000 y columna 12 tiene expresin estamos hablando.

golub[2000,12]

## [1] 0.19595

16 Y todos los niveles de este gen lo tendremos con 16


Estos datos han sido preprocesados
partiendo de los datos originales.
Pueden aparecer valores negativos. En
golub[2000,]
5.3 se explica y se entiende el porqu
del valor negativo. Lo importante valor
## [1] 0.73124 -0.19598 0.51981 -0.54371 0.55596 menor indica menor expresin, valor
## [6] 1.40683 0.79772 0.59493 0.99503 0.39529 mayor indica mayor expresin.

## [11] 0.09834 0.19595 0.85017 -1.39979 1.09789


## [16] -0.74362 0.44207 0.27698 -0.04128 -1.60767
## [21] -1.06221 -1.12665 0.47863 -0.44014 0.22286
## [26] 0.42795 0.65427 0.07257 -0.28093 -0.20985
## [31] 0.05160 -1.44434 -0.17118 -1.34158 0.92325
## [36] -0.21462 -1.34579 1.17048

A estos niveles los llamaremos perfil de expresin. Podemos repre-


sentar el perfil de expresin (figura 2.3). Definimos qu van en el eje
de abscisas y en el eje de ordenadas.

muestra = 1:ncol(golub) ## En abscisas el nmero de la muestra


y2000 = golub[2000,] ## En ordenadas su expresin

El perfil de expresin lo representamos con


r y bioconductor 31

qplot(muestra,y2000)

o con

y2000.df = data.frame(muestra = 1:ncol(golub),y2000= golub[2000,])

ggplot(y2000.df,aes(x = muestra,y= y2000))+geom_point()

Lo podemos ver en figura 2.3(a).


Si queremos ver las expresiones correspondientes a los pacientes
ALL lo podemos hacer con 17 17
Observermos que == se utiliza
para comparar e indica TRUE O FALSE
segn sea cierta o falsa la condicin.
golub[2000,golub.fac == "ALL"]

## [1] 0.73124 -0.19598 0.51981 -0.54371 0.55596


## [6] 1.40683 0.79772 0.59493 0.99503 0.39529
## [11] 0.09834 0.19595 0.85017 -1.39979 1.09789
## [16] -0.74362 0.44207 0.27698 -0.04128 -1.60767
## [21] -1.06221 -1.12665 0.47863 -0.44014 0.22286
## [26] 0.42795 0.65427

y los correspondientes a los pacientes AML.

golub[2000,golub.fac == "AML"]

## [1] 0.07257 -0.28093 -0.20985 0.05160 -1.44434


## [6] -0.17118 -1.34158 0.92325 -0.21462 -1.34579
## [11] 1.17048

Supongamos que volvemos a representar el perfil de expresin del


gen en la fila 2000, y2000, pero pretendemos diferenciar con un color
distinto la condicin que nos indica el tipo de leucemia, golub.fac. Lo
podemos hacer con (figura 2.3(b)):

qplot(muestra,y2000,colour=golub.fac)

Otro modo equivalente es el siguiente. Primero definimos un ba-


se::data.frame con

golub.df = data.frame(muestra,y2000,golub.fac)

Y luego representamos los datos contenidos en este data.frame.

ggplot(golub.df,aes(x = muestra,y= y2000,colour=golub.fac))+ geom_point()

Otra opcin sera representar separadamente18 los datos corres- 18


En facets distintas
pondientes a cada tipo de leucemia (figura 2.3(c)).
32 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

qplot(muestra,y2000,facets=golub.fac ~ .,colour = golub.fac)

Tambin podemos hacerlo con

ggplot(golub.df,aes(x = muestra,y= y2000,colour=golub.fac))+geom_point() +


xlab("Nmero de muestra") + ylab("Gen en fila 2000") +
facet_grid(golub.fac~.)

Podemos colocar los distintos subdibujos (o facets) horizontalmen-


te (2.3(d)).

ggplot(golub.df,aes(x = muestra,y= y2000,colour=golub.fac))+geom_point() +


xlab("Nmero de muestra") + ylab("Gen en fila 2000") +
facet_grid(. ~ golub.fac) #Modificamos esta lnea

En cuanto a representar la simplicidad es un valor. De las tres


figuras anteriores quizs la figura 2.3(b) sea la ms adecuada.

De qu genes estamos hablando? A qu gen corresponde esta fila? La


informacin la podemos obtener con

golub.gnames[2000,]

Qu tipo de datos tenemos ahora?

class(golub.gnames)

## [1] "matrix"

Es una matriz con dimensiones

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,]

## [1] "4544" "CDC21 HOMOLOG"


## [3] "X74794_at"

Los datos originales de la experimentacin tenan ms genes estu-


diados. Se hizo una preseleccin ( 5.3). Este gen ocupaba la fila 4544
en la matriz de expresin con todos los genes. Su nombre es
r y bioconductor 33

(a) (b)

(c) (d) Figura 2.3: (a) Perfil de expresin del


gen en la fila 2000. (b) Perfil de expre-
sin del gen en fila 2000 diferenciando
el tipo de leucemia. (c) Perfil de expre-
sin del gen en fila 2000 diferenciando
el tipo de leucemia mediante un color
distinto. Utilizamos distintos dibujos
(facets) alineados en vertical. (d) Perfil
de expresin del gen en fila 2000 dife-
renciando el tipo de leucemia mediante
un color distinto. Utilizamos distintos
dibujos (facets) alineados en vertical.
34 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

golub.gnames[2000,2]

## [1] "CDC21 HOMOLOG"

El identificador de la sonda Affy o AffyID (??) ocupa la tercera


columna y vale, para este gen,

golub.gnames[2000,3]

## [1] "X74794_at"

Vamos a modificar la matriz golub de modo que recoja la informa-


cin que tenemos de las filas (qu genes son) y de las columnas (qu
tipo de leucemia). Para ello podemos aplicar las funciones rownames y
colnames a dichas matrices.

1. Identificamos las filas con el identificador Affy.

rownames(golub) = golub.gnames[,3]

2. Describimos las columnas con el tipo de leucemia.

colnames(golub) = golub.fac

Tenemos la informacin de un modo ms compacto.

2.4 La funcin apply

Vamos a explorar los datos golub utilizando la funcin base::apply.


19 Otras muy relacionadas que utilizare-
19

Qu pretendemos hacer? Vamos a realizar dos dibujos. En absci- mos son base::lapply y base::sapply.

sas pretendemos dar una medida de localizacin (media o mediana)


de la expresin del gen en el primer tipo de leucemia, ALL. En orde-
nadas lo mismo pero con el segundo tipo, AML.
Primero hemos de calcular estos valores. La funcin que calcula
la media (muestral) de un vector de nmeros es base::mean. Por
ejemplo, la media del perfil de expresin del gen en la fila 2000 sera

mean(golub[2000,])

## [1] 0.02080211

Tambin parece una buena opcin cuantificar el valor alrededor de


donde se observan las expresiones mediante la mediana. La tenemos
con
r y bioconductor 35

median(golub[2000,])

## [1] 0.147145

Vemos que son muy distintos indicando asimetra.20 20


Cuando para un conjunto de datos
Y cmo lo hacemos para todos los genes de una vez? La funcin no hay coincidencia entre media y
mediana lo que sucede es que no
base::apply lo hace. Primero seleccionamos las partes de la matriz hay una disposicin simtrica de los
golub con las muestras ALL y con las muestras AML. datos alrededor de estas medidas de
localizacin.

golub.ALL = golub[,golub.fac == "ALL"]


golub.AML = golub[,golub.fac == "AML"]

Ahora utilizamos base::apply. El primer argumento es la matriz


con la que trabajamos, el segundo argumento indica si la funcin a
aplicar es por filas (1) o por columnas (2). El tercer argumento es la
funcin que queremos aplicar. Calculamos la media y la mediana
para cada submatriz de golub.

ALL.mean = apply(golub[,golub.fac == "ALL"],1,mean)


AML.mean = apply(golub[,golub.fac == "AML"],1,mean)
ALL.median = apply(golub[,golub.fac == "ALL"],1,median)
AML.median = apply(golub[,golub.fac == "AML"],1,median)

Representamos las medias de ALL (abscisas) frente a las medias


AML (ordenadas) (figura 2.4(a)).

qplot(ALL.mean,AML.mean,xlab ="Medias ALL",ylab = "Medias AML")

(a) (b) (c) en muestras AML


Figura 2.4: Medias
frente a medias en muestras ALL para
En la figura 2.4(a) hay muchos puntos representados. Es un scat- datos multtest::golub. En (a) tenemos
terplot o diagrama de puntos muy denso. Esto ser habitual en lo los puntos tal cual y en (b) utilizamos
un sombreado. (c) Medianas en mues-
que sigue pues trabajamos con grandes bancos de datos. Tantos pun- tras AML frente a medianas en mues-
tos que se van superponiendo nos impide ver en qu zonas hay una tras ALL para datos multtest::golub.
mayor densidad de puntos. No es til un dibujo as. Quizs ayude sustituimos la media por la mediana.
36 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

un sombreado que est relacionado con la densidad local de puntos


que representamos. Lo conseguimos con el argumento alpha (figura
2.4(b)).21 21
Este argumento alpha indicado
como una fraccin 1/4 en el ejemplo
qplot(ALL.mean,AML.mean,xlab ="Medias ALL",ylab = "Medias AML", indica que cuando se superpongan 4
puntos entonces se representa el punto
alpha=I(1/4))
completamente negro. Por debajo se
utilizan grises.
Reproducimos el dibujo sustituyendo la media por la mediana
(figura 2.4(c)).

qplot(ALL.median,AML.median,xlab ="Medianas ALL",


ylab = "Medianas AML",alpha=I(1/4))

2.5 Ejercicios

Ejercicio 1. Utilizando la matriz de expresin de los datos golub se pide:


1. Calcular para cada gen la expresin media bajo todas las condiciones.

2. Calcular para cada gen la desviacin estndar.

3. Representar grficamente un dibujo que, para cada gen, nos muestre en


abscisas la expresin media y en ordenadas la desviacin estndar.

4. Utilizando la funcin pdf() guardar el dibujo anterior en un fichero


externo.
Ejercicio 2. Con los datos golub se pide:
1. Calcular la expresin media para cada una de las condiciones definidas
por la variable golub.cl.

2. Representar una media frente a la otra.

3. Con la funcin abline() aadir la recta y = x as como las rectas y x =


e y x = donde es un valor que iremos variando.

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.

2. Representar un histograma de estas desviaciones estndar.

3. Calcular el percentil de orden 0.9 de las desviaciones calculadas en el


punto anterior. Denotemos este valor por q0,9 .

4. Utilizando la funcin abline aadir al dibujo del apartado 2 una lnea


vertical cuya abscisa coincida con el valor q0,9 .

5. Seleccionar aquellos genes cuya desviacin estndar sea mayor que el


valor q0,9 del punto anterior.
r y bioconductor 37

2.6 Funciones con R

La mayor potencia de R es que podemos definir funciones para ex-


tenderlo. En esta seccin vemos cmo hacerlo son ejemplos simples.

La estructura bsica de una funcin en R es

nombre.funcion = function(argumentos){
CODIGO
resultado
}

Supongamos que queremos calcular la media y desviacin estndar


de un vector de datos. La siguiente funcin puede valer.

MediaDesviacion = function(x){
resultado = c(mean(x),sd(x))
resultado
}

La funcin devuelve lo que tiene en la ltima lnea.22 Una vez 22


Tambin podemos usar return.
le declaramos la funcin podemos usarla.23 La aplicamos a datos 23
Copiamos y pegamos en lnea de
generados con distribucin normal. comandos.

x = rnorm(23,mean=12,sd=1.3)
MediaDesviacion(x)

## [1] 11.990483 1.285978

Queremos calcular la media y desviacin estndar pero de los


datos que estn por encima del percentil de orden p. El valor de p
ser un argumento y queremos fijarlo por defecto en 0.5.

MediaDesviacionPercentil = function(x,ordenpercentil = 0.5){


qp = quantile(x,probs=ordenpercentil)
x0 = x[x >qp]
resultado = c(mean(x0),sd(x0))
resultado
}

Y la utilizamos.

MediaDesviacionPercentil(x)

## [1] 13.0289967 0.5841361

Si queremos cambiar el valor por defecto del orden del percentil


hacemos
38 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

MediaDesviacionPercentil(x,ordenpercentil=.7)

## [1] 13.3247378 0.5243116

No hemos comprobado que efectivamente es un vector. Adems


pretendemos que no nos devuelva nada si no lo que recibe no es un
vector. En este caso que nos avise.

MediaDesviacionPercentilError = function(x,ordenpercentil = 0.5){


if(!is.vector(x)) return("No es un vector")
qp = quantile(x,probs=ordenpercentil)
x0 = x[x >qp]
resultado = c(mean(x0),sd(x0))
resultado
}

Vamos a ver qu tal funciona. Definimos una matriz.

y = matrix(1:16,ncol=4)

Comprobamos que no es un vector.

is.vector(y)

## [1] FALSE

Y probamos nuestra funcin.

MediaDesviacionPercentilError(y)

## [1] "No es un vector"

Funciona y todo. No obstante queda un poco feo que cuando es


un vector simplemente nos devuelve otro vector y hemos de saber
que es una media lo primero y una desviacin lo segundo. Podemos
devolver una lista de modo que le demos un nombre a cada cosa.

MediaDesviacionPercentilErrorLista = function(x,ordenpercentil = 0.5){


if(!is.vector(x)) return("No es un vector")
qp = quantile(x,probs=ordenpercentil)
x0 = x[x >qp]
resultado = list(media = mean(x0),de = sd(x0))
resultado
}

Y la probamos.
r y bioconductor 39

MediaDesviacionPercentilErrorLista(x)

## $media
## [1] 13.029
##
## $de
## [1] 0.5841361

Por ello podemos guardar lo que nos devuelve y luego acceder a


cada elemento de la lista.

x.des = MediaDesviacionPercentilErrorLista(x)

Y tendremos que la media es

x.des$media

## [1] 13.029

y la desviacin estndar sera

x.des$de

## [1] 0.5841361

2.7 Definiendo funciones tiles

En esta seccin se propone cmo definir funciones con algo ms


de complejidad. Se utiliza material que aparece ms tarde en el ma-
nual.

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")

y lo guardamos en gse (luego lo utilizamos como argumento de la


funcin).
40 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

gse = gse20986

Cargamos los paquetes que hemos de usar.

pacman::p_load("multtest","genefilter")

Todo el cdigo que utilizamos aqu lo podemos consultar en el


tema 8. Empezamos considerando el factor que nos clasifica las
muestras en distintos grupos (o condiciones).

(tejido = pData(gse20986)[,"tissue"])

## [1] iris retina retina iris


## [5] retina iris choroides choroides
## [9] choroides huvec huvec huvec
## Levels: iris retina choroides huvec

Vamos a preparar (de momento) la funcin para dos grupos por lo


que lo primero es quedarnos con solamente dos grupos. Nos queda-
mos con las muestras de iris y huvec. Cules son?

is.element(tejido,c("iris","huvec"))

## [1] TRUE FALSE FALSE TRUE FALSE TRUE FALSE


## [8] FALSE FALSE TRUE TRUE TRUE

Seleccionamos las muestras.

gse = gse[,is.element(tejido,c("iris","huvec"))]

Tambien hemos de quedarnos con

(irishuvec = tejido[is.element(tejido,c("iris","huvec"))])

## [1] iris iris iris huvec huvec huvec


## Levels: iris retina choroides huvec

Bien pero la variable de tipo factor mantiene los niveles retina y


coroides aunque ya no tenga muestras en esos niveles. Los quitamos.

(irishuvec = factor(irishuvec))

## [1] iris iris iris huvec huvec huvec


## Levels: iris huvec

Y ahora ya podemos trabajar.24 El cdigo podra ser 24


Todo llega.
r y bioconductor 41

alpha = 0.05
tt = rowttests(gse,irishuvec)
p1 = mt.rawp2adjp(tt$p.value,"BH")
sel = which(p1$adjp[p1$index,2] < alpha)

Lo ponemos en forma de funcin. Incorporamos un par de lneas


comprobando que los argumentos son lo que debe de ser.

tami.GenDE = function(eset,fac,alpha = 0.05,metodo = "BH"){


if(!is.factor(fac)) return("fac no es factor")
if(!class(eset) == "ExpressionSet") return("eset no es ExpressionSet")
tt = rowttests(eset,fac)
p1 = mt.rawp2adjp(tt$p.value,metodo)
sel = which(p1$adjp[p1$index,2] < alpha)
sel
}

Y ahora la probamos

tami.GenDE(gse,irishuvec,0.05,"BH")

No va mal la cosa. Veamos si nos mensajes funcionan.

x = 1:25
tami.GenDE(x,irishuvec,0.05,"BH")

## [1] "eset no es ExpressionSet"

Y ahora el control del factor.

fac = rep(1:2,3)
tami.GenDE(gse,fac,0.05,"BH")

## [1] "fac no es factor"

Otro detalle, la longitud de fac debiera de coincidir con el nmero


de muestras. Primero obtenemos el nmero de muestras.

ncol(gse)

## Samples
## 6

Y luego el nmero de valores de fac.


42 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

length(irishuvec)

## [1] 6

Modificamos la funcin.

tami.GenDE = function(eset,fac,alpha= 0.05,metodo = "BH"){


if(!ncol(eset)==length(fac)) return("Nmero equivocado de muestras")
if(!is.factor(fac)) return("fac no es factor")
if(!class(eset) == "ExpressionSet") return("eset no es ExpressionSet")
tt = rowttests(eset,fac)
p1 = mt.rawp2adjp(tt$p.value,metodo)
sel = which(p1$adjp[p1$index,2] < alpha)
sel
}

Intentamos ver si la cosa falla.

tami.GenDE(gse,rep(1:2,4))

## [1] "Nmero equivocado de muestras"

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")

Cargamos los paquetes necesarios.

pacman::p_load("annotate","R2HTML","hgu133plus2.db")

Definimos la funcin.

tami.Report = function(eset,sel.sig,file = "prueba.html"){


ID = featureNames(eset)[sel.sig]
Symbol = getSYMBOL(ID,annotation(eset))
Name = as.character(lookUp(ID,annotation(eset),"GENENAME"))
Ensembl = as.character(lookUp(ID,annotation(eset),"ENSEMBL"))
entrezid = as.character(lookUp(ID,annotation(eset), "ENTREZID"))
Ensembl = ifelse(Ensembl=="NA", NA,
paste("<a href='http://useast.ensembl.org/Homo_sapiens/Gene/Summary?g=",
Ensembl, "'>", Ensembl, "</a>", sep=""))
r y bioconductor 43

tmp = data.frame(ID=ID, Symbol=Symbol, Name=Name, Ensembl=Ensembl,


stringsAsFactors=F)
entrezid = ifelse(entrezid=="NA", NA,
paste("<a href='http://www.ncbi.nlm.nih.gov/gene/?term=",entrezid,
"'>",entrezid,"</a>", sep=""))
tmp = data.frame(ID=ID, Symbol=Symbol, Name=Name, Ensembl=Ensembl,
entrezid = entrezid, stringsAsFactors=F)
tmp[tmp=="NA"] <- NA
HTML(tmp,file,append=F)
}

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")

2.8 Grupos de genes en levaduras

En esta seccin proponemos una funcin que construye grupos de


genes utilizando Gene Ontology a partir de los nombres sistemticos
de los genes. La funcin requiere cargar los siguientes paquetes.

library(org.Sc.sgd.db) ## Anotacin de la levadura


library(GSEABase)

La funcin principal y la auxiliar son las siguientes

tami.gsc.y = function(sysids = "YML104C",subsetting = FALSE,sizefilt = TRUE,sizemin = 10,local=FALSE,local

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
}

Empezamos construyendo la coleccin de todos los conjuntos de


genes a partir de GO y lo guardamos en el fichero que utilizaremos
por defecto.

gscScGO = tami.gsc.y(sizefilt = FALSE)


save(gscScGO,file = "gscScGO.rda")

Supongamos que queremos construir los grupos de tamao mayor


a 10 utilizando el fichero local que acabamos de guardar.

gsc1 = tami.gsc.y(sizemin = 10,local = TRUE,localgsc = "gscScGO.rda")

Normalmente tendremos unos datos y queremos los grupos for-


mados utilizando los genes considerados en nuestra plataforma.
Tenemos dos opciones. Si no hemos construido los grupos previa-
mente podemos hacerlo indicando que solamente utilice los genes
considerados por nosotros. Utilizamos como ejemplo nuestros datos
tamidata::bdmy.norm.

data(bdmy.norm,package="tamidata")

Construimos la coleccin de conjuntos.

gsc = tami.gsc.y(featureNames(bdmy.norm),subsetting = TRUE)


bdmy.nor.gsc = gsc
save(bdmy.nor.gsc,file="bdmy.nor.gsc.rda")
3
Anotacin

De qu variables hablamos? En este manual trabajamos con


medidas de abundancia entendida como expresin de un gen o pre-
sencia de una mayor cantidad de protena. En este contexto cuando
hablamos de variables utilizaremos con frecuencia el nombre de ca-
ractersticas. Estas son nuestras variables. Pero, repetimos, de qu
variables hablamos? En ocasiones nos estaremos refiriendo a expre-
sin de un gen cuantificado via microarrays o RNASeq o alguna otra
tcnica. En otras ocasiones hablaremos de exones o bien, cuando
sea pertinente, de isoformas del gen obtenidas con empalmes alter-
nativos.1 Por tanto es de gran importancia2 poder manejar para el 1
Alternative splicing.
organismo que nos ocupe bases de datos que nos permitan conocer 2
Estamos al principio del texto.
cmo denominar a las caractersticas: distintos identificadores de
genes, exones, isoformas, protenas. Adems cmo pasar de unos
identificadores a otros. Cules son las correspondencias entre ellos
que con frecuencia no son correspondencias 1-1. Para cada organis-
mo podemos encontrar bases de datos disponibles online en la red.
Algunas de ellas se ocupan de ms de un organismo. Hay bases de
datos especficas de cierto tipo de genes (como de microRNAs). Es
habitual en la prctica del investigador acudir y usar este tipo de ba-
ses de datos con el gran hallazgo informtico de copiar y pegar. Es
un trabajo tedioso y, posiblemente, innnesario. Todo lo que hacemos
en este tema se puede hacer de este modo? Dira que no. En este te-
ma nos ocupamos de cmo acceder a esta informacin pero desde
R/Bioconductor.3 3
El navegador para leer la prensa.
Es muy conveniente consultar http://www.bioconductor.org/
help/workflows/annotation/annotation/. Los paquetes de anota-
cin de Bioconductor los tenemos en https://www.bioconductor.
org/packages/release/data/annotation/.

Tipos de paquetes de anotacin. Tenemos diferentes tipos de paquetes


de anotacin:
46 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

ChipDb Se refieren a una plataforma concreta. Por ejemplo, un chip


de microarray. 3.2

OrgDb Centrados en el organismo.

TxDb Paquetes relativos a transcriptomas de un organismo.

BSgenome Paquetes con genomas.


4 4
En lo que sigue seguimos el flujo de
trabajo annotation de Bioconductor.

Bases de datos e identificadores de genes.

3.1 AnnotationDbi

Las bases de datos de tipo ChipDb, OrgDb y TxDb heredan to-


dos los mtodos de la clase AnnotationDb que est definida en Pa-
ges et al. [2015, AnnotationDbi]. Por ello los mtodos aplicables a
AnnotationDb son aplicables a las dems: columns, keytypes, keys
y select. Con estos mtodos podremos extraer informacin de las
bases de las datos (objetos de clase ChipDb, OrgDb y TxDb) correspon-
dientes. Previo al uso de las distintas bases de datos de anotacin es
pues conveniente conocer los objetos AnnotationDb.

pacman::p_load("AnnotationDbi")

Para ilustrar los mtodos vamos a considerar un paquete de tipo


ChipDb, en concreto Carlson [2015b, hgu133a.db].

pacman::p_load("hgu133a.db")

La informacin contenida la podemos ver con

ls("package:hgu133a.db")

## [1] "hgu133a" "hgu133aACCNUM"


## [3] "hgu133aALIAS2PROBE" "hgu133aCHR"
## [5] "hgu133aCHRLENGTHS" "hgu133aCHRLOC"
## [7] "hgu133aCHRLOCEND" "hgu133a.db"
## [9] "hgu133a_dbconn" "hgu133a_dbfile"
## [11] "hgu133a_dbInfo" "hgu133a_dbschema"
## [13] "hgu133aENSEMBL" "hgu133aENSEMBL2PROBE"
## [15] "hgu133aENTREZID" "hgu133aENZYME"
## [17] "hgu133aENZYME2PROBE" "hgu133aGENENAME"
## [19] "hgu133aGO" "hgu133aGO2ALLPROBES"
## [21] "hgu133aGO2PROBE" "hgu133aMAP"
## [23] "hgu133aMAPCOUNTS" "hgu133aOMIM"
anotacin 47

## [25] "hgu133aORGANISM" "hgu133aORGPKG"


## [27] "hgu133aPATH" "hgu133aPATH2PROBE"
## [29] "hgu133aPFAM" "hgu133aPMID"
## [31] "hgu133aPMID2PROBE" "hgu133aPROSITE"
## [33] "hgu133aREFSEQ" "hgu133aSYMBOL"
## [35] "hgu133aUNIGENE" "hgu133aUNIPROT"

Con el nombre del paquete tambin tenemos informacin.

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

En los paquetes de anotacin tenemos columns. Algunas de estas


columnas pueden ser keys. Podemos realizar consultas en la base
de datos utilizando una key y pedir que nos devuelva una o ms de
una columns.
Qu informacin podemos recuperar utilizando select?

columns(hgu133a.db)

## [1] "ACCNUM" "ALIAS" "ENSEMBL"


## [4] "ENSEMBLPROT" "ENSEMBLTRANS" "ENTREZID"
## [7] "ENZYME" "EVIDENCE" "EVIDENCEALL"
## [10] "GENENAME" "GO" "GOALL"
## [13] "IPI" "MAP" "OMIM"
## [16] "ONTOLOGY" "ONTOLOGYALL" "PATH"
## [19] "PFAM" "PMID" "PROBEID"
## [22] "PROSITE" "REFSEQ" "SYMBOL"
## [25] "UCSCKG" "UNIGENE" "UNIPROT"

Pero: qu informacin es? Lo obtenemos con5 5


Podemos poner cualquiera de los
nombres anteriores y nos saldr la
help("ENTREZID") misma ayuda.

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)

## [1] "ACCNUM" "ALIAS" "ENSEMBL"


## [4] "ENSEMBLPROT" "ENSEMBLTRANS" "ENTREZID"
## [7] "ENZYME" "EVIDENCE" "EVIDENCEALL"
## [10] "GENENAME" "GO" "GOALL"
## [13] "IPI" "MAP" "OMIM"
## [16] "ONTOLOGY" "ONTOLOGYALL" "PATH"
## [19] "PFAM" "PMID" "PROBEID"
## [22] "PROSITE" "REFSEQ" "SYMBOL"
## [25] "UCSCKG" "UNIGENE" "UNIPROT"

Cmo conseguir todas los valores de una llave determinada?

head(keys(hgu133a.db,keytype="ENTREZID"))

## [1] "10" "100" "1000"


## [4] "10000" "100008586" "10001"

head(keys(hgu133a.db,keytype="ENSEMBL"))
anotacin 49

## [1] "ENSG00000121410" "ENSG00000175899"


## [3] "ENSG00000256069" "ENSG00000171428"
## [5] "ENSG00000156006" "ENSG00000196136"

Supongamos que tenemos algunos identificadores Affy (AffyID)


y pretendemos conocer sus identificadores ENTREZID. Empezamos
eligiendo cinco identificadores Affy al azar.6 6
De ah el uso de la funcin ba-
se::sample.

(ids = sample(keys(hgu133a.db,keytype="PROBEID"),5))

## [1] "216174_at" "211735_x_at"


## [3] "217586_x_at" "208884_s_at"
## [5] "AFFX-r2-Ec-bioD-3_at"

Vamos a obtener sus identificadores Entrez, los de ENSEMBL y su


SYMBOL.

AnnotationDbi::select(hgu133a.db,keys=ids,columns=c("ENTREZID","ENSEMBL","SYMBOL"),keytype="PROBEID")

## PROBEID ENTREZID ENSEMBL


## 1 _
216174 at 387535 <NA>
## 2 211735_x_at 6440 ENSG00000168484
## 3 217586_x_at <NA> <NA>
## 4 208884_s_at 51366 ENSG00000104517
## 5 AFFX-r2-Ec-bioD-3_at <NA> <NA>
## SYMBOL
## 1 HCRP1
## 2 SFTPC
## 3 <NA>
## 4 UBR5
## 5 <NA>

3.2 ChipDb

Si trabajamos con microarrays ( 4) nuestras caractersticas


sern las sondas.7 Estas sondas tendrn un identificador que el fabri- 7
Asociadas a genes.
cante del chip le ha asignado. Esto no es informativo para nosotros.
Hemos de poder hacer corresponder este identificador con el gen al
que corresponde. Estas bases de datos son de tipo ChipDb. Uno de
los chips ms populares de Affymetrix, Affymetrix Human Geno-
me U133. El paquete Bioconductor con la anotacin de este chip es
Carlson [2015b, hgu133a.db]. Lo cargamos.
50 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

pacman::p_load(hgu133a.db)

Qu sondas8 tienen correspondencia en Entrez? 8


Probes.

mappedProbes = mappedkeys(hgu133aENTREZID)

Lo guardamos en forma de lista.

mappedProbesList = as.list(hgu133aENTREZID[mappedProbes])

Por ejemplo, la primera posicin de la lista nos da el identificador


de Affymetrix9 y su identificador Entrez10 . 9
AffyID.
10
ENTREZID.
mappedProbesList[1]

## $`1053_at`
## [1] "5982"

O el correspondiente a la posicin 4567.

mappedProbesList[4567]

## $`205255_x_at`
## [1] "6932"

Si hacemos

ls("package:hgu133a.db")

## [1] "hgu133a" "hgu133aACCNUM"


## [3] "hgu133aALIAS2PROBE" "hgu133aCHR"
## [5] "hgu133aCHRLENGTHS" "hgu133aCHRLOC"
## [7] "hgu133aCHRLOCEND" "hgu133a.db"
## [9] "hgu133a_dbconn" "hgu133a_dbfile"
## [11] "hgu133a_dbInfo" "hgu133a_dbschema"
## [13] "hgu133aENSEMBL" "hgu133aENSEMBL2PROBE"
## [15] "hgu133aENTREZID" "hgu133aENZYME"
## [17] "hgu133aENZYME2PROBE" "hgu133aGENENAME"
## [19] "hgu133aGO" "hgu133aGO2ALLPROBES"
## [21] "hgu133aGO2PROBE" "hgu133aMAP"
## [23] "hgu133aMAPCOUNTS" "hgu133aOMIM"
## [25] "hgu133aORGANISM" "hgu133aORGPKG"
## [27] "hgu133aPATH" "hgu133aPATH2PROBE"
## [29] "hgu133aPFAM" "hgu133aPMID"
## [31] "hgu133aPMID2PROBE" "hgu133aPROSITE"
## [33] "hgu133aREFSEQ" "hgu133aSYMBOL"
## [35] "hgu133aUNIGENE" "hgu133aUNIPROT"
anotacin 51

podemos ver todas las correspondencias que nos ofrece el paquete.


Consideremos unos identificadores Affymetrix.

ids = c("39730_at", "1635_at", "1674_at", "40504_at", "40202_at")

Se supone que el chip es hgu95av2. Cargamos el paquete de anota-


cin correspondiente al chip utilizado Carlson [2015d, hgu95av2.db].

pacman::p_load("hgu95av2.db")

Y lo mismo que antes. Ahora tenemos adems la correspondencia


entre las sondas y los genes.

columns(hgu95av2.db)

## [1] "ACCNUM" "ALIAS" "ENSEMBL"


## [4] "ENSEMBLPROT" "ENSEMBLTRANS" "ENTREZID"
## [7] "ENZYME" "EVIDENCE" "EVIDENCEALL"
## [10] "GENENAME" "GO" "GOALL"
## [13] "IPI" "MAP" "OMIM"
## [16] "ONTOLOGY" "ONTOLOGYALL" "PATH"
## [19] "PFAM" "PMID" "PROBEID"
## [22] "PROSITE" "REFSEQ" "SYMBOL"
## [25] "UCSCKG" "UNIGENE" "UNIPROT"

keytypes(hgu95av2.db)

## [1] "ACCNUM" "ALIAS" "ENSEMBL"


## [4] "ENSEMBLPROT" "ENSEMBLTRANS" "ENTREZID"
## [7] "ENZYME" "EVIDENCE" "EVIDENCEALL"
## [10] "GENENAME" "GO" "GOALL"
## [13] "IPI" "MAP" "OMIM"
## [16] "ONTOLOGY" "ONTOLOGYALL" "PATH"
## [19] "PFAM" "PMID" "PROBEID"
## [22] "PROSITE" "REFSEQ" "SYMBOL"
## [25] "UCSCKG" "UNIGENE" "UNIPROT"

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

Este tipo de paquete se refiere a un organismo dado y est centra-


do en el gen. Veamos como ejemplo el relativo a ser humano.

pacman::p_load(org.Hs.eg.db)

Qu tipo de cosas o qu claves podemos manejar?

columns(org.Hs.eg.db)

## [1] "ACCNUM" "ALIAS" "ENSEMBL"


## [4] "ENSEMBLPROT" "ENSEMBLTRANS" "ENTREZID"
## [7] "ENZYME" "EVIDENCE" "EVIDENCEALL"
## [10] "GENENAME" "GO" "GOALL"
## [13] "IPI" "MAP" "OMIM"
## [16] "ONTOLOGY" "ONTOLOGYALL" "PATH"
## [19] "PFAM" "PMID" "PROSITE"
## [22] "REFSEQ" "SYMBOL" "UCSCKG"
## [25] "UNIGENE" "UNIPROT"

O bien con

keytypes(org.Hs.eg.db)

## [1] "ACCNUM" "ALIAS" "ENSEMBL"


## [4] "ENSEMBLPROT" "ENSEMBLTRANS" "ENTREZID"
## [7] "ENZYME" "EVIDENCE" "EVIDENCEALL"
## [10] "GENENAME" "GO" "GOALL"
## [13] "IPI" "MAP" "OMIM"
## [16] "ONTOLOGY" "ONTOLOGYALL" "PATH"
## [19] "PFAM" "PMID" "PROSITE"
## [22] "REFSEQ" "SYMBOL" "UCSCKG"
## [25] "UNIGENE" "UNIPROT"

Por ejemplo, si queremos los primeros identificadores de genes


utilizando los identificadores Entrez o ENTREZID tenemos

head(keys(org.Hs.eg.db, keytype="ENTREZID"))

## [1] "1" "2" "3" "9" "10" "11"


anotacin 53

Si consideramos sus identificadores en la base de datos Ensembl


entonces podemos usar

head(keys(org.Hs.eg.db, keytype="ENSEMBL"))

## [1] "ENSG00000121410" "ENSG00000175899"


## [3] "ENSG00000256069" "ENSG00000171428"
## [5] "ENSG00000156006" "ENSG00000196136"

Y en Gene Ontology.

head(keys(org.Hs.eg.db, keytype="GO"))

## [1] "GO:0003674" "GO:0005576" "GO:0005615"


## [4] "GO:0008150" "GO:0070062" "GO:0072562"

Supongamos que elegimos un sistema de identificacin, por ejem-


plo, ENTREZID. En concreto, los cinco primeros genes.

(ids = keys(org.Hs.eg.db, keytype="ENTREZID")[1:5])

## [1] "1" "2" "3" "9" "10"

A partir de estos identicadores podemos obtener el resto.

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

Supongamos que nos fijamos en el gen con cdigo Ensembl


ENSG00000000003.

(id = "ENSG00000171428")

## [1] "ENSG00000171428"

Buscamos su correspondencia en Gene Ontology.

(res = AnnotationDbi::select(org.Hs.eg.db, keys=id, column="GO", keytype="ENSEMBL"))

## ENSEMBL GO EVIDENCE ONTOLOGY


## 1 ENSG00000171428 GO:0004060 IEA MF
## 2 ENSG00000171428 GO:0005829 TAS CC
## 3 ENSG00000171428 GO:0006805 TAS BP
## 4 ENSG00000171428 GO:0044281 TAS BP
54 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Como vemos no tenemos una correspondencia 1-1. Al mismo gen


le corresponden distintos trminos Gene Ontology. Si solamente
tenemos inters en ellos podemos hacer

res[,"GO"]

## [1] "GO:0004060" "GO:0005829" "GO:0006805"


## [4] "GO:0044281"

Puesto que tenemos identificadores Gene Ontology podemos


utilizar el paquete Carlson [2015a, GO.db] para obtener los trminos
Gene Ontology correspondientes.

pacman::p_load(GO.db)

Y los trminos Gene Ontology seran

AnnotationDbi::select(GO.db, keys=res[,"GO"], columns="TERM", keytype="GOID")

3.4 TxDb

Los paquetes TxDb estn centrados en el genoma. Vamos a traba-


jar con la mosca de la drosophila melanogaster.11 Cargamos la base 11
https://en.wikipedia.org/wiki/
Drosophila_melanogaster.
de datos.

pacman::p_load("TxDb.Dmelanogaster.UCSC.dm3.ensGene")

Al cargar este paquete lo que hemos hecho es leer un objeto que se


llama como el propio paquete y de clase TxDb.12 12
Todos los paquetes de Bioconductor
que empiezan con TxDb son de este
tipo.
class(TxDb.Dmelanogaster.UCSC.dm3.ensGene)

## [1] "TxDb"
## attr(,"package")
## [1] "GenomicFeatures"

Hacemos una copia con un nombre ms breve.

txdb = TxDb.Dmelanogaster.UCSC.dm3.ensGene

De qu clase es este objeto?

class(txdb)

## [1] "TxDb"
## attr(,"package")
## [1] "GenomicFeatures"
anotacin 55

Es pues un objeto de clase TxDb. Tenemos un resumen sobre los


datos contenidos en txdb con

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

Podemos ver la informacin de la que disponemos con

columns(txdb)

## [1] "CDSCHROM" "CDSEND" "CDSID"


## [4] "CDSNAME" "CDSSTART" "CDSSTRAND"
## [7] "EXONCHROM" "EXONEND" "EXONID"
## [10] "EXONNAME" "EXONRANK" "EXONSTART"
## [13] "EXONSTRAND" "GENEID" "TXCHROM"
## [16] "TXEND" "TXID" "TXNAME"
## [19] "TXSTART" "TXSTRAND" "TXTYPE"

y con

keytypes(txdb)

## [1] "CDSID" "CDSNAME" "EXONID" "EXONNAME"


## [5] "GENEID" "TXID" "TXNAME"

Para el manejo de este tipo de bases de datos es til Carlson et al.


[2016, GenomicFeatures].
56 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

pacman::p_load(GenomicFeatures)

Por ejemplo: Qu cromosomas tenemos?13 13


En http://ucscbrowser.
genenetwork.org/cgi-bin/hgGateway?
hgsid=732&clade=insect&org=0&db=0
seqlevels(txdb)
podemos encontrar una explicacin
detallada.
## [1] "chr2L" "chr2R" "chr3L"
## [4] "chr3R" "chr4" "chrX"
## [7] "chrU" "chrM" "chr2LHet"
## [10] "chr2RHet" "chr3LHet" "chr3RHet"
## [13] "chrXHet" "chrYHet" "chrUextra"

Cuando se carga la base de datos todos los cromosomas estn


activos y lo que hagamos nos dar informacin sobre todos ellos.
Supongamos que no queremos esto. Queremos, por ejemplo, trabajar
solamente con chr2L. Lo conseguimos con

seqlevels(txdb) = "chr2L"

Supongamos que queremos conocer los GENEID de los primeros


genes.

(keysGENEID = head(keys(txdb, keytype="GENEID"),n=3))

## [1] "FBgn0000003" "FBgn0000008" "FBgn0000014"

columns = c("TXNAME", "TXSTART","TXEND","TXSTRAND")


AnnotationDbi::select(txdb, keysGENEID, columns, keytype="GENEID")

## GENEID TXNAME TXSTRAND TXSTART


## 1 FBgn0000003 FBtr0081624 + 2648220
## 2 FBgn0000008 FBtr0100521 + 18024494
## 3 FBgn0000008 FBtr0071763 + 18024496
## 4 FBgn0000008 FBtr0071764 + 18024938
## 5 FBgn0000014 FBtr0306337 - 12632936
## 6 FBgn0000014 FBtr0083388 - 12633349
## 7 FBgn0000014 FBtr0083387 - 12633349
## 8 FBgn0000014 FBtr0300485 - 12633349
## TXEND
## 1 2648518
## 2 18060339
## 3 18060346
## 4 18060346
## 5 12655767
## 6 12653845
anotacin 57

## 7 12655300
## 8 12655474

Nos devuelve el identificador del gen (GENEID), el nombre del


transcrito, la hebra o cadena y el punto de inicio y de finalizacin.
Notemos que el primer gen solo tiene un transcrito mientras que el
segundo gen tiene tres transcritos.
Los objetos TxDb nos permiten obtener las anotaciones como
GRanges.14 Empezamos con los transcritos. 14
21.5.1.

(txdb.tr = transcripts(txdb))

## GRanges object with 5384 ranges and 2 metadata columns:


## seqnames ranges strand |
## <Rle> <IRanges> <Rle> |
## [1] chr2L [ 7529, 9484] + |
## [2] chr2L [ 7529, 9484] + |
## [3] chr2L [ 7529, 9484] + |
## [4] chr2L [21952, 24237] + |
## [5] chr2L [66584, 71390] + |
## ... ... ... ... ...
## [5380] chr2L [22892306, 22918560] - |
## [5381] chr2L [22892306, 22918647] - |
## [5382] chr2L [22959606, 22960915] - |
## [5383] chr2L [22959606, 22961179] - |
## [5384] chr2L [22959606, 22961179] - |
## tx_id tx_name
## <integer> <character>
## [1] 1 FBtr0300689
## [2] 2 FBtr0300690
## [3] 3 FBtr0330654
## [4] 4 FBtr0309810
## [5] 5 FBtr0306539
## ... ... ...
## [5380] 5380 FBtr0331166
## [5381] 5381 FBtr0111127
## [5382] 5382 FBtr0111241
## [5383] 5383 FBtr0111239
## [5384] 5384 FBtr0111240
## -------
## seqinfo: 1 sequence from dm3 genome

Como estamos trabajando con el cromosoma chr2L nos devuelve


la informacin en este nuevo (y mejor) formato. Los que ocupan las
posiciones 1, 2, 3 y 1000 seran
58 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

txdb.tr[c(1:3,1000)]

## GRanges object with 4 ranges and 2 metadata columns:


## seqnames ranges strand |
## <Rle> <IRanges> <Rle> |
## [1] chr2L [ 7529, 9484] + |
## [2] chr2L [ 7529, 9484] + |
## [3] chr2L [ 7529, 9484] + |
## [4] chr2L [8011405, 8026898] + |
## tx_id tx_name
## <integer> <character>
## [1] 1 FBtr0300689
## [2] 2 FBtr0300690
## [3] 3 FBtr0330654
## [4] 1000 FBtr0079533
## -------
## seqinfo: 1 sequence from dm3 genome

Tambin podemos obtener informacin sobre los exones en modo


de un objeto GRanges.

(txdb.ex = exons(txdb))

## GRanges object with 13850 ranges and 1 metadata column:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr2L [7529, 8116] +
## [2] chr2L [8193, 8589] +
## [3] chr2L [8193, 9484] +
## [4] chr2L [8229, 9484] +
## [5] chr2L [8668, 9484] +
## ... ... ... ...
## [13846] chr2L [22959606, 22959815] -
## [13847] chr2L [22959877, 22960833] -
## [13848] chr2L [22959877, 22960876] -
## [13849] chr2L [22959877, 22960915] -
## [13850] chr2L [22960932, 22961179] -
## | exon_id
## | <integer>
## [1] | 1
## [2] | 2
## [3] | 3
## [4] | 4
## [5] | 5
## ... ... ...
anotacin 59

## [13846] | 13846
## [13847] | 13847
## [13848] | 13848
## [13849] | 13849
## [13850] | 13850
## -------
## seqinfo: 1 sequence from dm3 genome

Como antes el exon que ocupa la posicin 123 sera

txdb.ex[123]

## GRanges object with 1 range and 1 metadata column:


## seqnames ranges strand |
## <Rle> <IRanges> <Rle> |
## [1] chr2L [277930, 278323] + |
## exon_id
## <integer>
## [1] 123
## -------
## seqinfo: 1 sequence from dm3 genome

Podemos incluir metadatos adicionales como puede ser el identifi-


cador del gen.

transcripts(txdb, columns = c("tx_id","tx_name","gene_id"))

## GRanges object with 5384 ranges and 3 metadata columns:


## seqnames ranges strand |
## <Rle> <IRanges> <Rle> |
## [1] chr2L [ 7529, 9484] + |
## [2] chr2L [ 7529, 9484] + |
## [3] chr2L [ 7529, 9484] + |
## [4] chr2L [21952, 24237] + |
## [5] chr2L [66584, 71390] + |
## ... ... ... ... ...
## [5380] chr2L [22892306, 22918560] - |
## [5381] chr2L [22892306, 22918647] - |
## [5382] chr2L [22959606, 22960915] - |
## [5383] chr2L [22959606, 22961179] - |
## [5384] chr2L [22959606, 22961179] - |
## tx_id tx_name gene_id
## <integer> <character> <CharacterList>
## [1] 1 FBtr0300689 FBgn0031208
## [2] 2 FBtr0300690 FBgn0031208
60 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## [3] 3 FBtr0330654 FBgn0031208


## [4] 4 FBtr0309810 FBgn0263584
## [5] 5 FBtr0306539 FBgn0067779
## ... ... ... ...
## [5380] 5380 FBtr0331166 FBgn0250907
## [5381] 5381 FBtr0111127 FBgn0250907
## [5382] 5382 FBtr0111241 FBgn0086683
## [5383] 5383 FBtr0111239 FBgn0086683
## [5384] 5384 FBtr0111240 FBgn0086683
## -------
## seqinfo: 1 sequence from dm3 genome

Obtenemos las regiones CDS con

(txdb.cds = cds(txdb))

## GRanges object with 11003 ranges and 1 metadata column:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr2L [7680, 8116] +
## [2] chr2L [8193, 8589] +
## [3] chr2L [8193, 8610] +
## [4] chr2L [8229, 8610] +
## [5] chr2L [8668, 9276] +
## ... ... ... ...
## [10999] chr2L [22959877, 22960833] -
## [11000] chr2L [22959877, 22960873] -
## [11001] chr2L [22959877, 22960876] -
## [11002] chr2L [22960932, 22960995] -
## [11003] chr2L [22960932, 22961048] -
## | cds_id
## | <integer>
## [1] | 1
## [2] | 2
## [3] | 3
## [4] | 4
## [5] | 5
## ... ... ...
## [10999] | 10999
## [11000] | 11000
## [11001] | 11001
## [11002] | 11002
## [11003] | 11003
## -------
## seqinfo: 1 sequence from dm3 genome
anotacin 61

En los tres casos hemos obtenido un objeto GRanges. A este tipo


de objetos podemos aplicar otros mtodos que nos dan informacin
adicional. Por ejemplo, el nmero de elementos que lo componen

length(txdb.cds)

## [1] 11003

Podemos ver la hebra en la que estn15 15


En la salida que sigue nos hace una
tabla de frecuencias.
strand(txdb.cds)

## factor-Rle of length 11003 with 2 runs


## Lengths: 5489 5514
## Values : + -
## Levels(3): + - *

A partir de un objeto de clase TxDb podemos obtener un GRangesList16 16


21.5.2.
en la cual separamos por alguna caracterstica. Por ejemplo, los obje-
tos GRanges para los distintos genes.

transcriptsBy(txdb, by="gene")

## GRangesList object of length 2986:


## $FBgn0000018
## GRanges object with 1 range and 2 metadata columns:
## seqnames ranges strand |
## <Rle> <IRanges> <Rle> |
## [1] chr2L [10973443, 10975273] - |
## tx_id tx_name
## <integer> <character>
## [1] 4279 FBtr0080168
##
## $FBgn0000052
## GRanges object with 3 ranges and 2 metadata columns:
## seqnames ranges strand | tx_id
## [1] chr2L [6041178, 6045593] - | 3537
## [2] chr2L [6041178, 6045970] - | 3538
## [3] chr2L [6041178, 6045970] - | 3539
## tx_name
## [1] FBtr0079221
## [2] FBtr0079219
## [3] FBtr0079220
##
## $FBgn0000053
## GRanges object with 2 ranges and 2 metadata columns:
62 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## seqnames ranges strand | tx_id


## [1] chr2L [7014861, 7023940] - | 3704
## [2] chr2L [7018085, 7023940] - | 3705
## tx_name
## [1] FBtr0079431
## [2] FBtr0100353
##
## ...
## <2983 more elements>
## -------
## seqinfo: 1 sequence from dm3 genome

Podemos agrupar los exones por gen.

exonsBy(txdb, by="gene")

## GRangesList object of length 2986:


## $FBgn0000018
## GRanges object with 2 ranges and 2 metadata columns:
## seqnames ranges strand |
## <Rle> <IRanges> <Rle> |
## [1] chr2L [10973443, 10974210] - |
## [2] chr2L [10974268, 10975273] - |
## exon_id exon_name
## <integer> <character>
## [1] 11021 <NA>
## [2] 11022 <NA>
##
## $FBgn0000052
## GRanges object with 6 ranges and 2 metadata columns:
## seqnames ranges strand |
## [1] chr2L [6041178, 6042011] - |
## [2] chr2L [6042075, 6044351] - |
## [3] chr2L [6044428, 6045526] - |
## [4] chr2L [6044428, 6045593] - |
## [5] chr2L [6045894, 6045970] - |
## [6] chr2L [6045921, 6045970] - |
## exon_id exon_name
## [1] 8949 <NA>
## [2] 8950 <NA>
## [3] 8951 <NA>
## [4] 8952 <NA>
## [5] 8955 <NA>
## [6] 8956 <NA>
##
anotacin 63

## $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

O bien podemos tener los CDS agrupados por transcrito.

cdsBy(txdb, by="tx")

## GRangesList object of length 4951:


## $1
## GRanges object with 2 ranges and 3 metadata columns:
## seqnames ranges strand | cds_id
## <Rle> <IRanges> <Rle> | <integer>
## [1] chr2L [7680, 8116] + | 1
## [2] chr2L [8193, 8610] + | 3
## cds_name exon_rank
## <character> <integer>
## [1] <NA> 1
## [2] <NA> 2
##
## $2
## GRanges object with 3 ranges and 3 metadata columns:
64 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## seqnames ranges strand | cds_id


## [1] chr2L [7680, 8116] + | 1
## [2] chr2L [8193, 8589] + | 2
## [3] chr2L [8668, 9276] + | 5
## cds_name exon_rank
## [1] <NA> 1
## [2] <NA> 2
## [3] <NA> 3
##
## $3
## GRanges object with 2 ranges and 3 metadata columns:
## seqnames ranges strand | cds_id
## [1] chr2L [7680, 8116] + | 1
## [2] chr2L [8229, 8610] + | 4
## cds_name exon_rank
## [1] <NA> 1
## [2] <NA> 2
##
## ...
## <4948 more elements>
## -------
## seqinfo: 1 sequence from dm3 genome

O los intrones agrupados por transcrito.

intronsByTranscript(txdb)

## GRangesList object of length 5384:


## $1
## GRanges object with 1 range and 0 metadata columns:
## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr2L [8117, 8192] +
##
## $2
## GRanges object with 2 ranges and 0 metadata columns:
## seqnames ranges strand
## [1] chr2L [8117, 8192] +
## [2] chr2L [8590, 8667] +
##
## $3
## GRanges object with 1 range and 0 metadata columns:
## seqnames ranges strand
## [1] chr2L [8117, 8228] +
anotacin 65

##
## ...
## <5381 more elements>
## -------
## seqinfo: 1 sequence from dm3 genome

Tambin podemos tener las regiones UTR 5 y 3 agrupadas por


transcrito.

fiveUTRsByTranscript(txdb)

## GRangesList object of length 4733:


## $1
## GRanges object with 1 range and 3 metadata columns:
## seqnames ranges strand | exon_id
## <Rle> <IRanges> <Rle> | <integer>
## [1] chr2L [7529, 7679] + | 1
## exon_name exon_rank
## <character> <integer>
## [1] <NA> 1
##
## $2
## GRanges object with 1 range and 3 metadata columns:
## seqnames ranges strand | exon_id
## [1] chr2L [7529, 7679] + | 1
## exon_name exon_rank
## [1] <NA> 1
##
## $3
## GRanges object with 1 range and 3 metadata columns:
## seqnames ranges strand | exon_id
## [1] chr2L [7529, 7679] + | 1
## exon_name exon_rank
## [1] <NA> 1
##
## ...
## <4730 more elements>
## -------
## seqinfo: 1 sequence from dm3 genome

threeUTRsByTranscript(txdb)

## GRangesList object of length 4721:


## $1
66 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## GRanges object with 1 range and 3 metadata columns:


## seqnames ranges strand | exon_id
## <Rle> <IRanges> <Rle> | <integer>
## [1] chr2L [8611, 9484] + | 3
## exon_name exon_rank
## <character> <integer>
## [1] <NA> 2
##
## $2
## GRanges object with 1 range and 3 metadata columns:
## seqnames ranges strand | exon_id
## [1] chr2L [9277, 9484] + | 5
## exon_name exon_rank
## [1] <NA> 3
##
## $3
## GRanges object with 1 range and 3 metadata columns:
## seqnames ranges strand | exon_id
## [1] chr2L [8611, 9484] + | 4
## exon_name exon_rank
## [1] <NA> 2
##
## ...
## <4718 more elements>
## -------
## seqinfo: 1 sequence from dm3 genome

3.5 BSgenome

Estos paquetes contienen datos de secuencias para organismos


secuenciados.

BSgenome.Dmelanogaster.UCSC.dm3

pacman::p_load(BSgenome.Dmelanogaster.UCSC.dm3)
tx2seqs = extractTranscriptSeqs(BSgenome.Dmelanogaster.UCSC.dm3,TxDb.Dmelanogaster.UCSC.dm3.ensGene)

La secuencia correspondiente al primer gen sera

tx2seqs[[1]]

## 1880-letter "DNAString" instance


## seq: CTACTCGCATGTAGAGATTTC...TTCAATAAAATTTCCCCAAGT
anotacin 67

Si queremos conocer la secuencia entre las posiciones 1000 y 1020


entonces

tx2seqs[[1]][1000:1020]

## 21-letter "DNAString" instance


## seq: ATATTGATGTCTTTCGTACCC

Tambin podemos trasladar estas secuencias a protenas con

suppressWarnings(translate(tx2seqs[[1]]))

Para todos los transcritos lo hacemos con

suppressWarnings(translate(tx2seqs))

No todo lo que se transcribe se traslada. Para obtener obtener las


que realmente se trasladan se puede hacer

cds2seqs = extractTranscriptSeqs(BSgenome.Dmelanogaster.UCSC.dm3,cdsBy(txdb, by="tx"))


translate(cds2seqs)

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)

Nos fijamos en las secuencias.

seqNms = seqnames(Hsapiens)
head(seqNms)

## [1] "chr1" "chr2" "chr3" "chr4" "chr5" "chr6"

Nos fijamos en las dos primeras.

getSeq(Hsapiens, seqNms[1:2])

## A DNAStringSet instance of length 2


## width seq
## [1] 249250621 NNNNNNNNNNNNNNNNN...NNNNNNNNNNNNNNNN
## [2] 243199373 NNNNNNNNNNNNNNNNN...NNNNNNNNNNNNNNNN

Podemos, utilizando un objeto GRanges, obtener la secuencia de


bases en los cromosomas que queramos, en la hebra que queramos,
entre las posiciones que queramos.

rngs <- GRanges(seqnames = c('chr1', 'chr4'), strand=c('+','-'),


ranges = IRanges(start=c(100000,300000),
end=c(100023,300037)))
rngs

## GRanges object with 2 ranges and 0 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr1 [100000, 100023] +
## [2] chr4 [300000, 300037] -
## -------
## seqinfo: 2 sequences from an unspecified genome; no seqlengths

res <- getSeq(Hsapiens, rngs)


res

## A DNAStringSet instance of length 2


## width seq
## [1] 24 CACTAAGCACACAGAGAATAATGT
## [2] 38 GCTGGTCCCTTACTTCCAGTAGAAAAGACGTGTTCAGG
anotacin 69

3.6 OrganismDb

Un paquete de tipo OrganismDb nos permite combinar informa-


cin (para el organismo con que estemos trabajando) de GO.db con el
correspondiente TxDb y OrgDb.17 17
Buscar OrganismDb en Bioconductor.

pacman::p_load(Homo.sapiens)

Tomamos las dos primeras.

keys = head(keys(Homo.sapiens, keytype="ENTREZID"), n=2)


columns = c("SYMBOL","TXNAME")
AnnotationDbi::select(Homo.sapiens, keys, columns, keytype="ENTREZID")

## ENTREZID SYMBOL TXNAME


## 1 1 A1BG uc002qsd.4
## 2 1 A1BG uc002qsf.2
## 3 2 A2M uc001qvk.1
## 4 2 A2M uc009zgk.1

Tambin podemos obtener GRanges.

transcripts(Homo.sapiens, columns=c("TXNAME","SYMBOL"))

## GRanges object with 82960 ranges and 2 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr1 [ 11874, 14409] +
## [2] chr1 [ 11874, 14409] +
## [3] chr1 [ 11874, 14409] +
## [4] chr1 [ 69091, 70008] +
## [5] chr1 [321084, 321115] +
## ... ... ... ...
## [82956] chrUn_gl000237 [ 1, 2686] -
## [82957] chrUn_gl000241 [20433, 36875] -
## [82958] chrUn_gl000243 [11501, 11530] +
## [82959] chrUn_gl000243 [13608, 13637] +
## [82960] chrUn_gl000247 [ 5787, 5816] -
## | TXNAME SYMBOL
## | <CharacterList> <CharacterList>
## [1] | uc001aaa.3 DDX11L1
## [2] | uc010nxq.1 DDX11L1
## [3] | uc010nxr.1 DDX11L1
## [4] | uc001aal.1 OR4F5
## [5] | uc001aaq.2 NA
## ... ... ... ...
70 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## [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

El paquete Durinck and Huber [2015, biomaRt] es un interfaz


para poder acceder a una serie de bases de datos que implementan
BioMart.18 18
http://www.biomart.org.

pacman::p_load(biomaRt)

Podemos ver la lista de marts que tenemos (mostramos los prime-


ros).

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

Elegimos utilizar ensembl.

(ensembl = useMart("ENSEMBL_MART_ENSEMBL",host="www.ensembl.org"))

## Object of class 'Mart':


## Using the ENSEMBL_MART_ENSEMBL BioMart database
## Using the dataset

Ahora hemos de elegir el conjunto de datos a utilizar. Podemos ver


los disponibles con

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

Elegimos la correspondiente a ser humano.

(ensembl = useMart("ENSEMBL_MART_ENSEMBL",dataset="hsapiens_gene_ensembl",
host="www.ensembl.org"))

Podemos ver los atributos con

head(listAttributes(ensembl))

De hecho, son

nrow(listAttributes(ensembl))

Podemos comprobar que hay muchos que identifican el gen con


las sondas de Affymetrix, en concreto, con los AffyID. Supongamos
que nos fijamos en los siguientes AffyID.

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)

Podemos obtener todos los identificadores.


72 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

head(getBM(attributes='affy_hg_u133_plus_2', mart = ensembl))

3.8 Tareas habituales con anotaciones

Cules son las tareas que tenemos que realizar habitualmente? En


esta seccin vemos posibles soluciones que las resuelvan.

3.8.1 Cambiar identificadores de un ExpressionSet


Consideremos el ExpressionSet tamidata::gse1397.19 Las caracte- 19
5.10.
rsticas estn codificadas utilizando los identificadores Affymetrix.
Pretendemos incorporar la informacin que nos permita conocer la
correspondencia entre estos identificadores (PROBEID) y los identi-
ficadores Entrez y Ensembl. Esta informacin la incorporamos como
fData del ExpressionSet.
Necesitamos los paquetes.

pacman::p_load("Biobase","AnnotationDbi","BiocGenerics")

Leemos los datos.

data(gse1397,package="tamidata")

Qu paquete de anotacin necesitamos?

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)

## [1] "ACCNUM" "ALIAS" "ENSEMBL"


## [4] "ENSEMBLPROT" "ENSEMBLTRANS" "ENTREZID"
## [7] "ENZYME" "EVIDENCE" "EVIDENCEALL"
## [10] "GENENAME" "GO" "GOALL"
## [13] "IPI" "MAP" "OMIM"
## [16] "ONTOLOGY" "ONTOLOGYALL" "PATH"
anotacin 73

## [19] "PFAM" "PMID" "PROBEID"


## [22] "PROSITE" "REFSEQ" "SYMBOL"
## [25] "UCSCKG" "UNIGENE" "UNIPROT"

keytypes(hgu133a.db)

## [1] "ACCNUM" "ALIAS" "ENSEMBL"


## [4] "ENSEMBLPROT" "ENSEMBLTRANS" "ENTREZID"
## [7] "ENZYME" "EVIDENCE" "EVIDENCEALL"
## [10] "GENENAME" "GO" "GOALL"
## [13] "IPI" "MAP" "OMIM"
## [16] "ONTOLOGY" "ONTOLOGYALL" "PATH"
## [19] "PFAM" "PMID" "PROBEID"
## [22] "PROSITE" "REFSEQ" "SYMBOL"
## [25] "UCSCKG" "UNIGENE" "UNIPROT"

Vemos que, en este caso coinciden columns y keys. Los valores los
tenemos con

head(keys(hgu133a.db,keytype="PROBEID"))

## [1] "1007_s_at" "1053_at" "117_at"


## [4] "121_at" "1255_g_at" "1294_at"

que corresponde con los identificadores Affy o identificadores de


las sondas. Podemos ver los primeros que tenemos en nuestros datos.

head(featureNames(gse1397))

## [1] "1007_s_at" "1053_at" "117_at"


## [4] "121_at" "1255_g_at" "1294_at"

Coinciden todos?

table(featureNames(gse1397) == keys(hgu133a.db,keytype="PROBEID"))

##
## FALSE TRUE
## 53 22230

Vemos que no todos coinciden. Quienes son?

(control = which(featureNames(gse1397) != keys(hgu133a.db,keytype="PROBEID")))

## [1] 22231 22232 22233 22234 22235 22236 22237


## [8] 22238 22239 22240 22241 22242 22243 22244
74 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## [15] 22245 22246 22247 22248 22249 22250 22251


## [22] 22252 22253 22254 22255 22256 22257 22258
## [29] 22259 22260 22261 22262 22263 22264 22265
## [36] 22266 22267 22268 22269 22270 22271 22272
## [43] 22273 22274 22275 22276 22277 22278 22279
## [50] 22280 22281 22282 22283

Que identificadores tienen estas sondas?

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"

Son sondas de control que no corresponden a ningn gen. Hemos


dicho antes que queremos modificar los identificadores utilizados en
el ExpressionSet. Y queremos hacerlo pasando a Entrez y Ensembl.
Buscamos las correspondencias.

probeid2entrez = AnnotationDbi::select(hgu133a.db,keys=featureNames(gse1397),
columns="ENTREZID",keytype="PROBEID")

Nos ha devuelvo un data.frame.

class(probeid2entrez)

## [1] "data.frame"

Es importante notar que no hay una correspondencia 1-1 entre los


distintos identificadores.

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

La primera sonda tiene dos identificadores Entrez distintos.


Una opcin para resolver esta multiplicidad es utilizar BiocGene-
rics::match.
anotacin 75

indices = match(featureNames(gse1397),probeid2entrez$PROBEID)

Cmo se ha resuelto?

head(featureNames(gse1397))

## [1] "1007_s_at" "1053_at" "117_at"


## [4] "121_at" "1255_g_at" "1294_at"

head(probeid2entrez$PROBEID,n=7)

## [1] "1007_s_at" "1007_s_at" "1053_at"


## [4] "117_at" "121_at" "1255_g_at"
## [7] "1294_at"

head(indices)

## [1] 1 3 4 5 6 7

Elige la primera correspondencia e ignora las demas como hemos


visto.

eset = gse1397
fData(eset) = probeid2entrez[indices,]

Podemos comprobar, con Base::all.equal, si son iguales los nom-


bres del ExpressionSet con la columna de identificadores Affymetrix.

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.

* Ej. 2 Se pide encontrar el gen BRCA1 en el ratn (Mus muscu-


lus). Utilizad el paquete de anotacin Carlson [2015g, org.Mm.eg.db].
Parte II

Datos
4
Microarrays

4.1 Introduccin

En este tema tratamos sobre datos de expresin obtenidos utili-


zando microarrays. Nos ocupamos del procesado (o mejor, del pre-
procesado) de los datos desde los datos originales (o datos a nivel de
sonda) hasta los datos tal y como los hemos estado analizando.
Antes de procesar los datos necesitamos tenerlos. Los datos golub
que hemos usado son datos que ya han sido preprocesados. En este
tema nos ocupamos de este punto previo y no menor. Muchos de
los anlisis de expresin diferencial posterior dependen de un modo
esencial de lo que hacemos antes. Con frecuencia el experimentador
confa en el preprocesado que el fabricante del chip realiza. No ne-
cesariamente este preprocesado tiene porqu estar mal hecho pero
en cualquier caso es preciso conocerlo y evaluarlo. En lo que sigue
veremos como hay funciones que reproducen lo que el fabricante
hace.
En este captulo la referencia de mayor inters es Gentleman et al.
[2005]. En particular tienen un inters especial los tres primeros cap-
tulos.
La expresin de un gen es el proceso mediante el que se transcribe
el DNA en una serie de copias de mRNA. Los microarrays miden la
cantidad de mRNA para cada gen. El valor de la expresin de un gen
es una medida de luminiscencia relacionada con el mRNA presente.
Esto es para un chip de DNA.
En lo que sigue vamos a trabajar con el experimento GSE21779.1 1
http://www.ncbi.nlm.nih.gov/geo/
query/acc.cgi?acc=GSE21779.
Todos los anlisis que proponemos los podemos encontrar en http:
//www.uv.es/ayala/docencia/tami/Rmd/gse21779.htmlgse21779.html.
80 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

4.2 Affymetrix GeneChip

Es conveniente consultar Wit and McClure [2004, pginas 93 y


siguientes]. Vamos a leer datos obtenidos mediante un escner Affy-
metrix GeneChip. Estos arrays de oligonucletidos tienen un peque-
o nmero de sondas para un mismo gen. Hablaremos de conjunto
de sondas refirindonos a todas las sondas que en un mismo chip
estn asociadas con un mismo gen. Cada sonda son pequeas celdas
con oligonucletidos especficos de un gen. Estos oligonucletidos
tienen 25 pares de bases. Cada oligonucletido es una parte (aproxi-
madamente) especfica de un gen. En principio solo el mRNA de este
gen lo reconocer como propio. Sin embargo, tambin puede ocurrir
que el RNA de otros genes encuentre partes comunes con la sonda
y se adjunte. Tendramos una hibridacin no especfica. Con objeto
de considerar el problema Affymetrix modifica la secuencia original.
Concretamente el par de bases en la posicin 13. De este modo una
hibridacin con esta sonda se considera un acoplamiento errneo.
Las imgenes digitales con la informacin original son los ficheros
DAT. Una vez procesados por el software que proporciona el fabri-
cante obtenemos un resumen por celda que los guarda en los ficheros
CEL. Este fichero es el resultado del escaneo y la segmentacin de la
imagen obtenida. Todava no hemos resumido estas intensidades de
los pxeles en un valor por gen. En estos ficheros tenemos la media
y desviacin estndar de los niveles de gris as como la localizacin
de la sonda dentro del array. Se necesita tambin conocer la corres-
pondencia entre sondas y nombres de los genes. Esta informacin
aparece en el fichero CDF.2 2
Cuando leamos datos veremos que
La informacin que se maneja se puede considerar a tres niveles: si no tenemos cargado el fichero CDF
necesario el programa los baja sin que
se lo pidamos.
Imagen El primer nivel es de la imagen digital (ficheros DAT en
Affymetrix GeneChip). Hay que utilizar tcnicas de procesado de
imagen digital para obtener a partir de esta imagen otra imagen
donde cada pixel tiene como nivel de gris la expresin de la sonda
en esa celda.

Datos a nivel de sonda Tenemos un imagen digital donde un pixel


contiene una cuantificacin de la cantidad de hibridacin.

Datos de expresin Ya tenemos corregido el fondo y normalizadas las


muestras. Tenemos una matriz de expresin de modo que en la
fila tenemos el gen y en la columna la muestra. A partir de aqu se
trabaja para analizar la posible activididad diferenciada de un gen
o un conjunto de genes.
microarrays 81

4.3 Obteniendo los datos

En esta seccin vamos a utilizar los datos con nmero de acceso


GEO http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE21779
3 3
En 5.9 vemos cmo bajar los datos y
procesarlos.

4.4 Sonda y conjunto de sondas

En estos microarrays tenemos distintas sondas correspondientes


al mismo gen. Qu chip o plataforma se ha utilizado se ha utilizado?
Podemos verlo con Biobase::annotation.

library(Biobase); library(affy)
annotation(gse21779)

## [1] "hgu133plus2"

El nmero de sondas y de muestras lo podemos conocer con

dim(exprs(gse21779))

## [1] 1354896 18

Nos fijamos en el primer array cuyas expresiones aparecen en la


primera columna. Podemos ver las intensidades del primer micro-
array en forma de una imagen a niveles de gris. Cuando ms blanco
es el punto mayor es la intensidad observada en la sonda y por lo
tanto mayor la expresin del gen al que est asociada. Cada pixel co-
rresponde con una sonda distinta. La imagen la tenemos en la figura
4.1.

image(gse21779[,1])

Podemos conocer las identificadores que Affymetrix le ha asigna-


do a estas sondas con

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

## [1] "1007_s_at" "1007_s_at" "1007_s_at"


## [4] "1007_s_at" "1007_s_at" "1007_s_at"
82 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Nos fijamos en la sonda que aparece en la posicin 400.

(ID = probeNames(gse21779)[400])

## [1] "1552281_at"

El nmero de sondas que componen el conjunto asociado a este


identificador es

sum(probeNames(gse21779) == ID)

## [1] 11

Podemos ver los cardinales de todos los conjuntos de sondas que


lleva el chip.

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

4.5 Variabilidad intra y entre arrays

Dentro de todo el vector con los nombres de las sondas buscamos


las que ocupa la primera tanto para PM como para MM (de ah el
argumento both).

indexProbes(gse21779,"both",ID)[[1]]

## [1] 1088751 883561 1054203 366753 178855


## [6] 68793 490689 62456 1123802 939573
## [11] 1349651 1089915 884725 1055367 367917
## [16] 180019 69957 491853 63620 1124966
## [21] 940737 1350815

Cules corresponden a PM?

(posiciones = indexProbes(gse21779,"pm",ID)[[1]])

## [1] 1088751 883561 1054203 366753 178855


## [6] 68793 490689 62456 1123802 939573
## [11] 1349651
microarrays 83

Tenemos 11 correspondientes a PM. Y las dems corresponden a


MM:

indexProbes(gse21779,"mm",ID)[[1]]

## [1] 1089915 884725 1055367 367917 180019


## [6] 69957 491853 63620 1124966 940737
## [11] 1350815

En figura 4.2(a) vemos dnde est localizado el conjunto de son-


das4 dentro de la imagen. En cada localizacin tenemos un valor de 4
Probe set.
PM y otro valor MM.

(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

a un mismo conjunto de sondas de un array dado (figura 4.2(b)).

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()

En abscisas tenemos el nmero de la sonda (de un mismo conjun-


to) y en ordenadas su expresin. Si no hubiera ningn tipo de ruido
lo que se debe observar sera una lnea horizontal, unos mismos nive-
les de expresin. Pero no es as.
El dibujo 4.2(b) se refiere a la variabilidad intra array (utilizando
las sondas de un mismo conjunto) para un mismo gen. Vamos super-
poner (una lnea por muestra) las expresiones del mismo gen pero
para todas las muestras. De este modo ilustramos la variabilidad
entre muestras. En la figura 4.2(c) mostramos este dibujo.5 5
Observad el uso de la funcin resha-
pe::melt para obtener el data.frame.
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")

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()

En la figura 4.2(c) cada lnea corresponde a un array y los puntos


que representamos en cada lnea es un conjunto de sondas. Este
conjunto de sondas es el mismo que elegimos en todos los arrays.
Qu significa este dibujo? Cmo lo podemos interpretar? Si
las distintas sondas asociadas al mismo gen nos dieran una misma
expresin cada una de las lneas deba ser horizontal. No es as como
hemos visto para la primera y para todas las dems. Tenemos ahora
una segunda fuente de variacin. Estas muestras se han tomado bajo
tres condiciones distintas. Si no hubiera diferencia entre condiciones
las lneas debieran de estar muy superpuestas.
De acuerdo al diseo de este chip cabe esperar que en una mis-
ma localizacion el valor PM sea mayor que el valor de MM. Esto es
lo esperable ya que PM es seal, estamos observando la hibridacin
microarrays 85

especfica (aquella para la que la sonda ha sido diseada). El valor de


MM lo que mide es ruido ptico e hibridacin no especfica, en resu-
men, ruido en un sentido amplio. La seal debe dominar al ruido, el
valor de PM debiera de ser mayor que el valor de MM en cada celda.
Esto sobre el papel. Pero no en la realidad. Veamos (figura 4.2(d))
para un mismo array y para un conjunto de genes dados los valores
de PM y los valores MM.

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?

table(probes(gse21779,"pm") >= probes(gse21779,"mm"))

##
## FALSE TRUE
## 4460757 6415887

Vemos que tenemos un 41 % en este caso particular. No es poco.

4.6 Control de calidad

Vamos a estudiar distintos procedimientos que intentan evaluar


los distintos microarrays que componen nuestro experimento. El ob-
jetivo es decidir si es necesario descartar total o parcialmente alguna
de las muestras.

4.6.1 Dibujo de la media-diferencia de Tukey o dibujo de Bland-Altman

El dibujo media-diferencia de Tukey es ms habitualmente cono-


cido como el dibujo Bland-Altman estos autores lo popularizaron
utilizndolo en una revista mdida.6 6
El trabajo completo (con correcciones
Supongamos que tenemos pares de medidas ( xi , yi ) con i = respecto de la publicacin original) es
Bland-Altman y corresponde con la
1, . . . , n y pretendemos ver el grado de coincidencia de las mismas. O, referencia Bland and Altman [1986].
dicho de otro modo, si valores mayores corresponden con diferencias
86 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

mayores entre las cantidades observadas. Es de suponer que dos pro-


cedimientos que coincidan tendrn un coeficiente de correlacin alto.
Sin embargo, este valor viene condicionado por la variabilidad de
las medidas. El dibujo media-diferencia de Tukey o dibujo de Bland-
Altman es una representacin grfica que sirve para valorar el grado
de coincidencia de los pares de medidas. Supongamos que tenemos
los pares ( xi , yi ) con i = 1, . . . , n entonces consideramos los puntos
que tienen coordenadas
 
xi + yi
, ( xi yi ) .
2
xi + yi
Es decir, en abscisas tenemos la media de las dos medidas 2 y en
ordenadas tenemos su diferencia, xi yi . 7 7
En ocasiones, este dibujo se com-
pleta con dos lneas horizontales. Si
di = xi yi entonces podemos comple-
4.6.2 MA plots tar la representacin grfica aadiendo
dos lneas horizontales correspon-
Estos dibujos sirven para determinar si alguno de los microarrays dientes con los lmites del intervalo
de confianza para la diferencia media
debe de ser descartado del estudio y si necesitamos homogeneizar entre los dos procedimientos esto es
los valores para las distintas muestras. Son una aplicacin del dibujo las lneas tendran como ordenadas
d tn1,1 Sn donde S es la desvia-
media-diferencia propuesto por Tukey.8 2
cin estndar de las diferencias di y
Trabajamos, en lugar de con las intensidades originales obser- tn1,1 es el percentil 1 2 de una t
2
vadas, con su logaritmo en base 2. Supongamos que ui y vi deno- de Student con n 1 grados de libertad.
tan las intensidades originales en la sonda i-sima. Consideramos 8
Es conveniente consultar http://en.
wikipedia.org/wiki/MA_plot.
xi = log2 ui e yi = log2 vi y estos son los valores a comparar. En este
contexto se habla de dibujos MA ya que
ui
mi = xi yi = log2 ,
vi
y
1 1
ai = ( xi + yi ) = log2 ui vi = log2 ui vi .
2 2
Una primera opcin es comparar todos los pares de microarrays
utilizando el dibujo media-diferencia de Tukey.
Una segunda opcin consiste en considerar una especie de micro-
array tpico y comparar los dems con este. Por ejemplo, una opcin
que implementa el paquete Irizarry et al. [2015, affy] en la funcin
affy::MAplot consiste en calcular para cada sonda la mediana a lo lar-
go de todos los microarrays que componen nuestro experimento. Por
tanto, la mediana de las intensidades ser xi y el valor yi corresponde
a cada uno de los microarrays de nuestro experimento.

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")

Figura 4.3: MAplot comparando los dos


primeros microarrays.

4.6.3 Densidades y diagramas de cajas


En los dos dibujos anteriores hemos ilustrado la variabilidad intra
y entre arrays para un mismo gen. Tomemos un punto de vista ms
global. En particular, vamos a mostrar el comportamiento de los ni-
veles de expresin para todas las sondas en un array, por ejemplo, el
primero de ellos. Estamos evaluando la posibilidad de que alguno de
ellos tenga un nivel de ruido inaceptable y debiera de ser eliminado
del estudio.
Empezamos mostrando en la figura 4.4(a) la densidad de los ni-
veles de expresin en el primer array. Lo hacemos utilizando un
estimador kernel de la densidad.

hist(gse21779[,1])

Aunque la funcin que utilizamos es hist (de histograma), no es


histograma.9 Es un estimador kernel de la densidad. Con objeto de 9
Una mala eleccin de nombre.
ver (y comparar) la variabilidad en los distintos arrays podemos es-
timar los estimadores kernel de las densidades de las expresiones en
88 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

(a) (b) (c)


Figura 4.4: a)Estimador kernel de la
densidad de las expresiones a nivel
de sonda en el primer microarray. b)
cada uno de los arrays que componen nuestra muestra. Lo tenemos
Estimadores kernel de la densidad
en la figura 4.4(b). de las intensidades para los distintos
microarrays. Vemos que hay diferencias
claras. c) Diagramas de cajas de las
hist(gse21779) expresiones a nivel de sonda para los
datos gse21779.

Llama la atencin la gran diferencia entre estos estimadores de la


densidad para distintas muestras. En cualquier caso en todos ellos
vemos una clara asimetra a la derecha. Obviamente corresponde a
los genes con un alto nivel de expresin.
De un modo anlogo podemos para evaluar la variabilidad las
expresiones en cada arrays y entre arrays podemos utilizar diagramas
de cajas. Se muestra en la figura 4.4(c).

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.

4.6.4 Utilizando arrayQualityMetrics

El paquete ?, arrayQualityMetrics nos permite un control de ca-


lidad sencillo utilizando arrayQualityMetrics::arrayQualityMetrics.
10 El informe correspondiente lo tene-
10

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

4.6.5 Corrigiendo errores tcnicos

Si algo queda claro en esta seccin es la necesidad de tratar los


datos antes de poder compararlos y obtener alguna conclusin bio-
lgica. Es decir, hemos de trabajar los valores observados a nivel de
sonda antes de obtener un resumen que es la expresin del gen.
De hecho podemos ver los mnimos de PM en las distintas mues-
tras.

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

Y vemos como efectivamente no son nulos. La correccin de fondo


pretende que aproximadamente sean nulos los valores ms pequeos.
Esto correspondera con aquellos genes que no tienen actividad.
Tambin hemos visto que la distribucin de las intensidades es
claramente muy diferente entre arrays. Lo mostraban los estimadores
kernel y los diagramas de cajas. El proceso de hacer comparables los
datos entre arrays es lo que se conoce como normalizacin.
Una vez hemos corregido fondo y normalizadas las muestras,
seguimos teniendo para cada gen distintas sondas en cada array. Toca
resumir estos valores en un solo valor que indique la expresin del
gen asociado al conjunto de sondas.
Estas tres operaciones pueden realizarse de un modo secuencial
o bien hay mtodos que las realizan de un modo combinado. Hay
publicados muchos mtodos. Lo que vamos a utilizar en este captulo
est en el paquete Irizarry et al. [2015, affy].11 11
Es especialmente interesante consultar
la vieta builtinMethods.pdf que
aparece en la ayuda del paquete affy.
Como material complementario es de
inters Gentleman et al. [2005, captulo
2].
90 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

En estas notas vamos a estudiar con detalle dos mtodos. El pri-


mero es un mtodo que corrige cada chip, es el mtodo MAS5.0 que
es el que proporciona el software de Affymetrix. Muchos trabajan con
los datos que directamente les da este software y por tanto es intere-
sante conocerlo. Lo tratamos en 4.7. El segundo es el mtodo RMA.
Este procedimiento trabaja simultneamente con todos los chips del
experimento. Es pues un procedimiento multiarray o multichip. Este
mtodo lo estudiamos en 4.8.
El objetivo ahora es considerar procedimientos que corrigen las
variabilidades entre los microarrays intentando conseguir un valor de
expresin asociado a cada gen sin esos ruidos de caracter tcnico.

4.7 Mtodo MAS5

Veremos cmo pasar de los datos a nivel de sonda a los valores


de expresin del gen. Mucho de lo que luego analizamos depende
de cmo se realiza este paso. Lo que se comenta es especfico para
Affymetrix GeneChip. En cada localizacin tendremos sondas que
son oligonucletidos especficos de un gen. De hecho son pares de
sonda: una con la secuencia deseada y otra en la que se modifica la
base en la posicion 13. La intensidad (o expresin) observada con
el oligonucletido correcto le llamamos PM (perfect matching) y el
observado sobre el modificado le llamamos MM (miss matching).
Se pensaba que si a PM le restbamos MM corregiramos el ruido
de fondo. Esto no es cierto, una cierta proporcin de localizaciones
muestran un valor MM mayor que el valor PM, lo que en principio
va en contra de lo que lgicamente debera producirse.
Los datos y la informacin de un Affymetrix GeneChip se alma-
cenan en distintos ficheros. En el fichero CEL tenemos la intensidad
media de los pixels de la sonda, la desviacin estndar e informacin
de dnde se sita la sonda dentro del array. Cada array lleva asocia-
do un fichero CEL. Para poder interpretar el significado biolgico de
las sondas se necesita un mapa indicando a qu gen corresponde ca-
da gen. Esta informacin est en el fichero CDF. Este fichero depende
del chip utilizado y no vara para distintas muestras.
En esta seccin explicamos el mtodo MAS5.0 y nos basamos
en el manual http://media.affymetrix.com/support/technical/
whitepapers/sadd_whitepaper.pdf.12 12
Como casi todos los manuales tcni-
Empezamos a trabajar a partir del fichero .CEL que ha sido gene- cos no es prodigio de claridad precisa-
mente.
rado por el software Microarray Suite.
microarrays 91

4.7.1 Correccin de fondo


Se pretende determinar unos valores para restarlos a las intensida-
des originales en cada celda.

Determinan valores por zonas 1. Se divide el array en K zonas rectan-


gulares: Zk con k = 1, . . . , K.
2. En cada Zk se ordenan las intensidades observadas en las dis-
tintas celdas y se considera el 2 % con intensidades menores. Se
toma como medida de fondo la media muestral de las intensi-
dades previamente consideradas. Denotamos esta valor como
b( Zk ).
3. Del mismo modo que en punto anterior, se considera en cada
Zk ese 2 % de celdas con intensidades menores y calcular su
desviacin estndar que denotamos s( Zk ).

Suavizando el ajuste Sea la celda localizada en ( x, y) y vamos a deno-


tar por dk ( x, y) la distancia desde ( x, y) al centro de la regin Zk .
Consideramos la siguiente cantidad

1
wk ( x, y) =
d2k ( x, y) + s0

donde s0 nos evita que el cociente se pueda anular y por defecto


toma el valor s0 = 100. Para la celda localizada en ( x, y) considera-
mos
K
1
b( x, y) = K
k=1 wk ( x, y) k=1
wk ( x, y)b( Zk )

Correccin del ruido Ahora vamos a bajar las intensidades restndole


una medida de ruido de fondo local. El problema que se puede
producir es que nos encontremos con valores negativos. Este valor
de ruido en la celda localizada en ( x, y) se calcula como

K
1
n( x, y) = K
k=1 wk ( x, y)
wk (x, y)s(Zk ).
k =1

La idea ahora es quitar a las intensidades originales el fondo


(b( x, y)) que hemos calculado pero asegurndonos que no nos
surja valores negativos. La intensidad original se denota como
I ( x, y) en la localizacin ( x, y). El valor ajustado de la intensidad
viene dado por

A( x, y) = max{ I ( x, y) b( x, y), f 0 n( x, y)}

El parmetro f 0 se suele fijar en f 0 = 0,5.13 13


En el manual hay una igual-
dad incomprensible que dice
I ( x, y) max{ I ( x, y), 0,5}. En fin, ya vere-
mos qu es exactamente lo que quieren
hacer. He puesto lo que sensatamente
parece que quieren hacer.
92 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

4.7.2 Clculo del valor de expresin


Por el procemiento descrito anteriormente podemos ajustar los va-
lores de PM y de MM. En lo que sigue se supone que hemos ajustado
estos valores.
Lo esperable y correcto es que en una celda tengamos un valor
de PM mayor que el correspondiente valor MM. Esto no es as en
muchas ocasiones como hemos visto. Se define un valor IM (Ideal
Mismatch)14 que intenta corregir este problema. 14
Un apao se deca antes.
Denotamos por ( PMij , MMij ) el valor de PM y de MM de la j-
sima sonda perteneciente al i-simo conjunto de sondas (formado
por todas las sondas asociadas a un mismo gen).
Se calcula un valor que llaman background especfico para cada
conjunto de sondas.

Bi = Tbi {log2 ( PMij ) log2 ( MMij ) : j = 1, . . . , ni },

donde Tbi denota el algoritmo bipesado en un solo paso ( 33.2).


Bsicamente un promedio robusto de las diferencias indicadas que
no son ms que logaritmos de sus cocientes. Qu estima este valor
Bi para el conjunto de sondas i? Si el valor de

MMij si MMij < PMij
PMij


I Mij = si MMij PMij y Bi >
2Bi
PMij
si MMij PMij y Bi



2 1+( Bi )/

Por defecto se toma = 0,03 y = 10.


Ahora calculamos

Vij = max{ PMij I Mij , d}

siendo el valor por defecto para d, d = 220 .


Transformamos este valor con

Vij = log2 (Vij )

con j = 1, . . . , ni . Y volvemos a aplicar un estimador biponderado en


un solo paso ( 33.2).

SignalLogValuei = Tbi (Vi1 , . . . , Vini ).

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

grandes y de los ms pequeos) en donde se quita el 2 % de los ms


grandes y el 2 % de los ms pequeos.
El valor final para el conjunto de sondas i es

ReportedValue(i ) = s f i 2SignalLogValuei

Se incorpora una posibilidad de normalizacin que no indicamos.


El mtodo plier no lo tratamos en estas notas. Est implementado
en el paquete Inc. et al. [2015, plier].

4.8 Robust multichip average (RMA)

Una referencia con muchos ms detalles de los que vemos en esta


seccin es Bolstad [2008, pg. 41-59] En este mtodo trabajamos con
todos los arrays simultneamente15 a diferencia del mtodo anterior Y de ah su nombre Robust
15

Multiarray Average.
donde se procesaba cada array independientemente. El procedimien-
to solamente utiliza los valores PM y no utiliza para nada los valores
MM.

4.8.1 Correccin de fondo


Se empieza calculando una correccin de fondo.16 Asumimos 16
Que esencialmente no se ha publi-
(sugerido por la distribucin emprica observada en las intensidades cado. Aparece una descripcin ms o
menos vaga en .
de las sondas) que los valores PM pueden considerarse como la suma R.A. Irizarry, B. Hobbs, F. Collin,
de una variable Y con distribucin normal con media y varianza Y.D. Beazer, K.J. Antonellis, U. Scherf,
2 (que modeliza el ruido) y de una variable X con distribucin and T.P. Speed. Exploration, nor-
malization, and summaries of high
exponencial con media (que modelizara la seal). Por tanto el density oligonucleotide array pro-
valor observado aleatorio S sera be level data. Biostatistics, 4(2):
249264, 2003. doi: 10.1093/bios-
tatistics/4.2.249. URL http:
S = X+Y
//biostatistics.oxfordjournals.
org/content/4/2/249.abstract
con X Exp() e Y N (, 2 ).
La normal se trunca en cero para
evitar valores negativos. Si S denota la intensidad aleatoria en la
sonda entonces, para un valor observado S = s, se tiene

( ba )
E( X |S = s) = a + b
( ba )

siendo a = s 2 y b = mientras que y denotan las


funciones de densidad y de distribucin de una normal estndar
(con media 0 y varianza 1). Los parmetros del modelo (, , 2 ) se
estiman mediante un procedimiento no paramtrico. Utilizando las
intensidades observadas en las sondas PM se estima la moda de la
distribucin. Aquellos valores por encima de la moda son utilizados
para estimar y los puntos por debajo de la moda se utilizan para
estimar los parmetros y 2 .
94 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

4.8.2 Normalizacin de cuantiles


En este paso se pretende conseguir que las distribuciones empri-
cas de las expresiones a nivel de sonda de los distintos arrays sean la
misma.17 18 Esencialmente lo que buscamos es que las expresiones 17
Recordemos que en este mtodo
que se observan en los distintos microarrays sean las mismas y con solamente utilizamos las expresiones de
las sondas PM.
las mismas frecuencias. 18
En 25.3.6 se recuerda el concepto de
La normalizacin que se aplica en este mtodo es una normaliza- distribucin emprica.
cin de cuantiles.19 19
Quantile normalization Bolstad
Veamos qu es con un ejemplo detallado y sencillo. [2008].

1. Nuestro experimento tiene dos conjuntos de sondas y cada una


con tres sondas. Adems suponemos que tenemos simplemente
tres chips. En la siguiente tabla recogemos las expresiones.
Conjunto de sondas Sonda Chip 1 Chip 2 Chip 3
1 1 7 9 19
1 2 3 5 14
1 3 2 6 11
2 1 4 8 8
2 2 10 11 16
2 3 12 10 15

2. Determinamos los valores mayores en cada chip y calculamos el


promedio.

(12 + 11 + 19)/ 3

## [1] 14

Sustituimos los valores originales por estos promedios.


Conjunto de sondas Sonda Chip 1 Chip 2 Chip 3
1 1 7 9 14
1 2 3 5 14
1 3 2 6 11
2 1 4 8 8
2 2 10 14 16
2 3 14 10 15

3. Consideramos los segundos valores mayores en cada chip y los


promediamos.

(10 + 10 + 16) /3

## [1] 12

Sustituimos los valores originales por los promedios.


microarrays 95

Conjunto de sondas Sonda Chip 1 Chip 2 Chip 3


1 1 7 9 14
1 2 3 5 14
1 3 2 6 11
2 1 4 8 8
2 2 12 14 12
2 3 14 12 15

4. Consideramos los terceros valores mayores en cada chip.

(7 + 9 + 15)/3

## [1] 10.33333

Sustituimos los valores originales por los promedios.


Conjunto de sondas Sonda Chip 1 Chip 2 Chip 3
1 1 10.33 10.33 14
1 2 3 5 14
1 3 2 6 11
2 1 4 8 8
2 2 12 14 12
2 3 14 12 10.33

5. Y as sucesivamente hasta llegar al sexto valor que ya es el ms


pequeo en cada chip. Los datos finales son los de la siguiente
tabla.
Conjunto de sondas Sonda Chip 1 Chip 2 Chip 3
1 1 10.33 10.33 14
1 2 6.66 5 8.66
1 3 5 6.66 6.66
2 1 8.66 8.66 5
2 2 12 14 12
2 3 14 12 10.33

Una vez ilustrado el mtodo es sencillo de explicar.

1. Tomamos n vectores de longitud N y construimos la matriz X


N n que los tiene por vectores columna.

2. Ordenamos cada columna de X separadamente y tenemos Xs .

3. Calculamos la media por filas de la matrix Xs y creamos Xs0 una


matriz con la misma dimensin que X, tal que en la fila j tenemos
la media de la fila de Xs repetida n veces.

4. Obtenemos Xt en donde cada columna de Xs0 recupera el orden


original.
96 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Qu estamos haciendo desde el punto de vista probabilstico? He-


mos considerado los cuantiles muestrales en cada columna. Hemos
considerado la media muestral de estos cuantiles muestrales. Supon-
gamos que F es la funcin de distribucin de estas medias de cuan-
tiles muestrales. Tomamos G la funcin de distribucin muestral o
emprica de las expresiones de cada uno de los microarrays. Si la ex-
presin original la denotamos por yi para la i-sima sonda entonces
la nueva expresin de dicha sonda viene dada por yi0 = F 1 ( G (yi )).
Cuando F corresponde a la uniforme en el intervalo [0, 1] esto recibe
el nombre de transformacin integral de la probabilidad.

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

y = [yij ]i=1,...,|Sk |,j=1,...,n = [ xij ]iSk ,j=1,...,n .

En resumen, la matriz y simplemente corresponde con las filas de la


matrix x correspondiente al grupo de sondas Sk y todas las columnas.
En lo que sigue nos referimos al grupo k-simo de sondas y lo que
se asume es para cada grupo. Asumimos el siguiente modelo:

log2 (yij ) = + j + i + eij (4.1)

con las siguientes restricciones

1. la mediana de { j : j = 1, . . . , n} es nula,

2. la mediana de {i : i = 1, . . . , |Sk |} es nula

3. la mediana de {eij : j = 1, . . . , n} sea nula para cada i,

4. la mediana de {eij : i = 1, . . . , |Sk |} sea nula para cada j.


microarrays 97

El mtodo median polish es un procedimiento para estimar los par-


metros anteriores que aparecen en las ecuaciones 4.1. Cmo? Consi-
deramos, para cada grupo de sondas (por ejemplo, el k-simo Sk ), la
matriz
1,1 1,n a1
.. .. .. ..
. . . .
|Sk |,1 |Sk |,n a|Sk |
b1 bn m

En esta matriz las sondas corresponden a las filas y las columnas


a los arrays. Adems aadimos una columna y una fila (las ltimas
separadas por una lnea continua) en la que aparecen los efectos de
fila y columna. Aplicamos el siguiente procedimiento iterativo.

1. Fijamos ij = log2 (yij ), ai = bi = 0 i, j.

2. Calculamos la mediana para cada fila a lo largo de las columnas


ignorando la ltima columna (separada por la lnea).

3. Restamos a cada elemento de la fila la mediana correspondien-


te. Esta mediana se suma a la ltima columna (formada por
a1 , . . . , a|Sk | , m).

4. Calculamos la mediana para cada columna de los valores corres-


pondientes a las distintas filas sin considerar la ltima fila.

5. Restamos la mediana calculada en el paso anterior a cada ele-


mento de la columna exceptuando la ltima fila. A la ltima fila
sumamos las medianas calculadas.

6. El proceso descrito en los cuatro pasos anteriores continua iteran-


do sucesivamente entre filas y columnas hasta que los cambios que
se producen son nulos o muy pequeos.

7. Una vez finalizado el proceso iterativo tendremos = m, j = b j y


i = ai . El valor ij ser el estimador de eij : enij = ij .

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 .

Es un mtodo que no nos proporciona estimaciones de error de los


estimadores. Es muy rpido de implementar. Al utilizar medianas es
menos sensibles a observaciones extremas. Sin embargo, el resultado
puede ser distinto segn empecemos por filas o columnas.
98 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

4.9 MAS5 y RMA con affy

En el paquete Irizarry et al. [2015, affy] tenemos implementados


los dos procedimientos comentados en las dos secciones previas.
Usamos las funcin affy::rma y affy::mas5.

gse21779_rma = rma(gse21779)
gse21779_mas5 = mas5(gse21779)

El resultado lo tenemos en ?, tamidata.

data(gse21779_rma,package="tamidata")
data(gse21779_mas5,package="tamidata")

En la figuras 4.5(a) y 4.5(b) tenemos los estimadores kernel de


densidad de los niveles de expresin para los distintos chips una
vez hemos aplicado el mtodo RMA y MAS5. En las figuras 4.5(c)
y 4.5(d) mostramos los diagramas de cajas correspondientes a los
mismos datos preprocesados.

library(geneplotter)
multidensity(exprs(gse21779_rma))
multidensity(exprs(gse21779_mas5))
boxplot.matrix(exprs(gse21779_rma))
boxplot.matrix(exprs(gse21779_mas5))

4.10 Otros mtodos posibles

Hemos visto dos mtodos. Sin embargo, podemos considerar mto-


dos distintos con el paquete Irizarry et al. [2015, affy] Qu metodos
proporciona el paquete affy? Empezamos con los mtodos de correc-
cin de fondo. Las opciones son

bgcorrect.methods()

## [1] "bg.correct" "mas" "none"


## [4] "rma"

Las opciones que nos muestra corresponden con:

none En la opcin none no hacemos nada. Dejamos los valores origi-


nales.

mas Utiliza el procedimiento que hemos visto en MAS5.0.


microarrays 99

(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

RMA Utiliza el procedimiento visto en algoritmo RMA.

Nos ofrece los siguientes mtodos de normalizacin.

normalize.methods(gse21779)

## [1] "constant" "contrasts"


## [3] "invariantset" "loess"
## [5] "methods" "qspline"
## [7] "quantiles" "quantiles.robust"

En particular, para los chip de Affymetrix, tenemos distintas opcio-


nes para corregir los valores PM.

pmcorrect.methods()

## [1] "mas" "methods" "pmonly"


## [4] "subtractmm"

Los mtodos para resumir los valores de los conjuntos de son-


das en un nico valor de expresin del gen los podemos ver con el
siguiente cdigo.

express.summary.stat.methods()

## [1] "avgdiff" "liwong" "mas"


## [4] "medianpolish" "playerout"

La funcin expresso permite realizar los distintos pasos del prepro-


ceso. De hecho, la funcin mas5 que hemos utilizado anteriormente
no es ms que una llamada a esta funcin.

mas5

## function (object, normalize = TRUE, sc = 500, analysis = "absolute",


## ...)
## {
## res <- expresso(object, bgcorrect.method = "mas", pmcorrect.method = "mas",
## normalize = FALSE, summary.method = "mas", ...)
## if (normalize)
## res <- affy.scalevalue.exprSet(res, sc = sc, analysis = analysis)
## return(res)
## }
## <environment: namespace:affy>

Una explicacin (bastante) detallada de cada una de las opciones


la podemos encontrar en la vignette builtinMethods.pdf del paquete
Irizarry et al. [2015, affy].
microarrays 101

4.11 Cmo hacer un preprocesado sencillo a partir de datos de ex-


presin

En la seccin anterior hemos tratado cmo preprocesar datos


partiendo de datos a nivel de sonda muy orientado a Affymetrix.
Cuando conseguimos datos de expresin (por ejemplo de GEO)
en ocasiones no tenemos los datos a nivel de sonda (los .CEL en
el caso de Affymetrix GeneChip) sino que tenemos unos datos de
expresin con un preproceso que no controlamos exactamente. El
problema es que estos datos todavan necesitan un procesado para
homogeneizarlos. Cmo hacerlo de un modo sencillo? Una opcin
rpida la tenemos con la funcin normalizeBetweenArrays() del
paquete Smyth et al. [2016, limma].

Ejemplo 2 (GSE1397). Veamos un ejemplo con los datos GSE1397. En


5.10 hemos visto cmo bajarlos de GEO y cmo construir el ExpressionSet.
Los cargamos.

data(gse1397raw,package="tamidata")

Son datos Affymetrix correspondientes al chip

annotation(gse1397raw)

## [1] "hgu133a"

Supongamos que queremos aplicar una normalizacin de los cuantiles. 21 21


Ver 4.8.2 y Bolstad et al. [2003].
Podemos hacer

library(limma)
exprs1 = normalizeBetweenArrays(exprs(gse1397raw),method = "quantile")

O bien podemos hacer que coincidan las medianas de los distintos arrays
con

exprs1 = normalizeBetweenArrays(exprs(gse1397raw),method = "scale")

En la ayuda de limma::normalizeBetweenArrays podemos consultar otras


opciones.

4.12 Lecturas complementarias

El texto Stafford [2008] es una excelente referencia sobre lo tratado


en este tema. Mucho del material ha sido extraido de este libro.
5
Datos de microarrays

5.1 Introduccin

Comentaremos los bancos de datos que utilizamos en el resto del


curso. Son datos de expresin de genes obtenidos utilizando micro-
arrays. Algunos van incorporados en los paquetes de R/Bioconduc-
tor como los datos golub (en Pollard et al. [2015]) o los datos ALL (en
Li [2009]). Se utilizan como ejemplos en muchos paquetes y en artcu-
los. Es interesante analizarlos y conocerlos. Tambin se muestra en
este tema el uso de la clase Biobase::ExpressionSet. Esta clase permite
el manejo de datos de expresin obtenidos con microarrays. Veremos
tambin cmo bajar datos de repositorios pblicos.

5.2 sample.ExpressionSet

Los datos Biobase::sample.ExpressionSet. El experimento tiene 26


muestras y 500 genes. Sobre las muestras conocemos tres variables (o
covariables): sex, type (caso y control) y score. La ltima covariable
no es categrica, es una covariable continua. Estos datos de expre-
sin estn almacenados en un objeto de clase ExpressionSet. Para
poder utilizar esta estructura de datos hemos de cargar el paquete
Gentleman et al. [2015, Biobase].

library(Biobase)

Cargamos los datos.

data(sample.ExpressionSet)

Podemos ver ayuda sobre los mismos con


104 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

help(sample.ExpressionSet)

Las variables fenotpicas o metadatos que nos describen las mues-


tras tienen las siguientes etiquetas.

varLabels(sample.ExpressionSet)

## [1] "sex" "type" "score"

Una variable dada, por ejemplo type, la tendremos con

sample.ExpressionSet$type

## [1] Control Case Control Case Case


## [6] Control Case Case Case Control
## [11] Case Control Case Case Case
## [16] Control Case Control Case Case
## [21] Control Control Control Control Case
## [26] Case
## Levels: Case Control

Y todos los datos fenotpicos se obtienen con

phenoData(sample.ExpressionSet)

## An object of class 'AnnotatedDataFrame'


## sampleNames: A B ... Z (26 total)
## varLabels: sex type score
## varMetadata: labelDescription

La matriz de expresin se obtiene con (no la mostramos)

exprs(sample.ExpressionSet)

Para tener informacin sobre un objeto de clase ExpressionSet


es recomendable consultar Hahne et al. [2008, captulo 2]. Esto nos
va a permitir trabajar con los datos de expresin y los metadatos
que nos dan una descripcin completa del experimento. En la clase
ExpressionSet tendremos:

assayData Los datos de expresin de los distintos microarrays que


componen toda la experimentacin.

Metadatos En particular tendremos phenoData que nos dan infor-


macin sobre las muestras utilizadas. Las caractersticas del chip
vienen dadas en featureData. Las anotaciones de los genes las ten-
dremos en annotation.
datos de microarrays 105

En la vieta Gentleman et al. [2015, Biobase] tenemos una buena


descripcin de la creacin y manipulacin de un ExpressionSet. Por
ejemplo podemos saber la anotacin de estos datos con

annotation(sample.ExpressionSet)

## [1] "hgu95av2"

Finalmente veamos una breve descriptiva de las covariables que


nos proporcionan informacin sobre las muestras y que utilizaremos
para ilustrar estas notas. Para las categricas vemos una tabla de
frecuencias absolutas.

table(sample.ExpressionSet$sex)

##
## Female Male
## 11 15

table(sample.ExpressionSet$type)

##
## Case Control
## 15 11

Y un resumen numrico de score.

summary(sample.ExpressionSet$score)

## Min. 1st Qu. Median Mean 3rd Qu. Max.


## 0.1000 0.3275 0.4150 0.5369 0.7650 0.9800

5.3 Datos golub

Una buena explicacin de estos datos aparece en el manual de


uso del paquete Pollard et al. [2015, multtest]. Estos datos fueron
analizados por primera vez en Golub et al. [1999]. En estas notas se
utilizan en dos versiones. La primera es la incluida en el paquete
Pollard et al. [2015]. La segunda corresponde a los datos incluidos en
el paquete Golub [2015]. En el manual hablaremos de multtest::golub
o bien golubEsets::golub_Train.1 1
Son unos datos antiguos pero que
Hay muestras correspondientes a dos grupos o condiciones: 27 aparecen en numerosas publicaciones y
vietas de paquetes de R.
muestras (las primeras 27 columnas) correspondientes a pacientes
106 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

con leucemia linfoblstica aguda (ALL, la clase 0) y leucemia mie-


loide aguda (AML, clase 1). Para medir los niveles de expresin se
utilizaron chips de alta densidad de oligonucletidos Affymetrix pa-
ra 6817 genes. Los datos los podemos obtener a partir del paquete
Pollard et al. [2015] con

data(golub,package= "multtest")

Segn se indica en el manual de Pollard et al. [2015, multtest] se


realiz una seleccin previa de genes de carcter no especfico (no
se utiliza por tanto informacin de las dos condiciones que preten-
demos diferenciar). Esta seleccin no especfica consisti en los si-
guientes pasos. Se trabaj con los datos normalizados que se pueden
encontrar en http://www.broadinstitute.org. All podemos encontrar
una detallada explicacin del protocolo experimental utilizado. Una
vez obtenidos los datos normalizados se realiz la siguiente seleccin
previa.

1. Una umbralizacin de los niveles de expresin. Valores por debajo


de 100 se les asign el valor 100. Los valores superiores a 16000 se
les asign el valor 16000.

2. Se calcul para cada gen el valor mximo y el valor mnimo de


sus niveles de expresin para todas las muestras analizadas. Si
denotamos por m1 el mnimo y por m2 el mximo entonces se
eliminaron los genes que verifican
m2
5
m1

o bien que
m2 m1 500

3. Se tom el logaritmo en base 10 para los niveles de expresin de


los genes que no fueron eliminados.

Finalmente se estandarizaron los niveles de expresin dentro de cada


array. Es decir, se calcul para cada array la media y la desviacin
estndar de todos los niveles observados en este array. A los datos
originales se les rest la media y se dividi por la desviacin estn-
dar. Estos son los datos finales con los que trabajamos.2 Una vez 2
Es importante darse cuenta de la enor-
hemos cargado los datos golub tenemos la siguiente informacin: me cantidad de transformaciones de
la informacin original que estamos
haciendo y que, por lo tanto, afecta de
golub Es una matriz 3051 38 de niveles de expresin donde las 3051 un modo fundamental las conclusiones
filas corresponden a los genes y las 38 columnas corresponden a que obtengamos en cualquier trata-
miento estadstico posterior. Y lo peor:
las muestras. Podemos ver su primera fila:
no sabemos de un modo claro cmo
afectan estos resultados.
datos de microarrays 107

golub[1,]

## [1] -1.45769 -1.39420 -1.42779 -1.40715 -1.42668


## [6] -1.21719 -1.37386 -1.36832 -1.47649 -1.21583
## [11] -1.28137 -1.03209 -1.36149 -1.39979 0.17628
## [16] -1.40095 -1.56783 -1.20466 -1.24482 -1.60767
## [21] -1.06221 -1.12665 -1.20963 -1.48332 -1.25268
## [26] -1.27619 -1.23051 -1.43337 -1.08902 -1.29865
## [31] -1.26183 -1.44434 1.10147 -1.34158 -1.22961
## [36] -0.75919 0.84905 -0.66465

golub.gnames Es una matriz 3051 3 con identificadores de los ge-


nes. Veamos la informacin de la primera fila correspondiente al
primer gen.

golub.gnames[1,]

## [1] "36"
## [2] "AFFX-HUMISGF3A/M97935_MA_at (endogenous control)"
## [3] "AFFX-HUMISGF3A/M97935_MA_at"

golub.cl Es un vector de longitud 38 con la clasificacin del tipo de


leucemia.

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

Con frecuencia, y con objeto de mejorar la presentacin de los


resultados ejecutaremos la siguiente lnea de cdigo.

golub.cl = factor(golub.cl,levels= 0:1,labels=c("ALL","AML"))

Si volvemos a ver el contenido de golub.cl veremos el cambio


producido.

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].

5.4 Datos ALL

Para una versin ampliada de esta seccin podemos consultar


Hahne et al. [2008, captulo 1]. Los datos ALL son microarrays de
128 individuos distintos con leucemia linfoblstica aguda (ALL). De
estos individuos 95 corresponden a leucemia linfoblstica precurso-
ra aguda de clulas B y y 33 son leucemia linfoblstica precursora
aguda de clulas T. Son enfermedades bastante distintas y por ello
se consideran por separado. Habitualmente trabajaremos con las
muestras de leucemia linfoblstica precursora aguda de clulas B.
Los datos han sido preprocesados utilizando el mtodo RMA (robust
multichip average) implementado en el paquete Irizarry et al. [2015,
affy] con la funcin affy::rma y estn almacenados en forma de un
Biobase::ExpressionSet. Empezamos cargando los datos.

library(Biobase)
library(ALL)
data(ALL)

En lo que sigue no vamos a utilizar todas las muestras.


Un subconjunto de muestras de inters con dos grupos son los
grupos de tumores de clulas B que tienen la mutacin BCR/ABL y
los tumores de las clulas B sin ninguna anormalidad citogentica.
Veamos cmo seleccionar estas muestras. En primer lugar selecciona-
mos las muestras de clulas B.

bcell = grep("^B",as.character(ALL$BT))

Y ahora seleccionamos las muestras correspondientes a los tipos


moleculares BCR/ABL o NEG.

types = c("NEG","BCR/ABL")
moltyp = which(as.character(ALL$mol.biol) %in% types)

Ahora combinamos ambas selecciones para quedarnos con los tu-


mores de las clulas B y que tienen o bien la translocacin BCR/ABL
o bien no tienen ninguna de las anormalidades moleculares evalua-
das.
datos de microarrays 109

bcrneg = ALL[,intersect(bcell,moltyp)]

Habitualmente haremos uso de los datos ALL realizando previa-


mente esta seleccin. Remitiremos a esta seccin para consultar el
cdigo anterior.

5.5 Construyendo un ExpressionSet

Supongamos (y no es mucho suponer) que tenemos los datos de


expresin en un fichero, en otro fichero tenemos la descripcin de
las distintas muestras que hemos analizado, en otro fichero (o en la
red) tenemos informacin sobre los genes (o sondas) que tenemos
en las filas de la matriz de expresin. Tenemos informacin sobre
las distintas muestras que componen toda la experimentacin, bajo
qu condiciones se consiguieron. Lo que podemos llamar la descrip-
cin fenotpica de las muestras. Y finalmente sabemos cosas sobre
toda la experimentacin realizada: autores, publicacin principal
que se deriv, objetivo de la experimentacin. Y, como es habitual,
lo tenemos todo por separado, en distintos ficheros. La clase Bioba-
se::ExpressionSet tiene como objetivo tenerlo todo contenido en un
mismo objeto. En esta seccin vemos cmo construir este Expression-
Set a partir de la informacin dispersa. En ocasiones esto nos puede
pasar si bajamos la informacin de alguna publicacin en la que nos
aparece como informacin suplementaria.
Es probable que en nuestro trabajo no tengamos que realizar todo
el proceso que indicamos a continuacin pero con mucha probabili-
dad al menos una parte s.

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

perimento genmico de alto rendimiento? Podemos distinguir la


siguiente informacin:

1. Los datos del ensayo (los niveles de expresin).

2. Datos sobre las muestras que podemos llamar de un modo genri-


co metadatos fenotpicos.

3. Anotaciones sobre las sondas u otros metadatos.

4. Una descripcin del experimento.

Vamos a construir un ExpressionSet construyendo cada una de las


componentes a partir de unos datos.4 4
Los datos que estamos usando han
sido amablemente proporcionados
por Joan Climent y estn ligeramente
Datos del ensayo modificados respecto de los publicados
originalmente en Neve et al. [2006].
Son los valores de expresin posiblemente preprocesados. Es una
matriz con N filas y con n columnas. El nmero N de filas correspon-
de con el nmero de caractersticas (features) del chip y n con el n-
mero de muestras. Leemos los datos (posiblemente con read.table
o read.csv. Nos han pasado los datos.5 Normalmente las funciones 5
Como Dios quiere y nosotros hemos
utils::read.table o utils::read.csv nos suelen resolver el problema. de averiguar.

pacman::p_load("tamidata")
finput = system.file("extdata","n06_expr.txt",package="tamidata")
exprs0 = read.table(file = finput,header = TRUE,sep="\t")

Cuando usamos estas funciones nos devuelve un data.frame como


podemos comprobar.

class(exprs0)

## [1] "data.frame"

En lo que sigue necesitamos que sea una matriz. Lo hacemos (por


cierto el -1 nos sirve para quitar la primera columna de la matriz
donde tenamos los nombres de las sondas).

exprs0 = as.matrix(exprs0[,-1])

Y podemos comprobar que ya lo tenemos.

class(exprs0)

## [1] "matrix"

Cuntas filas (features) y columnas (samples) tenemos?


datos de microarrays 111

dim(exprs0)

## [1] 22215 54

Los nombres de las columnas son

colnames(exprs0)

## [1] "X600MPE" "AU565" "BT474"


## [4] "BT483" "CAMA1" "DU4475"
## [7] "HCC202" "HCC1428" "HCC1007"
## [10] "HCC2185" "LY2" "MCF7"
## [13] "MDAMB415" "MDAMB175" "MDAMB361"
## [16] "MDAMB435" "MDAMB134" "SUM185PE"
## [19] "SUM225CWN" "SUM44PE" "SKBR3"
## [22] "T47D" "UACC812" "ZR75B"
## [25] "ZR751" "ZR7530" "SUM52PE"
## [28] "BT20" "HCC1937" "HCC70"
## [31] "HCC1187" "HCC1008" "HCC1599"
## [34] "HCC3153" "HCC1569" "HCC2157"
## [37] "HCC1954" "HCC38" "HCC1500"
## [40] "HCC1143" "MCF12A" "MCF10A"
## [43] "MDAMB468" "SUM149PT" "SUM190PT"
## [46] "BT549" "HS578T" "HBL100"
## [49] "MDAMB231" _
"MDAMB435 2" "MDAMB157"
## [52] "MDAMB436" "SUM159PT" "SUM1315"

Y podemos ver

head(exprs0,n=1)

## X600MPE AU565 BT474 BT483 CAMA1


## [1,] 10.11474 10.42933 9.445266 10.16027 10.0863
## DU4475 HCC202 HCC1428 HCC1007 HCC2185
## [1,] 8.79988 10.32634 9.279211 9.620473 9.620686
## LY2 MCF7 MDAMB415 MDAMB175 MDAMB361
## [1,] 9.471435 9.87178 10.07334 9.736757 10.20135
## MDAMB435 MDAMB134 SUM185PE SUM225CWN
## [1,] 9.438713 9.355205 10.18208 10.35122
## SUM44PE SKBR3 T47D UACC812 ZR75B
## [1,] 10.28434 9.58074 9.968553 10.68766 9.624339
## ZR751 ZR7530 SUM52PE BT20 HCC1937
## [1,] 9.872964 9.843985 9.584688 9.52413 9.881727
## HCC70 HCC1187 HCC1008 HCC1599 HCC3153
## [1,] 10.53008 10.18941 10.14184 9.933858 9.920917
112 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## HCC1569 HCC2157 HCC1954 HCC38 HCC1500


## [1,] 9.009182 9.30533 8.945598 9.207611 9.857016
## HCC1143 MCF12A MCF10A MDAMB468 SUM149PT
## [1,] 10.35362 9.458165 8.582511 10.12283 9.849195
## SUM190PT BT549 HS578T HBL100 MDAMB231
## [1,] 9.497212 8.225951 7.960181 8.137387 7.625879
## MDAMB435_2 MDAMB157 MDAMB436 SUM159PT
## [1,] 8.038661 8.320586 7.414636 7.962508
## SUM1315
## [1,] 7.512639

Vamos a etiquetar las filas con los identificadores de las sondas.

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)

Podemos ver el nmero de muestras (que ha de coincidir con el


nmero de columnas de la matriz de expresin) y de covariables.

dim(pd0)

## [1] 54 14

Es necesario que los nombres de las filas de pd0 coincidan con


los nombres de las columnas de exprs0 ya que nos estn dando
covariables relativas a estas muestras.

rownames(pd0) = colnames(exprs0)
datos de microarrays 113

Esto es fundamental. Si no coinciden los nombres de las columnas


de la matriz de expresin con los nombres de las filas de la matriz de
datos de las covariables no podremos construir el ExpressionSet.
Y ahora es conveniente un pequeo resumen descriptivo de las
covariables.

summary(pd0)

## IDENTIFIER sample_no Type


## 600MPE : 1 Min. : 1.00 B:18
## AU565 : 1 1st Qu.:14.25 L:27
## BT20 : 1 Median :27.50 M: 9
## BT474 : 1 Mean :27.50
## BT483 : 1 3rd Qu.:40.75
## BT549 : 1 Max. :54.00
## (Other):48
## in_CGH ALL CDH1_meth
## Min. :0.000 Min. :1 Del : 1
## 1st Qu.:1.000 1st Qu.:1 full : 1
## Median :1.000 Median :1 no :14
## Mean :0.963 Mean :1 partial: 4
## 3rd Qu.:1.000 3rd Qu.:1 NA's :34
## Max. :1.000 Max. :1
##
## SFRP1 HER2 KIT known.p53
## Min. :2.975 NO :27 NO :45 NO :24
## 1st Qu.:3.160 YES :11 YES : 8 YES :29
## Median :3.293 NA's:16 NA's: 1 NA's: 1
## Mean :3.701
## 3rd Qu.:4.004
## Max. :7.780
## NA's :1
## BRCA order
## loss :16 Min. : 1.00
## loss_mutant: 3 1st Qu.:14.00
## mutant : 1 Median :27.00
## WT : 9 Mean :27.23
## NA's :25 3rd Qu.:40.00
## Max. :54.00
## NA's :1
## adherence per3
## adherent :12 Min. :4.000
## not adherent: 5 1st Qu.:4.000
## partial : 6 Median :5.000
## NA's :31 Mean :5.452
114 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## 3rd Qu.:5.000
## Max. :9.000
## NA's :23

Podemos ver que tenemos covariables categricas (en R se les


llama de clase factor) y covariables numricas. Con las covariables
categricas tenemos las frecuencias mientras que con las numricas
nos da mnimo, primer cuartil (o percentil de orden 25 %), mediana y
media, tercer cuartil (o percentil de orden 75 %) y mximo.
Podemos ver los tipos (o clases) de cada columna del siguiente
modo.

sapply(pd0,class)

## IDENTIFIER sample_no Type in_CGH


## "factor" "integer" "factor" "integer"
## ALL CDH1_meth SFRP1 HER2
## "integer" "factor" "numeric" "factor"
## KIT known.p53 BRCA order
## "factor" "factor" "factor" "integer"
## adherence per3
## "factor" "integer"

Podemos tener informacin adicional sobre las covariables que nos


describen las muestras. Por ejemplo, un nombre de variable como
known.p53 puede no significar demasiado. Pero si una etiqueta como
Presencia de p536 Cmo podemos aadir esta informacin? 6
No es un ejemplo muy lucidor.

metadatos = data.frame(labelDescription = c("Identificador",


"Nmero de muestra", "Tipo","En CGH","ALL","Mtodo CDH1","SFRP1",
"HER2","KIT","Presencia de p53","BRCA","Orden","Adherencia",
"per3"),row.names=colnames(pd0))

Notemos que la columna labelDescription debe de estar presente.


Utilizamos la clase Biobase::AnnotatedDataFrame que nos permite
tener los valores de las covariables y los metadatos que acabamos de
introducir. Lo podemos hacer del siguiente modo.

datosfenotipo = new("AnnotatedDataFrame", data = pd0,


varMetadata = metadatos)

Una vez tenemos este AnnotatedDataFrame podemos ver los nom-


bres de las muestras
datos de microarrays 115

sampleNames(datosfenotipo)

## [1] "X600MPE" "AU565" "BT474"


## [4] "BT483" "CAMA1" "DU4475"
## [7] "HCC202" "HCC1428" "HCC1007"
## [10] "HCC2185" "LY2" "MCF7"
## [13] "MDAMB415" "MDAMB175" "MDAMB361"
## [16] "MDAMB435" "MDAMB134" "SUM185PE"
## [19] "SUM225CWN" "SUM44PE" "SKBR3"
## [22] "T47D" "UACC812" "ZR75B"
## [25] "ZR751" "ZR7530" "SUM52PE"
## [28] "BT20" "HCC1937" "HCC70"
## [31] "HCC1187" "HCC1008" "HCC1599"
## [34] "HCC3153" "HCC1569" "HCC2157"
## [37] "HCC1954" "HCC38" "HCC1500"
## [40] "HCC1143" "MCF12A" "MCF10A"
## [43] "MDAMB468" "SUM149PT" "SUM190PT"
## [46] "BT549" "HS578T" "HBL100"
## [49] "MDAMB231" _
"MDAMB435 2" "MDAMB157"
## [52] "MDAMB436" "SUM159PT" "SUM1315"

O tambin ver los valores de las covariables (mostramos los prime-


ros solamente)

head(pData(datosfenotipo))

## IDENTIFIER sample_no Type in_CGH ALL


## X600MPE 600MPE 1 L 1 1
## AU565 AU565 2 L 1 1
## BT474 BT474 3 L 1 1
## BT483 BT483 4 L 1 1
## CAMA1 CAMA1 5 L 1 1
## DU4475 DU4475 6 L 1 1
## CDH1_meth SFRP1 HER2 KIT known.p53 BRCA
## X600MPE no 3.40987 <NA> NO NO <NA>
## AU565 <NA> 3.16902 <NA> NO YES <NA>
## BT474 no 3.16737 YES NO NO loss
## BT483 no 2.97456 NO NO NO WT
## CAMA1 no 3.16856 <NA> NO NO WT
## DU4475 no 3.06074 <NA> NO NO WT
## order adherence per3
## X600MPE 1 <NA> 9
## AU565 2 <NA> 4
## BT474 3 <NA> NA
## BT483 4 <NA> NA
116 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## CAMA1 5 <NA> NA
## DU4475 6 <NA> NA

Anotaciones y datos de las caractersticas


Sin duda este es el punto fundamental, la descripcin de infor-
macin sobre las filas de la matriz de expresin. Estas filas (features)
corresponden con sondas. De hecho, distintas sondas correspon-
den con un mismo gen. Esta informacin depende del chip que
utilizamos. Por ello distintos experimentos pueden corresponder
a un mismo chip o instrumento. Es conveniente consultar http:
//www.bioconductor.org/packages/2.11/bioc/html/annotate.html.
La informacin de cada chip aparece en un paquete de metadatos del
mismo. En particular, nos proporcionan el nombre del gen, el smbo-
lo y la localizacin en el cromosoma. Otros paquetes proporcionan
informacin de GO o KEGG.

Descripcin del experimento


Los experimentos los hace la gente y hay que incluir esta informa-
cin en los datos.

datosexperimento = new('MIAME',name='Neve et alt.',lab='Varios',


contact ='rmneve@lbl.gov',
title = 'A collection of breast cancer cell lines for the study of
functionally distinct cancer subtypes',abstract = 'An example ExpressionSet',
url = '10.1016/j.ccr.2006.10.008',
other = list(notes = 'Creado a partir de ficheros de texto'))

El formato MIAME (Minimum information about a microarray ex-


periment) puede consultarse en http://fged.org/projects/miame/.

Y montamos las piezas


Ejemplo de ExpressionSet a partir de los distintos elementos que
hemos construido.7 7
Esto es un poco como el Mecano.

neve06 = new("ExpressionSet",exprs=exprs0,phenoData = datosfenotipo,


experimentData = datosexperimento,annotation = "hgu95av2")

Guardamos este ExpressionSet para uso posterior.

save(neve06,file="neve06.rda")

Todo lo hecho en esta seccin se puede hacer de un modo ms


simple con EnrichmentBrowser::read.eset.
datos de microarrays 117

5.6 Un experimento con levadura

Los datos que comentamos en esta seccin son un experimento en


donde vamos a considerar dos tipos de clulas en levadura: salvaje y
mutada. Observaremos la expresin en cada uno de los tipos bajo con
temperaturas distintas (30 y 40 grados centgrados). El tipo salvaje
a 30 grados tambin ser observado en tres instantes temporales
distintos.8
Los datos los tenemos en un ExpressionSet que leemos. Figura 5.1: Sacaromice Cerevisiae.
8
Estos datos son originales. Sin embar-
data(bdmy,package="tamidata") go, hemos eliminado todos aquellos
genes para los cuales haba algn dato
El nmero de genes y muestras es faltante.

dim(bdmy)

## Features Samples
## 6018 18

Podemos ver los datos fenotpicos.

head(pData(bdmy),n=1)

## temperatura tiempo tipo muestra


## GROBY30C1 30 0 gb 1

Es necesario normalizar los datos? En la figura 5.3(a) mostramos


la densidad estimada.

geneplotter::multidensity(exprs(bdmy),xlim = c(0,8))

En la figura 5.3(b) tenemos los diagramas de cajas.

boxplot.matrix(exprs(bdmy),ylim=c(0,8))

Vamos a reproducir los dibujos de la figura 5.3 utilizando el pa-


quete Wickham and Chang [2016, ggplot2].9 El cdigo es el que sigue 9
Sobre el paquete Wickham [2014,
y los tenemos en la figura ??. reshape] es interesante consultar ?.

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

Hemos utilizado la funcin limma::normalizeBetweenArrays para


corregir las expresiones de los distintos arrays.

library(limma)
bdmy.n = normalizeBetweenArrays(exprs(bdmy))

Despus hemos creado otro ExpressionSet tamidata::bdmy.norm


en donde hemos sustituido la matriz de expresin por la corregida y
lo guardamos.

bdmy.norm = bdmy
exprs(bdmy.norm) = bdmy.n

Podemos ver la informacin fenotpica con

head(pData(bdmy))

## temperatura tiempo tipo muestra


## GROBY30C1 30 0 gb 1
## GROBY30C2 30 0 gb 2
## GROBY30C3 30 0 gb 3
## GROBY35C1 35 0 gb 1
## GROBY35C2 35 0 gb 2
## GROBY35C3 35 0 gb 3

Podemos ver las densidades y diagramas de cajas de los datos


normalizados en las figuras 5.4(a) y 5.4(b).

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()

5.7 De cmo utilizar un ExpressionSet

En esta seccin pretendemos mostrar cmo utilizar funciones que


manejan ExpressionSet. Vamos a utilizar los datos ALL que aparecen
en el paquete Li [2009, ALL]. Cargamos el paquete.

library(ALL)

Podemos ver que es un resumen de la informacin que tenemos en


ALL.
120 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

(a) (b)
Figura 5.4: Datos bdmy.norm estimado-
res de densidad y diagramas de cajas
antes de normalizacin.
ALL

## ExpressionSet (storageMode: lockedEnvironment)


## assayData: 12625 features, 128 samples
## element names: exprs
## protocolData: none
## phenoData
## sampleNames: 01005 01010 ... LAL4 (128
## total)
## varLabels: cod diagnosis ... date last
## seen (21 total)
## varMetadata: labelDescription
## featureData: none
## experimentData: use 'experimentData(object)'
## pubMedIds: 14684422 16243790
## Annotation: hgu95av2

Podemos ver los niveles de expresin (en filas tenemos sondas y


en columnas muestras). Los niveles de expresin han sido preproce-
sados y aparecen el logaritmo en base 2 de este valor ya preprocesa-
do. Se obtienen (y no lo mostramos) con

exprs(ALL)

Los datos fenotpicos los tendremos con (tampoco los mostramos)


datos de microarrays 121

pData(ALL)

Cul fue chip que se utiliz para obtener estos datos?

annotation(ALL)

## [1] "hgu95av2"

Con pData(ALL) hemos visto los nombres (y los valores) de las


covariables que nos describen las distintas muestras. Solamente los
nombres los podemos ver con

names(pData(ALL))

## [1] "cod" "diagnosis"


## [3] "sex" "age"
## [5] "BT" "remission"
## [7] "CR" "date.cr"
## [9] "t(4;11)" "t(9;22)"
## [11] "cyto.normal" "citog"
## [13] "mol.biol" "fusion protein"
## [15] "mdr" "kinet"
## [17] "ccr" "relapse"
## [19] "transplant" "f.u"
## [21] "date last seen"

Y si simplemente queremos ver los valores de la variable BT pode-


mos hacerlo con

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

Los datos de expressin aparecen en una matriz con filas (features


que suelen corresponder a sondas) y con columnas (que correspon-
den con muestras). Vamos a seleccionar una parte de las muestras.
En concreto, vamos a considerar las muestras tales que la variable
fenotpica mol.bio toma el valor NEG. Determinamos las columnas.
122 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

selcol = ALL$mol.biol == "NEG"

Y nos quedamos con esa muestras.

ALL[,selcol]

## ExpressionSet (storageMode: lockedEnvironment)


## assayData: 12625 features, 74 samples
## element names: exprs
## protocolData: none
## phenoData
## sampleNames: 01010 04007 ... LAL4 (74
## total)
## varLabels: cod diagnosis ... date last
## seen (21 total)
## varMetadata: labelDescription
## featureData: none
## experimentData: use 'experimentData(object)'
## pubMedIds: 14684422 16243790
## Annotation: hgu95av2

Lo importante es ver que todo el ExpressionSet tiene menos mues-


tras y tambin se han modificado (eliminando) los datos de expresin
y los datos fenotpicos.

5.8 NCBI GEO

GEO es el NCBI Gene Expression Omnibus. Su direccin es


http://www.ncbi.nlm.nih.gov/geo/. Es un repositorio pblico con
datos experimentales de alto rendimiento. Tenemos experimentos ba-
sados en microarrays de uno o dos canales que miden mRNA, DNA
genmico, presencia de proteinas. Tambin hay otras tcnicas no ba-
sadas de arrays como anlisis serial de expresin de genes (SAGE),
datos protemicos obtenidos son espectrometra de masas o datos
de secuenciacin de alto rendimiento. Hay cuatro tipos de entidades
bsicas en GEO: Sample, Platform, Series, DataSet. En esta seccin
mostramos cmo obtener datos de esta gran base de datos pblica.
Los datos que nos bajamos los utilizaremos en los siguientes temas.
Cuando accedemos a una entrada de GEO podemos ver el enlace
Analyze with GEO2R. Si accedemos a este enlace podemos ver que
nos ofrece algunos anlisis de los datos utilizando R/Bioconductor.
Estas notas son una versin muy extendida de estos anlisis.
datos de microarrays 123

5.9 GSE21779

Hemos elegido los datos que en dicha base de datos tienen el


identificador GSE21779. Podemos buscarlos utilizando la pgina
web http://www.ncbi.nlm.nih.gov/geo/ o bien podemos acceder
directamente a esta direccin http://www.ncbi.nlm.nih.gov/sites/
GDSbrowser?acc=GDS4128. Bajamos los ficheros CEL (estn en formato
comprimido gzip).
Sabiendo el identificador de los datos y que tienen los datos de
expresin originales los podemos bajar del siguiente modo. Primero
cargamos el paquete Davis [2015, GEOquery].

library(GEOquery)

Y sabiendo el identificador podemos bajar los datos.

gcel = getGEOSuppFiles("GSE21779")

Podemos ver que los coloca en un subdirectorio al que denomina


GSE21779.10 Cambiamos al directorio donde tenemos los datos. 10
A gusto del consumidor. Posiblemen-
te para bajar un simple banco de datos
lo mejor es utilizar el navegador.
setwd("GSE21779/")

Descomprimimos.

system("tar xvf GSE21779_RAW.tar")

Cargamos el paquete Irizarry et al. [2015, affy].

library(affy)

Y leemos todos los datos.

gse21779 = ReadAffy()

Guardamos estos datos de expresin en un fichero externo.

save(gse21779,file = "gse21779.rda")

save(gse21779,file=paste(dirTamiData,"gse21779.rda",sep=""))

Otra opcin es bajar los mismos datos de ArrayExpress. Su cdigo


en esta base de datos es E-GEOD-21779. Lo hacemos con el siguiente
cdigo.
124 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

library(ArrayExpress)
geod21779 = ArrayExpress("E-GEOD-21779")

La ventaja es que directamente nos devuelve un AffyBatch. Nor-


malizamos los datos mediante el mtodo RMA.11 11
4.8.

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.

otros que aparecen en otros cromosomas. Los datos se pueden ob-


tener de GEO y el identificador del experimento es GSE1397. Los
utilizaremos en distintos temas pero de un modo muy importante
en ??. Los resultados que se obtienen son realmente bonitos e intere-
santes. Los datos a nivel de sonda (raw data) no estn disponibles.
Nos hemos de traer unos datos preprocesados. En el experimento se
utilizaron arrays Affymetrix GeneChip U133A. Los obtenemos con

pacman::p_load("Biobase","GEOquery")
gse1397raw = getGEO("GSE1397")[[1]]

La anotacin de estos datos es GPL96 que (podemos comprobarlo


entrando en GEO) corresponde con Affymetrix Human Genome U133
chip hgu133a. El paquete que contiene sus datos de anotacin es
Carlson [2015b, hgu133a.db]. Cambiamos la anotacin.

annotation(gse1397raw) = "hgu133a"

Los datos fenotpicos de las muestras los podemos ver con (no
mostramos)

pData(gse1397raw)

Podemos ver las etiquetas de las covariables asociadas a las mues-


tras con
datos de microarrays 125

varLabels(gse1397raw)

Fijmonos en la variable type que nos indica la alteracin. En


concreto puede ser trisoma 21 (sndrome de Down), trisoma 13 o
euploide (ploidez normal) y el tejido puede ser cerebro, cerebelo,
astrocito y corazn. Los valores de esta covariable la podemos ver
con

head(pData(gse1397raw)[,"title"])

La matriz de expresin la tenemos (y no la mostramos) con

exprs(gse1397raw)

Vamos a seleccionar aquellas muestras que corresponden a cerebro


o cerebelo y que son o bien TS21 o euploides.

(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"]))))

Efectivamente tenemos las columnas con las muestras que busc-


bamos

pData(gse1397raw)[eu,"title"]

pData(gse1397raw)[ts21,"title"]

Y ahora seleccionamos las muestras.

gse1397raw = gse1397raw[,c(eu,ts21)]

Modificamos los datos fenotpicos.

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)

Guardamos los datos.


126 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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)

No tenemos los ficheros .CEL que necesitamos para preprocesar


los datos. Por ello recurrimos a la funcin normalizeBetweenArrays()
del paquete Smyth et al. [2016, limma].

library(limma)
gse1397 = gse1397raw
exprs(gse1397) = normalizeBetweenArrays(exprs(gse1397raw))

En la figura 5.5 tenemos el estimador kernel para las distintas


muestras.

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"

5.11 Datos GSE20986


15 15
El anlisis de estos datos lo
Empezamos obteniendo los datos. Tenemos los datos a nivel de sugiri un estudio que se puede
encontrar en http://bioinformatics.
sonda de modo que podemos realizar nuestro propio preprocesado. knowledgeblog.org/2011/06/20/
Una explicacin detallada del protocolo experimental se puede ver en analysing-microarray-data-in-bioconductor/.
En lo que sigue utilizaremos parte
GEO consultando la informacin de una cualquiera de las muestras, del anlisis que se propone all. La
por ejemplo, en http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi? referencia original del estudio es
acc=GSM524662. Podemos ver en esta pgina que el preprocesado de Browning et al. [2012].

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")

Nos bajamos los ficheros CEL.

gcel = getGEOSuppFiles("GSE20986")

Nos ha creado el subdirectorio GSE20986 por lo que hemos de


cambiar el directorio de trabajo al nuevo directorio.

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.

system("tar xvf GSE20986_RAW.tar")

Leemos los datos.

gse20986raw = affy::ReadAffy()

Aadimos variables fenotpicas.


128 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

tissue = factor(c(1,2,2,1,2,1,3,3,3,4,4,4),levels = 1:4,


labels=c("iris","retina","choroides","huvec"))
pd = data.frame(tissue)
rownames(pd) = colnames(gse20986raw)
pData(gse20986raw) = pd

Guardamos los datos.

save(gse20986raw,file="gse20986raw.rda")

En la referencia original el preprocesado de los datos se realiz


con el mtodo GC-RMA.18 . Vamos a reproducirlo. 18
Stafford [2008, captulo 3]

pacman::p_load("gcrma","hgu133plus2probe")
gse20986 = gcrma::gcrma(gse20986raw)

Y guardamos el nuevo ExpressionSet.19 19


Los datos que hemos bajado con la
funcin getGEO ya estaban preproce-
sados utilizando las mismas funciones
save(gse20986,file="gse20986.rda")
que usamos aqu. Lo he hecho para
mostrar cmo se hace o bien porque
En este trabajo se comparan muestras obtenidas a partir de clulas podemos querer utilizar algn otro
procedimiento de preprocesado.
endoteliales microvasculares de ojos humanos con clulas endotelia-
les obtenidas de venas umbilicales humanas (HUVEC). Del primer
tipo de clulas hay tres subtipos dependiendo de dnde se extraen.
En concreto se extrajeron del iris, la retina y la coroides. Las clulas
HUVEC son ms fciles de obtener y por lo tanto de estudiar. Sin
embargo, no es claro que lo que se estudie con ellas sea extrapolable
con los resultados que se obtendran con los otros tipos de clulas. En
resumen, el objeto fundamental es la comparacin de este grupo con
los otros tres grupos.
En el paquete ?, tamidata tenemos gse20986raw y lo podemos leer
con

data(gse20986raw,package="tamidata")

Todo el proceso para su obtencin a partir de los datos originales


20que hemos visto en esta seccin lo podemos reproducir lo tenemos 20
Y todo lo que se hace con estos datos
en el script http://www.uv.es/ayala/docencia/tami/md/gse20986. en el manual.

html.

5.12 GSE34764

Consideremos los datos de GEO con identificador GSE34764. Ne-


cesitamos el paquete Davis [2015, GEOquery]. Lo cargamos.
datos de microarrays 129

library(GEOquery)

Obtenemos los ficheros CEL.

getGEOSuppFiles("GSE34764")

Cambiamos el directorio de trabajo.

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

Hemos descrito cmo bajar datos de GEO. Si conocemos el banco


de datos o simplemente pretendemos analizar un solo banco de datos
lo que hemos hecho es suficiente. Pero si pretendemos explorar GEO
posiblemente buscando bancos de datos similares a los propios esto
no es suficiente. Una buena herramienta es ?, GEOmetadb donde ? es
la publicacin correspondientes.

5.14 ArrayExpress

En 5.5 hemos visto cmo construir un ExpressionSet cuando tene-


mos los datos de expresin, los fenotpicos y los de anotacin. Si con-
sultamos la referencia original 21 vemos que los autores han subido 21
Richard M. Neve, Koei Chin, Jane
toda la informacin del experimento a ArrayExpress. Realmente gran Fridlyand, Jennifer Yeh, Frederick L.
Baehner, Tea Fevr, Laura Clark, Nora
parte del trabajo que hicimos en esa seccin la podamos ahorrar Bayani, J. e. a. n. . P. h. i. l. i. p. p. e.
bajando los datos ya preparados de esta base de datos. Lo podemos Coppe, Frances Tong, Terry Speed,
Paul T. Spellman, Sandy DeVries,
hacemos hacer con el paquete Kauffmann et al. [2015, ArrayExpress] Anna Lapuk, Nick J. Wang, W. e. n. .
del siguiente modo. L. i. n. Kuo, Jackie L. Stilwell, Daniel
Pinkel, Donna G. Albertson, Frederic M.
Waldman, Frank McCormick, Robert B.
library(ArrayExpress)
Dickson, Michael D. Johnson, Marc
rawset = ArrayExpress("E-TABM-157") Lippman, Stephen Ethier, Adi Gazdar,
and Joe W. Gray. A collection of
Podemos comprobar que el objeto rawset en donde guarda los breast cancer cell lines for the study of
functionally distinct cancer subtypes.
datos es un AffyBatch a la cual podemos aplicar la correccin de Cancer cell, 10(6):515 527, 2006. doi:
fondo, la normalizacin y el resumen en 4. 10.1016/j.ccr.2006.10.008
130 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

5.15 Varios

Esta seccin es una especie de cajn de sastre que contiene cosas


que no he sabido colocar elegantemente en el resto del tema.

5.15.1 Guardando la matriz de expresin


Supongamos que tenemos un ExpressionSet y queremos guardar
la matriz en un fichero externo para leerlo con alguna otra aplicacin.
Podemos utilizar la funcin Biobase::write.exprs.

data(gse1397,package="tamidata")

Guardamos en un fichero texto la matriz de expresin.

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.

5.16 Utilizando ExpressionSet con EnrichmentBrowser

Con EnrichmentBrowser:fData podemos manejar un Biobase::ExpressionSet.

pacman::p_load("EnrichmentBrowser")

Con tamidata::gse1397. Hemos de tener instalado ? que es su pa-


quete de anotacin.

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

Podemos ver toda la informacin con

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

Los nombres de las filas ha de ser


132 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## [1] "g1" "g2" "g3" "g4" "g5" "g6" "g7"


## [8] "g8" "g9" "g10" "g11" "g12" "g13" "g14"
## [15] "g15" "g16" "g17" "g18" "g19" "g20"

Los nombres de las muestras sern


## [1] "m1" "m2" "m3" "m4" "m5" "m6" "m7"
## [8] "m8" "m9" "m10" "m11" "m12" "m13" "m14"
## [15] "m15" "m16" "m17" "m18" "m19" "m20"

Como datos fenotpicos (covariables que describen las columnas) han


de ser las siguientes
## tipo crecimiento
## 1 1 0.30
## 2 2 0.23
## 3 2 0.34
## 4 1 0.24
## 5 2 0.45

Ej. 4 23 Vamos a bajar y preprocesar los datos GSE30129 de GEO. 23


Este problema es muy similar a lo que
Se pide realizar los siguientes pasos. hacemos en 5.12.

1.Bajar los datos a nivel de sonda utilizando el paquete Davis [2015,


GEOquery] y la funcin getGEOSuppFiles.
2.Leer los datos utilizando la funcin read.celfiles del paquete
Carvalho and Irizarry [2016, oligo].
3.En el paso anterior si no tenemos instalado el paquete pd.mogene.1.0.st.v1
nos dar un aviso.
4.Instalar el paquete indicado y repetir la lectura.
5.Representar los estimadores de densidades y los diagramas de
cajas de las expresiones a nivel de sonda.
6.Obtener los MAplots.
7.Aplicar el mtodo RMA.
8.Aplicar el mtodo MAS5. Es posible hacerlo?
9.Repetir los dibujos de los apartados 5 y 6 para los datos procesa-
dos utilizando el mtodo RMA.

* Ej. 5 Consideremos los datos tamidata::gse20986raw.


1.Cmo identifica los genes de las filas?
2.Cambiar los identificadores de los genes a sus cdigos Ensembl.
6
RNASeq

6.1 Introduccin

En este tema trabajamos con datos obtenidos mediante la tcnica


conocida como RNA-Seq. En http://rnaseq.uoregon.edu/ tenemos
una introduccin muy simple y clara. Oshlack et al. [2010] da una
buena visin general. En Delhomme and Padioleau [2015, RnaSeq-
Tutorial] tenemos una presentacin general de cmo trabajar con
estos datos en el contexto de R/Bioconductor. Un texto general que
trata lo relativo al anlisis de este tipo de datos es Korpelainen et al.
[2015]. Una referencia ms breve pero muy interesante es Conesa
et al. [2016] donde tambin da una visin global del anlisis de este
tipo de informacin.
En este manual se asume que se trabaja con un genoma de referen-
cia. Los procedimientos que vamos a estudiar asumen este punto de
partida.
De un modo anlogo a 4 y 5 comentaremos este tipo de infor-
macin de expresin gnica.1 1
En el momento actual uno de los que
ms inters despierta.

6.2 Flujo de trabajo con RNASeq

Un estudio de este tipo implica la realizacin de los siguientes


pasos (Oshlack et al. [2010]):

1. Diseo experimental.

2. Protocolos de extraccin del RNA.

3. Preparacin de las libreras. Se convierte el RNA en cDNA y se


aaden los adaptadores para la secuenciacin.

4. Se secuencia el las lecturas cDNA utilizando una plataforma de


secuenciacin.
134 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

5. Alineamiento de las lecturas secuenciadas a un genoma de refe-


rencia.

6. Resumen del nmero de lecturas alineadas a una regin.

7. Normalizacin de las muestras para eliminar diferencias tcnicas


en la preparacin.

8. Estudio estadstico de la expresin diferencial incluyendo en lo


posible un modelo.

9. Interpretacin de los resultados desde el punto de vista biolgico.

En este manual estamos interesados fundamentalmente en el anlisis


de expresin diferencial. Obviamente el punto ?? es bsico. Lo realiza
el experimentador. En la medida en que vamos a trabajar con datos
de experimentos ya realizados hablaremos de cuestiones de diseo
aunque no de un modo central. La extraccin del RNA, preparacin
de libreras y la secuenciacin son cuestiones no tratadas aqu.
S que comentaremos cmo alinear las lecturas cuando dispone-
mos de un genoma de referencia y de los pasos que siguen en el
anlisis. Sin embargo, este manual se quiere centrar en problemas
estadsticos en el contexto de la Bioinformtica. Por ello, toda la par-
te de alineamiento y conteo de las lecturas lo veremos de un modo
sencillo insistiendo en cmo hacerlo y no en qu se hace. Nuestro
trabajo empieza a partir del momento en que tenemos los conteos y
nos interesamos por estudiar si estos conteos son significativamente
distintos entre distintas condiciones biolgicas.2 2
En tenemos el anlisis detallado
En el diseo hemos de diferenciar entre rplicas tcnicas en la que con todos los pasos desde las lecturas
originales hasta el anlisis de expresin
utilizamos una misma muestra biolgica, un mismo procesado y los diferencial final. El inters del trabajo
mismos protocolos de secuenciacin. Es de esperar que las diferen- es que podemos reproducir un anlisis
completo. Adems contiene enlaces
cias de lo que observamos en estas rplicas tcnicas sean menores para aquellas herramientas que se
a las obtenidas con rplicas biolgicas en las que se utilizan distin- utilizan fuera de R/Bioconductor
tas muestras biolgicas. En los experimentos RNASeq solemos tener como bowtie2, samtools y tophat2.
En http://www.bioconductor.org/
rplicas biolgicas y raramente rplicas tcnicas. help/workflows/rnaseqGene/ tenemos
Cuntas muestras? Se trabaja con muestras extremadamente todo un flujo en donde se analiza un
experimento. El paquete Love [2015a,
pequeas: 2 o 3 por tratamiento. Obviamente no podemos esperar airway] tiene los datos para poder
ver diferencias claras entre tratamientos. trabajar.
Sin duda, en general y en particular en este contexto, los diseos S. Anders, D. J. McCarthy, Y. Chen,
M. Okoniewski, G. K. Smyth, W. Huber,
experimentales han de mantenerse lo ms simples que se puedan. and M. D. Robinson. Count-based
Qu tipos de tratamiento hemos de realizar? Es necesaria una differential expression analysis of rna
normalizacin previa de las muestras que permita controlar las sequencing data using r and bioconduc-
tor. Nat. Protocols, 8(9):17651786, 2013.
variaciones tcnicas. doi: 10.1038/nprot.2013.099

1. Por ejemplo, las muestras proporcionadas por el secuenciador


tienen distintas cantidades de DNA y esto da lugar a diferencias
rnaseq 135

en el nmero total de lecturas secuenciadas y alineadas indepen-


dientemente de las diferente expresin diferencial de un gen. El
tratamiento debiera afectar solamente a una fraccin de los genes
evaluados. Si la diferencia se observa en todos los genes lo que
vemos es un efecto del protocolo de trabajo.

2. Tambin hay diferencias entre genes que no se deben a diferencias


de expresin. En los protocolos estandar un gen largo es secuen-
ciado con ms frecuencia que un gen corto.

En las secciones que siguen se comentan los datos que utilizamos


en los restantes captulos.
La clase que en R/Bioconductor debe de utilizarse para trabajar
con datos RNASeq es GenomicRanges::SummarizedExperiment. Y es-
to es as cuando partimos de las lecturas originales y realizamos todo
el proceso de alineamiento sobre un genoma. Sin embargo, cuando
los datos los bajamos de alguna base de datos con las lecturas corres-
pondientes a genes o exones ya contadas (lo que llamaremos sin ms
los conteos de genes o conteos de exn) entonces es ms cmodo uti-
lizar Biobase::ExpressionSet. Finalmente, cuando realizamos anlisis
de expresin diferencial.
7
Datos de RNASeq

7.1 Introduccin

Responder las siguientes preguntas es el objeto de este tema.

1. Dnde podemos obtener datos de secuenciacin? De otro modo:


qu repositorios podemos utilizar?

2. Cmo podemos realizar bsquedas en los metadatos con objeto


de obtener experimentos que tenga que ver con lo que me intere-
sa?

3. Cmo bajarlos?

4. Cmo contar las lecturas alineadas sobre intervalos o uniones de


intervalos sobre el genoma?

En 6 ya hemos contado la tcnica. Ahora pretendemos dejar la


informacin preparada para abordar el problema de la expresin
diferencial en ??.

7.2 Repositorios

Los repositorios donde podemos encontrar este tipo de datos son


NCBI en los Estados Unidos, EMBL en Europa y DDBJ en Japn.1 En 1
Son los bsicos como para datos de
NCBI GEO tambin hay datos de secuencias y podemos acceder a microarrays tenemos NCBI GEO y EBI
ArrayExpress.
ellos utilizando Davis [2015, GEOquery]. En concreto las direcciones
son

NCBI SRA http://www.ncbi.nlm.nih.gov/sra Posiblemente es la


mayor de las bases de datos. No almacena lecturas alineadas. En
NCBI GEO s que tenemos algunos bancos de datos con lecturas
alineadas sobre un genoma de referencia.

EBI ENA http://www.ebi.ac.uk/ena


138 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

DDBJ http://www.ddbj.nig.ac.jp

En lo que sigue utilizamos fundamentalmente la primera base de


datos y, a veces, la segunda. Cada una de estas bases de datos puede
ser consultada en lnea y bajar los datos desde la propia pgina.
Tambin usaremos en lo que sigue herramientas para hacerlo desde
R, por ejemplo, Zhu and Davis [2015, SRAdb].
En las secciones 7.3, 7.4 y ?? comentamos distintos formatos
para almacenar lecturas cortas. Tambin comentamos paquetes R/-
Bioconductor para trabajar con estos formatos.

7.3 Formato FASTA

Es el formato basado en texto para representar secuencias bien de


nucletidos bien de pptidos. Tanto unos como otros son represen-
tados por una sola letra. Tambin tiene smbolos para representar
un hueco (gap) o parada en la traduccin o bien que no se sabe el
nucletido o aminocido. Es muy simple. Tiene una lnea que tiene
en la primera posicin el smbolo > al que sigue una descripcin de
la secuencia. En la siguiente lnea empieza la secuencia de bases o
aminocidos. Se recomiento que no tener ms de 80 columnas y se
pueden tener todas las filas que se precisen.

7.4 Formato FASTQ

Es uno de los formatos ms populares para datos de secuencias.


Consiste de cuatro lneas. La primera contiene el nombre de la se-
cuencia. La segunda lnea contiene a la propia secuencia. La tercera
lnez contiene informacin opcional sobre la secuencia. La cuarta
lnea cuantifica la confianza o calidad en la determinacin de cada
base recogida en la segunda lnea. Las cuatro siguientes lneas corres-
ponden a un ejemplo.

@SRR1293399.1 ILLUMINA-545855_0026_FC629BG:6:1:1022:5049 length=50


ACAGGGACGCCATCGAATCCGGATCNTNNNNNNNNNNNNANNNNNNNNNN
+SRR1293399.1 ILLUMINA-545855_0026_FC629BG:6:1:1022:5049 length=50
dee\edYcdc`bbY`S]bb_]]Ua^BBBBBBBBBBBBBBBBBBBBBBBBB

Cmo se cuantifica la confianza o precisin? Se utiliza el programa


Phred.2 Este programa lo que hace es asignar los picos de fluorescen- 2
El procedimiento que utiliza aparece
en Ewing et al. [1998] y cmo estima las
cia a una de las cuatro bases.3 En Ewing and Green [1998] tenemos
probabilidades de error cuando asigna
la explicacin del mtodo de asignacin. Si P denota la probabilidad4 cada base aparece en Ewing and Green
para una base dada de ser mal asignada o clasificada entonces el [1998].
3
En ingls base call es el proceso me-
valor con el que se trabaja es
diante el cual se asigna el pico de
fluorescencia a la base.
Q = 10 log10 P. (7.1) 4
No es realmente una probabilidad. Es
una cuantificacin de la calidad de la
asignacin y no ms.
datos de rnaseq 139

Esto significa que una probabilidad P muy pequea de clasificacin


incorrecta se traduce en un valor grande de Q. Una vez calculado
Q estonces se asigna (usualmente) el caracter ASCII que ocupa la
posicin 33 + Q.5 Una descripcin detallada sobre FASTQ la tenemos 5
Sin duda, un mtodo curioso de
en Cock et al. [2009]. mostrar valores numricos utilizando
texto.

Utilizando ShortRead
Para trabajar con el formato FASTQ es til el paquete Morgan
et al. [2015b, ShortRead].

library(ShortRead)

Vamos a ver sus funcionalidades utilizando el SRR1293399_1.fastq.6 6


En 7.5 vemos cmo podemos bajar
En esta seccin suponemos fijado el directorio de trabajo a donde te- estos datos.

nemos los datos.


Leemos con ShortRead::readFastq.7 7
Veremos que tarda lo suyo en leer los
datos.
fq0 = readFastq("SRR1293399_1.fastq")

Es un fichero con muchas lecturas y para trabajar es mejor tomar


una muestra de las mismas. Tomamos 10000 lecturas elegidas al azar.
Y lo hacemos con ShortRead::FastqSampler. Volvemos a leer esta
muestra aleatoria.

fqsample = FastqSampler("SRR1293399_1.fastq",10000)
fq0 = yield(fqsample)

Ahora fq0 es un ejemplo de clase

class(fq0)

## [1] "ShortReadQ"
## attr(,"package")
## [1] "ShortRead"

En particular podemos ver la informacin bsica con

fq0

## class: ShortReadQ
## length: 10000 reads; width: 50 cycles

Obviamente tiene solamente 10000 lecturas. Podemos seleccionar8 8


Subsetting
del modo habitual. Por ejemplo, la primera sera
140 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

fq0[1]

## class: ShortReadQ
## length: 1 reads; width: 50 cycles

O de la tercera a la dcima con

fq0[3:10]

## class: ShortReadQ
## length: 8 reads; width: 50 cycles

Con ShortRead::sread podemos tener la lectura. Por ejemplo, la


que ocupa la posicin 1000 sera

sread(fq0[1000])

## A DNAStringSet instance of length 1


## width seq
## [1] 50 AGAGAAATCGGTGTCAGTC...GTATGCCGTCTTCTGCTT

Podemos ver las primeras y ltimas con

sread(fq0)

## A DNAStringSet instance of length 10000


## width seq
## [1] 50 TAAACACTGTCTCCTTG...CCTGGTGTCAGTCACT
## [2] 50 ACAGCTTTGTCTGAGAC...TGTCAGTCATTCCAGC
## [3] 50 GTGTCAGTCACTTCCAG...GGTCGTATGCCGTCTT
## [4] 50 TGCGGCCCCGGGTTCCT...CTGAGCGTGTCAGTCA
## [5] 50 TCTTTGGGTTCCGGGGG...TGAAACGTGTCAGTCA
## ... ... ...
## [9996] 50 ATAGTCTGTGGGAGTCA...CACTTCCAGCGGTCGT
## [9997] 50 CAAAGTGCTTACAGTGC...CCAGCGGTCGTATGCC
## [9998] 50 GTGTCAGTCACTTCCAG...CTGCTTGAAAAAAAAA
## [9999] 50 TGGCGCTGCGGGATGAA...GCGCCCGATGCCGACG
## [10000] 50 CAACTAGCCCTGAAAAT...CAGGCCCATACCCGTG

Podemos ver la longitud de las lecturas con

width(fq0)

Con ShortRead::detail tenemos una informacin detallada. Las


medidas de calidad de la lectura 1000 las obtenemos con
datos de rnaseq 141

quality(fq0[1000])

## class: SFastqQuality
## quality:
## A BStringSet instance of length 1
## width seq
## [1] 50 ffffffffffffffffeff...fffeffefffff`ddbdd

Podemos saber el valor a que corresponde la codificacin de la


calidad con

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)

Evaluando la calidad del experimento. Vamos a realizar un control


de calidad del experimento con ShortRead::qa. Lo hacemos para la
primera muestra.9 9
Obviamente debemos repetir el anli-
sis para cada una de las muestras.
SRP042140_1.qa = qa(fls[1],type="fastq")

Generamos un informe y lo visualizamos.10 10


A los usuarios de Windows es pro-
bable que el codigo que sigue no les
funcione. Les extraa?
browseURL(report(SRP042140_1.qa))

Es un informe muy interesante. Notemos que estos datos ya es-


tn previamente filtrados11 y por ello algunas de las caractersticas Son datos obtenidos de un repositorio
11

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)

Por ejemplo podemos ver el nmero de lecturas.

SRP042140_1.qa[["readCounts"]]

## read filter aligned


## SRR1293399_1.fastq 29508968 NA NA

O tambin podemos ver las frecuencias de cada una de las bases.

SRP042140_1.qa[["baseCalls"]]

## A C G
_
## SRR1293399 1.fastq 10600637 12762822 12873094
## T N
_
## SRR1293399 1.fastq 13753938 9509

O las lecturas ms frecuentes.

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

Podemos ver la frecuencia de cada base en cada posicin de la


lectura. Por ejemplo, para las dos primeras posiciones.

head(SRP042140_1.qa[["perCycle"]]$baseCall,n=10)

## Cycle Base Count lane


## 1 1 _
A 221622 SRR1293399 1.fastq
## 2 1 C 70578 SRR1293399_1.fastq
## 3 1 G 202760 SRR1293399_1.fastq
## 4 1 T 504717 SRR1293399_1.fastq
## 15 1 N 323 SRR1293399_1.fastq
## 19 2 A 350254 SRR1293399_1.fastq
## 20 2 C 97623 SRR1293399_1.fastq
## 21 2 G 280410 SRR1293399_1.fastq
## 22 2 T 271675 SRR1293399_1.fastq
## 33 2 N 38 SRR1293399_1.fastq

head(SRP042140_1.qa[["perCycle"]]$quality,n=10)

## Cycle Quality Score Count lane


## 35 1 B 2 678 SRR1293399_1.fastq
## 44 1 K 11 80 SRR1293399_1.fastq
## 45 1 L 12 3411 SRR1293399_1.fastq
## 46 1 M 13 625 SRR1293399_1.fastq
## 51 1 R 18 137 SRR1293399_1.fastq
## 53 1 T 20 6936 SRR1293399_1.fastq
## 54 1 U 21 907 SRR1293399_1.fastq
## 55 1 V 22 1140 SRR1293399_1.fastq
## 56 1 W 23 88 SRR1293399_1.fastq
## 57 1 X 24 757 SRR1293399_1.fastq

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"

Comprobamos si ya lo hemos bajado previamente. En otro caso lo


baja. 13 13
En cualquier caso, aunque tengamos
una copia local, es conveniente actuali-
zarlo de vez en cuando. La informacin
if(!file.exists('SRAmetadb.sqlite')) sqlFile = getSRAdbFile()
se va actualizando.

Creamos la conexin.14 Desconectamos con


14

SRAdb::dbDisconnect.
sraCon = dbConnect(SQLite(),sqlFile)

Veamos qu tablas podemos manejar con la conexin establecida.

(sraTables = dbListTables(sraCon))

## [1] "col_desc" "experiment"


## [3] "fastq" "metaInfo"
## [5] "run" "sample"
## [7] "sra" "sra_ft"
## [9] "sra_ft_content""sra_ft_segdir"
_ _
## [11] "sra ft segments" "study"
## [13] "submission"

Nos fijamos en la tabla experiment. Veamos sus campos.

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"

Podemos tener informacin de estos campos.

dbGetQuery(sraCon,'PRAGMA TABLE_INFO(experiment)')

Bsqueda por texto completo 15 15


fts3
Para un no experto en SQL16 es la mejor opcin para realizar 16
Como es mi caso.
bsquedas.17 Por ejemplo, buscamos registros que contengan breast Es el modo en que buscamos en
17

cancer exactamente de este modo en registros de las tablas run y Google.

study.

busqueda = getSRA( search_terms = '"breast cancer"',


out_types = c('run','study'), sraCon)

La bsqueda nos ha devuelto un data.frame.


146 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

class(busqueda)

## [1] "data.frame"

El nmero de registros es

dim(busqueda)

## [1] 12089 23

Y las variables que lo forman son

names(busqueda)

## [1] "run_alias" "run"


## [3] "run_date" "updated_date"
## [5] "spots" "bases"
## [7] "run_center" "experiment_name"
## [9] "run_url_link" "run_entrez_link"
## [11] "run_attribute" "study_alias"
## [13] "study" "study_title"
## [15] "study_type" "study_abstract"
## [17] "center_project_name" "study_description"
## [19] "study_url_link" "study_entrez_link"
## [21] "study_attribute" "related_studies"
## [23] "primary_study"

Vamos a limitar algo ms la bsqueda. Buscamos que adems de


referirse a breast cancer contenga el trmino microRNA o bien el
trmino abreviado miR. Tambin completamos las tablas de las que
queremos informacin.

busqueda = getSRA( search_terms = '"breast cancer" AND ("microRNA" OR "miR")',


out_types = c('submission','study','sample','experiment','run'), sraCon)
dim(busqueda)

## [1] 186 66

Tenemos muchos menos registros.18 A cuntos estudios distintos 18


An as nos quedan unos cuantos.
corresponden?

unique(busqueda[,"study"])

## [1] "DRP002326" "DRP002330" "DRP002835"


## [4] "ERP002221" "ERP004396" "ERP004399"
## [7] "ERP013303" "SRP011278" "SRP013022"
## [10] "SRP014142" "SRP016507" "SRP017190"
datos de rnaseq 147

## [13] "SRP018427" "SRP022047" "SRP023533"


## [16] "SRP033584" "SRP034635" "SRP036035"
## [19] "SRP042140" "SRP045204" "SRP051374"
## [22] "SRP060224" "SRP062974"

Veamos el nmero de muestras por estudio.

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

Bajando ficheros SRA Hemos realizado una bsqueda y queremos


bajar los datos para trabajarlos. Nos fijamos en el estudio SRP042140
que hemos visto que tiene 9 muestras. 19 Qu muestras correspon- 19
La referencia original es Pillai et al.
den a este estudio? [2014].

busqueda[busqueda[,"study"] == "SRP042140","sample"]

## [1] "SRS616248" "SRS616242" "SRS616245"


## [4] "SRS616241" "SRS616247" "SRS616246"
## [7] "SRS616243" "SRS616249" "SRS616244"

Los bajamos.

muestras = busqueda[busqueda[,"study"] == "SRP042140","sample"]


rs = listSRAfile(muestras,sraCon,fileType ='sra')

Veamos la primera muestra.

rs[1,]

## sample study experiment run


## 1 SRS616241 SRP042140 SRX547984 SRR1293399
##
## 1 ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/SRX/SRX547/SRX547984/SRR1293399/SRR1
148 bioinformtica estadstica anlisis estadstico de datos micos con rbioconductor

Veamos si estn disponibles realmente estos ficheros ya que


SRAdb::listSRAfile no lo hace.

listSRAfile(muestras,sraCon,fileType = 'sra')

Bajamos los datos.20 20


Paciencia y mucho disco duro.

dirTamiActual = getwd()
setwd(dirTamiData) ##Fijamos dnde queremos los datos
getSRAfile( muestras, sraCon, fileType='sra')
setwd(dirTamiActual)

Podemos bajarlos directamente en formato FASTQ con21 21


No muy recomendable porque son
ficheros mucho ms pesados.
listSRAfile( muestras, sraCon, fileType = 'fastq' )
getSRAfile( muestras, sraCon, fileType='fastq')

Otra opcin ms rpida para bajar los ficheros es utilizar wget.22 22


Que instalamos con apt-get install
Necesitamos las direcciones en que estn los ficheros SRA o FASTQ. wget.

Estas direcciones las hemos obtenido previamente con SRAdb::listSRAfile.


Por ejemplo, la primera secuencia se bajara con:

$wget f t p :// f t p t r a c e . n c b i . nlm . nih . gov/ s r a /sra


, i n s t a n t /reads/ByExp/ s r a /SRX/SRX547/SRX547984/
, SRR1293399/SRR1293399 . s r a

Y hacemos lo mismo con cada uno de los ficheros SRA.

7.6 De SRA a fastq

Lo hacemos con SRA Toolkit.23 Utilizamos la funcin fastq-dump. 23


En Debian/Ubuntu hemos de instalar
el paquete sra-toolkit. Consultar https:
f a s t q dump I s p l i t f i l e s nombre_fichero . s r a //github.com/ncbi/sra-tools/wiki/
Downloads.

Y lo repetimos para cada fichero SRA.


Una opcin que nos lo hace para todos es24 24
Previamente hay que instalar parallel
con apt-get install parallel.
c a t f i l e s | p a r a l l e l j 7 f a s t q dump s p l i t f i l e s
, { } . s r a

donde files es un fichero que tiene en cada lnea el nombre del


fichero sra sin la extensin. En nuestro caso el fichero files es

SRR1293399
SRR1293400
SRR1293401
SRR1293402
SRR1293403
datos de rnaseq 149

SRR1293404
SRR1293405
SRR1293406
SRR1293407

7.7 Control de calidad de las lecturas

7.8 STAR y samtools

Veamos cmo alinear y contar utilizando conjuntamente STAR y


samtools.

1. Instalamos STAR.

2. Copiamos la versin Linux en el directorio donde tenemos los


ficheros SRA.

3. Creamos dos subdirectorios con los nombres aligned y fastq.

4. Nos bajamos (con wget) de http://labshare.cshl.edu/shares/


gingeraslab/www-data/dobin/STAR/STARgenomes/ENSEMBL/homo_
sapiens la ltima versin.25 25
En el momento de escribir
ENSEMBL.homo_sapiens.GRCh38.release-
5. Descomprimimos el fichero anterior y extraemos los ficheros del 79.
archivo tar en el subdirectorio ENSEMBL.homo\_sapiens.release-75.
6. Supongamos que:
a) El ejecutable STAR lo tenemos en nuestro directorio de trabajo.
b) ENSEMBL.homo\_sapiens.release-75 es un subdirectorio de
nuestro directorio de trabajo.
c) Los ficheros FASTQ los tenemos en el subdirectorio fastq.
d) Pretendemos guardar el fichero SAM en el subdirectorio
aligned.

Entonces el cdigo (utilizando STAR) para generar el fichero SAM


a partir del FASTQ sera el siguiente

. /STAR genomeDir ENSEMBL . homo_sapiens . r e l e a s e


, 75 r e a d F i l e s I n
f a s t q /SRR1293399_1 . f a s t q runThreadN 12
, o u tF i l e N a me P r e f ix a l i g n e d /SRR1293399_1 .

Podemos comprobar que el fichero generado es SRR1293399_1.Aligned.out.sam.


Y el cdigo anterior lo hemos de repetir para cada uno de nuestros
ficheros FASTQ.
150 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

De SAM a BAM utilizando Samtools.


Utilizamos Samtools para transformar los ficheros SAM en ficheros
BAM.
samtools s o r t view bS a l i g n e d /SRR1293399_1 . Aligned
, . out . sam o a l i g n e d /SRR1293399_1 . bam

Contando las lecturas con Rsamtools.

1. Suponemos que los ficheros bam generados previamente estn en


el subdirectorio aligned de nuestro directorio de trabajo.

2. Creamos el fichero bamfiles.txt que tenga en cada lnea el nom-


bre de uno de los ficheros BAM. Por ejemplo, las tres primeras
lneas de este fichero podran ser
SRR1293399_1 . bam
SRR1293400_1 . bam
SRR1293401_1 . bam

3. Creamos la lista de ficheros bam.

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)

4. Contamos las lecturas.

a) Cargamos Carlson et al. [2016, GenomicFeatures].

library(GenomicFeatures)

b) Leemos el fichero GTF/GFF que hemos bajado previamente.

gtffile = paste(dirTamiData,
"ENSEMBL.homo_sapiens.release-75/Homo_sapiens.GRCh37.75.gtf",sep="")

c) txdb = makeTxDbFromGFF(gtffile, format="gtf")


genes = exonsBy(txdb, by="gene")
library(GenomicAlignments)
SRP042140.counts = summarizeOverlaps(features = genes, read=bamLst,
mode="Union",
singleEnd=TRUE, ## No son lecturas apareadas
ignore.strand=TRUE,
datos de rnaseq 151

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

Mediante la lnea vertical mostramos en qu puntos hay una co-


rrespondencia correcta mientras que con un guin en una u otra
secuencia indicamos en qu posiciones hemos debido de incorporar
un hueco para poder hacer corresponder ambas secuencias.
Notemos que no estamos seguros de que efectivamente la secuen-
cia corta se haya originado en este punto. Es una hiptesis. La mejor
que se puede conjeturar pero no es seguro ni mucho menos. En mu-
chas ocasiones no se puede encontrar una correspondencia.
Dos tipos de alineamientos son considerados: alineamiento de
extremo a extremo o alineamiento global30 y alineamiento local.31 En 30
End-to-end alignment.
la primera opcin toda la secuencia corta es alineada. En el segun- 31
Local alignment.
do tipo permitimos que uno o los dos extremos contengan bases no
alineadas. En Bowtie2 la opcin local se indica --local para el ali-
neamiento local mientras que la opcin global se asume por defecto.
Hemos de evaluar la calidad del alineamiento. Para ello definimos
una puntuacin asociada a cada posible correspondencia. Lo que
152 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

podemos llamar una funcin objetivo. La idea es que cuanto mayor


sea la funcin objetivo mejor es el alineamiento. Realmente penaliza-
mos cada error en la correspondencia. Tendremos una penalizacin
por correspondencia errnea, una penalizacin por cada hueco. En
el caso de alineamiento local sumaremos un valor por cada corres-
pondencia. Finalmente el valor de la funcin objetivo nos cuantifica la
calidad final de la correspondencia conseguida. En concreto se consi-
deran los siguientes valores que se suman (bajando o subiendo) para
calcular el valor de la funcin objetivo.

ma Sumamos un valor positivo por cada correspondencia (para


alineamiento local).

mp Penalizacin (restamos) por una correspondencia errnea.

np Penalizacin por tener un valor N (esto es una base no especifi-


cada) en la secuencia corta o en la larga de referencia.

rdg Penalizacin por hueco en secuencia corta.

rfg Penalizacin por hueco en secuencia de referencia.

Obviamente mediante algn procedimiento encontraremos siempre


una correspondencia. No necesariamente esta correspondencia la
hemos de considerar suficientemente buena. Cundo la considerare-
mos aceptable? Lo que se hace es fija un umbral por debajo del cual
el alineamiento no se acepta. Este umbral lgicamente ha de depen-
der de la longitud de la lectura corta. El valor de este umbral que
por defecto (aunque es configurable) tiene definido Bowtie2 es, para
alineamiento global,
0,6 0,6 L, (7.2)
siendo L la longitud de la lectura. Para alineamiento local el valor es

20 + 8 ln( L). (7.3)

Lo podemos configurar con la opcin --score-min.


Podemos alinear de un modo nico? Por supuesto que no. Pen-
semos en zonas de la secuencia en donde se repiten mucho los ele-
mentos. Si tenemos secuencias cortas entonces podremos alinear
(perfectamente) de distintos modos. Tendremos distintos alineamien-
tos igualmente buenos. Se plantea el problema de elegir entre estos
alineamientos. Esto se puede hacer utilizando las medidas de calidad
de la correspondencia.
Qu son lecturas apareadas?32 Son pares de lecturas cortas o se- Paired-end o mate-pair. No es lo
32

cuencias cortas de las cuales conocemos a priori su posicin relativa mismo.

y la distancia que las separa en la lectura de DNA. Cuando tenemos


lecturas apareadas tendremos dos ficheros que incluyen el primer y
datos de rnaseq 153

el segundo elemento del par, uno en cada fichero. En concreto la mis-


ma lnea en cada fichero indica cada una de las componentes del par
de lecturas. En Bowtie2 se utilizan los argumento -1 y -2 para indicar
el primer y segundo fichero. Cuando se realiza el alineamiento de un
par de secuencias cortas en el fichero SAM resultante se indica en los
campos RNEXT y PNEXT el nombre y la posicin del otro elemento del
par. Tambin se indica la longitud del fragmento de DNA del cual se
secuenciaron los dos fragmentos. Cuando se realiza el alineamiento
de un par de lecturas este se puede producir de un modo concordan-
te o de un modo discordante. En un modo concordante los dos ele-
mentos del par se alinean verificando lo que se espera en orientacin
y distancia entre ellos. El alineamiento es discordante entonces tene-
mos para cada uno un alineamiento nico pero no se verifican las
restricciones de orientacin y distancia. Por defecto, Bowtie2 busca
tanto alineamientos concordantes como alineamientos discordantes.
Con la opcin --no-discordant solamente busca concordantes.
En la opcin por defecto, Bowtie2 realiza un alineamiento mixto.
En esta opcin primero busca alinear el par de lecturas de un modo
concordante. Si no lo logra entonces busca alinear cada una de ellas
de un modo discordante. Si no queremos la segunda parte de la
bsqueda podemos eliminarla con la opcin --no-mixed.
Bowtie2 busca alineamientos vlidos para cada lectura. Cuando
encuentra un alineamiento vlido sigue buscando otros que sean al
menos tan buenos como el que ha encontrado. Tiene unos controles
para dejar de buscar. Cuando cesa la bsqueda utiliza los mejores
alineamientos que ha encontrado para evaluar la calidad de la corres-
pondencia encontrada (el campo MAPQ en el formato SAM).
En http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml
se tiene una muy buena exposicin de todas las opciones que ofrece
este programa y es ms que recomendable su lectura.

Ejemplo 3. Vamos a realizar el alineamiento utilizando Bowtie2.

1. Los datos corresponden a Illumina.

2. Bajamos el fichero de ndices de http://support.illumina.com/


sequencing/sequencing_software/igenome.html.

3. En concreto bajamos \Homo_sapiens_Ensembl_GRCh37.tar.gz.

4. Ejecutamos en lnea de comandos.

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

7.10 Utilizando tophat y samtools

Seguimos los siguientes pasos.

1. Necesitamos el genoma humano de referencia. Vamos a utilizar


GRCh37.

2. Lo podemos encontrar en http://ccb.jhu.edu/software/tophat/


igenomes.shtml. Lo bajamos.

3. Descomprimimos el fichero anterior.

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

Antes de realizar el alineamiento necesitamos el genoma humano


de referencia. Se utiliza GRCh37. En concreto vamos a utilizar el ndi-
ce Bowtie que podemos encontrar en http://ccb.jhu.edu/software/
tophat/igenomes.shtml.
Descomprimimos el fichero anterior.

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

7.11 Datos ReCount

En http://bowtie-bio.sourceforge.net/recount/ tenemos datos


en formato Biobase::ExpressionSet ya preparados para analizarlos.
En Frazee et al. [2011] tenemos una explicacin de estos datos. De
estos utilizaremos los datos maqc. La razn es que los datos no es-
tn agregados entre distintas rplicas tcnicas. El ExpressionSet lo
podemos bajar de http://bowtie-bio.sourceforge.net/recount/
ExpressionSets/maqc_eset.RData.
datos de rnaseq 155

load("maqc_eset.RData")

La variable fenotpica que nos define dos grupos es tissue

library(Biobase)
pData(maqc.eset)[,"tissue"]

## [1] brain brain brain brain brain brain brain


## [8] UHR UHR UHR UHR UHR UHR UHR
## Levels: brain UHR

7.12 GSE37211: paquete parathyroidSE

Estos datos corresponden al experimento con nmero de acceso


GEO GSE37211. En la vieta del paquete Love [2015b, parathyroidSE]
tenemos una descripcin detallada para obtener los conteos a nivel
de gen o de exon partiendo de los ficheros originales sra.33 Ya los Primero hay que bajarlos paciente-
33

tenemos en el paquete Love [2015b, parathyroidSE]. mente.

data(parathyroidGenesSE,package="parathyroidSE")
se = parathyroidGenesSE

Son datos relativos a los genes. Qu clase tenemos?

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

La matriz con los conteos nos la da GenomicRanges::assay.35 35


Es la anloga a Biobase::exprs para
Biobase::ExpressionSet.
assay(se)

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]

## [,1] [,2] [,3]


## ENSG00000000003 792 1064 444
## ENSG00000000005 4 1 2
## ENSG00000000419 294 282 164

Tenemos los metadatos de las columnas o variables fenotpicas o


covariables asociadas a las muestras con GenomicRanges::coldata.36 36
Corresponde con Biobase::pData.

colData(se)

Es un IRanges::DataFrame.

class(colData(se))

## [1] "DataFrame"
## attr(,"package")
## [1] "IRanges"

Por ejemplo, podemos ver los nombres de las variables fenotpicas


con

names(colData(se))

## [1] "run" "experiment" "patient"


## [4] "treatment" "time" "submission"
## [7] "study" "sample"

Y acceder a los valores de la variable treatment con

colData(se)[,"treatment"]

## [1] Control Control DPN DPN OHT


## [6] OHT Control Control DPN DPN
## [11] DPN OHT OHT OHT Control
## [16] Control DPN DPN OHT OHT
## [21] Control DPN DPN DPN OHT
## [26] OHT OHT
## Levels: Control DPN OHT

o bien con (no mostrado)

colData(se)$treatment

La informacin sobre las filas que, en este caso, corresponde con


genes.
datos de rnaseq 157

rowRanges(se)

Por tanto, las filas de un SummarizedExperiment es un Genomi-


cRanges::GRangesList de modo que cada fila es un GenomicRan-
ges::GRanges indicando los exones que se utilizaron para contar las
secuencias de RNA. Los nombres de los genes los podemos obtener
con

rownames(se)

Los primeros con

head(rownames(se))

## [1] "ENSG00000000003" "ENSG00000000005"


## [3] "ENSG00000000419" "ENSG00000000457"
## [5] "ENSG00000000460" "ENSG00000000938"

37 37
En esta seccin hemos visto cmo
manejar un la clase GenomicRan-
ges::SummarizedExperiment y sus
7.13 GSE64099 mtodos asociados.

Bajamos los datos de GEO.


wget f t p . n c b i . nlm . nih . gov/geo/ s e r i e s /GSE64nnn/
, GSE64099/suppl/GSE64099_RAW . t a r
t a r xvf GSE64099_RAW . t a r
gzip d *
rm GSE64099_RAW . t a r

Se tienen las siguientes muestras:

GSM1564328_2086.txt GSM1564331_241.txt GSM1564329_2433.txt


GSM1564332_1932.txt GSM1564327_1934.txt GSM1564330_3225.txt
GSM1564333_1940.txt

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

datosfenotipo = new("AnnotatedDataFrame", data = type)


sampleNames(datosfenotipo)
datosexperimento = new('MIAME',name='GSE64099',
lab='Molecular Medicine Division, The Walter and Eliza Hall Institute
of Medical Research',
contact ='mritchie@wehi.edu.au',
title = ' Transcriptome profiling for genes transcriptionally
regulated by Smchd1 in lymphoma cell lines',
url = 'http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE64099')
gse64099 = new("ExpressionSet",exprs=exprs0,phenoData = datosfenotipo,
experimentData = datosexperimento,annotation = "MusMusculus")

Eliminamos los genes que no tienen ninguna lectura alineada.


Todos estos genes no tienen inters cuando estudiemos la posible
expresin diferencial.

nullsum = apply(exprs(gse64099),1,sum)==0
gse64099 = gse64099[!nullsum,]

7.14 GSE63776 a partir de conteos

En ocasiones tampoco es necesario realizar todo el procesado


que hemos visto. Esto es, no necesitamos partir de las libreras de
lecturas cortas y realizar todo el proceso de alineamiento. Los propios
autores del estudio original han puesto a nuestra disposicin las
conteos. En este caso lo ms cmodo es utilizar un ExpressionSet
para almacenar la informacin. Como ejemplo los datos GSE63776.

1. Los bajamos de http://www.ncbi.nlm.nih.gov/geo/download/


?acc=GSE63776&format=file&file=GSE63776%5FPANC1%5Fcounts%
2Etxt%2Egz.38 Vamos a trabajar con los conteos. 38
Casi mejor poner el cdigo de acceso
GSE63776 en Google y tenemos la
2. Descomprimimos el fichero GSE37211_count_table.txt.gz. direccin.

3. Abrimos el fichero con un editor39 y aadimos al principio de la 39


Bloc de nota, gedit, emacs
primera lnea la palabra Gene. Guardamos el fichero con la modifi-
cacin.
4. Leemos los datos.

x = read.table(file="GSE63776_PANC1_counts.txt",header=TRUE)

5. la primera columna es el nombre del gen por lo que la eliminamos


para quedarnos con la matriz de expresin (conteos).
datos de rnaseq 159

exprs0 = as.matrix(x[,-1])
rownames(exprs0) = x[,"Gene"]

6. Construimos los metadatos o datos fenotpicos.

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")

7.15 Normalizacin de RNA-seq

El mtodo que vamos a proponer es 40 . 40


Alicia Oshlack, Mark Robinson, and
Cules son los efectos que pueden influir en las distintas mues- Matthew Young. From rna-seq reads to
differential expression results. Genome
tras y que precisen algn tipo de correccin previa? Biology, 11(12):220, 2010. ISSN 1465-
6906. doi: 10.1186/gb-2010-11-12-220.
Profundidad de secuenciacin o tamao de la librera 41 Estamos mues- URL http://genomebiology.com/2010/
11/12/220
treando del total de molculas disponibles. El tamao de nuestra 41
Sequencing depth, size library.
muestra es el total de lecturas. Este total de lecturas es distinto
para las distintas muestras. En algunos procedimientos para an-
lisis de la expresin diferencial este efecto no necesitar correccin
previa pues el propio mtodo incorpora en su modelo estocstico
la distinta profundidad.
160 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Composicin del RNA Mediante la tcnica RNASeq tenemos una me-


dia de la abundancia relativa de cada gen en una muestra de RNA.
Pero no tenemos una medida de la cantidad total de RNA por
clula. Supongamos que tenemos una pequea cantidad de ge-
nes que se expresan mucho en una muestra pero no en otra. En la
muestra en donde se expresan mucho consumen una parte fun-
damental de la librera de lecturas de modo que otros genes que
se expresen en esa muestra pero en mucho menor medida apenas
aparecern. De hecho, veremos que se expresan mucho menos de
lo que realmente lo hacen porque los otros han consumido una
parte importante del total de lecturas. En otras muestras donde no
aparecen tan expresados esto no ocurrir. Si no se ajusta la compo-
sicin del RNA los otros genes aparecen falsamente infraregulados
en la muestra donde unos pocos se expresan mucho. El mtodo
que vamos a utilizar para corregir este efecto es el la media ajusta-
da de M-valores (TMM)42 entre cada par de muestras. 42
Trimmed mean of M-values (TMM).

Contenido GC El contenido GC de un gen no cambia entre muestras.


Para un anlisis de expresin diferencial no debiera influir. Algu-
nos autores han indicado que puede que esto no sea tan cierto.
Longitud del gen Genes ms largos tendern a tener ms lecturas
alineadas. Otra vez, entre muestras no cambia este factor y para un
anlisis de expresin diferencial no debiera tener influencia.

Sobre la longitud del gen. En Oshlack and Wakefield [2009] se comen-


ta e ilustra el problema. Qu efecto cabe experar cuando tenemos
genes con distinta longitud. En RNASeq lo que tenemos son frag-
mentos de transcritos. Si el transcrito es ms largo el nmero de
lecturas que producen es mayor. Es cierto que si queremos comparar
entre muestras este efecto es el mismo. La longitud es la misma en
todas las muestras. Sin embargo, al tener ms lecturas la potencia
del test es mayor para genes ms largo y por ello encontraremos ms
genes con expresin diferencial entre los genes ms largos. Un mayor
tamao muestral se asocia a una mayor probabilidad de rechazar la
hiptesis nula de igualdad de las medias para una misma diferencia
entre medias. De hecho, se propone en el trabajo indicado una simple
formalizacin de este hecho. Denotamos por X la variable aleatoria
que nos da el nmero de lecturas alineadas sobre un gen. Olvidan-
de otros posibles sesgos podemos asumir que el valor medio de X
depende del total de transcritos N y de la longitud del gen segn la
siguiente relacin
X = EX = cNL,

siendo c un valor constante. En resumen asumimos que la media de


lecturas es proporcional al tamao de la librera y a la longitud del
datos de rnaseq 161

gen. Si se asume que la media y la varianza son iguales43 entonces 43


Lo cual es cierto bajo la hiptesis de
que la variable X sigue una distribucin
var ( X ) = X2 = cNL, de Poisson.

Si consideramos la variable X en dos muestras distintas tendremos Xi


con i = 1, 1 y tamaos de librera Ni con i = 1, 2. Si utilizamos para
contrastar la igualdad de medias el estadstico

X1 X2
.
cN1 L + cN2 L

La potencia del test depende del cociente entre la media y la desvia-


cin estndar de D = X1 X2 44 que viene dado por 44
O error estndar.

cN L cN2 L
= 1 L.
cN1 L + cN2 L

Es decir, es proporcional a la raiz cuadrada de la longitud del gen.


Puede pensarse que un correccin simple como sera dividir el conteo
por la longitud del gen corrige este efecto. Si aplicamos esta correc-
cin no se resuelve el problema ya que entonces la diferencia sera
D 0 = XL1 XL2 . Como es bien conocido45 tenemos que la media y 45
25
varianza de Xi /Ni son
 
Xi EXi Xi var ( Xi )
E = y var =
L L L L2

Por tanto el cociente entre la media y la desviacin estndar de D 0 no


se modifica y vale

cN L cN2 L
= 1 L.
cN1 L + cN2 L

7.15.1 Mtodo TMM: Media ajustada de M-valores


Es, quizs, el mtodo ms popular de normalizacin. Fue pro-
puesto en Robinson and Oshlack [2010]. Comentan los autores en
Robinson and Oshlack [2010, pg. 2] el siguiente ejemplo hipottico.
Tenemos dos experimentos de secuenciacin de RNA o muestras.
Llamamos a estas dos muestras A y B. Supongamos dos conjuntos
de genes disjuntos y con el mismo nmero de elementos: S1 y S2 . El
primer conjunto se expresa igualmente en A y B, es decir, tenemos
el mismo nmero de transcritos en ambas muestras. Sin embargo, S2
solamente se expresa en la muestra A y no en la muestra B. Adems
asumimos que no se expresa ningn otro gen. Si la profundidad de
secuenciacin es la misma en las dos muestras entonces el nmero
de transcritos que observaremos de un gen de S1 ser la mitad en
A que en B aunque sabemos que se expresa exactamente igual. En
resumen, en la poblacin (total de transcritos) el nmero total de
162 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

transcritos de este gen es el mismo en ambas muestras. La probabili-


dad de observar uno de ellos depende de su frecuencia y del nmero
de transcritos observados. Por ello, depende de que otros genes se
expresen ms o menos. En resumen, de la composicin del RNA.
Sea Xij (xij ) el conteo aleatorio (observado) del gen i en la muestra
j. Denotamos Li la longitud del gen i y m j es el total de lecturas de la
librera j (o tamao de la librera j). En Robinson and Oshlack [2010]
se asume que la media de Xij verifica
ij Li
 
E Xij = mj,
cj

siendo c j = iN=1 ij Li . Notemos que c j nos est representando el


total de RNA en la muestra. No se asume ninguna distribucin de
probabilidad especfica para Xij . La produccin total de RNA, c j ,
no es conocida. Sin embargo, s es fcil estimar el cociente de estos
valores para dos muestras, es decir, estimar el cociente f j = c j /c j0 .
Elegimos una muestra como muestra de referencia. Por ejemplo, la
muestra r denota a partir de ahora la muestra tomada (arbitrariamen-
te) como de referencia.
Nos fijamos en la muestra j y vamos a determinar la constante por
la que multiplicaremos los conteos originales. En lo que sigue tanto j
como r son fijos y las cantidades definidas dependen de i que denota
el gen. Se define

(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

os y el mismo porcentaje de los ms grandes. Lo mismo hacemos mantenemos fijos j y r.

para los valores Ai . Tambin eliminamos aquellos ndices i tales que


xij = 0 o bien xir = 0. El conjunto de ndices i restante lo denotamos
por G . Finalmente, el factor de normalizacin sera
(r ) (r )
(r ) iG wij Mij
log2 ( TMM j ) = (r )
iG wij
con
(r ) m j xij mr xir
wij = + .
m j xij mr xir
La muestra de referencia r es fija y lo que acabamos de calcular es el
factor por el que multiplicamos los conteos originales de la muestra j.
(r ) (r )
Este factor viene dado por TMM j .47 47
Obviamente tenemos que TMMr =
1 y esta muestra de referencia no se
normaliza.
datos de rnaseq 163

7.15.2 Medidas de abundancia de la transcripcin


En esta seccin cuando hablamos de caracterstica nos estamos
refiriendo al exn, gen o regin del genoma en que tenemos inters.

RPKM Fue propuesto en Mortazavi et al. [2008]. Supongamos que


denotamos el conteo de inters por C. Es el nmero de lecturas ali-
neadas sobre la caracterstica de inters (exon, gen, etc.). El total de
lecturas que podemos alinear48 es N (o tamao de la librera). Y de- 48
Mapear en mala traduccin.
notamos por L la longitud de la caracterstica de inters en bp. Se
define el RPKM como el siguiente cociente

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 Estudios de caso

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.

Podemos bajar los datos accediendo a las direcciones indicadas y


con el propio navegador. Suponemos que fijamos el directorio de
trabajo donde tenemos los ficheros sra que acabamos de bajar.

2. Ejecutamos (y lo repetimos para cada fichero sra)

f a s t q dump I s p l i t f i l e s SRR2549634 . s r a

3. Bajamos el fichero de ndices para poder trabajar con Bowtie2.


Nuestro datos corresponden a Sacaromices cerevisiae. En http:
//support.illumina.com/sequencing/sequencing_software/
igenome.html los tenemos para distintas especies. En concreto,
bajamos ftp://igenome:G3nom3s4u@ussd-ftp.illumina.com/
Saccharomyces_cerevisiae/Ensembl/R64-1-1/Saccharomyces_
cerevisiae_Ensembl_R64-1-1.tar.gz.
164 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

4. Descomprimimos el fichero de ndices y sacamos los ficheros.

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

Tenemos ahora un directorio Saccharomyces\_cerevisiae_Ensembl_R64-1-1.

5. Alienamos las lecturas. Para ello ejecutamos, para cada fiche-


ro fastq, lo siguiente sustituyendo los directorios por los co-
rrespondientes a nuestro caso. Supongamos que denotamos
dirIndice donde tenemos los ndices. En mi caso dirIndice es
/DOCENCIA/tami-data/Saccharomyces_cerevisiae/Ensembl/R64-1-
1/Sequence/Bowtie2Index/genome. Ejecutamos lo siguiente sustituyen-
do dirIndice por el directorio correspondiente.

bowtie2 x d i r I n d i c e U SRR2549634_1 . f a s t q S
, SRR2549634_1 . sam

6. Repetimos el punto anterior para cada uno de los ficheros fastq.


Notemos que al tener lecturas simples (no apareadas) solamente
tenemos un fichero fastq por muestra.

7. Se obtienen unos buenos porcentajes de lecturas alineadas supe-


riores al 95 % en todos los casos.

8. Transformamos de formato sam a formato bam ordenado utilizan-


do samtools.

samtools view bS SRR2549634_1 . sam | samtools


, s o r t SRR2549634_1

Y como siempre repetimos para cada uno de los ficheros sam.

9. Ejecutamos el siguiente cdigo que nos produce el Summarize-


dExperiment con el que podemos trabajar.

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 Run Treatment Rep


SRR2549634_1.bam GSM1900735 SRR2549634 0 1
SRR2549636_1.bam GSM1900737 SRR2549636 0 3
SRR2549638_1.bam GSM1900739 SRR2549638 1 2
SRR2549635_1.bam GSM1900736 SRR2549635 0 2
SRR2549637_1.bam GSM1900738 SRR2549637 1 1
SRR2549639_1.bam GSM1900740 SRR2549639 1 3

Creamos un DataFrame50 con estas variables. 50


Que no es un data.frame.

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")

Los datos SRP064411_SE los tenemos en ?, tamidata.

7.17 Cufflinks

En esta seccin vamos a utilizar Samtools, TopHat, Bowtie y ?,


CummeRbund. La referencia bibliogrfica obligada es ?.

apt g e t i n s t a l l samtools bowtie bowtie2 t o p h a t


, c u f f l i n k s
Parte III

Expresin diferencial
8
Expresin diferencial marginal

8.1 Introduccin

Para cada uno de los genes (exones, o en general caractersticas


genmicas) tenemos un valor numrico (expresin) que nos indica
abundancia de copias de esta caracterstica. En resumen abundancia
de la caracterstica en la que estamos interesados. Tenemos este va-
lor observado para distintas muestras. De cada una de las muestras
tenemos a su vez variables que las describen: tiempos, tamaos ce-
lulares, temperatura, etc. A estas variables las llamaremos en lo que
sigue covariables. Estas covariables pueden ser categricas, num-
ricas o tiempos de supervivencia censurados. Si la covariable tiene
dos categoras entonces nos define dos grupos (por ejemplo, control
y tratamiento). El caso en que queremos comparar dos grupos es el
ms frecuente y por ello siempre le daremos una mayor atencin.
El problema que se conoce como expresin diferencial se puede
traducir a saber si hay algn tipo de asociacin entre las expresiones
observadas y los valores de la covariable. Si la covariable define dos
categoras entonces la pregunta de la asociacin covariable-expresin
se puede formular como: Hay diferencias entre la expresin de ge-
nes entre dos grupos considerados? Dicho de otro modo, la expresin
es distinta bajo los tratamientos que estamos considerando.
En un primer momento vamos a adoptar la aproximacin gen-a-
gen. Buscamos genes que se expresan diferencialmente sin atender a
las interacciones que puedan existir entre los distintos genes, que las
hay y las consideraremos ms adelante.
Intentaremos ir planteando las cuestiones (muy) lentamente ilus-
trando continuamente lo que hacemos con R/Bioconductor.

8.2 Algo de notacin


1 1
Una buena notacin es fundamental
cuando se quieren expresar las cosas
con algo de formalidad y rigor.
170 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

En lo que sigue denotaremos la matriz con los datos de expre-


sin de los distintos genes como X = [ xij ]i=1,...,N;j=1,...,n donde el
valor xij nos da el nivel de expresin del gen i-simo i en la muestra
j.2 Asociada a la muestra j tenemos una covariable y. El valor de la 2
O de un modo ms genrico la abun-
covariable y en la muestra j la vamos adenotar por y j .3 Cuando consi- dancia de la caracterstica en la muestra
j.
deremos todos los niveles de expresin en una fila, esto es, los niveles 3
Por ejemplo, si estamos comparando
de expresin de un gen en todas las muestras o perfil de expresin los niveles de expresin en dos grupos
del gen denotaremos por xi = ( xi1 , . . . , xin ) T .4 A veces denotaremos (un grupo control y un grupo de
(r ) enfermos por ejemplo) entonces y j
xi = ( xi1 , . . . , xin ) T . De un modo anlogo cuando consideremos tomar el valor 1 si est en el primer
los niveles de expresin en una muestra de todos los genes entonces grupo (control) y valor 2 si est en el
(c) segundo grupo (valor 2).
denotaremos por x j = ( x1j , . . . , x Nj ) T . 4
Consideramos vectores columna de
Como es de uso habitual en Estadstica denotaremos modo que con el signo T denotamos el
vector transpuesto.
N n
x j = xij ; xi = xij ,
i =1 j =1

N xij n xij
x j = N
; xi = n
.
i =1 j =1

De un modo similar, si consideramos un subconjunto de genes


I {1, . . . , N } o bien un subconjunto de muestras J {1, . . . , n}
denotamos
x I j = xij ; xiJ = xij ,
i I j J
xij xij
x I j = |I| ; xiJ = | J| .
i I j J

8.3 Seleccin no especfica o filtrado independiente


5 5
El material de esta seccin se ha
obtenido de Hahne et al. [2008, captulo
5] y Gentleman et al. [2016]. Como
La mayor parte de los genes no se expresan de un modo dife- material complementario es muy
renciado entre condiciones. Y hay muchos.6 Ms genes evaluados interesante Bourgon et al. [2010].
simultneamente suponen una dificultad mayor en el tratamiento esta-
6
A veces uno piensa que demasiados.

dstico posterior. Por ello si podemos de un modo simple quitar genes


que no parecen tener actividad pues mucho mejor.7 7
Aunque esto puede tener muchos
Es costumbre realizar una preseleccin, un filtrado que no utilice riesgos como descartar genes que
actan conjuntamente con otros y
informacin de la covariable y. Utilizamos el perfil de expresin del marginalmente no tengan una actividad
gen pero no informacin sobre las muestras, la posible clasificacin apreciable. Es pues algo peligroso
eliminar genes sin tener muy claro
de muestras en distintos grupos. A este filtrado se le da en la lite- como lo hacemos.
ratura la denominacin de filtrado independiente o bien seleccin no
especfica.
Veamos un posible mtodo. Consideramos el gen i-simo y to-
mamos una medida de localizacion como la mediana. Denotamos
este valor por ui . Determinamos un cierto percentil de estos valores
expresin diferencial marginal 171

ui . Por ejemplo, si denotamos por p1 el orden del percentil entonces


q p1 (u) sera el correspondiente percentil de orden p1 de los valo-
res ui . Mantendremos los genes tales que su valor ui sea mayor que
q p (u). Ahora consideramos una medida de dispersin como el coe-
ficiente intercuartlico. Del mismo modo, vi sera el coeficiente inter-
cuartlico del i-simo gen y el correspondiente percentil sera q p2 (v)
donde el orden p2 no tiene porqu coincidir con p1 . Nos quedamos
con los genes en el siguiente conjunto

{i : i = 1, . . . , N; ui q p1 (u); vi q p2 (v)},

es decir, aquellos que tienen un nivel de expresin alto y una variabi-


lidad alta. En otras palabras, genes que se expresan y que lo hacen de
un modo variable en las distintas muestras.
En el mtodo que acabamos de explicar podemos sustituir la me-
diana como localizacin y el rango intercuartlico como dispersin
por la media y la desviacin estndar.
Otro procedimiento que se ha propuesto y utilizado con frecuencia
es que un gen se exprese con claridad en algunas muestras, lo que
podemos llamar el mtodo k-sobre-A. La idea es simple, un gen lo
conservamos si en al menos k muestras tiene un nivel de expresin
por encima de un valor mnimo A.
En lo que sigue vemos cmo utilizar estas ideas con R/Bioconduc-
tor. En 8.3.1 se propone una opcin muy sencilla para preseleccio-
nar genes utilizando simplemente la funcin apply. En 8.3.2 utili-
zamos el paquete Gentleman et al. [2016, genefilter]. Es ms potente
pero con ms compleja de utilizar. Finalmente en 8.3.3 utilizamos la
funcin genefilter::nsFilter. Es una opcin muy sencilla de utilizar.
Vamos a abordar el problema con los datos ALL que tenemos en
el paquete Li [2009, ALL]. Les aplicamos la seleccin de muestras
comentada en 5.4.

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)]

Podemos probar distintas opciones.

8.3.1 Utilizando apply


Vamos a implementar un par de procedimientos de seleccin
independiente con la funcin apply.
172 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Un procedimiento muy bsico puede ser calcular para el rango


intercuartlico del perfil de expresin de cada gen.

bcrneg.iqr = apply(exprs(bcrneg),1,IQR)

Y luego podemos determinar el cuantil (por ejemplo, el percentil


0.5 o mediana) de los rangos intercuartlicos. Si ests por encima de
este percentil conservamos el gen. De lo contrario, no lo considera-
mos en lo que sigue.

sel.iqr = (bcrneg.iqr > quantile(bcrneg.iqr,0.5))

Una idea como la que acabamos de aplicar para seleccionar genes


tiene el inconveniente de que si un grupo tiene pocos datos entonces
aunque hubiera una expresin diferencial la variabilidad total no
tiene porqu ser muy grande.
Ahora filtramos atendiendo a la mediana del perfil de expresin.

bcrneg.median = apply(exprs(bcrneg),1,median)
sel.median = (bcrneg.median > quantile(bcrneg.median,0.5))

Y nos quedamos con los genes que verifican ambas condiciones.


Nuestro ExpressionSet original es bcrneg, cmo nos quedamos con
estos genes y todas las muestras? Con el siguiente cdigo.

bcrneg1 = bcrneg[sel.iqr & sel.median,]

Media y desviacin estndar


Sustituimos mediana y rango intercuartlico por media y desvia-
cin estndar respectivamente.
Es claro que podramos sustituir la desviacin estndar por alguna
otra medida de variabilidad, por ejemplo, el rango intercuartlico. El
mtodo anterior se podra implementar con el siguiente cdigo.

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

mnimo es c y tenemos n muestras podemos pedir que un gen deter-


minado se considere activo si en al menos k muestras del total de n
su nivel de expresin supere este nivel mnimo de actividad.
Cmo hacerlo con R? Empezamos fijando el nivel mnimo c. Y
cmo? Podemos ver los percentiles de todas las expresiones (todos
los genes y todas las muestras).

quantile(exprs(bcrneg))

## 0% 25% 50% 75% 100%


## 1.984919 4.117796 5.468801 6.832439 14.044896

Nos quedamos con la mediana para c.

c = 5.468801

Determinamos qu niveles de expresin lo superan.

overc = exprs(bcrneg) > c

Podemos ver los resultados para la fila 433.

overc[433,]

Determinamos el nmero de muestras por fila que superan el


valor c. Notemos que aplicamos una suma. Cuando sumamos un
vector lgico (con valores TRUE y FALSE) entonces el valor TRUE se
interpreta como el nmero 1 y el valor FALSE se interpreta como 0.

count.c = apply(overc,1,sum)

Por ejemplo, las primeras filas son

head(count.c)

## 1000_at 1001_at 1002_f_at 1003_s_at 1004_at


## 79 3 0 77 76
## _
1005 at
## 79

Y finalmente determinamos si estamos por encima de 5 muestras.

sel.c = count.c >= 5

Y veamos cuntos genes conservamos.


174 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

table(sel.c)

## sel.c
## FALSE TRUE
## 4736 7889

Una vez elegido un procedimiento de los comentados eliminamos


aquellos genes que no pasan el criterio de seleccin. Y con los genes
que nos quedan seguiramos estudiando si hay o no expresin dife-
rencial. Observemos que no hemos utilizado para nada los grupos
que pretendemos comparar.

8.3.2 Utilizando genefilter


En la anterior seccin utilizamos funciones bsicas de R para reali-
zar la seleccin no especfica. Podemos utilizar un paquete diseado
para esto. El paquete genefilter Gentleman et al. [2016] nos permite
implementar distintos procedimientos de filtrado independiente de
un modo sencillo.
Seguimos utilizando los datos del ExpressionSet bcrneg. Supon-
gamos un procedimiento de filtrado no especfico tan simple como el
siguiente: mantendremos aquellos genes tal que su nivel de expresin
es al menos de 200 en al menos 5 de las muestras. Para hacer esto con
el paquete Gentleman et al. [2016, genefilter] hemos de realizar tres
pasos:

1. Crear la funcin que implementa cada criterio de filtrado.

2. Combinar todos los criterios de filtrado en una nica funcin.

3. Aplicar la funcin de filtrado final a la matriz de expresin.

El siguiente cdigo implementa todo el procedimiento.

library(Biobase)
library(genefilter)
f1 = kOverA(5, 5.468801)
ffun = filterfun(f1)
wh1 = genefilter(exprs(bcrneg), ffun)

Finalmente podemos ver cuntos genes permanecen en nuestro


estudio. Son aquellos que tiene el valor de wh1 igual a TRUE.

table(wh1)

## wh1
## FALSE TRUE
## 4736 7889
expresin diferencial marginal 175

Vamos a incorporar los otros dos criterios comentados previamen-


te. Primero necesitamos una funcin que nos diga si la desviacin
estndar supera el valor c.
Primero vemos el modelo que nos ofrece la funcin kOverA.

kOverA = function (k, A = 100, na.rm = TRUE)


{
function(x) {
if (na.rm)
x = x[!is.na(x)]
sum(x > A) >= k
}
}

Y nos definimos algo similar utilizando la desviacin estndar.

sdOverc = function (c, na.rm = TRUE)


{
function(x) {
if (na.rm)
x = x[!is.na(x)]
sd(x) >= c
}
}

Y ahora otra funcin que evale si el rango intercuartlico supera


un cierto valor.

iqrOverc = function (c, na.rm = TRUE)


{
function(x) {
if (na.rm)
x = x[!is.na(x)]
IQR(x) >= c
}
}

f1 = kOverA(5, 200)
f2 = sdOverc(150)
f3 = iqrOverc(72)
ffun = filterfun(f1,f2,f3)
wh123 = genefilter(exprs(bcrneg), ffun)

Qu genes verifican este criterio de preseleccin?


176 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

table(wh123)

## wh123
## FALSE
## 12625

8.3.3 Utilizando nsFilter


Supongamos que queremos aplicar la siguiente seleccin nos va-
mos a quedar con aquellas sondas tales que el rango intercuartlico
(para todas las muestras) es mayor que la mediana de los rangos in-
tercuartlicos. Luego vamos a necesitar conocer la anotacin de los
genes. Si esto es as podemos filtrar aquellos genes de los cuales des-
conocemos su anotacin. Para ello necesitamos conocer primero el
paquete de anotacin que utilizan nuestros datos.8 8
En http://www.bioconductor.org/
packages/release/data/annotation/
tenemos un listado de paquetes de
annotation(ALL) anotacin.

## [1] "hgu95av2"

Por tanto hemos de cargar este paquete.

library(hgu95av2.db)

Realizamos el filtrado correspondiente.9 9


Observemos que ahora no pasamos la
matriz de expresin sino el Expression-
Set mismo.
bcrneg.filt1 = nsFilter(bcrneg,var.func=IQR,var.cutoff=0.5,
require.GOBP=TRUE)

La funcin que utilizamos para medir variabilidad podemos ir mo-


dificndola. Por ejemplo, podemos sustituir var.func por la varianza
o por la desviacin estndar. As podramos realizar

bcrneg.filt2 = nsFilter(bcrneg,var.func=sd,var.cutoff=0.5,
require.GOBP=TRUE)

Cmo podemos combinar ambas seleccin? Utilizando la funcin


nsFilter tenemos un ExpressionSet. Una manera simple puede ser la
siguiente.

sel = intersect(featureNames(bcrneg.filt1),
featureNames(bcrneg.filt2))

Y nuestro ExpressionSet filtrado sera


expresin diferencial marginal 177

bcrneg1 = bcrneg[sel,]

Y ya podemos seguir trabajando con los genes que hemos filtrado.

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

Lo definimos como el cociente de las medias de las expresiones en


la escala original. La segunda definicin (que no es equivalente a la
primera) es
(2)
FCi = ui vi , (8.2)

tenemos la diferencia de las medias de las log2 expresiones.


Un procedimiento11 que se ha utilizado frecuentemente en la Que no es estadstico y que por tanto
11

literatura de microarrays consiste en tomar el log2 del fold-change en no vamos a considerar en este manual.

la definicin 8.2, el valor


 
(1) xi
log2 FCi = log2 .
yi

Si el mdulo del cociente anterior es mayor que una constante posi-


tiva c (c > 0) entonces diramos que el gen i se sobre expresa en el
grupo 1 en relacin con el grupo 2 ya que
 
xi
log2 c.
yi

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.

8.5 Los peligros de la seleccin no especfica

En este tema hemos presentado como habitual la combinacin de


una seleccin no especfica o independiente de genes con un anlisis
posterior marginal de los genes que no han sido seleccionados uti-
lizando procedimientos de correccin por comparaciones mltiples.
Este procedimiento, an habitual en la literatura, tiene sus riesgos.
Un trabajo de gran inters a consultar sobre este problema es Bour-
gon et al. [2010].

8.6 Expresin diferencial de un solo gen

Seguimos trabajando con los datos golub. Cargamos los datos.

data(golub,package="multtest")

Una parte de nuestro trabajo va a consistir en comparar los pa-


cientes ALL y AML. Es conveniente convertir el vector que nos indica
el tipo de enfermedad, golub.cl en lo que R llama un factor. Los tal y
como van en el fichero que acabamos de leer son

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

Realizamos la transformacin a factor.


expresin diferencial marginal 179

golub.cl = factor(golub.cl,levels=0:1,labels=c("ALL","AML"))

Antes golub.cl era un vector numrico con valores 0 y 1. Ahora es


de clase factor lo que indica que R sabe que son dos categoras con
las etiquetas que le hemos indicado.13 13
En general, hacer esto supone un
mejor tratamiento de este tipo de
variable.
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

Pretendemos fijarnos en un gen y ver cmo comparamos los nive-


les de expresin. Para ello utilizaremos dos ejemplos. El primero es el
gen Gdf5. A qu fila corresponde en nuestros datos golub?

grep('Gdf5',golub.gnames[,2])

## [1] 2058

Guardamos los niveles de expresin en xGdf5.

xGdf5 = golub[2058,]

En la figura 8.1(a) mostramos los datos para las distintas muestras


(con distintos colores y caracteres distintos).

plot(xGdf5,col = as.numeric(golub.cl),pch = as.numeric(golub.cl))

Sabemos que hay dos grupos de pacientes correspondientes a dos


tipos de leucemia. Podemos representar dos diagramas de cajas que
nos den una comparacin sencilla de los niveles de expresin para
los dos tipos de leucemia. Lo tenemos en figura 8.1(b).

boxplot(xGdf5 ~ golub.cl)

Tambin trabajaremos con las expresiones de CCND3 Cyclin D3.


Obtenemos la fila en la que est.

grep('CCND3 Cyclin D3',golub.gnames[,2])

## [1] 1042

Guardamos los datos en xCCND3.


180 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

(a) (b)

(c) (d) Figura 8.1: a) Perfil de expresin para el


gen Gdf5 en los dos tipos de leucemia
considerados. b) Diagrama de cajas
para gen Gdf5 en los dos tipos de
leucemia. c) Perfil de expresin para el
gen CCND3 cyclin D3 en los dos tipos
de leucemia considerados. d) Diagrama
de cajas para gen CCND3 cyclin D3 en
los dos tipos de leucemia.
expresin diferencial marginal 181

xCCND3 = golub[1042,]

En las figuras 8.1(c) y 8.1(d) mostramos el perfil de expresin de


este gen diferenciando las expresiones segn el tipo de leucemia y el
correspondiente diagrama de cajas.

plot(xCCND3,col = as.numeric(golub.cl),pch = as.numeric(golub.cl))


boxplot(xCCND3 ~ golub.cl)

Este es el problema planteado: dos grupos de valores indicando


los niveles de expresin bajo dos condiciones y la pregunta funda-
mental a responder es: son ambos grupos de valores, ambos grupos
de niveles de expresin, similares entre s o difieren claramente uno
de otro? Estamos con lo que en Estadstica se conoce como la com-
paracin de dos poblaciones: cada poblacin corresponde con una
condicin. En 8.7.1 recordamos el test de la t (o simplemente t-test)
para comparar muestras independientes.

8.7 Comparamos dos condiciones

Tenemos datos relativos a niveles de expresin bajo dos condiciones


experimentales. En nuestro caso, la condicin experimental me indica
el tipo de leucemia. Denotamos por X el nivel de expresin aleatorio
que observamos bajo la primera condicin y por Y lo mismo pero con
la segunda condicin.

8.7.1 Test de la t para comparacin de medias


Supongamos que asumimos que ambos tienen una distribucin
normal con medias y varianzas posiblemente distintas. Es decir, asu-
mimos que X N ( X , X2 ) y que Y N (Y , Y2 ). Suponemos que
tenemos una muestra aleatoria de X (X1 . . . , Xn variables aleato-
rias independientes y con una misma distribucin, la de X) y otra
muestra de Y (Y1 . . . , Ym variables aleatorias independientes y con la
distribucin de Y). En 29.3.2 se estudia con detalle los contrastes de
hiptesis de comparacin de medias de dos poblaciones normales.14 14
Todo el captulo 29 est dedicado a
Por ello, no repetimos innecesariamente. esta cuestin.

8.8 Comparacin simultnea de todos los genes

Lo que acabamos de hacer podemos realizarlo para todos los ge-


nes simultneamente.
182 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

8.8.1 Con genefilter::rowttests


Utilizamos genefilter::rowttests.

library(genefilter)
tt = rowttests(golub,golub.cl)

Veamos las primeras filas de la salida.

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

Cada fila corresponde a un gen. La primera columna (statistic)


nos muestra el estadstico t del contraste de hiptesis para la igual-
dad de las medias (por defecto asume varianzas iguales). La segunda
columna (dm) nos muestra la diferencia de medias y la ltima colum-
na (p.value) nos da el p-valor del contraste.
Para cada gen tenemos pues un p-valor. Podemos seguir apli-
cando el criterio de rechazar la hiptesis nula cuando el p-valor es
inferior al nivel de significacin previamente elegido?
Si lo hacemos en este ejemplo, cundo tests mostraran una expre-
sin diferencial entre ambos grupos?

table(tt$p.value < 0.05)

##
## FALSE TRUE
## 2006 1045

Como vemos tenemos demasiados genes que muestran expresin


diferencial. Y no parece muy razonable esto. Con qu problema nos
estamos encontrando? El nivel de significacin es una cota superior
del error tipo I cuando realizamos un solo test. Pero no estamos
aplicando un solo test. En concreto con estos datos acabamos de
realizar 3051 tests que adems son dependientes entre si. Estamos
rechazando muchas hiptesis nulas (no diferencia entre grupos para
cada gen) cuando no deberamos de hacerlo.
Sin embargo, cuando realizamos muchos test: qu es el error tipo
I? Ya no es claro cmo cuantificamos los errores que cometemos y, de
expresin diferencial marginal 183

hecho, tenemos que definir nuevas tasas de error para cuantificar y,


sobre todo, controlar los errores que cometemos cuando realizamos
simultneamente muchos tests.
Ej. 6 Utilizando los datos tamidata::gse1397 y el factor pData(gse1397[,"type"]
realizar un anlisis de expresin diferencial marginal

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")

Qu clase nos devuelve?

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"

En particular tenemos el mtodo show.

show(ordT)

## Ranking by ordinaryT,
## number of genes: 3051.

Con toplist tenemos

toplist(ordT)

## index statistic pval


## 1 829 -10.255974 3.148592e-12
## 2 378 -8.448676 4.577914e-10
## 3 2124 -8.166010 1.035034e-09
## 4 808 -7.981284 1.772821e-09
184 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## 5 2489 7.855191 2.565377e-09


## 6 394 7.836707 2.708573e-09
## 7 2670 -7.751813 3.477675e-09
## 8 1009 -7.746138 3.536367e-09
## 9 1995 7.636098 4.895332e-09
## 10 937 -7.108487 2.366804e-08

Ordena las filas atendiendo al p valor (pval) o bien al mdulo de


del estadstico. Como vemos nos devuelve la posicin del gen en el
ExpresssionSet original, el valor del t-estadstico y el p-valor.

8.9 Comparando ms de dos condiciones

En todo lo anterior hemos considerado la situacin ms habi-


tual. Tenemos las muestras clasificadas en dos grupos o condiciones y
pretendemos determinar aquellos genes que se expresan de un modo
distinto entre ambas condiciones, que se expresan diferencialmente.
Sin embargo, podemos tener ms de dos grupos y pretender reali-
zar un anlisis similar. Esto nos conduce al anlisis de la varianza (o
abreviadamente anova). Vamos a recordar brevemente qu es y cmo
se aplica un anlisis anova.
Supongamos que tenemos I condiciones distintas y en cada una de
ellas ni muestras de modo que iI=1 = n, el total de muestras de las
que disponemos. Supongamos que Yi denota la expresin aleatoria
de un gen bajo la condicin i. Se asume que

Yi N (i , 2 ),

es decir, que dicha expresin aleatoria se distribuye como una normal


con media dependiente (posiblemente) de la condicin pero con una
varianza comn 2 15 La no existencia de expresin diferencial entre 15
Recordemos que en el caso de dos
las condiciones se traduce, asumiendo este modelo probabilstico, grupos podemos asumir o no una
misma varianza.
en que las expresiones medias son la misma. En definitiva, no existe
expresin diferencial es equivalente (bajo el modelo) a

H0 : 1 = . . . = I , (8.3)
H1 : Existe i 6= j i 6= j . (8.4)

Supongamos que, para un gen dado, denotamos por yij la j-sima


muestra observada bajo la condicin i (i = 1, . . . , I y j = 1, . . . , ni ). Se
consideran las sumas de cuadrado intra
I ni
SS( Intra) = (yij yi )2
i =1 j =1
expresin diferencial marginal 185

y la suma de cuadrados entre como

I
SS( Entre) = ni (yi y )2
i =1

El estadstico para contrastar esta hiptesis nula es

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 .

Ejemplo 4 (Anova con R). Lo ilustramos la expresin bajo diferentes


condiciones de un gen de los datos de expresin GSE20986 ( 5.11).

data(gse20986,package="tamidata")

Seleccionamos un gen cualquiera.

y = exprs(gse20986)[678,]

y realizamos un anlisis de la varianza.

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

De acuerdo con el p-valor observado no rechazaramos la hiptesis nula a


ninguno de los niveles de significacin habituales (0.05 o 0.01).

En el siguiente ejemplo analizamos, buscando diferencias entre


cualquier par de grupos (tejidos en el ejemplo).

Ejemplo 5 (GSE20986). Vamos a realizar un anlisis de expresin diferen-


cial de los datos GSE20986. Cargamos paquetes necesarios

library(multtest)
library(genefilter)
186 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Tenemos cuatro grupos. Tenemos inters en la comparacin entre todos los


grupos (tejidos) al mismo tiempo. En definitiva buscamos aquellos genes que
muestran una expresin diferencial entre al menos dos de los grupos. Un po-
sible planteamiento es el modelo de anlisis de la varianza y la comparacin
entre los grupos se reformula como una comparacin entre valores medios.16 16
No es la nica opcin. Podramos
Esto supone una comparacin simultnea de las medias de los cuatro grupos usar una opcin no paramtrica.

y esto se realiza con un anlisis de la varianza.


Calculamos los p-valores con la funcin genefilter::rowFtests.

gse20986.aov =
rowFtests(gse20986, pData(gse20986)[,"tissue"])

Por ejemplo, vemos los dos primeros valores.

head(gse20986.aov,n=2)

## statistic p.value
## 1007_s_at 9.778743 0.004720765
## 1053_at 14.134099 0.001459233

8.10 Utilizando EnrichmentBrowser::ed.ana

pacman::p_load(EnrichmentBrowser)
data(gse1397,package="tamidata") ## Leemos datos
eset = gse1397 ## Copiamos en eset
rm(gse1397) ## Ahorramos memoria

Para trabajar con Geistlinger et al. [2016, EnrichmentBrowser] es


conveniente tener identificas los genes con identificadores Entrez.
Con EnrichmentBrowser::probe.2.gene.eset lo conseguimos.

eset = probe.2.gene.eset(eset)

Vamos a realizar anlisis de expresin diferencial. Para ella la co-


variable o variable fenotpica debe llamarse GROUP y formar parte del
data.frame que nos describe las muestras. Tambin la variable GROUP
ha de tomar los valores 0 y 1. Realizamos un anlisis de expresin
diferencial marginal utilizando el mtodo Limma( 10.2).

eset = de.ana(eset)

Podemos ver los resultados en el slot fData.


expresin diferencial marginal 187

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.

Ej. 8 Utilizando el paquete Gentleman et al. [2016, genefilter] se


pide disear un filtrado no especfico para los datos multtest::golub y
que seleccione los genes atendiendo a los siguientes criterios:
1.Determinamos para cada gen el coeficiente de variacin.
2.Determinamos el percentil 0.90 del los coeficientes de variacin
para todos los genes.
3.El coeficiente de variacin ha de superar el percentil 0.9 de los
coeficientes de variacin observados.
4.Repetimos los puntos anteriores sustituyendo el coeficiente de
variacin por el nivel de expresin medio.
5.Conservamos los genes que verifican los dos criterios de seleccin.

Ej. 9 Realizar una seleccin no especfica de los datos ALL utili-


zando el paquete Gentleman et al. [2016, genefilter]. Los criterios de
seleccin son los siguientes:
188 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

1.La mediana de los niveles de expresin del gen ha de superar el


percentil 0.9 de las medianas observadas para todos los genes.
2.El rango intercuartlico de los niveles de expresin del gen ha de
superar el percentil 0.9 de los rangos intercuartlicos observados
para todos los genes.
9
Comparaciones mltiples

Empezamos con algunos comentarios bibliogrficos. Esta seccin


se basa fundamentalmente en Dudoit et al. [2003]. Sin embargo, un
artculo a consultar es Reiner et al. [2003].
Supongamos que nuestras muestras corresponden a dos grupos
que de un modo genrico podemos llamar casos y controles. Nuestro
inters no est en evaluar si uno o dos genes concretos se expresan
de un modo distinto entre las dos condiciones consideradas. Se pre-
tende una visin global. Pretendemos responder a una pregunta
como: qu genes se expresan de un modo distinto (o diferencial en
la jerga habitual en esta literatura) en los dos grupos que considera-
mos? Tenemos miles de genes: cules de ellos tienen realmente una
expresin diferencial? Y, lo importante, pretendemos responder la
pregunta de modo que controlemos, de algn modo, las veces que
admitimos una expresin diferencial cuando no la tiene. Qu con-
trastes de hiptesis estamos evaluando? Si numeramos los genes con
i = 1, . . . , N entonces para el i-simo gen estamos considerando el
contraste de hiptesis siguiente:

Hi : El gen i no tiene una expresin diferencial entre las condicio-


nes consideradas.

Ki : El gen i tiene una expresin diferencial entre las condiciones


consideradas.

El contraste anterior se puede reformular como

Hi : La expresin del gen i no tiene asociacin con la condicin.

Ki : La expresin del gen i tiene asociacin con la condicin.


1 1
De este modo, creo que englobamos
Estos contrastes nos lo planteamos para cada uno de los N genes de un modo ms natural el caso en que
consideramos asociada a las muestras
que evaluamos. Denotemos por G = {1, . . . , N } el conjunto de hi- una covariable que no sea necesaria-
ptesis nulas que estamos evaluando. El nmero de hiptesis que mente un factor experimental con dos
niveles.
190 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

vamos a contrastar es conocido a priori ya que corresponde con el


nmero de genes que estamos evaluando. Denotamos por G0 (con
G0 G) las hiptesis nulas que son ciertas. Denotamos por N0 = | G0 |
el cardinal del conjunto G0 . Notemos que el conjunto G0 es descono-
cido para nosotros. No sabemos ni cuntas ni cules son las hiptesis
nulas ciertas. Esto supondra que conocemos qu genes se expresan
diferencialmente y esto es precisamente nuestro objetivo. La situa-
cin en la en que nos encontramos viene descrita en la tabla 9.1 (de
Benjamini and Hochberg [1995]).

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

nula Hi ser de 1 , es decir,

P(| Ti | c | Hi ) = 1 P(| Ti | > c | Hi ) = 1 .

Cuando realizamos simultneamente muchos contrastes nos pode-


mos equivocar rechazando la hiptesis nula cuando no lo es en ms
de una ocasin. De hecho, el nmero de hiptesis nulas falsamente
rechazadas es una variable aleatoria que denotamos por V y nos da
el nmero de veces que rechazamos la hiptesis nula errneamente.
Nuestro inters es que la variable aleatoria V tome valores pequeos
con probabilidades altas.
Las distintas medidas de error que se utilizan esencialmente cuan-
tifican valores asociados a las variables que hemos definido en la
tabla 9.1. Se habla de tasas de error tipo I abandonando la expresin de
error tipo I utilizada con un solo test. Son extensiones del nico error
tipo I que se nos plantea cuando realizamos un solo contraste.

Tasa de error por comparacin 3 Por E(V ) denotamos la media o valor 3


Per-comparison error rate.
medio de la variable V. Se define la tasa de error por comparacin
como el cociente entre la media de V y el nmero de contrastes.

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 > 0) = P(V 1).

Sin duda es la medida ideal. Ningn error. Esto tiene un pago.


Es un criterio muy exigente si tenemos un nmero de hiptesis
N muy grande. Notemos que nos fijamos en cometer al menos
un error cuando con frecuencia tendremos decenas de miles de
contrastes. Esto puede parecer algo bueno pero tambin estare-
mos construyendo tests que procurarn no rechazar una hiptesis
nula salvo que tengan una evidencia contra ella muy grande. Pro-
cedimientos para contrastar miles de hiptesis nula y que hagan
pequea esta tasa de error tendern a ser muy conservadores. Co-
mo (mala) contrapartida muchos genes que tendrn una expresin
diferencial realmente no sern detectados. O dicho de un modo
ms tcnico perderemos potencia en los contrastes donde la poten-
cia es la probabilidad de rechazar Hi cuando realmente es falsa.
192 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

FDR: Tasa de falsamente rechazados 5 Se propuso en Benjamini and 5


False discovery rate.
Hochberg [1995]. De alguna manera se vi que la tasa FWER era
demasiado exigente y se trataba de conseguir procedimientos ms
potentes sin que por ello dejaramos de tener una tasa de error ra-
zonable controlada. Definimos la variable aleatoria Q = V/R si
R > 0 y Q = 0 en otro caso. Esta variable simplemente nos da la
proporcin de test que rechazamos errneamente. Rechazamos R
de los cuales V no debieran de ser rechazados, por tanto, nuestra
proporcin de hiptesis nulas falsamente rechazadas es Q. Tene-
mos el problema de si no rechazamos ninguna hiptesis. En este
caso tendremos 0/0. Lo que se hace es definir el cociente como ce-
ro. Otra vez, Q es algo aleatorio, es una proporcin aleatoria. Qu
queremos controlar de este valor aleatorio? La conocida como tasa
de falsamente rechazados o false discovery rate denotada como FDR
y que se define como
   
V V
FDR = E( Q) = E | R > 0 P ( R > 0) + 0 P ( R = 0) = E | R > 0 P ( R > 0),
R R
que nos da la proporcin esperada de hiptesis errneamente re-
chazadas entre aquellas hiptesis que hemos rechazado. A la tasa
FDR la hemos llamada tasa de falsamente rechazados. Hay una
cierta confusin con la tasa de falsos positivos. Esta tasa sera la
proporcin de hiptesis nulas que son ciertas y que son rechaza-
das. Esto es, sera el valor medio de la variable V/N0 . Por ejemplo,
si tenemos una FDR de 5 % entonces el 5 % de las hiptesis nulas
que rechazamos son realmente ciertas. Si tenemos una tasa de fal-
sos positivos del 5 % entonces una media del 5 % de las hiptesis
nulas ciertas son errneamente rechazadas. Si tenemos p-valores
pi y aplicamos simplemente la regla de rechazar Hi cuando pi
entonces tenemos una tasa de falsos positivos .
pFDR: Tasa de falsamente rechazados modificada 6 Es una modificacin 6
Positive false discovery rate.
de la anterior. Se define como
 
V
pFDR = E |R > 0 .
R
Cuando tenemos un gran nmero de hiptesis nulas N entonces
la probabilidad de que rechacemos al menos una es prcticamente
segura, es decir, P( R > 0) 1 y por lo tanto ambas tasas de error
son tambin prcticamente iguales FDR pFDR. Definimos la
tasa pFDR porque est muy relacionada con el concepto de q-valor
que definimos ms adelante.

En lo que sigue vamos a considerar distintos procedimientos para


contrastar muchas hiptesis. Un procedimiento concreto se dice
que controla una tasa de error tipo I al nivel cuando su tasa de
comparaciones mltiples 193

error es menor o igual que cuando aplicamos el procedimiento


para producir una lista de R hiptesis nulas rechazadas o de genes
declarados como significativos. La tasa de error que utilizaremos
fundamentalmente en lo que sigue ser la tasa FDR.

9.1 Control fuerte y control dbil del error

Cuando hemos definido las tasas de error hemos considerado el


comportamiento aleatorio de V y R (conjunto y marginal de hecho).
Ese comportamiento aleatorio depende de qu hiptesis nulas son
ciertas y qu hiptesis son falsas. Por ejemplo, cuando hemos defini-
do
FWER = P(V 1),
realmente la probabilidad depende de qu hiptesis nulas son ciertas
y qu hiptesis nulas son falsas. Lo correcto hubiera sido escribir:

FWER = P(V 1 | i M0 Hi ),

es decir, la probabilidad de rechazar al menos una hiptesis nula


equivocadamente condicionando a que se verifican las hiptesis de
M0 .7 Un detalle importante es que cundo controlamos una tasa de 7
Un detalle, no conocemos M0 .
error tipo I es saber qu hiptesis nulas asumimos que son ciertas.
Un par de definiciones que son importantes.

Definition 1 (Control fuerte). Se dice que un procedimiento de contras-


te de mltiples hiptesis realiza un control fuerte de la tasa de error tipo I
elegida cuando dicha tasa de error es menor o igual que el lmite que especi-
fiquemos para cualquier combinacin de hiptesis ciertas y falsas, en otras
palabras, para cualquier subconjunto M0 {1, . . . , m} de hiptesis ciertas
(el resto las suponemos falsas).

Definition 2 (Control dbil). Se dice que un procedimiento de contraste de


mltiples hiptesis realiza un control dbil de la tasa de error tipo I elegida
cuando dicha tasa de error es menor o igual que el lmite que especifiquemos
asumiendo que todas las hiptesis nulas son ciertas. Asumimos pues que se
verifica la hiptesis nula
H0C = iN=1 Hi .

En el control dbil asumimos algo que no tiene muchos visos de


realidad. Estamos asumiendo que todas las hiptesis nulas son cier-
tas. Si pensamos en nuestro problema estamos diciendo que ningn
gen tiene una expresin diferencial entre condiciones. No s pero mal
lo tenemos si es as. Parece poco realista asumir esto. Lo natural es
asumir que algunas hiptesis nulas son ciertas y otras falsas. Es decir,
que existe un conjunto N0 que nos da las que son ciertas y aquellos
194 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

que no estn en N0 son falsas. Y quin es N0 ? Ese es nuestro proble-


ma precisamente. En el control fuerte nos preparamos para cualquier
N0 sea el que sea. En lo que sigue cuando pongamos probabilidades
referidas a V (o cualquier otra variable) siempre han de entenderse
como probabilidades condicionadas a la realidad (desconocida para
nosotros), es decir, probabilidades condicionadas a i N0 Hi siendo
N0 el conjunto de hiptesis nulas ciertas (en nuestro caso, los genes
que estn en N0 no se expresan de un modo diferencial y s lo hacen
los que no estn en N0 ).

9.2 Relacin entre las tasas de error tipo I

En general se verifican las siguientes desigualdades:

PCER FDR FWER.

Esto significa que si un procedimiento controla la FWER entonces


tender a rechazar menos hiptesis nulas, tender a ser ms conser-
vador por tanto y, posiblemente, nos estaremos perdiendo genes que
tienen expresin diferencial y no lo apreciamos.
La aproximacin clsica al problema de las contrastes mltiples se
basa en el control fuerte de la FWER. Una aproximacin ms reciente
propuesta en Benjamini and Hochberg [1995] consiste en controlar la
FDR en un sentido dbil.

9.3 p valores y p valores ajustados

Para cada contraste Hi tendremos un p-valor pi . En el test de la t


para comparar medias tenemos

pi = P(| Ti | ti | Hi ).

donde ti es el i-simo estadstico observado. A los p-valores pi los


llamaremos p-valores originales. Podemos contrastar el contraste
Hi con un nivel de significacin i rechazando la hiptesis nula Hi
si pi i y no rechazando en otro caso. Cuando consideramos
simultneamente todos los tests los valores i sern distintos y por
ello tendramos que ir comprobando si la desigualdad pi i se
verifica o no. La idea del p-valor ajustado es transformar el p-valor
pi en otro valor pi , el i-simo p-valor ajustado, de modo que sean
equivalentes: pi i y pi siendo el valor que especificamos
para controlar alguna de las tasas de error tipo I.
comparaciones mltiples 195

9.4 Mtodos que controlan la FWER

Veremos procedimientos que actan en un solo paso y procedimien-


tos por pasos bien de bajada o de subida.

9.4.1 Los mtodos en un solo paso


Veamos el ejemplo ms conocido, es el mtodo de Bonferroni.
Supongamos que tenemos el p-valor pi asociado al contraste Hi . Si
solamente estuvieramos contrastando la hiptesis Hi entonces recha-
zamos con un error tipo I si pi < y aceptamos o no rechazamos
en otro caso. La modificacin de Bonferroni es simple. Ahora tene-
mos en cuenta que hay m contrastes y rechazamos Hi si

pi (9.1)
N
o, equivalentemente, si
N pi . (9.2)

Si tenemos en cuenta que 0 < 1 entonces la desigualdad 9.2 es


equivalente a que
mn{ N pi , 1} . (9.3)

De este modo el p-valor ajustado ser pi = mn{ N pi , 1}. 8 8


El mtodo de Bonferroni controla la
FWER de un modo dbil. Vemoslo.
Mtodo de Bonferroni Este mtodo nos da un control fuerte de la Denotemos por Ei el suceso consistente
en que no rechazamos Hi o, si se
FWER al nivel . En este mtodo rechazamos la hiptesis nula prefiere, aceptamos Hi . Se busca que
Hi si el correspondiente p-valor sin ajustar es menor o igual a N . P(iN=1 Ei | iN=1 Hi ) = 1 . Las
probabilidades que siguen se entienden
El p-valor ajustado sera:
que son condicionadas a que todas las
hiptesis nulas son simultneamente
pi = mn{ N pi , 1} ciertas. Tenemos
N
P(iN=1 Ei ) = 1 P(iN=1 Eic ) 1 P( Eic ).
i =1
(9.4)
Mtodo de Sdk Nos permite un control dbil del FWER. Los p- Pero P( Eic ) es la probabilidad de
valores ajustados son rechazar Hi siendo cierta iN=1 Hi .
Supongamos que consideramos una
regin crtica de tamao /m, es decir,
pi = 1 (1 pi ) N . P( Eic ) /m. Teniendo en cuenta 9.4 se
sigue
Asume la independencia de los p valores sin ajustar, en definitiva, N

asume la independencia de los tests. En nuestro contexto no es P(iN=1 Ei ) 1 P( Eic ) 1 m .
i =1
N
muy asumible esta hiptesis pues los genes tienen expresiones (9.5)
relacionadas, no independientes.

Mtodo de minP en un solo paso Los p-valores ajustados son


 
C
pi = P mn Pl pi | Ho ,
1 l N
196 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

siendo HoC la hiptesis nula completa (la interseccin de todas las


hiptesis nulas) y Pl la variable aleatoria que nos da el p-valor
aleatorio de la l-sima hiptesis.

maxT en un solo paso Podemos considerar como una opcin alternati-


va como el mximo de los valores de los estadsticos observados.
Es el maxT en un solo paso donde los p-valores ajustados son
 
pi = P max | Tl || ti || HoC ,
1 l N

Los procedimientos basados en maxT o minP nos dan un control


dbil de FWER.

En general, los mtodos de un solo paso son simples de implementar


pero tiende a ser conservadores, esto es, tienden a no rechazar la
hiptesis nula. No son pues muy potentes en el sentido de detectar
genes con expresin diferencial. Los mtodos por pasos son ms
potentes.

9.4.2 Los mtodos por pasos de bajada


Los p-valores originales son p1 , . . . , pm . Los ordenamos de menor a
mayor:
p r1 p r2 . . . p r N .
Tendremos las correspondientes hiptesis nulas Hr1 Hr2 . . .
Hr N

Mtodo de Holm Definimos



i = mn{i : pri > }
mi+1
y rechazamos las hiptesis nulas Hri para i = 1, . . . , i 1. Si no
existe i entonces rechazamos todas las hiptesis nulas. Si conside-
ramos los p-valores ajustados entonces vienen dados por

pri = max {mn{m k + 1) prk , 1}}


k =1,...,i

El mtodo de Holm es menos conservador que el mtodo de Bon-


ferroni.

Mtodo de Sdk por pasos de bajada Definimos los p-valores ajustados


como:
pri = max {1 (1 prk )mk+1 }.
k =1,...,i

min P por pasos de bajada Se definen los p-valores ajustados como:


  
pri = max P mn Pl prk | HoC
k =1,...,i l {rk ,...,rm }
comparaciones mltiples 197

max T por pasos de bajada Los p-valores ajustados son:


  
pri = max P max | Tj || trk || HoC
k =1,...,i l {rk ,...,rm }

donde |tr1 | |tr2 | . . . |tr N | son los estadsticos ordenados.

9.4.3 Mtodo por pasos de subida


Vamos a ver el mtodo de Hochberg. Se pretende, como en los
anteriores, controlar el FWER a un nivel . Consideramos

i = max{i : pri }
mi+1

y se rechazan las hiptesis nulas Hri para i = 1, . . . , i . Los p-valores


ajustados de Hochberg son

pri = mn mn{(m k + 1) prk , 1} .
k =i,...,N

Este procedimiento es una versin en sentido inverso del procedi-


miento de Holm.

9.5 Mtodos que controlan el FDR

Los mtodos de la seccin anterior controlan el FWER. En resu-


men estamos controlando el no cometer ningn error tipo I (admitir
un gen con expresin diferencial cuando no la tiene). Esto produce
procedimientos conservadores. En 9 se propuso la idea de que cuan- 9
Yoav Benjamini and Yosef Hoch-
do contrastamos muchas hiptesis podemos tolerar algunos errores berg. Controlling the false discovery
rate: A practical and powerful ap-
tipo I, siempre que el nmero de estos errores sea pequeo en rela- proach to multiple testing. Journal
cin con el nmero de hiptesis que se rechazan. Esta es la idea de of the Royal Statistical Society. Series
B (Methodological), 57(1):pp. 289
controlar el FDR. Dos son los procedimientos que vamos a ver para 300, 1995. ISSN 00359246. URL
controlar esta tasa. http://www.jstor.org/stable/2346101

Benjamini y Hochberg Este procedimiento fue propuesto en 10 . Siendo 10


Yoav Benjamini and Yosef Hoch-
pr1 . . . pr N son los p-valores originales ordenados entonces berg. Controlling the false discovery
rate: A practical and powerful ap-
consideramos proach to multiple testing. Journal
i of the Royal Statistical Society. Series
i = max{i : pri } B (Methodological), 57(1):pp. 289
N
300, 1995. ISSN 00359246. URL
y rechazamos Hri para i = 1, . . . , i . Si no existe i entonces no http://www.jstor.org/stable/2346101
rechazamos ninguna hiptesis. Los p-valores ajustados se definen
como  
N
pri = mn mn prk , 1 .
k =i,...,N k
198 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Benjamini y Yekutieli Propuesto en Benjamini and Yekutieli [2001].


Como en el anterior, pr1 . . . pr N son los p-valores originales
ordenados. En este caso los p-valores ajustados se definen como

 m N
j=1 1/j
 

pri = mn mn prk , 1 .
k =i,...,N k

9.6 Utilizando genefilter y multtest

En esta seccin incluimos anlisis de expresin diferencial (margi-


nal ) utilizando los paquetes Pollard et al. [2015, multtest] y Gentle-
man et al. [2016, genefilter]. No vamos a realizar en principio nin-
guna seleccin no especfica y nos planteamos trabajar con todos los
genes.

9.7 Clculo de p-valores ajustados

Calculamos los estadsticos t (test de la t con varianzas distintas) y


los p-valores asociados.
Utilizamos los datos tamidata::gse1397.

data(gse1397,package ="tamidata")
eset = gse1397; y = pData(gse1397)[,"type"]

Aplicamos los t-test para cada gen.

library(genefilter)
tt = rowttests(eset,y)

Los p-valores originales los guardamos en p0.

p0 = tt$p.value

Supongamos que vamos a utilizar el mtodo de Benjamini-Hochberg.


Entonces pasamos de los p-valores originales (raw p-values) a los p-
valores ajustados con la funcin multtest::mt.rawp2adjp.

p.BH = mt.rawp2adjp(p0, "BH")

En particular los p-valores ajustados son los siguientes

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

Sin embargo podemos ver que aparecen ordenados de menor a


mayor segn p-valor original (y por consiguiente segn los ajusta-
dos). A qu filas en la matriz de expresin original corresponden
estos p-valores? Sus posiciones originales los tendremos con

head(p.BH$index)

## [1] 346 1170 1853 6303 7889 10450

Si tenemos inters en saber el p-valor ajustado para un gen deter-


minado del cual sabemos la fila que ocupaba en la matriz de expre-
sin original. Por ejemplo, si la fila original era la primera,

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

Supongamos que nos planteamos utilizar no solamente el proce-


dimiento de Benjamini-Hochberg. Para ver las opciones lo mejor es
consultar la ayuda de mt.rawp2adjp. En concreto vamos a utilizar los
siguientes procedimientos (indicamos entre parntesis su etiqueta
utilizada en la funcin): Bonferroni ("BH"), Holm ("Holm"), Hochberg
("Hochberg"), Sidak de un solo paso ("SidakSS"), Sidak de bajada
("SidakSD"), Benjamini-Hochberg ("BH") y Benjamini-Yekutieli ("BY").
Calculamos los p-valores ajustados segn los distintos procedi-
mientos.

metodos = c("Bonferroni", "Holm", "Hochberg", "SidakSS","SidakSD",


"BH", "BY")
p.ajustados = mt.rawp2adjp(p0, metodos)
200 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

El orden original lo tenemos en index. En concreto los dos genes


con los p-valores originales menores y sus correspondientes p-valores
ajustados seran

head(p.ajustados$adjp,n=2)

## rawp Bonferroni Holm


## [1,] 2.070655e-07 0.004614041 0.004614041
## [2,] 2.481752e-07 0.005530087 0.005529839
## Hochberg SidakSS SidakSD
## [1,] 0.004614041 0.004603413 0.004603413
## [2,] 0.005529839 0.005514825 0.005514578
## BH BY
## [1,] 0.002765044 0.02927854
## [2,] 0.002765044 0.02927854

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,]

## rawp Bonferroni Holm Hochberg SidakSS


## [1,] 0.5478926 1 1 0.9999277 1
## [2,] 0.5582264 1 1 0.9999277 1
## SidakSD BH BY
## [1,] 1 0.9901883 1
## [2,] 1 0.9901883 1

Si tenemos demasiados dgitos podemos simplificar la salida con

round(p.ajustados2[1:2,],digits=3)

## rawp Bonferroni Holm Hochberg SidakSS


## [1,] 0.548 1 1 1 1
## [2,] 0.558 1 1 1 1
## SidakSD BH BY
## [1,] 1 0.99 1
## [2,] 1 0.99 1
comparaciones mltiples 201

9.8 Genes con expresin diferencial

Lo primero es fijar una tasa de error . En concreto podemos consi-


derar el valor = 0,05.

alpha = 0.05

Consideremos los p-valores ajustados utilizando Benjamini-


Hochberg manteniendo el orden original de la matriz de expresin.
Observad que la segunda columna tiene los p-valores ajustados por
el mtodo Benjamini-Hochberg.

p1 = mt.rawp2adjp(p0, "BH")
orden.original = order(p1$index)
p.BH = p1$adjp[orden.original,2]

Y quienes son los genes significativos con estos p-valores.

significativos.BH = mt.reject(p.BH, alpha)

Cuntos son?

table(significativos.BH$which)

##
## FALSE TRUE
## 22278 5

Y ocupan las filas (mostramos solamente las 10 primeras)

which(significativos.BH$which)[1:10]

## [1] 346 1170 1853 6303 7889 NA NA NA NA


## [10] NA

Cuntos eran significativos con los p-valores originales?

mt.reject(p0, alpha)$r

## [1] 902

Mientras que ahora tenemos

mt.reject(p.BH, alpha)$r

## [1] 5
202 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Si queremos una tasa de error (por ejemplo, de = 0,01) tendra-


mos con los p-valores originales los siguientes genes con expresin
diferencial significativa

mt.reject(p0, 0.01)$r

## [1] 183

Y con los corregidos

mt.reject(p.BH, 0.01)$r

## [1] 2

Ya nos vamos acercando a algo para continuar trabajando.

9.9 El q-valor

Esta seccin se basa en ?. Supongamos que ordenamos de menor a


mayor los p-valores calculados para los distintos contrastes.

p (1) . . . p ( N )

Cuando hacemos este ordenamiento, como hemos visto en los pro-


cedimientos anteriores, declarar significativo uno de estos p-valores
supone declarar significativos a todos los que son menores o iguales
que l. Los mtodos anteriores buscaban un punto de corte para estos
p-valores ordenados. Por debajo de este punto de corte admitimos
que los genes se expresan diferencialmente (rechazamos al hiptesis
nula correspondiente) y por encima aceptamos la hiptesis nula. La
idea del q-valor es asociar a cada test un valor numrico que nos diga
lo extremo que es su p-valor considerando el resto de p-valores. De
un modo intuitivo, si consideramos un test determinado nos da la
proporcin esperada de falsos positivos en la que incurrimos cuando
declaramos significativo ese test.

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)

Tenemos un gran nmero de contrastes N por ello aproximadamente


se tiene que  
V (t) EV (t)
E .
R(t) ER(t)
Podemos estimar R(t) simplemente contando el nmero de pi obser-
vados que son menores o iguales a t,

R(t) = |{ pi : pi t}|

Para estimar V (t) hemos de tener en cuenta que si la hiptesis nula


Hi es cierta entonces el p-valor aleatorio Pi se distribuye uniforme
en el intervalo [0, 1] y por tanto la probabilidad de que sea menor o
igual a t es precisamente 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 )

Podemos pues estimar pFDR con

\ = 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

El estimador 0 depende de un valor . De hecho el procedimien-


to exacto no utiliza un valor concreto sino que estima utilizando
distintos valores y luego hace un ajuste tomando como estimador el
valor estimado a partir del ajuste en 1.
El algoritmo exacto es el siguiente:

1. Sean p(1) . . . p( N ) los p-valores ordenados.

2. Para un rango de valores de , por ejemplo, de 0 a 0.95 con


incrementos de 0.01 calculamos
|{ pi : pi > ; i = 1, . . . , N }|
0 () = .
N (1 )

3. Determinamos f el spline natural cbico con 3 grados de libertad


a partir de los valores 0 ().

4. Fijamos como estimador de 0 el valor

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

7. El q-valor estimado para el i-simo contraste ms significativo es


q( p(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

Utilizamos el paquete with contributions from Andrew J. Bass


et al. [2015, qvalue].
comparaciones mltiples 205

library(qvalue)
aa = qvalue(pvalue)

Podemos ver una descripcin grfica con

plot(aa)

que aparece en la figura 9.1. En concreto tenemos:

Arriba izquierda: Los distintos valores estimados de 0 , proporcin de


hiptesis nulas ciertas, cuando variamos el valor de . El valor es-
timado por el mtodo antes propuesto nos da un 96.3 % de genes
sin expresin diferencial.

Arriba derecha: La transformacin que nos lleva de los p-valores


originales (ordenados de menor a mayor) a los q-valores.

Abajo izquierda: Para distintos puntos de corte para los q-valores


el nmero de genes que declaramos con expresin diferencial
significativa.

Abajo derecha: En abscisas el nmero de test significativos y en orde-


nadas el nmero de falsos positivos esperado.

Si simplemente queremos los q-valores los obtenemos con

q.value = qvalue(pvalue)$qvalues

9.10 tami::tm.descrip

Vamos a definir una funcin tm.descrip en que implementamos to-


do lo visto en este tema. Como entradas va a tener un ExpressionSet
eset y una covariable y. La funcin nos devuelve un base::data.frame
cuyas columnas son: el t-estadstico, el p-valor (asumiendo varianzas
iguales), el p-valor ajustado por el mtodo de Benjamini-Hochberg, el
q-valor. Utilizamos los datos gse1397.

library(tamidata)
eset = gse1397
y = pData(gse1397)[,"type"]

La funcin, aadiendo un par de comprobaciones iniciales sobre


los argumentos, es13 13
Esta funcin la tenemos en el paquete
propio ?, tami.
206 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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
}

Para poderla utilizar necesitamos todos los paquetes.

library(genefilter);library(multtest);library(qvalue)

Podemos utilizar, una vez se la declaramos a R, con

z = tm.descrip(eset,y)

O si se prefiere directamente con

z = tm.descrip(gse1397,pData(gse1397)[,"type"])

Podemos ver las primeras filas del resultado.

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

## 1294_at 2.9096918 0.01308856 0.9901883


## q
_ _
## 1007 s at 0.9453875
## 1053_at 0.9453875
_
## 117 at 0.9453875
## 121_at 0.9453875
_ _
## 1255 g at 0.9453875
## 1294_at 0.9453875

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.

Ej. 11 Vamos a utilizar los datos tamidata::gse1397. Vamos a rea-


lizar un estudio de expresin diferencial marginal comparando las
personas con y sin la trisoma del cromosoma 21.
1.Aplicamos, a cada gen, un test de la t (asumiendo una misma va-
rianza). Obtener los t-estadsticos y los p-valores correspondientes.
2.Si aplicamos la regla de decisin consistente en admitir una expre-
sin diferencial cuando el p-valor es menor que = 0,05: cuntos
y qu genes son declarados significativos?
3.Utilizando los mtodos de correccin de Bonferroni y de Benjamini-
Hochberg obtener los p-valores ajustados para cada uno de los
procedimientos.
4.Representar, en un mismo dibujo, los p-valores originales y los
ajustados obtenidos en el paso anterior. Utilizad tipos de lnea y
colores diferentes para cada conjunto de p-valores.
comparaciones mltiples 209

5.Si utilizamos un valor de FDR igual a 0.05: qu genes declara-


mos como significativos utilizando la correccin de Benjamini-
Hochberg? Y utilizando la correccin de Bonferroni?
6.Todos los significativos segn Bonferroni lo son con Benjamini-
Hochberg? Comparar los grupos de genes significativos utilizando
las funciones base::intersect y Biobase::featureNames.
10
Expresin diferencial con microarrays

10.1 Mtodo SAM

Es la abreviatura de Significance Analysis of Microarrays. Fue


propuesto en Tusher et al. [2001].1 1
Tiene un gran inters consultar la
direccin http://www-stat.stanford.
edu/~tibs/SAM/. De hecho, no se puede
10.1.1 El mtodo entender el mtodo tal cual se aplica
hoy a partir de la referencia original. Ha
habido una gran evolucin posterior del
procedimiento incluyendo el manejo de
El conjunto de muestras, como es habitual, lo denotaremos
datos de secuencia. Existe una versin
como por {1, . . . , n}. Empezamos con el caso en que pretendemos comercial para su uso con Excel. En la
comparar dos grupos. Esta informacin la podemos tener con un parte de los detalles tcnicos del ma-
nual de la versin comercial se puede
vector y = (y1 , . . . , yn ) donde y j vale 1 si la muestra j est en el pri- encontrar la explicacin detallada del
mer grupo y vale 2 si la muestra en esa columna est en el segundo mtodo y, por lo tanto, de las salidas
que realizan las funciones. Este ma-
grupo. Para un gen dado las expresiones del grupo 1 (o del grupo 2)
nual tcnico lo podemos conseguir en
corresponden con los valores donde y j = 1 (respectivamente y j = 2). http://www-stat.stanford.edu/~tibs/
Consideramos Jg = { j : y j = g} con g = 1, 2. Tendremos J1 y J2 donde SAM/sam.pdf.

Jg son las muestras del grupo g con g= 1,2.2 Denotamos por n1 y n2 2


Notemos que J1 y J2 son una particin
los cardinales de J1 y J2 . Podemos denotar de {1, . . . , n} de modo que J1 J2 =
{1, . . . , n} y son disjuntos J1 J2 = .
j Jg xij
xig = xi,Jg =
ng
siendo n g el nmero de muestras en Jg . Para el i-simo gen conside-
ramos la diferencia relativa dada por
xi1 xi2
di = (10.1)
s i + s0
donde v
u 2
(xij xi,g )2
u
si = t a (10.2)
g =1 j Jg

y
1/n1 + 1/n2
a=
n1 + n2
212 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Observemos que el estadstico di es el estadstico del contraste de


igualdad de medias o simplemente el t-estadstico al que le modifica-
mos el error estndar. Para qu se hace esta modificacin? Si el valor
si es muy pequeo entonces el valor di es muy grande. En valores de
expresin pequeos esto puede pasar. Los distintos valores di no son
comparables para los distintos genes (la expresin que utilizan los
propios autores es que no son intercambiables). Por ello se le suma
un valor s0 que estabiliza la varianza (y nos permite comparar los t-
valores entre si). Este valor hay que estimarlo o calcularlo a partir de
los propios datos ( 10.1.2). Veamos el procedimiento enumerando los
pasos.

1. Calculamos los estadsticos di segn la ecuacin 10.1.

2. Ordenamos de menor a mayor los di s observados: d(1) . . .


d( N ) de modo que d(i) es el i-simo menor.

3. Realizamos B permutaciones aleatorias del vector y que nos indica


el grupo de la columna. Para cada permutacin calculamos los
nuevos valores di y los denotamos por di (b). Ordenamos, como
antes, estos nuevos valores de menor a mayor: d(1) (b) . . .
d ( N ) ( b ).

4. Calculamos, para las B permutaciones, el valor medio de estos


estadsticos ordenados, es decir, calculamos
B d (i ) ( b )
d(i) = B
.
b =1

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.

5. Representamos grficamente d(i) frente a d(i) .

6. Para un valor fijo positivo , empezando en el origen y mo-


vindonos a la derecha determinamos el primer i = i1 tal que
d(i) d(i) > . Todos los genes a la derecha de i1 son llamados
significativamente positivos (estos genes verifican la desigualdad an-
terior). Del mismo modo, empezando en el origen y movindonos
a la izquierda determinamos el primer i = i2 tal que d(i) d(i) > .
Todos los genes con la diferencia anterior ms a la izquierda de i2
los llamamos significativamente negativos. Para cada definimos un
punto de corte superior como

u() = mn{di : i es significativamente positivo}

y
l () = max{di : i es significativamente negativo}
expresin diferencial con microarrays 213

7. Para distintos valores de , calculamos:

El nmero total de genes significativos (como hemos visto en el


paso anterior).
En la b-sima permutacin aleatoria hemos obtenido di (b) con
i = 1, . . . , N. Calculamos el nmero de genes falsamente llamados
en la aleatorizacin b-sima como

cb = |{i : di (b) > u() o di (b) < l ()}

Tendremos los valores cb con b = 1, . . . , B. Notemos que los


valores di (b) han sido calculados bajo la hiptesis de no asocia-
cin, es cierta la hiptesis nula para cada gen. En consecuen-
cia debieran de estar en el intervalo [l (), u()]. Calculamos
la mediana y el percentil de orden 0.90 de los valores cb con
b = 1, . . . , B y los denotamos como q0,5 (c) y q0,90 (c).

8. Vamos a estimar 0 , la proporcin de genes sin expresin diferen-


cial, de genes que no se asocian con la covariable y. En definitiva
cul es la proporcin de hiptesis nulas ciertas.

a) Calculamos los percentiles de orden 0.25 y 0.75, q0,25 y q0,75 ,


de todos los valores di (b) que hemos obtenido realizando las
permutaciones: {di (s); i = 1, . . . , N; s = 1, . . . , B} (tenemos un
total de N B valores).
b) Calculamos
|{di : di (q0,25 , q0,75 )}|
0 =
N/2
donde {d1 , . . . , d N } son los d valores originales.
c) Truncamos el valor de 0 en 1, es decir, consideramos

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. Elegimos un valor de y determinamos el conjunto de genes


significativos.

11. La tasa de falsos positivos FDR es estimada como el cociente


entre la mediana, q0,5 (c), (o el percentil 0.90, q0,90 (c)) del nmero
de genes falsamente llamados y el nmero de genes declarados
significativos.
214 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

12. El q-valor (que aparece en la salida de Tibshirani et al. [2011,


samr]) es la tasa pFDR cuando la lista de genes significativos est
compuesta por este gen y todos los genes que son ms significa-
tivos que este. Se calcula buscando cul es el valor ms pequeo
de para el cual este gen es declarado como significativo. Si es-
entonces la pFDR asociada a este valor es el q-valor
te valor es
asociado al gen.

10.1.2 Clculo de s0
La seleccin de s0 se hace del siguiente modo:

1. Consideramos s = (s1 , . . . , s N ) las desviaciones estndar muestra-


les.

2. Sea q (s) el percentil de orden de los valores si . Definimos

() xi1 xi2
di = .
si + q ( s )

3. Consideramos los percentiles q j/100 (s) con j = 1, . . . , 100.

4. Para cada {0, 0.1, . . . , 1}:

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).

10.1.3 SAM con samr

Utilizamos los datos golub. Cargamos el paquete Tibshirani et al.


[2011, samr].

pacman::p_load("samr")

Realizamos el anlisis. Tenemos dos grupos y en el tipo de res-


puesta le indicamos la opcin Two class unpaired. La variable que indi-
ca el grupo ha de tomar valores 1 y 2. Vamos a tomar una tasa de fal-
samente rechazados o FDR muy pequea. En concreto, FDR = 0,001.
expresin diferencial con microarrays 215

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

Y qu genes encuentra el procedimiento significativo?

(sigtabla = samfit$siggenes.table)

Podemos comprobar en la salida anterior que diferencia entre


genes up y genes down. Qu es un gen up en este paquete? Indica
asociacin positiva entre expresin y la covariable y que nos indica el
grupo (para golub recordad que la covariable es golub.cl que codifica
ALL como 0 y AML como 1). En definitiva un gen up es que tiene
una media mayor cuando la covariable es mayor, es decir, para los
datos golub que la media en el grupo AML (valor de golub.cl 1) es
mayor que la media en el grupo ALL (valor de golub.cl 0). Como es
lgico los genes down son lo contrario. Tambin podemos ver, para
cada uno de ellos: el valor de di , su numerador y denominador, el
cociente de las medias y el q-valor.
Tenemos tambin una ilustracin grfica en donde en abscisas
nos muestra di y en ordenadas di . La lnea en trazo continuo indica

la lnea donde di = di . Las lneas en trazo discontinuo por arriba y











5

por abajo indican los genes up y los genes down. En la figura 10.1



observed score
































podemos ver los resultados.



































0























































plot(samfit)





























Podemos ver tambin una exploracin de posibles valores para 2 1 0 1 2 3

con expected score

Figura 10.1: Mtodo SAM utilizando


head(samfit$delta.table,n=1)
Tibshirani et al. [2011, samr]. En negro
los genes no significativos. En rojo
## delta # med false pos 90th perc false pos los genes up que corresponden con
## [1,] 1.466926 0.5394952 3.776467 asociacin positiva con la covariable
y en verde los que tienen asociacin
## # called median FDR 90th perc FDR cutlo negativa.
## [1,] 337 0.001600876 0.01120613 -2.675221
## cuthi
## [1,] 2.678885
216 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

10.1.4 SAM con otro tipo de covariables

Acabamos de utilizar este procedimiento en la comparacin de dos


grupos. Este mismo procedimiento se puede adaptar a los casos en
que el vector y (covariable) nos indica la pertenencia de la muestra a
ms de un grupo o bien es un valor numrico.
El mtodo es el mismo modificando las definiciones de di y si
dadas en las ecuaciones 10.1 y 10.2.

Comparacin de ms de dos grupos Tenemos K grupos a comparar


(K > 2) por lo que y j {1, . . . , K }. Supongamos que Jk denota los
ndices de las observaciones en grupo k.5 Y supongamos que nk 5
Los conjuntos Jk son disjustos entre s
es el cardinal de Jk (kK=1 nk = n). Utilizando la notacin de 8.2 y su unin es el total de muestras, es
decir, kK=1 Jk = {1, . . . , n}.
definimos di como
ri
di = (10.3)
s i + s0
con v
u K
u n K
ri = t kK=1 k nk ( xi,Jk xi )2 (10.4)
k =1 n k k =1
y
v
u  K  K
1 1
nk (xij xi,Jk )2 .
u
si = t (10.5)
kK=1 (nk 1) k =1 k =1 j Jk

Covariable continua Supongamos que los valores de y son valores


numricos en este caso definimos di como en 10.3 y los valores de
ri y si son
nj=1 y j ( xij xi )
ri = (10.6)
nj=1 (y j y)2
y
i
si = q (10.7)
n
j =1 ( y j y)2

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)

Ejemplo 6. Vamos a utilizar los datos bdmy ( 5.6).


expresin diferencial con microarrays 217

data(bdmy.norm,package="tamidata")

El tipo celular by lo hemos observado en tres momentos: 0, 30 y 60 mi-


nutos. Vamos a realizar el anlisis de dos formas. Podemos considerar que
simplemente tenemos tres grupos a comparar y pretendemos determinar
genes con expresin diferencial entre estos tres momentos. Si observamos la
informacin de las muestras

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

vemos que el tiempo 0 en el tipo gb son las tres primeras columnas, el


tiempo 30 son las columnas 13,14 y 15 y el minuto 60 las columnas 16 a 18.
Seleccionamos estas columnas. columnas.

bd.nor = bdmy.norm[,c(1:3,13:18)]

Y podemos comprobar que nos hemos quedado con las muestras adecua-
das.

pData(bd.nor)

## temperatura tiempo tipo muestra


## GROBY30C1 30 0 gb 1
## GROBY30C2 30 0 gb 2
## GROBY30C3 30 0 gb 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

Cargamos Tibshirani et al. [2011, samr].

library(samr)

En un primer momento queremos que considere los grupos definidos con


tiempo simplemente como grupos.
218 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

tiempo.factor = factor(pData(bd.nor)[,"tiempo"])

Hacemos el anlisis.

samfit = SAM(exprs(bd.nor),tiempo.factor,resp.type="Multiclass")

El valor de que ha seleccionado es

samfit$del

## delta
## 0

Y la tabla de genes significativos sera

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

plot(samfit) expected score

Figura 10.2: SAM para bdmy utilizando


Y ahora repetimos el anlisis que acabamos de hacer pero vamos a utilizar tiempos como factor.
el tiempo como un valor numrico (el nmero de minutos en que se observa
la muestra).

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).

2. Aplicar el mtodo SAM y obtener el grupo de genes significativos.

3. Comparar con el grupo obtenido en el apartado 4 del ejercicio 10.

Ejercicio 5. Utilizando los datos gse20986.gcrma se pide determinar los


genes significativos cuando comparamos los cuatro grupos considerados en el
estudio.
expresin diferencial con microarrays 219

10.2 Limma

Hasta el momento nos hemos preocupado de estudiar la posible


asociacin entre el perfil de expresin de un gen y una sola cova-
riable (o variable fenotpica). Nuestro mayor inters (aunque hemos
considerado otros casos sobre todo con el mtodo SAM) ha estado en
el caso en que la covariable nos define dos poblaciones a comparar
dos tipos de cancer; una cepa mutante frente a una salvaje.
En este tema nos ocupamos de considerar la relacin entre las ex-
presiones del gen y ms de una covariable. Situaciones habituales (y
que consideramos aqu) ser cuando tengamos las muestras clasifi-
cadas segn dos criterios y queramos considerar el efecto simultneo
sobre la expresin. Ejemplos concretos de esta situacin son:

1. Consideramos dos cepas (salvaje y mutante) y las observamos


en varios instantes temporales. Supongamos que las muestras
que observamos en cada instante temporal son independientes.
Tenemos un diseo cruzado para cada gen.

2. Supongamos que tomamos muestras de un mismo individuo en


dos instantes temporales (antes y despus de un tratamiento por
ejemplo). Adems los individuos los tenemos clasificados en dos
grupos. Para cada individuo tenemos una muestra apareada.

Los diseos experimentales anteriores son habituales en la literatura


y los estudiamos en este tema. Y para ello se recurre a la teora de
modelos lineales adaptada a este contexto particular. El paquete
bsico en este tema es Smyth et al. [2016, limma]. 6 6
La vieta de este paquete es, en s
misma, un buen libro y, sin duda, la
referencia a consultar.
10.2.1 El modelo limma
El material de esta seccin fue publicado en Smyth [2004]. Lo que
se hace es ajustar un modelo lineal para cada fila de la matriz de
expresin considerando que tenemos valores independientes para
las distintas muestras.7 8 Si trabajamos con datos de microarrays 7
Y olvidando por tanto todo el proceso
entonces supondremos que trabajamos con su logaritmo en base 2 de correccin de fondo y normalizacin.
8
En 31 se incluye un repaso de la
(log2 ). Las expresiones aleatorias correspondientes al gen i-simo las teora de modelos lineales.
denotamos por
Xi = ( Xi1 , . . . , Xin )0 .

Los correspondientes valores observados los denotaremos utilizando


minsculas, es decir;
xi = ( xi1 , . . . , xin )0 .

El vector Xi es el vector respuesta para el i-simo ajuste que vamos


a realizar. 9 Denotamos, como es habitual, por E( Xi ) el vector de 9
Asumimos que se ha preprocesado
corrigiendo fondo y normalizando y
que los datos estn en escala log2 .
220 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

medias del vector Xi que tiene en cada componente la media de la


variable Xij , es decir, EXi = ( EXi1 , . . . , EXin )0 . Se asume:

1.
E( Xi ) = Ai (10.11)

siendo A una matriz de diseo de rango completo en columnas10 10


Todas sus columnas linealmente
y i es un vector de coeficientes. independientes.

2. Suponemos que la matriz de covarianzas del vector aleatorio Xi


que es proporcional (siendo desconocida la constante de propor-
cionalidad) a una matriz conocida, es decir, asumimos que

var ( Xi ) = i2 Wi , (10.12)

donde Wi es una matriz definida no negativa conocida. El vector


Xi puede tener datos faltantes y la matriz Wi puede tener elemen-
tos en la diagonal principal nulos.

Como es habitual en la teora de modelos lineales11 estamos interesa- 11


31.
dos en ciertos contrastes sobre el vector de coeficientes i que corres-
ponden al diseo utilizado en la experiencia y, por lo tanto, evalan
problemas de inters desde un punto de vista biolgico. Un contraste
tiene la forma general
i = C 0 i .

Estamos interesados en contrastar si ij son nulas para los distintos


j y para cada gen i, es decir, en la hiptesis nula: H0 : ij = 0 vs
H0 : ij 6= 0.
Ajustamos un modelo lineal para cada gen y obtenemos los esti-
madores i , el estimador s2i de i2 y la matriz de covarianzas estimada

var (i ) = Vi s2i (10.13)

siendo Vi una matriz definida positiva que no depende de s2i . Los


estimadores de los contrastes son

i = C 0 i ,

y de su matriz de covarianzas es

var ( i ) = C 0 Vi Cs2i .

No se asume necesariamente normalidad para Xi ni tampoco asu-


mimos que el ajuste de los modelos lineales se hace mediante el
procedimiento de los mnimos cuadrados. Pero si se asume que:

1. i s que tiene una distribucin aproximadamente normal con


vector de medias i y matriz de covarianzas C 0 Vi Ci2 .
expresin diferencial con microarrays 221

2. Tambin asumimos que s2i siguen aproximadamente una distribu-


cin ji-cuadrado escalada.

La matriz Vi podra depender de i . Si esta dependencia se produce


entonces consideramos Vi evaluada en i y que la dependencia puede
ser ignorada al menos en una aproximacin de primer orden.
Si denotamos por vij el j-simo elemento de la diagonal de C 0 Vi C
entonces todas las hiptesis indicadas previamente se traducen en
que:

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.

Asumiendo estas hiptesis se tiene que el siguiente estadstico

ij
tij =
si vij

aproximadamente tiene una distribucin t de Student con di grados


de libertad.
En lo que sigue se asumir (y no tienen porqu ser cierto) que i y
2
si son independientes para los distintos genes.
Tenemos muchos test simultneos. Se trata de modelizar el com-
portamiento entre genes. Y para ello se opta por modelizar mediante
distribuciones de probabilidad sobre los parmetros.12 En concreto 12
Tenemos un modelo bayesiano.
sobre i2 la siguiente distribucin,

1 1 2
.
i2 d0 s20 d0

Para un j dado, suponemos que ij es no nula con una probabilidad


conocida
P( ij 6= 0) = p j .
Notemos que p j tiene el sentido de la proporcin esperada de genes
que se expresan diferencialmente. Para los coeficientes no nulos se
asume
ij |i2 , ij 6= 0 N (0, v0j i2 ).
Asumiendo el modelo jerrquico que acabamos de especificar se tiene
que la media de la distribucin a posteriori de 1/i2 condicionada a
s2i viene dada por
 
1 2 1
E 2 | si = 2 ,
i si
con
d0 s20 + di s2i
s2i = .
d0 + d i
222 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Podemos definir el estadstico t moderado13 como 13


Moderated t-statistic.

ij
tij = 2 .
si vij

Se demuestra que los t-estadsticos moderados tij y las varianzas


muestrales residuales s2i se distribuyen independientemente. Y de he-
cho, tendremos que bajo la hiptesis nula H0 : ij = 0, el t-estadstico
moderado tij sigue una distribucin t de Student con di + d0 grados
de libertad.14 Los grados de libertad que estamos aadiendo d0 ex- 14
Ver seccin 4 de Smyth [2004].
presan la ganancia de informacin que obtenemos de utilizar todos
los genes siempre asumiendo el modelo jerrquico. Los valores d0 y
s0 que se suponen conocidos en lo previo sern estimados a partir de
los datos.
Se consideran los odds a posteriori dados por

P( ij 6= 0|tij,s2 )
i
Oij = . (10.14)
P( ij = 0|tij,s2 )
i

Estos odds prueban que tienen la siguiente expresin.

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

Bij = ln Oij . (10.16)

En el procedimiento que acabamos de comentar falta estimar los


parmetros de las distribuciones a priori. Hemos de estimar d0 , s0 , v0j
(para todos los j) y las proporciones p j . En principio, son valores que
el propio usuario debiera de especificar. Representan la informacin
previa y por lo tanto es la informacin que a priori y sin usar nada
de la informacin muestral hemos de especificar. Es claro que esto
no parece muy factible. Los autores proponen lo que se conoce como
un mtodo emprico bayesiano y utilizan los propios datos para
determinar estos valores.15 15
Ver seccin 6 de Smyth [2004].
Utilizando los log-odds B podemos ordenar los genes de mayor
a menor expresin diferencial. De hecho, si observamos la ecuacin
10.15 y la definicin 10.16 es fcil ver que, asumiendo que los di y
los vi no varan entre genes16 , entonces los log-odds B son funcio- 16
O varan muy poco.
nes montonas de |tij . En resumen, la ordenacin de los genes que
obtenemos con los log-odds o con los estadsticos |tij es la misma.
Es claro que los log-odds tienen una interpretacin sencilla y, por
ello, son tiles. Sin embargo, para decidir qu genes son significativos
para el contraste en que estemos interesados es mejor opcin trabajar
con los t-estadsticos moderados.17 17
Cuya definicin es una especie de
mezcla inteligente de Estadstica clsica
y bayesiana.
expresin diferencial con microarrays 223

Trabajar con los t-estadsticos moderados, t, en lugar de con los


log-odds tiene otra ventaja. Los t dependen solamente de d0 y s20 . Sin
embargo, los log-odds dependen adems de v0j y de los p j . Obvia-
mente requerimos menos estimaciones previas de hiperparmetros.18 18
Cosa nada desdeable.
Lo ms importante, sin duda,el t-estadstico moderado tiene la
ventaja sobre el t-estadstico usual de que es menos probable que
aparezcan valores muy grandes simplemente porque las varianzas
muestrales infraestiman las varianzas poblaciones. Trabajamos con
pequeas muestras lo que hace que la estimacin de la varianza sea
poco precisa. Una infraestimacin notable de esta varianza ocasiona
que el estadstico sea muy grande aunque no tengamos una diferen-
cia de medias grande. Este mismo problema se comenta en 10.1.
All se propona aadir una constante (estimada a partir de los pro-
pios datos) a la desviacin estndar de la diferencia de medias (el
error estndar). Esto es lo mismo? Es similar en espritu pero no
es lo mismo. Si los grados de libertad verifican do < + y di > 0
entonces los t-estadsticos moderados tienen la siguiente expresin
 1/2
d0 + d i ij
tij = q ,
di s2,i vij

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")

Vamos a considerar la variable que nos da la tasa de crecimiento


celular.

pData(yeastgrowthRA)[,"growthrate"]

## [1] 0.468 0.359 0.408 0.231 0.267 0.415 0.231


## [8] 0.173 0.415 0.350 0.330 0.318 0.309 0.332
## [15] 0.318 0.318 0.318 0.318 0.292 0.301 0.123

Cargamos Limma.

library(limma)

Determinamos la matriz de diseo.

design = model.matrix(~ pData(yeastgrowthRA)[,"growthrate"])


colnames(design) = c("intercept","growthrate")

Podemos ver que la matriz design.

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

Ajustamos los modelos lineales.

fit = lmFit(yeastgrowthRA,design)

## Warning: Partial NA coefficients for 17 probe(s)

fit1 = eBayes(fit)

## Warning: Zero sample variances detected, have been offset

Si la constante por la que multiplicamos growthrate es nula indica-


r que no hay una dependencia del nivel de expresin respecto de la
tasa de crecimiento celular. Veamos los resultados.
expresin diferencial con microarrays 225

topTable(fit1,coef=2,adjust ="BH")

## logFC AveExpr t P.Value


## YHR108W 637.2255 74.34238 2.789624 0.01136892
## YGL036W 209.5562 25.27523 2.772313 0.01181069
## YPL234C 867.0238 108.29753 2.708032 0.01359865
## YGL008C 2581.7977 294.28806 2.703570 0.01373187
## YNL190W 3431.0625 399.66734 2.618369 0.01652621
## YOR276W 515.7580 63.28013 2.610828 0.01679788
## YGR054W 360.5677 37.97875 2.581520 0.01836979
## YBR143C 1781.3633 168.02822 2.512373 0.02075430
## YBR015C 403.5329 53.38461 2.523409 0.02077482
## YHR025W 912.9321 104.25798 2.477618 0.02234877
## adj.P.Val B
## YHR108W 0.8508521 -4.595117
## YGL036W 0.8508521 -4.595117
## YPL234C 0.8508521 -4.595117
## YGL008C 0.8508521 -4.595117
## YNL190W 0.8508521 -4.595117
## YOR276W 0.8508521 -4.595117
## YGR054W 0.8508521 -4.595118
## YBR143C 0.8508521 -4.595118
## YBR015C 0.8508521 -4.595118
## YHR025W 0.8508521 -4.595118

Aunque alguno de los p-valores originales pudieran (marginal-


mente) considerarse como significativos cuando corregimos por com-
paraciones mltiples por el mtodo de Benjamini-Hochberg no lo
son.

10.2.3 Datos bdmy.norm con limma


Los datos que vamos a utilizar son tamidata::bdmy.norm.

data(bdmy.norm,package="tamidata")

Observamos los datos fenotpicos o metadatos.

pData(bdmy.norm)

## temperatura tiempo tipo muestra


## GROBY30C1 30 0 gb 1
## GROBY30C2 30 0 gb 2
## GROBY30C3 30 0 gb 3
## GROBY35C1 35 0 gb 1
226 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## 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

Convertimos a factor las tres primeras covariables.

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))

Vamos a realizar varios anlisis.

El primer anlisis considera un factor con tres niveles. Pretendemos


comparar cada par de grupos. En concreto corresponde a las mues-
tras con tipo gb y temperatura a 30 grados centgrados. El factor que
nos define los tres grupos es el tiempo. Seleccionamos las muestras
adecuadas (tres primeras y seis ltimas).

bdmy0 = bdmy.norm[,c(1:3,13:18)]

Determinamos la matriz de diseo.

tiempofac = factor(pData(bdmy0)[,"tiempo"])
design = model.matrix(~ tiempofac)
colnames(design) = c("Constante","tiempo30","tiempo60")

Podemos ver esta matriz de diseo.

design

## Constante tiempo30 tiempo60


## 1 1 0 0
## 2 1 0 0
expresin diferencial con microarrays 227

## 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"

La primera columna es la constante o expresin media global en


el grupo que se toma de referencia que, en este caso, es el tiempo 0.
El segundo coeficiente nos la diferencia de la media en el tiempo 30
respecto del tiempo 0 y el tercero la diferencia de la media en el tiem-
po 60 respecto del tiempo 0. Podemos contrastar si cada coeficiente o
bien comparaciones entre ellos son nulos. El inters aqu es la com-
paracin entre los distintos tiempos. Por ello parece ms adecuada la
siguiente matriz de diseo.

design = model.matrix(~ 0 + tiempofac)


colnames(design) = c("tiempo0","tiempo30","tiempo60")
design

## tiempo0 tiempo30 tiempo60


## 1 1 0 0
## 2 1 0 0
## 3 1 0 0
## 4 0 1 0
## 5 0 1 0
## 6 0 1 0
## 7 0 0 1
## 8 0 0 1
## 9 0 0 1
## attr(,"assign")
## [1] 1 1 1
## attr(,"contrasts")
## attr(,"contrasts")$tiempofac
## [1] "contr.treatment"

Hemos quitado la constante general y, ahora, cada coeficiente


corresponde con la media en cada tiempo. Ajustamos el modelo.
228 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

fit = lmFit(bdmy0,design)

## Warning: Partial NA coefficients for 142 probe(s)

Como estamos interesados en todas las comparaciones entre los


tres grupos construimos los contrastes correspondientes.

(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)

## Warning: Zero sample variances detected, have been offset

Como hemos visto en la matriz de contrastes anterior el primer


coeficiente es la diferencia de medias entre tiempo 30 y tiempo 0.
Veamos cules son significativos.

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

## YNL064C 1.011933e-03 0.5752984 -0.5114720


## YOL043C 1.304796e-03 0.5752984 -0.7024269
## YPL261C 1.332608e-03 0.5752984 -0.7184399
## YDR410C 1.405195e-03 0.5752984 -0.7588201
## YLR417W 1.209299e-03 0.5752984 -0.7996505

La comparacin entre el tiempo 60 y el inicial sera.

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

Y finalmente entre el tiempo 30 y tiempo 60.

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

## YDR124W -1.7310504 1.2285137 -4.381807


## YLR378C 0.6615884 1.1612587 4.048499
## YML114C -0.5890101 1.1764396 -4.033693
## P.Value adj.P.Val B
## YOR100C 2.260218e-05 0.1321097 0.4575387
## YOR309C 7.504473e-04 0.9791658 -0.9314870
## YGL179C 1.575064e-03 0.9791658 -1.3348749
## YER026C 1.600675e-03 0.9791658 -1.3440759
## YOL086C 3.985247e-03 0.9791658 -1.8926024
## YMR287C 4.341338e-03 0.9791658 -1.9468029
## YNR046W 2.637381e-03 0.9791658 -1.9494660
## YDR124W 4.297608e-03 0.9791658 -1.9561594
## YLR378C 4.590161e-03 0.9791658 -1.9823388
## YML114C 4.678889e-03 0.9791658 -1.9945895

Un resumen de todo lo tenemos con

(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 ...

No encontramos ningn coeficiente significativo para ningn gen.

En el segunda anlisis nos fijamos ahora en las muestras observadas en el


tiempo 0. Notemos que tenemos dos tipos y dos temperaturas. Es
un diseo factorial 2 2 donde los factores son la temperatura y el
tiempo. En cada combinacin de los factores tenemos tres muestras.
Empezamos seleccionando las muestras. Nos quedamos con un
ExpressionSet en que seleccionamos el instante inicial que correspon-
de con las 12 primeras muestras de los datos originales.

bdmy0 = bdmy.norm[,1:12]

En un diseo como este las preguntas habituales son las siguien-


tes:

1. Qu genes muestran un comportamiento diferenciado para dis-


tintas temperaturas?
expresin diferencial con microarrays 231

2. Qu genes se comportan de un modo distinto para distintos


tipos?

3. Para qu genes los cambios en su expresin para distintas tempe-


raturas son distintos en cada uno de los tipos?

En jerga estadstica hablaramos de los efectos principales de los


factores y de la posible interaccin.
Una aproximacin simple y efectiva es construir un solo factor con
todas las combinaciones de los factores.

temptipo = factor(rep(c("f30.gb","f35.gb","f30.gd","f35.gd"),each=3))

Consideremos la siguiente matriz de diseo.

design = model.matrix(~ 0 + temptipo)


colnames(design) = levels(temptipo)
design

## f30.gb f30.gd f35.gb f35.gd


## 1 1 0 0 0
## 2 1 0 0 0
## 3 1 0 0 0
## 4 0 0 1 0
## 5 0 0 1 0
## 6 0 0 1 0
## 7 0 1 0 0
## 8 0 1 0 0
## 9 0 1 0 0
## 10 0 0 0 1
## 11 0 0 0 1
## 12 0 0 0 1
## attr(,"assign")
## [1] 1 1 1 1
## attr(,"contrasts")
## attr(,"contrasts")$temptipo
## [1] "contr.treatment"

Podemos ver que cada coeficiente corresponde con la expresin


media para la correspondiente combinacin de factores.

fit = lmFit(bdmy0,design)

## Warning: Partial NA coefficients for 122 probe(s)

Construimos los contrastes en que estamos interesados.


232 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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)

Podemos ejecutar el siguiente cdigo y podemos comprobar que


ningn contraste es significativo.

topTable(fit2,coef=1,adjust="BH")
topTable(fit2,coef=2,adjust="BH")
topTable(fit2,coef=3,adjust="BH")

10.3 Un comentario tcnico importante

En este tema hemos trabajado con p-valores que estn relacio-


nados entre s. Si denotamos por Pi el valor aleatorio de el p-valor
correspondiente al contraste de Hi frente a Ki entonces su distribu-
cin (si asumimos distribucin continua para el estadstico como en
el test de la t de Student), bajo la hiptesis nula Hi , ser uniforme en
el intervalo unitario [0, 1], es decir, Pi U (0, 1). Hay procedimien-
tos de correccin de estos p-valores que consideran que los Pi son
independientes. A priori sabemos que esto no es cierto. Los genes
tienen interdependencias que se traducen en dependencias entre las
distribuciones de los Pi . Sin embargo, hay otro efecto tambin muy
destacable y no tan evidente a priori. Aquellos genes que tienen una
expresin mayor son detectados como diferencialmente expresados
con ms probabilidad. La potencia del test es mayor.
11
Expresin diferencial con datos RNASeq

11.1 Una muestra por condicin

Y si no tenemos rplicas en cada condicin que queremos com-


parar? Queremos comparar dos condiciones y disponemos de una
muestra en cada una de las condiciones. Qu podemos hacer para
comparar los conteos para cada gen?1 Para cada gen tenemos una 1
Lo primero sera pensar en tomar
alguna muestra ms por condicin
tabla de contingencia 2 2 que recoge los conteos (11.1). En esta tabla
que los milagros solamente son los
yi recoge el nmero de lecturas alineadas sobre el gen en la muestra jueves.http://es.wikipedia.org/wiki/
i (con i = 1, 2). Los tamaos de las libreras en cada muestra son mi Los_jueves, _milagro y https://www.
youtube.com/watch?v=-yDNya7XP-4.
(con i = 1, 2).

Gen Resto Total Tabla 11.1: Una muestra por condicin.


No es un opcin correcta.
Muestra 1 y1 m1 y1 m1
Muestra 2 y2 m2 y2 m2
Total y1 + y2 m1 + m2 y1 y2 m1 + m2
El problema se formula en este caso como una comparacin entre
proporciones. Si denotamos por p1 y p2 las proporciones de conteos de
un gen en una muestra (o condicin porque solo tenemos una mues-
tra) y en otra entonces el problema se formula como el contraste:
H0 : p1 = p2 frente a H1 : p1 6= p2 . Tendramos unas proporciones es-
timadas pi = yi /mi y podemos utilizar alguno de los procedimientos
estndares de comparacin de proporciones (Agresti [2002, Captulos
2 y 3]). Una primera referencia en este sentido es Kal et al. [1999].
Para ilustrar utilizaremos los datos tamidata::PRJNA297664. Nos
quedaremos con una muestra wild y otra SEC66 deletion. Com-
pararemos entre s estas dos muestras.

pacman::p_load("SummarizedExperiment")
data(PRJNA297664,package="tamidata")
se = PRJNA297664
rm(PRJNA297664)
234 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

La variable que indica el tipo es treatment.

colData(se)[,"treatment"]

## [1] Wild Wild SEC66 deletion


## [4] Wild SEC66 deletion SEC66 deletion
## Levels: Wild SEC66 deletion

Vamos a comparar las muestras 1 y 3 con la funcin edgeR::binomTest.


Para el gen i-simo tendramos los conteos xi1 e xi2 en las dos mues-
tras siendo m1 y m2 los tamaos de las libreras. Vamos a suponer
fijo el nmero total de muestras para el gen i (ni = xi1 + xi2 ). Su-
poner fijo este nmero es asumir que trabajamos condicionalmente
a los totales de las filas o genes. Tambin asumidos fijo (o dado)
el tamao total de las dos libreras, m1 y m2 . Bajo estas dos hiptesis
previas vamos a contrastar que Hi : pi = m1 /(m1 + m2 ) frente a
Hi : pi 6= m1 /(m1 + m2 ) donde pi denota ahora la proporcin en la
muestra 1 del gen i sobre un total dado de lecturas para este gen de
ni .

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()

Tambin podemos aplicar para el mismo problema el test de Fis-


her. En cualquier caso, solamente tiene sentido hacer este anlisis
cuando tenemos una muestra en cada condicin.2
Qu hacemos con ms de una muestra? Realizar todas las com-
paraciones dos a dos? No. Obviamente hay que buscar procedimien-
tos ms adecuados. 2
Y tampoco mucho.
Se puede realizar algo similar cuando tenemos varias muestras
por cada una de las dos condiciones? Es tentador simplemente sumar
los conteos de cada gen en cada condicin. Tendramos el total de
lecturas por gen y condicin. Sin embargo, si consideramos la tabla
11.1 correspondiente estaramos ignorando la variabilidad intra con-
dicin de los conteos correspondientes. En este caso hemos de acudir
a alguno de los procedimientos que vemos en la siguientes secciones.

De porqu una muestra por condicin no es buena consejera. Vamos a


evaluar de un modo emprico porqu necesitamos ms muestras por
expresin diferencial con datos rnaseq 235

condicin. Porqu esa prctica (ms frecuente de lo que se debiera)


de tener una muestra por condicin no se debe de utilizar. Siguien-
do con PRJNA297664 tenemos 9 posibles pares formados por una
muestra por condicin. Vamos a calcular los p-valores para cada
una de estas nueve posibles comparaciones y ver cmo varan estos
p-valores.

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)

Por cada gen tenemos el p-valor resultado de comparar cada uno


de los pares. Tenemos pues 9 p-valores por gen. Calculamos el p-
valor medio, el mnimo y el mximo y los ordenamos de menor a
mayor. Finalmente representamos en abscisas el p-valor medio y
en ordenadas dos lneas correspondientes al mnimo y al mximo.
Dada la gran cantidad de puntos hemos de representar una versin
suavizada del mnimo y mximo.

pvalores.mean = apply(pvalores,1,mean) ## Media de p-valores


pvalores.min = apply(pvalores,1,min) ## Mnimo de p-valores
pvalores.max = apply(pvalores,1,max) ## Mximo de p-valores
df = data.frame(pvalores.mean,pvalores.min,pvalores.max)
df=df[sort(pvalores.mean,index.return=TRUE)$ix,] ## Ordenamos
df1 = reshape2::melt(df,id="pvalores.mean")
pp = ggplot(df1,aes(x=pvalores.mean,y=value,color=variable))
pp + geom_smooth() # Suavizamos mnimo y mximo

En la figura 11.1 tenemos el resultado. Podemos ver la tremenda


variabilidad que tenemos.

11.2 edgeR

Este paquete implementa los procedimientos propuestos en Robin-


son and Smyth [2008, 2007]3
3
Hay que leer primero Robinson and
Smyth [2008] y luego Robinson and
11.2.1 Estimacin de una dispersin comn Smyth [2007] pues es la secuencia
temporal de los trabajos aunque se
Consideramos una caracterstica en n muestras (o libreras) de publicaron en orden invertido.
tamaos distintos.4 Sea mi el tamao de la i-sima librera (total de 4
Son rplicas de una misma experimen-
lecturas). Sea la proporcin que hay en una librera cualquiera de tacin con tamaos distintos.

la caracterstica en que estamos interesados. Vamos a asumir que Yi


tiene una distribucin binomial negativa con media i = mi y con
dispersin . 5 5
Y tiene una distribucin binomial
negativa con media y dispersin
, Y BN (, ), si su funcin de
probabilidad es P(Y = y|, ) =
  1  y
( y + 1 ) 1
(1 )(y+1) 1+ 1 +
para
y = 0, 1, . . .. Su media es E(Y ) = y su
varianza var (Y ) = + 2 . Ver 25.8.2.
236 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Supongamos el caso ideal (e irreal) en que todas las libreras tienen


el mismo tamao: mi = m para i = 1, . . . , n. Bajo esta condicin tene-
mos que Z = in=1 Yi NB(nm, /n). Adems la logverosimilitud
condicionada al valor de Z = z no depende de y podemos estimar
el valor de . Por tanto, se estimara maximizando la verosimilitud
condicionada dada por
 n 
ly| z = log (yi + 1/) +
i =1
log (n/) log (z + n/) n log (1/), (11.1)

donde y = (y1 , . . . , yn )0 son los conteos observados. Si los tamaos


de las libreras son distintos la verosimilitud no tiene una expresin
simple. La idea en Robinson and Smyth [2008] es modificar los valo-
res observados yi y generar unos nuevos datos en que los tamaos de
las libreras coincidan, los pseudodatos. El tamao comn ser la me-
dia geomtrica de los tamaos observados, m = n in=1 mi . Cmo
p

transformamos los conteos yi ? El procedimiento propuesto es:

1. Inicializamos (por ejemplo, con el estimador maxmo verosmil


condicionado sin realizar ningn ajuste).

2. Dado el valor estimado de , estimamos maximizando la verosi-


militud para el valor estimado de la dispersin.

3. Suponemos que cada conteo yi es un valor observado de una


distribucin binomial negativa con media mi y parmetro de
dispersin . Calculamos los percentiles
1
pi = P(Y < yi |mi , ) + P(Y = yi |mi , ), (11.2)
2
para i = 1, . . . , n.

4. Suponemos ahora una distribucin binomial negativa con media


m y dispersion . Determinamos qu valor sera el percentil
de orden pi en la nueva distribucin. Ya no tiene porqu ser un
dato entero e incluso puede ser negativo. Los pseudodatos para un
mismo gen tienen aproximadamente la misma distribucin.

5. Estimamos la dispersin con los pseudodatos utilizando la


veromilitud condicionada a la (pseudo) suma total de un gen.

6. Repetimos desde 2 hasta 5 hasta que converja .

A este procedimiento de estimacin de y los autores lo deno-


minan mxima verosimilitud condicionada ajustada por cuantiles.6 Lo 6
Quantile-adjusted condicional maxi-
fundamental es entender que estamos modificando los datos para mum likelihood (qCML).

conseguir un tamao comn de las libreras, una misma profundidad


de secuenciacin.
expresin diferencial con datos rnaseq 237

11.2.2 Un test exacto


Tenemos dos condiciones a comparar.

Estimacin de la dispersin comn. Vamos a asumir en un primer


momento que el parmetro de dispersin es comn. Tenemos yijk
el conteo para la muestra k en la condicin j del gen i donde j =
1, 2 y k = 1, . . . , n j . El tamao de la librera de la condicin j en el
gen i es mij Supongamos que aplicamos el mtodo qCML dentro de
cada condicin j de modo que por condicin tenemos un tamao de
librera comn. Con los pseudodatos (que denotamos tambin yijk
podemos condicionar a la suma total por gen dentro de cada clase.
Como el parmetro de dispersin se asume el mismo para todos
los genes y condiciones podemos considerar la logverosimilitud
nj
condicionada a zij = yij = k=1 yijk para la dispersin dada por

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)

En consecuencia la logverosimilitud comn es7 7


Sera ms correcto hablar de pseudo-
verosimilitud ya que los distintos genes
N son dependientes.
l () = li ( ). (11.4)
i =1

La estimacin de en 11.2.1 se obtiene maximizando la funcin


dada en la ecuacin 11.4. Denotamos a este estimador comn por C
y es el usado en lo que sigue.

Contraste de hiptesis. Tenemos dos condiciones a comparar y esta-


mos asumiendo
EYijk = mij ij ,

para cualquier i, j, k siendo Yijk el conteo aleatorio del gen i en la


condicin j y en la muestra k. Si consideramos la hiptesis nula de
que no hay diferencia entre los valores de , es decir, el contraste
siguiente:

Hi : i1 = i2 ,
Ki : i1 6= i2 .

Bajo la hiptesis nula el valor no depende de la condicin.


Aplicamos el mtodo qCML a todas las muestras (tenemos n = n1 +
n2 ). Como es habitual denotamos los nuevos pseudodatos como los
originales. El tamao de las libreras es la media geomtrica de los
238 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

tamaos originales y la denotamos por m .8 Estos nuevos psedodatos 8


Importante, los pseudodatos no son
tienen una distribucin comn. En concreto para el gen i denotamos los mismos utilizados para estimar la
dispersin comn.
por yijk el conteo para la muestra k en la condicin j donde j = 1, 2
y k = 1, . . . , n j . El tamao comn de todas las libreras es m . Si
consideramos la variable aleatoria Yijk (de la cual yijk sera el valor
observado) entonces
EYijk = m ij ,

para cualquier i, j, k. Bajo la hiptesis nula H0 no tendramos dife-


rencia en el valor de entre las condiciones y sera un valor comn
i = i1 = i2 para el gen i. Utilizando el estimador previamente
calculado C y los pseudatos (que obtienen un tamao de librera
comn) yijk con k = 1, . . . , n j podemos estimar i . Simplemente el
estimador mximo verosmil no es ms que el cociente de la suma
de los conteos dividido por la suma de los tamaos de las libreras.
Tenemos las estimaciones i y C .
Bajo la hiptesis nula de no diferencia entre grupos tendramos
nj
que Yij = k=1 Yijk NB(n j m i , C /n j ) para j = 1, 2. Ade-
ms Yi1 e Yi2 son independientes. La suma Yi1 + Yi2 tambin tiene
nj
una distribucin binomial negativa: Yi1 + Yi2 = 2i=1 k=1 Yijk
NB((n1 + n2 )m i , C /(n1 + n2 )). Podemos considerar la distribucin
condicionada del vector aleatorio (Yi1 , Yi2 ) a la suma Yi1 + Yi2 y
considerar las probabilidades de los conteos conjuntos que son menos
probables que el observado. La suma de estas probabilidades nos dara
el p-valor del test.9 9
Es un test similar al test de Fisher
bilateral en donde las probabilidades
hipergeomtricas son sustituidas por
11.2.3 Dispersiones posiblemente distintas probabilidades por la distribucin
binomial negativa. Ver Agresti [2002,
Pgina 93].
En el test exacto que hemos visto en 11.2.2 hemos asumido una
dispersin comn y se ha estimado su valor utilizando los con-
teos asociados a todos los genes y condiciones bajo las cuales se han
observado a estos genes. Bajo la hiptesis nula de un misma media,
y asumiendo la dispersin comn esto tena sentido. Es, sin duda,
una hiptesis bastante exigente. Una misma dispersin sobre una
cantidad grande de genes no es muy razonable.10 En Robinson and 10
Buena desde el punto de vista del
modelo y su estimacin pero nos aleja
Smyth [2007] proponen no asumir un mismo valor para cada gen y
de los datos.
considerar que las dispersiones dependen del gen. Tenemos ahora, en
lugar del valor comn , un valor (posiblemente) distinto para el gen
i, i . Y cmo lo estimamos? Proponen un compromiso entre la con-
tribucin que hacen los conteos del i-simo gen, li (ecuacin 11.3), a
la logverosimilitud global, l (ecuacin 11.4), y la propia logverosimili-
tud global. En concreto hablan de la logverosimilitud condicionanda
ponderada definida como

W L(i ) = li (i ) + l (i ), (11.5)
expresin diferencial con datos rnaseq 239

siendo el peso que se da a la verosimilitud global. Es una funcin


que propone un compromiso entre considerar l como funcin a ma-
ximizar considerando la misma contribucin a todos los genes y li en
donde solamente consideramos los conteos del propio gen. El proble-
ma fundamental a considerar ahora es la eleccin del valor de . Un
mayor nos aproxima a un valor comn para la dispersin y un me-
nor valor nos dar estimaciones distintas de la dispersin para cada
gen. En qu punto nos quedamos? En Robinson and Smyth [2007,
Seccin, 3.2, pg. 2883] dan una motivacin11 11
No un criterio de optimalidad. Sim-
Para explicar cmo lo hacen hemos de considerar la funcin score plemente argumentan lo razonable de
la eleccin.
definida como
l ()
Si ( ) = i (11.6)

y la informacin esperada definida como

2 li ( )
Ii () = E( Ji ), siendo Ji = . (11.7)
2

El procedimiento de estimacin de y la posterior estimacin de


i es el siguiente:

1. Estimamos la dispersin comn maximizando la verosimilitud


global l: 0 .

2. Evaluamos para cada gen i: Si (0 ) y Ii (0 ).

3. Estimamos 0 resolviendo la ecuacin

N  
Si (0 )
Ii (0 )(1 + Ii (0 )02 )
1 = 0.
i =1

Si iN=1 Si2 (0 )/Ii (0 ) < N entonces 0 = 0.

4. Fijamos
N
1/ = 02 Ii (0 ).
i =1

5. Una vez estimado en el paso anterior, maximizamos la funcin


W L(i ) definida en la ecuacin 11.5.

Finalmente los autores utilizan en lugar de la informacin esperada


Ii (0 ) una aproximacin que consiste en utilizar la observada (en-
tendiendo por observada la correspondiente a los conteos dados). Es
decir, sustituyen Ii (0 ) por Ji (0 ). Adems comentan que trabajan
con = /( + 1).12 12
Lo cual es irrelevante. Estimamos
estimamos pues hay una correspon-
dencia 1-1.
240 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

11.2.4 edgeR: PRJNA297664


En esta seccin analizamos la posible expresin diferencial de los
datos tamidata::PRJNA297664.

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

dge.t = estimateTagwiseDisp(dge.c) ##Dispersiones por gen


et.c = exactTest(dge.c)
et.t = exactTest(dge.t)

Determinamos los genes significativos.

topTags(et.c)

## Comparison of groups: SEC66 deletion-Wild


## logFC logCPM PValue
## YBR171W -10.150220 6.114922 2.128721e-258
## YCR021C -1.928779 8.463733 4.873506e-47
## YBR054W -1.878579 7.156683 3.518798e-43
## YGL255W -1.846348 7.518466 1.930761e-42
## YNR034W-A -2.176676 4.670571 1.175800e-40
## YBR093C -1.694281 8.563323 2.731791e-37
## YFR053C 1.621598 6.384697 2.625927e-31
## YER150W -1.560027 5.479642 2.325258e-26
## YDR171W -1.383170 7.792428 2.142035e-25
## YDR214W 1.362108 7.982939 1.024220e-24
## FDR
## YBR171W 1.516926e-254
## YCR021C 1.736430e-43
## YBR054W 8.358319e-40
## YGL255W 3.439650e-39
## YNR034W-A 1.675750e-37
## YBR093C 3.244457e-34
## YFR053C 2.673194e-28
## YER150W 2.071224e-23
## YDR171W 1.696016e-22
## YDR214W 7.298590e-22
expresin diferencial con datos rnaseq 241

topTags(et.t)

## Comparison of groups: SEC66 deletion-Wild


## logFC logCPM PValue
## YBR171W -10.150503 6.114922 5.626918e-296
## YGL255W -1.846051 7.518466 5.457136e-30
## YBR093C -1.694086 8.563323 5.842776e-27
## YNR034W-A -2.174452 4.670571 7.405310e-22
## YDR214W 1.362104 7.982939 2.334412e-20
## YLR109W 1.240894 9.510958 4.582740e-20
## YHR215W -1.208860 9.533270 2.172411e-18
## YAR071W -1.211709 9.219219 3.764180e-18
## YMR186W 1.109256 11.622933 9.483487e-18
## YKL161C 1.100257 5.723199 1.070160e-16
## FDR
## YBR171W 4.009742e-292
## YGL255W 1.944378e-26
## YBR093C 1.387854e-23
## YNR034W-A 1.319256e-18
## YDR214W 3.327005e-17
## YLR109W 5.442768e-17
## YHR215W 2.211515e-15
## YAR071W 3.352943e-15
## YMR186W 7.508814e-15
## YKL161C 7.625962e-14

11.2.5 edgeR: maqc


Vamos a utilizar los datos maqc.13 Recordemos que son un objeto 13
7.11.
de clase ExpressionSet.

library(Biobase)
load("maqc_eset.RData")

El ExpressionSet es maqc.eset. Hemos de construir un objeto de


clase edgeR::DGEList. Notemos que la matriz de expresin corres-
ponde ahora con los conteos por gen. El factor experimental es la
variable fenotpica tissue. La funcin edgeR::DGEList nos crea este
objeto y hemos de indicarle los conteos por gen y el factor experi-
mental.

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.

factor experimental, lib.size es el tamao de la librera o profundi-


dad de secuenciacin calculada como la suma de todos los conteos
para todos los genes de una misma muestra. Con el siguiente cdigo
podemos comprobarlo.

head(apply(dge$counts,2,sum))

## SRX016359.1 SRX016359.2 SRX016359.3 SRX016359.4


## 1139330 1443781 1451904 1537886
## SRX016359.6 SRX016359.7
## 1490690 1488620

En edgeR hemos de normalizar aquellos efectos que dependen ex-


clusivamente de las muestras. Hemos de considerar la longitud del
gen? Aquellos genes ms largos tendern a observarse ms lecturas
sobre l. Sin embargo, lo mismo ocurre en cada muestra de toda la
experimentacin. En definitiva como vamos a comparar este gen en
distintas condiciones del mismo experimento esto significa que el ses-
go es el mismo en todas ellas. Las medias se modifican de la misma
forma en los dos grupos y nosotros comparamos estas medias. No se
precisa corregir este efecto.
El segundo efecto es la profundidad de secuenciacin. Del total
de molculas muestreamos una parte. El tamao de la librera o
profundidad de secuenciacin no es ms que el tamao muestral. En
principio, esto habra que corregirlo pero hemos visto previamente
que este efecto es considerado explicitamente en el modelo y por
lo tanto s se tiene en cuenta y el usuario no tiene que corregirlo
previamente. Es la mejor opcin desde el punto de vista estadstico,
incorporarlo en el propio modelo.
Las funciones de edgeR trabajan con los conteos originales sin
aplicarles ningn tipo de normalizacin previa.
Vamos a estimar la dispersin comn .

dge.c = estimateCommonDisp(dge)

El valor estimado de , , sera

dge.c$common.dispersion

## [1] 0.0005323165

Los pseudoconteos obtenidos son


expresin diferencial con datos rnaseq 243

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

Ahora estimamos las dispersiones para cada gen.15 15


Previamente se tiene que haber
estimado la comn.
dge.t = estimateTagwiseDisp(dge.c)

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.

## [1] 0.0179462862 0.0012471135 0.0005703896


## [4] 0.0005696324 0.0003260761 0.0002347824

Vamos a analizar la posible expresin diferencial. Empezamos con


el test exacto antes comentado con la funcin edgeR::exactTest. Se
puede utilizar la hiptesis de un parmetro de dispersin comn o
bien de parmetros de dispersin distintos por gen.

(et.c = exactTest(dge.c))

## An object of class "DGEExact"


## $table
## logFC logCPM PValue
## ENSG00000000003 2.9562929 3.2845042 5.786985e-26
## ENSG00000000005 1.6312510 0.7721872 2.188035e-01
## ENSG00000000419 2.2952277 3.9746738 1.069951e-30
## ENSG00000000457 0.1839263 3.7236017 3.612018e-01
## ENSG00000000460 3.1936553 2.2846197 8.675885e-13
## 52575 more rows ...
##
## $comparison
244 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## [1] "brain" "UHR"


##
## $genes
## NULL

(et.t = exactTest(dge.t))

## An object of class "DGEExact"


## $table
## logFC logCPM PValue
## ENSG00000000003 2.9541664 3.2845042 2.458117e-22
## ENSG00000000005 1.6312523 0.7721872 2.188752e-01
## ENSG00000000419 2.2952158 3.9746738 1.121307e-30
## ENSG00000000457 0.1839249 3.7236017 3.613497e-01
## ENSG00000000460 3.1936804 2.2846197 8.481375e-13
## 52575 more rows ...
##
## $comparison
## [1] "brain" "UHR"
##
## $genes
## NULL

11.3 SAMseq

Este mtodo fue propuesto en Li and Tibshirani [2013] y est im-


plementado en el paquete Tibshirani et al. [2011, samr]. Supongamos
el caso con dos grupos. Denotamos como siempre por xij el conteo
de la i-sima caracterstica en la j-sima muestra (i = 1, . . . , N y
j = 1, . . . , n). El tamao de la librera o profundidad de secuenciacin
ser m j = N j=1 xij . Como siempre el valor observado es xij mientras
que el valor aleatorio (antes de observar los datos) lo denotamos con
Xij . Los ndices correspondientes a los dos grupos de muestras los
denotamos por C1 y C2 . Estos conjuntos de ndices constituyen una
particin de {1, . . . , n}. Suponemos que las clases C1 y C2 la compo-
nen n1 y n2 elementos (con n1 + n2 = n).
Supongamos, en un primer momento, que todas las profundidades
de secuenciacin son iguales m1 = . . . = mn = m. Fijamos la ca-
racterstica i. Ordenamos (de menor a mayor) los conteos xi1 , . . . , xin .
La posicin de xij en xi = ( xi1 , . . . , xin ) la denotamos por rij ( xi ).
Si consideramos el valor aleatorio Xi entonces tenemos la variable
aleatoria Rij ( Xi ). El estadstico de Mann-Whitney-Wilcoxon17 sera 17
A veces se le llama de Mann-Whitney,
otras de Wilcoxon y otras con los tres
nombres.
expresin diferencial con datos rnaseq 245

n1 ( n + 1)
Ti = Rij ( Xi )
2
. (11.8)
jC1

Se supone que no tenemos empates en Xi . Si Ti es muy grande sig-


nifica que en la caracterstica i los valores en la primera clase (C1 )
tienden a ser mayores que en la segunda (C2 ). Un valor muy pequeo
indica lo contrario. Notemos que Ti puede tomar valores negativos.
En general, si el valor absoluto | Ti | es muy grande, lo que tenemos
es que ambos grupos de valores son claramente distintos, uno mayor
que el otro. Valores prximos a cero indican que no hay diferencias
entre los grupos. Hasta aqu no hay problema ninguno. Simplemente
se propone utilizar un test de Mann-Whitney-Wilcoxon para com-
parar los rdenes en los dos grupos que comparamos. El problema
aparece cuando los tamaos de las libreras son distintas que es lo
habitual. De hecho, suelen ser muy distintos. Una primera idea que
no da buenos resultados es dividir los conteos originales por los co-
rrespondientes tamaos de las libreras.
Suponemos fijos los tamaos de las libreras. Esto es, aunque supo-
nemos conteos aleatorios la suma de las correspondientes columnas
de conteos las asumimos como fijas.18 Denotamos el mnimo tamao 18
Una hiptesis necesaria.
de las libreras con m0 = mn j=1,...,n m j y la librera donde se da este
mnimo suponemos que es la j0 . Supongamos que, para la librera j,
del total de lecturas elegimos al azar m0 (correspondiente a la librera
con menor tamao). Esto supone que cada lectura original de esta
librera es conservada con probabilidad m 0
m y eliminada con proba-
j
bilidad 1 m 0 0
m j . Si denotamos por Xij el nmero de lecturas que nos
quedan despus de este proceso de muestreo tendremos que
m0
Xij0 | Xij Binomial ( Xij , ).
mj

Los autores llaman a esto un muestreo hacia abajo.19 Este procedi- 19


Down sampling.
miento de muestreo nos produce unos nuevos conteos y un nuevo
valor del estadstico dado en 11.8 que podemos denotar por Ti0 . No-
temos que si el tamao mnimo es mucho menor que el resto de
tamaos estamos descartando muchas lecturas.
Una segunda opcin es igualar los tamaos de las libreras a un
 1/n
n
valor intermedio como la media geomtrica m = j=1 m j .
Generamos conteos aleatorios con
m
 
Xij0 | Xij Poisson Xij . (11.9)
mj

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

siendo eij variables aleatorias independientes y con distribucin


comn uniforme en el intervalo [0, 0,1].20 Como vemos estamos ge- 20
Un pequeo truco para evitar empa-
nerando valores por lo que lo que obtenemos tambin es aleatorio. tes.

Supongamos que en un muestreo obtenemos obtenemos Ti0 (b). Repe-


timos este muestreo B veces. Consideramos el estadstico
B
1
Ti =
B Ti0 (b). (11.10)
b =1

Este es el estadstico con el que finalmente se trabaja para contrastar.


No conocemos la distribucin de este estadstico. Hemos indicado
que la regin crtica natural, la zona en donde rechazamos la hipte-
sis nula de que no hay diferencia significativa entre muestras vendra
dada por Ti > c siendo c un valor a determinar. Dado un valor posi-
tivo c consideraremos como significativa a la caracterstica i si Ti > c.
Lo que vamos a hacer es elegir un conjunto de posibles valores para
c y estimaremos la tasa de hiptesis nulas falsamente rechazadas si
utilizamos ese valor de c. El procedimiento21 es el siguiente: 21
Ver Storey and Tibshirani [2003].

1. Calculamos T1 , . . . , TN
a partir de nuestros datos.

2. Permutamos S veces las columnas de X manteniendo la asigna-


cin de los grupos (las etiquetas de clase) y calculamos T1 (s), . . . , TN
(s)

utilizando los datos permutados con s = 1, . . . , S.

3. Tomamos una serie de valores para c y calculamos:

N S
1
V =
S 1|Ti (s)|>c (11.11)
i =1 s =1

que estima la cantidad de hiptesis nulas falsamente rechazadas y

N
R = 1|Ti |>c (11.12)
i =1

que estima la cantidad de hiptesis nulas rechazadas.

4. El valor de FDR asociado a cada valor c es estimado con

[ (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

11.3.1 SAMseq: PRJNA297664

pacman::p_load("SummarizedExperiment","samr")
data(PRJNA297664,package="tamidata")

PRJNA297664samseq = SAMseq(x = assay(PRJNA297664),


y = colData(PRJNA297664)[,"treatment"],
resp.type="Two class unpaired",geneid = rownames(PRJNA297664),
genenames=rownames(PRJNA297664),nperms = 1000,nresamp = 40,
fdr.output = 0.20)

Podemos ver los resultados con23 23


No mostrado.

print(PRJNA297664samseq)

Un dibujo con los resultados que podemos ver en figura 11.1

plot(PRJNA297664samseq)

11.4 DESeq

El mtodo aparece en Anders and Huber [2010].24


Figura 11.1: Genes significativos con los
En http://www.bioconductor.org/help/workflows/rnaseqGene/
datos PRJNA297664.
tenemos un ejemplo completamente desarrollado con este ejemplo. 24
Es de un gran inters el material
suplementario asociado a este trabajo.

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

El paquete CummeRbund permite visualizar los resultados produ-


cidos por Cuffdiff.
248 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

11.10 EBSeq

11.11 Material adicional

En 25 tenemos un estudio comparativo de distintos procedimientos 25


Fatemeh Seyednasrollah, Asta Laiho,
para expresin diferencial utilizando distintos paquetes de Biocon- and Laura L. Elo. Comparison of
software packages for detecting diffe-
ductor. rential expression in rna-seq studies.
Briefings in Bioinformatics, 2013. doi:
10.1093/bib/bbt086. URL http://bib.
11.12 Ejercicios oxfordjournals.org/content/early/
2013/12/02/bib.bbt086.abstract
Ej. 12 Para los datos tamidata::PRJNA297664 se pde:
1.Aplicar el procedimiento de comparacin de proporciones utili-
zando edgeR::binomTest a las muestras 1 y 3.
2.Ajustar los p-valores obtenidos en el punto anterior por el mtodo
de Benjamini-Hochberg.
3.Una vez ajustados los p-valores determinar cuantos y cuales tienen
un p-valor ajustado menor a 0.01.
4.Repetir los tres pasos anteriores comparando las muestras 2 y 5.
5.Cuntos genes han sido detectados como significativos simult-
neamente en los puntos 3 y 4?
12
Tamao muestral y potencia

Los paquetes que vamos a utilizar son

Microarrays Qiu et al. [2015, sizepower],Pawitan and Ploner [2015,


OCplus], Warnes et al. [2012, ssize],

RNASeq Therneau [2015, RNASeqPower], Zhao et al. [2015, RnaSeq-


SampleSize] y sus datos asociados en Zhao et al. [2014, RnaSeq-
SampleSizeData]. Wu [2015, PROPER],

Ambos van Iterson [2015, SSPA]

ChIP-Seq Zuo and Keles [2015, CSSP]


13
Generando un informe

En temas previos hemos visto cmo obtener subconjuntos de ge-


nes con expresin diferencial. Ya tenemos la lista. Lo habitual es
querer explorar este grupo de genes. Y el modo ms til posible-
mente sea generar un archivo en HTML con enlaces a bases de datos
donde nos proporcionan informacin sobre ellos como puede ser Ge-
ne Ontology. Esto nos permitir consultar posteriormente nuestros
resultados con nuestro navegador.1 1
Que esperemos no sea Internet Explo-
La complejidad del problema que se aborda hace que este paso rer.

sea muy importante. En la prctica estadstica clsica se generaba


un informe y el investigador interpreta los resultados y redacta un
informe. En este contexto el problema es mayor. Bsicamente se ex-
plora en la gran cantidad de genes y por ello los resultados han de
ser validados y, posiblemente, nuevas hiptesis generadas.
En este tema nos proponemos el siguiente objetivo: generar un
fichero en que cada fila contenga distintos identificadores de aque-
llos genes que declaramos con expresin diferencial significativa
as como los p-valores originales y los ajustados.
Utilizamos como ejemplo los datos GSE20986.2 2
5.11.

library(Biobase)
data(gse20986,package="tamidata")
eset = gse20986

En concreto nos vamos a fijar en la comparacin entre las muestras


extradas de clulas endoteliales vasculares de la retina y de clu-
las endoteliales de la vena umbilical (abreviadamente hablamos de
clulas de la retina y huvec). Con el siguiente cdigo3 nos aplica- 3
8 y 9.
mos un t-test, a los p-valores obtenidos le aplicamos el mtodo de
Benjamini-Hochberg con un FDR de 0.05. Los genes significativos son
los que utilizamos en el resto de tema para ilustrar la generacin de
un informe a partir de ellos.
252 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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)

En el vector sig tenemos las filas que ocupan, en la matriz de


expresin, los genes declarados significativos por el procedimiento
indicado. Podemos ver las primeras filas (no estn ordenados segn
que el p-valor original o ajustado sea menor, simplemente son las
primeras filas de la matriz) son:

head(sig)

## [1] 10 35 148 263 389 623

El nmero de significativos es

nsig = length(sig)

Guardamos los p-valores y los p-valores ajustados.

pvalor = p.BH$adjp[1:nsig,1]
pajustado = p.BH$adjp[1:nsig,2]

En 13.1 vemos cmo obtener distintos identificadores de este


grupo de genes utilizando el paquete Gentleman [2015, annotate]. En
13.2 y 13.3 generamos ficheros HTML utilizando estos identifica-
dores con los paquetes Lecoutre [2014, R2HTML] y Hackney et al.
[2015, ReportingTools] respectivamente. En 13.2 y 13.3 ofrecemos
dos opciones alternativas (la mejor es la segunda) y necesitan lo que
vemos en 13.1.

13.1 Identificando el grupo de genes

El primer problema es asociar a los genes seleccionados un identi-


ficador. Qu anotacin tienen nuestros datos? Necesitamos el paque-
te Gentleman [2015, annotate].
generando un informe 253

library(annotate)

La funcin annotate::annotation nos indica la anotacin.

annotation(eset)

## [1] "hgu133plus2"

Cargamos (despus de instalarlo) el paquete correspondiente.

library(hgu133plus2.db)

Obtenemos los identificadores de nuestros genes. Tenemos un chip


de Affymetrix por ello tendremos los identificadores AffyID. Puesto
que tenemos un ExpressionSet podemos hacer

ID = featureNames(eset)[sig]

Los primeros seran

head(ID)

## [1] "1431_at" "1552288_at" "1552467_at"


## [4] "1552627_a_at" "1552799_at" "1553129_at"

Podemos determinar los smbolos de nuestros genes. Dos posibles


formas de hacerlo son

lookUp(ID, "hgu133plus2.db", "SYMBOL")


getSYMBOL(ID,"hgu133plus2.db")

Sus nombres con

lookUp(ID, "hgu133plus2.db", "GENENAME")

Supongamos que queremos obtener informacin sobre estos genes


en la base de datos Ensembl. Cules son sus identificadores en esta
base de datos?

lookUp(ID, "hgu133plus2.db", "ENSEMBL")

O en Gene Ontology?

lookUp(ID, "hgu133plus2.db", "GO")

O bien sus identificadores en Entrez.


254 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

lookUp(ID, "hgu133plus2.db", "ENTREZID")

Y bastante ms informacin. Toda la informacin que podemos


obtener se puede consultar en la ayuda del paquete Carlson [2015c,
hgu133plus2.db] o bien con

ls("package:hgu133plus2.db")

13.2 R2HTML

Veamos cmo hacerlo con el paquete Lecoutre [2014, R2HTML].

library(R2HTML)

En 13.1 hemos visto cmo obtener a partir de las filas de la ma-


triz de expresin distintos identicadores de los genes. Repetimos el
cdigo de dicha seccin guardando los resultados.

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

Lo siguiente es definir un data.frame donde reunimos toda la


informacin. Incorporamos los p-valores y los p-valores ajustados.

tmp = data.frame(ID=ID, Symbol=Symbol, Name=Name, Ensembl=Ensembl,


entrezid = entrezid,pvalor = pvalor,pajustado = pajustado, stringsAsFactors=F)

Podemos tener campos vacos que hay que declarar como datos
faltantes.

tmp[tmp=="NA"] = NA
HTML(tmp,"reports/prueba.html",append=F)

El informe que hemos generado lo podemos ver con el navegador.4 4


Crucemos los dedos para que no sea
Internet Explorer.

browseURL("reports/prueba.html")

Parece que un fichero HTML sin hipervnculos no parece muy til.


Se los aadimos.
generando un informe 255

Ensembl = ifelse(Ensembl=="NA", NA,


paste("<a href='http://useast.ensembl.org/Homo_sapiens/Gene/Summary?g=",
Ensembl, "'>", Ensembl, "</a>", sep=""))
tmp = data.frame(ID=ID, Symbol=Symbol, Name=Name, Ensembl=Ensembl,
stringsAsFactors=F)
entrezid = ifelse(entrezid=="NA", NA,
paste("<a href='http://www.ncbi.nlm.nih.gov/gene/?term=",
entrezid,"'>",entrezid,"</a>", sep=""))
tmp = data.frame(ID=ID, Symbol=Symbol, Name=Name, Ensembl=Ensembl,
entrezid = entrezid,pvalor = pvalor,pajustado = pajustado,
stringsAsFactors=F)
tmp[tmp=="NA"] <- NA
HTML(tmp,"reports/prueba.html",append=F)

Y vemos el nuevo fichero.

browseURL("reports/prueba.html")

13.3 ReportingTools

En esta seccin vemos cmo generar un informe con Hackney


et al. [2015, ReportingTools]. Cargamos el paquete.

library(ReportingTools)

Obtenemos distintos identificadores.

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=""))

Posiblemente queramos aadir a estos descriptores los p-valores


originales as como los ajustados. Generamos un data.frame con los
distintos identificadores.

df = data.frame(ID = ID,Name = Name,entrezid = entrezid,


pvalor = pvalor,pajustado = pajustado,stringsAsFactors=F)
256 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Utilizando ReportingTools::HTMLReport fijamos el nombre del


fichero en que guardamos la informacin as como el directorio en
donde estar dicho fichero.

foutput = "gse20986.DE"
htmlRep1 = HTMLReport(shortName = foutput,title = foutput,
reportDirectory = "./reports")

Guardamos la informacin y cerramos el fichero con las funciones


ReportingTools::publish y ReportingTools::finish.

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

Ejercicio 6. Utilizando el ExpressionSet gse1397 se pide:

1. Cul es el chip utilizado?

2. Seleccionar el gen en la fila 678. Cul es su identificador Affymetrix,


AffyID? Determinar los identificadores en las siguientes bases de datos:
Ensembl, Gene Ontology y NCBI.

3. Elegir al azar 100 genes con la funcin sample. Determinar sus AffyIDs
y los correspondientes en Ensembl, Gene Ontology y NCBI.

a) Generar un fichero HTML tal que en las cuatro primeras columnas


tengamos los identificadores.
b) Repetir el punto anterior pero de modo que, asociado a los identifica-
dores en Ensembl, Gene Ontology y NCBI nos aparezca en vnculo
para el acceso a la base de datos correspondiente.
Parte IV

Reduccin de dimensin y
clasificacin
14
Componentes principales

14.1 Introduccin

En este tema nos ocupamos de problemas de reduccin de dimen-


sin. Qu significa reducir la dimensin? Responder a esta pregunta
es obvio si nos fijamos en los datos que tenemos. Trabajando con ex-
presin de genes tenemos tantas filas como genes y tantas columnas
como muestras. En resumen miles de filas y decenas o centenares
de columnas. En el tema En temas anteriores hemos visto como se-
leccionar filas, esto es, seleccionar genes es una tarea incluso previa.
Hemos de quedarnos con genes que tengan una expresin diferencial
si consideramos alguna caracterstica fenotpica o bien con genes que
tengan una expresin mnima o bien con genes que tengan un cierto
nivel de variacin. Qu hacemos con las columnas? O de otro modo:
qu hacemos con las muestras? Quizs la respuesta natural sera:
si tenemos miles de filas, por qu preocuparse de unas decenas de
filas? No es una buena respuesta. Realmente tener 50 o 100 columnas
son muchas a la hora de visualizar resultados o bien de aplicar trata-
mientos estadsticos. En este tema tratamos el tema de cmo reducir
el nmero de columnas o el nmero de filas.

14.2 Componentes principales

Para ilustrar los conceptos vamos a considerar unos datos senci-


llos. Tomamos los datos golub y nos fijamos en los genes que tienen
que ver con Cyclin (tienen esta palabra en su nombre). Vamos a
considerar las dos primeras muestras, esto es, las dos primeras co-
lumnas.
260 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

library(multtest)
data(golub)
sel = grep("Cyclin",golub.gnames[,2])
golub.red = golub[sel,1:2]

1.5

Los datos aparecen en la figura 14.1.

1.0
golub.red[,2]

0.5

plot(golub.red)

0.0

1.5 1.0 0.5


Cada punto corresponde con uno de los genes seleccionados.

Para la fila i (para el gen i) denotamos las expresiones observadas


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]

Centramos los datos. Esto es, le restamos a cada columna la media


Figura 14.1: Expresin de las dos
de la columna. Para ello, primero calculamos las medias. El vector de primeras muestras de los datos golub
medias lo vamos a denotar por x = ( x1 , x2 ) donde para aquellos genes que contienen la
expresin Cyclin.
n xij
x j = n
i =1

es decir, cada componente es la media de las componentes. En re-


sumen el primer valor es la expresin media en la primera muestra
para todos los genes. Podemos calcular fcilmente el vector de me-
dias. Una funcin especfica es la siguiente.

medias = colMeans(golub.red)

Tambin podemos usar la funcin genrica apply que nos hace lo


mismo.

medias = apply(golub.red,2,mean)

Le restamos a cada columna su media.

golub.red = sweep(golub.red,2,medias)

En la figura 14.2 reproducimos los datos centrados y mostramos


los ejes de coordenadas en rojo.

plot(golub.red)
abline(v=mean(golub.red[,1]),col="red")
abline(h=mean(golub.red[,2]),col="red")

Hemos trasladado los datos de modo que las medias de cada


variable valen cero ahora. Esto es lo que se conoce como centrar los
datos. Hemos centrado los datos. Podemos comprobar que los nuevos
datos tienen una media nula.
componentes principales 261

Figura 14.2: a) Centramos los datos go-


lub.red y mostramos el nuevo sistema
de coordenadas en rojo. b) Vectores que
colMeans(golub.red) definen las lneas donde proyectamos.
c) Las lneas sobre las que proyecta-
## [1] -3.006854e-17 1.069746e-17 mos. d) Datos golub.red mostrando las
lneas sobre las que proyectamos (en
azul) para obtener las dos componentes
Nuestros datos (filas) corresponden a las expresiones correspon- principales y las proyecciones sobre la
dientes a los genes. Los datos originales tienen dimensin 2 (dos primera componente en verde. e) Datos
golub.red mostrando las lneas sobre
variables correspondientes a las dos muestras) y supongamos que
las que proyectamos (en azul) para
pretendemos reducir la dimensin a solo una, esto es, representar obtener las dos componentes principa-
cada gen mediante un nico nmero. La idea de las componentes les y las proyecciones sobre la segunda
componente.
principales es considerar una combinacin lineal de los valores ori-
ginales. Es decir, se pretende elegir un vector (de dimensin dos)
a1 = ( a11 , a12 ) de modo que en lugar de utilizar xi consideremos
(el resumen) ui = a11 xi1 + a12 xi2 . Qu a1 elegimos? La idea es lo-
grar que los valores ui tengan la mayor variabilidad que se pueda
con objeto de no perder informacin. Mantener la variabilidad origi-
nal indica que mantenemos la informacin que los datos originales
tienen. En concreto se elige a1 de modo que maximizamos
n
1
n (ui u)2 .
i =1

El vector a1 nos indica la direccin sobre la cual proyectamos los da-


tos originales. Las proyecciones sobre a1 , los valores ui son la mejor
262 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

descripcin univariante de los datos. La segunda mejor descripcin


que sea ortogonal a la anterior seran las proyecciones sobre la l-
nea ortogonal a la primera que pasa por el origen de coordenadas.
Obtengamos las componentes principales.

a.pca = prcomp(golub.red)

Los vectores directores de las lneas sobre las que proyectamos


aparecen en la figura 14.2. Estos vectores son

a.pca$rotation

## PC1 PC2
## [1,] -0.7619878 0.6475914
## [2,] -0.6475914 -0.7619878

Las lneas sobre las que proyectamos aparecen en azul en la figura


14.2 Hemos trasladado los datos de modo que las medias de cada
variable valen cero ahora. Esto es lo que se conoce como centrar los
datos. Hemos centrado los datos. Podemos comprobar que los nuevos
datos tienen una media nula.

colMeans(golub.red)

## [1] -3.006854e-17 1.069746e-17

Nuestros datos (filas) corresponden a las expresiones correspon-


dientes a los genes. Los datos originales tienen dimensin 2 (dos
variables correspondientes a las dos muestras) y supongamos que
pretendemos reducir la dimensin a solo una, esto es, representar
cada gen mediante un nico nmero. La idea de las componentes
principales es considerar una combinacin lineal de los valores ori-
ginales. Es decir, se pretende elegir un vector (de dimensin dos)
a1 = ( a11 , a12 ) de modo que en lugar de utilizar xi consideremos
(el resumen) ui = a11 xi1 + a12 xi2 . Qu a1 elegimos? La idea es lo-
grar que los valores ui tengan la mayor variabilidad que se pueda
con objeto de no perder informacin. Mantener la variabilidad origi-
nal indica que mantenemos la informacin que los datos originales
tienen. En concreto se elige a1 de modo que maximizamos
n
1
n (ui u)2 .
i =1

El vector a1 nos indica la direccin sobre la cual proyectamos los da-


tos originales. Las proyecciones sobre a1 , los valores ui son la mejor
descripcin univariante de los datos. La segunda mejor descripcin
componentes principales 263

que sea ortogonal a la anterior seran las proyecciones sobre la l-


nea ortogonal a la primera que pasa por el origen de coordenadas.
Obtengamos las componentes principales.

a.pca = prcomp(golub.red)

Los vectores directores de las lneas sobre las que proyectamos


aparecen en la figura 14.2(b). Estos vectores son

a.pca$rotation

## PC1 PC2
## [1,] -0.7619878 0.6475914
## [2,] -0.6475914 -0.7619878

Las lneas sobre las que proyectamos aparecen en azul en la figura


14.2(c). Y finalmente podemos ver las proyecciones. En verde mostra-
mos las proyecciones sobre la primera componente (figura 14.2(d)). Y
ahora consideremos la proyeccin sobre la segunda componente. En
la figura 14.2(e) la mostramos. Los valores de estas proyecciones los
obtenemos con

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

Las desviaciones estndar de la primera y segunda componente


principal son las siguientes

## [1] 1.4687760 0.1849567

Y las varianzas son los cuadrados de las desviaciones estndar.


264 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

a.pca$sdev^2

## [1] 2.15730290 0.03420899

Cmo de variables son nuestros datos? Podemos cuantificar el


total de la variacin de los datos sumando las varianzas de cada una
de las dos coordenadas

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

Las nuevas coordenadas tienen la misma varianza total.

sum(a.pca$sdev^2)

## [1] 2.191512

Y qu proporcin de la varianza es atribuible a la primera compo-


nente? Y a la segunda? Podemos dividir la varianza de cada compo-
nente por la suma total.

variacion.total = sum(a.pca$sdev^2)
a.pca$sdev^2 / variacion.total

## [1] 0.98439023 0.01560977

La primera componente explica un 98.44 % de la variacin total.


Para qu necesitamos utilizar dos nmeros por gen si con uno tene-
mos esencialmente la misma informacin.

14.3 Componentes principales de los datos golub

Hemos visto las componentes principales con dos variables (en


nuestro caso dos muestras) con efecto de poder ver el significado
geomtrico de las componentes principales. Vamos a trabajar con
componentes principales 265

el banco de datos completo: todos los datos golub que tienen 38


muestras (27 de un tipo de leucemia y 11 de otro tipo).
Obtengamos las componentes principales.

golub.pca = prcomp(golub,scale=FALSE,center=TRUE)

El argumento center=TRUE centra los datos restando la media de


la columna de modo que las variables tengan medias nulas. El argu-
mento scale=TRUE hace que las variables originales sean divididas
por su desviacin estndar de modo que la varianza (y la desviacin
estndar) de las nuevas variables sea la unidad.
Diferentes criterios podemos aplicar a la hora de decidir con cun-
tas componentes nos quedamos.

1. Uno puede ser la proporcin total explicada. Fijar un nivel mni-


mo y quedarnos con el nmero de componentes necesario para
superar este valor mnimo.

2. El segundo puede ser que una componente no puede tener una


desviacin estndar menor que una de las variables originales. Si
hemos escalado cada variable original dividiendo por su desvia-
cin estndar entonces la desviacin estndar de cada componente
ha de ser mayor que uno.

3. Otro criterio puede ser ver en qu momento se produce un des-


censo de la desviacin estndar muy notable. Quedarnos con las
componentes previas.

Un resumen de las componentes nos puede indicar con cuntas


nos quedamos.

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

## Standard deviation 0.63630 0.56700 0.55263


## Proportion of Variance 0.01065 0.00846 0.00804
## Cumulative Proportion 0.86672 0.87518 0.88321
## PC13 PC14 PC15
## Standard deviation 0.53868 0.52011 0.49568
## Proportion of Variance 0.00764 0.00712 0.00647
## Cumulative Proportion 0.89085 0.89797 0.90443
## PC16 PC17 PC18
## Standard deviation 0.48402 0.47719 0.47068
## Proportion of Variance 0.00617 0.00599 0.00583
## Cumulative Proportion 0.91060 0.91659 0.92242
## PC19 PC20 PC21
## Standard deviation 0.45421 0.43795 0.43410
## Proportion of Variance 0.00543 0.00505 0.00496
## Cumulative Proportion 0.92785 0.93290 0.93786
## PC22 PC23 PC24
## Standard deviation 0.42475 0.41582 0.40718
## Proportion of Variance 0.00475 0.00455 0.00436
## Cumulative Proportion 0.94260 0.94715 0.95152
## PC25 PC26 PC27
## Standard deviation 0.40066 0.3948 0.38731
## Proportion of Variance 0.00422 0.0041 0.00395
## Cumulative Proportion 0.95574 0.9598 0.96379
## PC28 PC29 PC30
## Standard deviation 0.38417 0.37882 0.37124
## Proportion of Variance 0.00388 0.00378 0.00363
## Cumulative Proportion 0.96767 0.97145 0.97508
## PC31 PC32 PC33
## Standard deviation 0.36957 0.3596 0.3593
## Proportion of Variance 0.00359 0.0034 0.0034
## Cumulative Proportion 0.97867 0.9821 0.9855
## PC34 PC35 PC36
## Standard deviation 0.35276 0.34218 0.33228
## Proportion of Variance 0.00327 0.00308 0.00291
## Cumulative Proportion 0.98875 0.99183 0.99473
## PC37 PC38
## Standard deviation 0.32572 0.30667
## Proportion of Variance 0.00279 0.00247
## Cumulative Proportion 0.99753 1.00000

En este caso podemos aplicar el criterio 1 o 3 ya que no hemos


dividido por la desviacin estndar.
Si fijamos, por ejemplo un 80 % de la variacin total a explicar
entonces debemos quedarnos con las cinco primeras componentes.
componentes principales 267

Atendiendo al tercer criterio quizs (muy subjetivo) tampoco sea


una mala solucin quedarnos con las cinco primeras. Puede ser una
buena eleccin y una solucin intermedia. Los nuevos datos los obte-
nemos con la funcin predict.

a = predict(golub.pca)

Podemos ver todas las componentes para el primer gen (primera


fila).

a[1,]

## PC1 PC2 PC3


## -7.037559379 -1.611150783 -0.580507718
## PC4 PC5 PC6
## 0.008740257 0.538496894 0.217863112
## PC7 PC8 PC9
## 0.095229954 -0.918846037 0.512919401
## PC10 PC11 PC12
## 0.863356337 -0.199100855 -0.661871987
## PC13 PC14 PC15
## 0.098500958 1.167024082 -0.080881207
## PC16 PC17 PC18
## 0.019311238 0.311828852 -0.734193835
## PC19 PC20 PC21
## 0.484426444 -0.413971027 0.861064042
## PC22 PC23 PC24
## 0.412112072 -0.169223915 -0.042496895
## PC25 PC26 PC27
## 0.392156775 -0.810609198 -0.724090154
## PC28 PC29 PC30
## -0.022842034 -0.267379502 0.223249663
## PC31 PC32 PC33
## 0.004501899 -0.066925615 -0.420010671
## PC34 PC35 PC36
## 0.043025063 0.325939735 -0.095872751
## PC37 PC38
## 0.451061057 0.873973312

Y ahora nos quedamos con las primeras cinco columnas corres-


pondientes con las cinco primeras componentes principales como
hemos decidido previamente.

a = a[,1:5]
268 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Podemos representar, como es habitual, las dos primeras compo-


nentes. Lo tenemos en la figura 14.3



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

## [5] 0.1659431 0.1668800 0.1686381 0.1602445


Figura 14.3: Dos primeras componentes
## [9] 0.1648769 0.1687936 0.1653992 0.1694389 principales de los datos golub.
## [13] 0.1629073 0.1661268 0.1647691 0.1720833
## [17] 0.1559293 0.1600159 0.1677201 0.1491867
## [21] 0.1272725 0.1620961 0.1643597 0.1652554
## [25] 0.1659262 0.1690494 0.1539691 0.1689052
## [29] 0.1541333 0.1516988 0.1691436 0.1682306
## [33] 0.1452419 0.1675335 0.1638384 0.1508645
## [37] 0.1476137 0.1520465

Podemos ver que son coeficientes muy parecidos, todos positivos.


Bsicamente tenemos la media muestral de todos los niveles de ex-
presin en las 38 muestras. La primera componente es bsicamente la
media sobre las 38 muestras. Y la segunda componente?

golub.pca$rotation[,2]

## [1] 0.104190349 -0.036887376 0.069108679


## [4] 0.100701406 0.170952497 0.028349013
## [7] 0.032390592 0.000505933 0.093593873
## [10] 0.023532773 0.075375878 -0.089380731
## [13] 0.233399832 0.077938472 0.237951078
## [16] 0.184071755 0.078196661 0.041608386
## [19] 0.114629249 0.247148154 0.201580365
## [22] -0.014147623 0.037858911 0.210585781
## [25] -0.044465104 0.122286768 0.021439090
## [28] -0.189278987 -0.174593342 -0.243775839
## [31] -0.165316096 -0.150156242 -0.344034501
## [34] -0.157687744 -0.130649728 -0.277921375
## [37] -0.344828851 -0.222765782

Si observamos los coeficientes vemos que las primeros 27 valores


son positivos y los 11 ltimos son negativos. Adems no hay una
gran diferencia entre los 27 primeros y tampoco entre los 11 ltimos.
Bsicamente (aunque no exactamente) estamos comparando, para
componentes principales 269

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).

14.4 Componentes principales de las muestras o de los genes?

En la seccin anterior hemos realizado un anlisis de compo-


nentes principales de las muestras, esto es, la reduccin de dimensin
supona resumir, para gen, su perfil de expresin con menos valores.
Sin embargo, tambin podemos realizar un anlisis de componen-
tes principales de los genes. En este caso, las observaciones son las
muestras y las variables seran las expresiones sobre los genes. Ob-
viamente podemos realizarlo sobre el conjunto de todos los genes o
bien despus de aplicar alguna seleccin previa (bien un filtrado no
especfico, bien utilizando informacin sobre los propios genes).

Ejemplo 7 (Datos golub). Pretendemos hacer un anlisis de componentes


principales donde las observaciones son las muestras y para cada muestra
tenemos su perfil de expresin sobre todos los genes. Para ello hemos de
considerar la matriz traspuesta de la matriz de expresin original con la
funcin t(). A los datos que obtenemos le aplicamos la funcin prcomp.

tgolub.pca = prcomp(t(golub),scale=FALSE,center=TRUE)

Veamos el resumen del anlisis que acabamos de realizar.

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

## Cumulative Proportion 0.62398 0.64816 0.67126


## PC13 PC14 PC15
## Standard deviation 4.72354 4.50857 4.40036
## Proportion of Variance 0.02141 0.01951 0.01858
## Cumulative Proportion 0.69267 0.71218 0.73076
## PC16 PC17 PC18
## Standard deviation 4.34750 4.27398 4.12411
## Proportion of Variance 0.01814 0.01753 0.01632
## Cumulative Proportion 0.74890 0.76643 0.78275
## PC19 PC20 PC21
## Standard deviation 3.98196 3.94862 3.85795
## Proportion of Variance 0.01522 0.01496 0.01428
## Cumulative Proportion 0.79796 0.81292 0.82721
## PC22 PC23 PC24
## Standard deviation 3.77535 3.69767 3.64804
## Proportion of Variance 0.01368 0.01312 0.01277
## Cumulative Proportion 0.84088 0.85400 0.86677
## PC25 PC26 PC27
## Standard deviation 3.58436 3.51711 3.49260
## Proportion of Variance 0.01233 0.01187 0.01171
## Cumulative Proportion 0.87910 0.89097 0.90268
## PC28 PC29 PC30
## Standard deviation 3.44527 3.37281 3.35604
## Proportion of Variance 0.01139 0.01092 0.01081
## Cumulative Proportion 0.91407 0.92498 0.93579
## PC31 PC32 PC33
## Standard deviation 3.26862 3.26192 3.21319
## Proportion of Variance 0.01025 0.01021 0.00991
## Cumulative Proportion 0.94604 0.95625 0.96616
## PC34 PC35 PC36
## Standard deviation 3.10703 3.01784 2.95738
## Proportion of Variance 0.00926 0.00874 0.00839
## Cumulative Proportion 0.97543 0.98416 0.99256
## PC37 PC38
## Standard deviation 2.78502 7.019e-15
## Proportion of Variance 0.00744 0.000e+00
## Cumulative Proportion 1.00000 1.000e+00

En principio, la dimensin de mis datos es de 3051 que es el nmero de


genes con los que estamos trabajando. Sin embargo, vemos que solamente
considera 38 posibles componentes principales. Por qu? Pues porque es el
rango de la matriz de covarianzas.1 1
Es un comentario incomprensible
Es interesante representar las componentes principales de las muestras siguiendo el material anterior. Lo indico
simplemente.
y los genes. En las figuras 14.4 y 14.5 mostramos las dos primeras com-
componentes principales 271

ponentes utilizando la funcin plotPCA del paquete MacDonald [2008,


Principal Components Plot
affycoretools].

20
library(affycoretools)

plotPCA(golub,legend = FALSE)

10
PC2
plotPCA(t(golub),legend = FALSE)

Cuando realizamos un anlisis de los genes sabemos que las observaciones

10

estn clasificadas (las muestras son de dos tipos de leucemia). La funcin


plotPCA est preparada para mostrarnos si las componentes nos repro- 20 10 0 10 20

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.

tipo = factor(golub.cl+1,levels = 1:2,labels = c("ALL","AML"))


Principal Components Plot
plotPCA(golub,groups = tipo, groupnames = tipo,legend=FALSE)

5

Podemos ver cmo la primera componente principal diferencia bastante










claramente los dos tipos de leucemia.






























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.

tras y genes y, sobre el papel, la escala es la misma. Pero: y si no es


as? En este caso en lugar de trabajar con las variables originales las Principal Components Plot

tipificamos y realizamos el anlisis anterior con estos datos.2


20

Reproducimos (y no mostramos) el anlisis de los datos golub pe-

ro utilizando datos tipificados. Notemos que la opcin fundamental


10

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

Figura 14.6: Dos primeras componentes


principales de los datos golub. donde se
aplican las componentes a los genes y
14.6 Ejemplos diferenciamos la muestra con un color y
tipo de punto distintos.
Ejemplo 8 (GSE20986). Cargamos los datos. 2
Realmente si no tipificamos y simple-
mentamos centramos los datos estamos
realizando un anlisis de componentes
principales sobre la matriz de cova-
rianzas. Si tipificamos las variables
entonces estamos realizando un anli-
sis de componentes principales sobre
la matriz de correlaciones. En 31.2
definimos matriz de covarianzas y de
correlaciones.
272 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

data(gse20986r,package="tamidata")

## Warning in data(gse20986r, package = "tamidata"): data


set gse20986r not found

La covariable fenotpica que nos indica el tejido de donde se obtuvo la


muestra es

pData(gse20986)[,"tissue"]

## [1] iris retina retina iris


## [5] retina iris choroides choroides
## [9] choroides huvec huvec huvec
## Levels: iris retina choroides huvec

En la figura 14.7 vemos representadas las componentes principales de los


genes.

plotPCA(gse20986,groups = pData(gse20986)[,"tissue"], Principal Components Plot

groupnames = c("iris","retina","choroides","huvec")) iris

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

muestran una diferenciacin.

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

mos que tomamos la matriz de expresin y luego aplicamos la traspuesta ya PC1

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

## Cumulative Proportion 0.92608 0.9538 0.97551


## PC10 PC11
## Standard deviation 13.42973 10.17401
## Proportion of Variance 0.01556 0.00893
## Cumulative Proportion 0.99107 1.00000
## PC12
## Standard deviation 1.705e-13
## Proportion of Variance 0.000e+00
## Cumulative Proportion 1.000e+00

Apreciamos que las dos primeras componentes nos explican un 64.61 %


de la variacin total.

Ejemplo 9 (GSE1397). Leemos los datos.

data(gse1397,package="tamidata")

Tenemos los metadatos fenotpicos con

pData(gse1397)

Vemos que la variable que nos indica la alteracin y el tejido son

pData(gse1397)[,'type']

## [1] Euploid Euploid Euploid Euploid Euploid


## [6] Euploid Euploid TS21 TS21 TS21
## [11] TS21 TS21 TS21 TS21
## Levels: Euploid TS21

pData(gse1397)[,'tissue']

## [1] Cerebrum Cerebrum Cerebrum Cerebrum


## [5] Cerebellum Cerebellum Cerebellum Cerebrum
## [9] Cerebrum Cerebrum Cerebrum Cerebellum
## [13] Cerebellum Cerebellum
## Levels: Cerebrum Cerebellum

En la figura 14.8 tenemos el resultado de un anlisis de componentes


principales considerando los genes como observaciones y diferenciando segn
el tipo de alteracin.

plotPCA(gse1397, groups = pData(gse1397)[,'type'],


groupnames = levels(pData(gse1397)[,'type']))
PC2

20000 10000

274 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

20000 10000 0 10000 20000

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

14.7 Componentes principales 20000 10000 0 10000 20000

PC1

Figura 14.9: Dos primeras compo-


En esta seccin realizamos una presentacin ms formal del con-
nentes principales de datos GSE1397
cepto de componente principal. Su nivel no corresponde con el resto diferenciando el tejido.
del captulo y se incluye como material complementario.
Cuando tomamos medidas sobre genes, personas, objetos, em-
presas, unidades experimentales de un modo genrico, se tiende a
recoger el mximo de variables posible. En consecuencia tenemos
dimensiones del vector de caractersticas X grandes.
Una opcin consiste en sustituir la observacin original, de di-
mensin d, por k combinaciones lineales de las mismas. Obviamente
pretendemos que k sea mucho menor que d. El objetivo es elegir k
de modo que expresen una proporcin razonable de la dispersin o
variacin total cuantificada como la traza de la matriz de covarianza
muestral, tr (S),
Sea X un vector aleatorio de dimensin d con vector de medias
y matriz de covarianzas . Sea T = (t1 , t2 , . . . , td ) (los ti indican la
i-sima columna de la matriz) la matriz ortogonal tal que

T 0 T = = diag(1 , . . . , d ), (14.1)

donde 1 2 . . . d 0 son los valores propios de la matriz .


Sea
Y = T 0 ( X ). (14.2)

Si denotamos la j-sima componente de Y como Yj entonces Yj =


t0j ( X ) con j = 1, . . . , d. A la variable Yj la llamamos la j-sima
Y
componente principal de Y. La variable Zj = j es la j-sima
j
componente principal estandarizada de Y.
Estas componentes tienen algunas propiedades de gran inters.
Notemos que el vector t j tiene longitud unitaria y, por lo tanto, Yj no
es ms que la proyeccin ortogonal de X en la direccin t j .
componentes principales 275

Proposicin 1. 1. Las variables Yj son incorreladas y var (Yj ) = j .

2. Las variables Zj son incorreladas y con varianza unitaria.

Demostracin.
En cuanto al apartado primero tenemos que

var (Y ) = var ( T 0 ( X ) = T 0 var (Y ) T = T 0 T = .

El segundo apartado es directo a partir del primero.

Se verifica el siguiente resultado.

Teorema 1. Las componentes principales Yj = t0j ( X ) con j = 1, . . . , d


tienen las siguientes propiedades:

1. Para cualquier vector a1 de longitud unitaria, var ( a10 X ) alcanza su valor


mximo 1 cuando a1 = t1 .

2. Para cualquier vector a j de longitud unitaria tal que a0j ti = 0 para


i = 1, . . . , j 1, se tiene que var ( a0j X toma su valor mximo j cuando
aj = tj.

3. dj=1 var (Yj ) = dj=1 var ( X j ) = traza().

La versin muestral de las componentes principales la obtenemos


sustituyendo en lo anterior y por X y respectivamente. Es
importante considerar el estimador de que estamos utilizando (o
bien el estimador insesgado donde dividimos por n 1 o bien el
estimador en donde dividimos por n).
Si denotamos por 1 . . . d los valores propios ordenados
de y la matriz T = (t1 , . . . , td ) es la matriz tal que cada columna es
el correspondiente vector propio entonces tenemos las componentes
principales muestrales dadas por y j = T 0 ( xi x ). La nueva matriz de
datos viene dada por

Y 0 = (y1 , . . . , yn ) = T 0 ( x1 x, . . . , xn x ) (14.3)

Finalmente, si las variables vienen dadas en unidades muy dis-


tintas puede ser conveniente sustituir la matriz de covarianzas (po-
blacional o muestral) por la correspondiente matriz de correlaciones.
De hecho, una de los inconvenientes de las componentes principales
como un modo de reducir la dimensin de los datos es precisamente
que obtenemos resultados distintos si utilizamos las componentes
principales obtenidas a partir de la matriz de covarianzas o bien las
componentes principales obtenidas a partir de la matriz de correla-
ciones.
276 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

A partir de las d variables originales podemos obtener hasta d


componentes principales. Sin embargo, hemos dicho que pretende-
mos reducir la dimensin del vector de datos. La pregunta a respon-
der es: con cuntas componentes nos quedamos?
Supongamos que estamos trabajando con la matriz de covarian-
zas . Hemos de recordar que var (y j ) = j y que dj=1 var ( x j ) =
dj=1 var (y j ) = dj=1 j . En consecuencia se suelen considerar los
siguientes cocientes

kj=1 j
, con k = 1, . . . , d,
dj=1 j

de modo que, cuando para un cierto valor de k, estamos prximos a


la unidad nos quedamos con ese valor de k. En la versin muestral
trabajaremos o bien con los valores propios de la matriz de covarian-
zas muestral o la matriz de correlaciones muestrales.
Una referencia muy interesante sobre componentes principales es
Abdi and Williams [2010].
15
Anlisis cluster

15.1 Introduccin

Este tema est dedicado al anlisis cluster y su aplicacin a datos


de expresin de gen. Trataremos lo que en la literatura estadstica
recibe el nombre de anlisis cluster1 o, en mejor castellano, anlisis de 1
Por cierto que la palabra cluster no
conglomerados. En la literatura de Inteligencia Artificial se utiliza la existe en castellano

expresin clasificacin no supervisada.2 2


Por tradicin, utilizaremos la ex-
Qu vamos a clasificar cuando trabajamos con datos de expresin presin de anlisis cluster. Es la que,
personalmente, prefiero.
de gen? Nuestra informacin es la matriz de expresin. Podemos
considerar como observaciones a clasificar los genes. En este caso,
la observacin son los niveles de expresin observados en todas las
muestras, el perfil de expresin del gen sobre las muestras analiza-
das.
Tambin podemos considerar como observaciones a clasificar las
muestras. En este caso cada muestra viene descrita por sus expresio-
nes sobre todos los genes. Podemos trabajar con todos los genes o
con un subconjunto de genes.
En uno u otro caso tenemos una muestra de observaciones mul-
tivariantes de dimensin d. Qu pretendemos hacer con ellos?
Encontrar grupos. Muy breve la respuesta pero: qu son grupos?
Imaginemos una imagen area fija de un patio de un colegio. En esta
imagen los datos son las posiciones de los nios. Se agrupan los ni-
os formando grupos o todos estn jugando con todos y los grupos
son una consecuencia pasajera del juego (delanteros y defensas que
aparecen agrupados en un ataque)?
Parece claro y simple el problema. S, lo parece. Qu es un grupo?
Cmo defino un grupo? Cuntos grupos distingo en los datos?
Estamos viendo el efecto del ruido o realmente hay una estructura
debajo que la vemos en un entorno con ruido.
Qu quiere decir encontrar grupos? Se trata de clasificar las ob-
servaciones en grupos de modo que las observaciones de un mismo
278 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

grupo sean lo ms similares que podamos y que los grupos entre s


sean muy distintos. El nmero de procedimientos que se han pro-
puesto en la literatura es muy grande. La mayor parte de ellos no
tienen un modelo probabilstico debajo, no son procedimientos basa-
dos en modelo. Son mtodos que esencialmente utilizan el concepto de
proximidad. Valoran de distintas formas lo prximos, lo cercanos que
estn los puntos, dentro de un mismo grupo y entre distintos grupos.
Es pues, el primer punto a tratar: cmo cuantificamos lo cerca o lejos
que estn los distintos puntos? En 15.3 nos ocupamos de este punto.
Tambin ser necesario, como veremos en el tema, valorar cuando
dos conjuntos de puntos son ms o menos parecidos, proximos, si-
milares. En la misma seccin nos ocupamos de ello. Supongamos
que ya hemos clasificado en distintos grupos. Hemos tenido xito
al hacerla? Cuando tenemos un anlisis discriminante tenemos una
muestra donde sabemos a qu grupo pertenece el individuo y dnde
lo hemos clasificado. Esto nos permita valorar si nuestro procedi-
miento clasifica bien o no. Aqu no vamos a tener esta referencia que
nos da la muestra de entrenamiento. Cmo valorarlo? Un concepto
conocido por silueta y debido a Rousseeuw Kaufman and Rousseeuw
[1990] nos va a servir para ello. No es ni tan simple ni tan satisfac-
torio como en anlisis discriminante (como es de esperar si tenemos
menos informacin para trabajar). Lo estudiamos en 15.8.
Entre los muchos procedimientos de obtener los grupos a partir de
los datos, los ms utilizados son dos tipos: procedimientos jerrqui-
cos y mtodos de particionamiento. De los jerrquicos nos ocupamos
en 15.5. El mtodo de las k-medias y el mtodo de las k-mediodes
(el castellano como siempre es muy sufrido pues no existe la palabra)
son mtodos de particionamiento y los tratamos en 15.7.
Un texto antiguo pero de un inters enorme en este tema es Sneath
and Sokal [1973].

15.2 Datos

En esta seccin presentamos tres ejemplos sencillos de obser-


vaciones a agrupar y que utizamos como ilustracin simple de los
mtodos que proponemos.

15.2.1 Un ejemplo artificial

Son unos datos muy conocidos, los datos Ruspini. Estn en el


paquete cluster Maechler et al. [2016].3 3
En este tema el paquete cluster es, sin
Cargamos el paquete y los datos. duda, el fundamental.
anlisis cluster 279

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)

Previamente hemos visto que los valores de expresin de los genes


CCND3 Cyclin D3 y Zyxin permiten diferenciar entre ALL y
AML. Localicemos las expresiones correspondientes a estos genes.

grep("CCND3 Cyclin D3",golub.gnames[,2])

## [1] 1042

grep("Zyxin",golub.gnames[,2])

## [1] 2124

Los datos aparecen en estas filas. Por lo tanto podemos construir la


matriz de datos correspondiente.

cz.data = data.frame(golub[1042,],golub[2124,])
colnames(cz.data) = c("CCND3 Cyclin D3","Zyxin")

Este ser un segundo ejemplo para analizar. Los datos aparecen en



la figura 15.2.
2

plot(cz.data)

Zyxin

En este caso las observaciones corresponden a las muestras y las


variables son los niveles de expresin de dos genes. Hay grupos?






Esto no son datos artificiales como los de Ruspini y ya no es tan


0.5 0.0 0.5 1.0 1.5 2.0 2.5
claro. CCND3 Cyclin D3

Figura 15.2: Datos cz.data


280 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

15.2.3 Un ejemplo con genes


Consideremos (otra vez) los datos golub.

library(multtest)
data(golub)

Para cada gen vamos a considerar la expresin media sobre los


casos ALL

x = apply(golub[,golub.cl == 0],1,mean)

y la media sobre los casos AML.

y = apply(golub[,golub.cl == 1],1,mean)

Y vamos a limitarnos a un conjunto de genes. En concreto vamos


a considerar los genes que se relacionan con el trmino biolgico
Cyclin. Determinamos qu filas ocupan.

sel = grep("Cyclin",golub.gnames[,2])

La funcin grep busca la palabra Cyclin en cada uno de los nom-


bres que le pasamos. Y los nombres de estos genes son

golub.gnames[sel,2]

## [1] "CCND2 Cyclin D2"


## [2] "CDK2 Cyclin-dependent kinase 2"
## [3] "CCND3 Cyclin D3"
## [4] "CDKN1A Cyclin-dependent kinase inhibitor 1A (p21, Cip1)"
## [5] "CCNH Cyclin H"
## [6] "Cyclin-dependent kinase 4 (CDK4) gene"
## [7] "Cyclin G2 mRNA"
## [8] "Cyclin A1 mRNA"
## [9] "Cyclin-selective ubiquitin carrier protein mRNA"
## [10] "CDK6 Cyclin-dependent kinase 6"
## [11] "Cyclin G1 mRNA"
## [12] "CCNF Cyclin F"

Ahora nos limitamos a considerar las expresiones medias para los


casos ALL y los casos AML para estos genes.

cyclin.data = data.frame(x[sel],y[sel])
colnames(cyclin.data) = c("meanALL","meanAML")

En la figura 15.3 mostramos los datos.


anlisis cluster 281

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

En lo que sigue denotaremos los datos a agrupar con xi con


1.0 0.5 0.0 0.5 1.0 1.5 2.0
i = 1, . . . n siendo xi Rd . Todos los ejemplos que hemos visto meanALL

en la seccin anterior eran (con objeto de poder representarlos) datos


Figura 15.3: Datos cyclin.data.
bidimensionales, d = 2.

15.3.1 Distancias eucldea y de Manhattan


Empezamos tratando el problema de cuantificar el grado de pro-
ximidad, de similaridad entre dos puntos en el espacio de dimensin
d. Tradicionalmente este tema en Matemticas se ha formalizado a
travs del concepto de distancia o mtrica. Una mtrica es una funcin
que a cada par de puntos x, y Rd le asocia un valor positivo de mo-
do que cuando mayor es ms distantes son, ms alejados estn. Como
siempre la formalizacin matemtica de un concepto intuitivo ha de
ser prudente y pedir que se verifiquen ciertos axiomas que resulten
razonables y generalmente admisibles. Las distancias ms utilizadas
en anlisis cluster son la distancia eucldea y la distancia de Manhat-
tan. Para dos vectores x e y (en Rd ) entonces la distancia eucldea se
define como v
u d
d E ( x, y) = t ( xk yk )2 ,
u
(15.1)
k =1

con x, y Rd . La distancia de Manhattan viene dada por

d
d M ( x, y) = | x k y k |. (15.2)
k =1

Las distancias eucldea y de Manhattan son adecuadas cuando tra-


bajamos con variables continuas y que adems estn en una misma
escala. Son dos ejemplos de distancias o mtricas.4 En lo que sigue 4
En concreto la funcin d definida en el
en lugar de distancia utilizaremos el trmino medida de disimilaridad espacio producto Rd Rd se dice que
es una mtrica si verifica:
indicando que no necesariamente ha de ser distancia. Es una visin
No negativa d( x, y) 0.
menos restrictiva a la hora de definir que dos genes estn cerca. Un punto dista 0 de s mismo d( x, x ) = 0.
En lo que sigue agrupamos bien genes bien muestras. Si esta clasi- Simetra d( x, y) = d(y, x ).
ficacin no supervisada la basamos en una distancia lo que buscamos
Desigualdad triangular d( x, z)
es encontrar grupos de genes que tienen perfiles de expresin si- d( x, y) + d(y, z), para todo
milares. En definitiva que se comportan de un modo parecido en x, y, z Rd .
282 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

el experimento para todas las muestras. Si agrupamos muestras lo


que buscamos son muestras que, para los genes considerados, tienen
unas expresiones similares. Por ejemplo, si las muestras correspon-
den a un cierto tipo de cncer entonces los grupos que podemos
encontrar seran subtipos de cncer. En resumen genes o muestras los
consideramos similares cuando sus expresiones lo son. Adems inter-
pretamos la similaridad como una mtrica. El concepto de distancia
o mtrica (del cual hemos visto dos ejemplos) es limitado en mu-
chas aplicaciones. En ocasiones podemos interpretar que dos genes
estn prximos cuando sus expresiones estn relacionadas de alguna
forma, en resumen, cuando estn corregulados. En este caso podemos
usar para definir la disimilaridad a partir de una cuantificacin de la
dependencia entre los genes.

15.3.2 Disimilaridades utilizando coeficientes de correlacin


Consideremos dos genes con perfiles x = ( x1 , . . . , xn ) e y =
(y1 , . . . , yn ). En primer lugar pretendemos cuantificar el grado de de-
pendencia entre los pares ( xi , yi ) para i = 1, . . . , n. Si nos limitamos a
la posible dependencia lineal entre estos pares entonces el coeficiente
de correlacin de Pearson es la medida genricamente aceptada. En
31.1 tenemos su definicin y algunas propiedades bsicas. Se define
como
in=1 ( xi xn )(yi yn )
r x,y = q q .
in=1 ( xi xn )2 in=1 (yi yn )2

Lo fundamental es que vara entre -1 y 1. Cuando toma valores prxi-


mos a cero indica independencia entre los pares y cuando toma valor
prximo a 1 o a -1 indica una dependencia lineal extrema. De hecho
si vale 1 entonces existen constantes a y b tales que y1 = axi + b
con a > 0. Si vale -1 entonces existen constantes a y b tales que
y1 = axi + b con a < 0.
Supongamos que cuando evaluamos si dos genes estn prximos
o estn alejados lo que estamos intentando expresar es que estn co-
rregulados. Esto indicara que una mayor expresin de uno en una
muestra se corresponde con una mayor expresin en la misma mues-
tra. Si, adems, la asociacin es de tipo lineal esto significara que el
perfil de expresin de gen se podra obtener como una funcin lineal
de la expresin del otro gen. En resumen su coeficiente de correla-
cin de Pearson ( 31.1) debiera de ser prximo a uno. Tambin sera
razonable entender como prximos aquellos genes donde cuando
uno tiene un valor alto de expresin el otro lo tiene bajo. Es decir,
finalmente tienen una fuerte relacin lineal pero de tipo inverso.
A partir del coeficiente de correlacin podemos definir distintas
medidas de disimilaridad. Algunas opciones que se han propuesto
anlisis cluster 283

son las siguientes:

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.

Tenemos una serie de conjunto de puntos a agrupar: { x1 , . . . , xn }.


Una vez elegida una disimilaridad construiremos una matriz que en
la fila i, columna j tiene la disimilaridad entre el punto xi y el punto
x j . Denotaremos indistintamente d( xi , x j ) o dij . Por tanto, la matriz de
disimilaridades es

D = [d( xi , x j )]i,j=1,...,n = [dij ]i,j=1,...,n .

Cmo calculamos las matrices de disimilaridades que acabamos


de proponer? La funcin dist de R Core Team [2016] es una buena
opcin cuando utilizamos las distancias eucldea o de Manhattan.
Un detalle es importante. Si la disimilaridad que estamos conside-
rando es simtrica, esto es, si la disimilaridad d verifica

d ( x i , x j ) = d ( x j , x i ),

entonces la matriz de disimilaridades

D = [d( xi , x j )]i,j=1,...,n

es simtrica y estamos almacenando informacin redundante. Ade-


ms hemos de considerar que

d( xi , xi ) = 0,

es decir, la disimilaridad de un perfil de expresin consigo mismo


es nula y por lo tanto, en la matriz de disimilaridades, la diagonal
de la matriz es nula. Sabemos que trabajamos habitualmente con un
nmero de genes muy grande. La matriz de disimilaridades total
sera de tamao N N y por ello, es ms que conveniente eliminar
redundancias. Veamos cmo esto lo hace de un modo automtico la
funcin dist.
Vamos a calcular la matriz de distancias con la funcin dist para
los datos cz.data propuestos en 15.2.2.
284 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

cz.dist.euclidea = dist(cz.data,method="euclidian")

De qu clase es cz.dist.euclidea.

class(cz.dist.euclidea)

## [1] "dist"

Veamos las distancias (no las mostramos por razones de espacio).

cz.dist.euclidea

La distancia de Manhattan la podemos obtener con

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)

Con cada una de estas matrices podemos cuantificar la disimila-


ridad que hay entre los elementos originales de la muestra. Algunos
de los procedimientos de agrupamiento que vamos a considerar en
lo que sigue no necesitan conocer los datos originales. Pueden apli-
carse con solo conocer esta matriz de disimilaridades. Otros no. Otros
utilizan los datos a lo largo de las distintas etapas de aplicacin del
procedimiento.

15.4 Disimilaridades entre grupos de observaciones

En algunos procedimientos de agrupamiento (en particu-


lar, los jerrquicos) vamos a necesitar calcular disimilaridades entre
conjuntos disjuntos de las observaciones originales. Estas disimilari-
dades las podemos calcular a partir de las disimilaridades originales
anlisis cluster 285

entre puntos. Supongamos que tenemos un banco de datos con n in-


dividuos cuyos ndices son {1, . . . , n}. Sean A y B dos subconjuntos
disjuntos del conjunto de ndices de la muestra {1, . . . , n}, esto es,
dos subconjuntos de observaciones disjuntos. Cmo podemos de-
finir una disimilaridad entre A y B partiendo de las disimilaridades
entre los datos individuales? Se han propuesto muchos procedimien-
tos. Si denotamos la disimilaridad entre A y B como d( A, B) entonces
las disimilaridades ms habitualmente utilizadas son las siguientes:

Enlace simple La disimilaridad entre los dos grupos es el mnimo


de las disimilaridades entre las observaciones de uno y de otro.
Tomamos la disimilaridad de los objetos que ms se parecen en
uno y otro grupo.

d( A, B) = mn d( a, b)
a A,b B

Enlace completo Ahora tomamos como disimilaridad entre los grupos


como el mximo de las disimilaridades, en definitiva, la disimilari-
dad entre los objetos ms alejados o ms distintos.

d( A, B) = max d( a, b)
a A,b B

Promedio La disimilaridad es el promedio de las disimilaridades


entre todos los posibles pares.

1
d( A, B) =
| A| | B| d( a, b)
a A,b B

donde | A| es el cardinal del conjunto A.

Es importante notar que solamente necesitamos conocer las disimila-


ridades entre los individuos para poder calcular las disimilaridades
entre grupos de individuos.
En la siguiente seccin nos vamos a ocupar de los mtodos jerr-
quicos en los cuales es fundamental el procedimiento que elijamos
para calcular distintas entre grupos.

15.5 Cluster jerrquico

La idea de estos procedimientos es construir una jerarqua de parti-


ciones del conjunto de ndices.
Sea {1, . . . , n} el conjunto de ndices que indexan las distintas
observaciones. Supongamos que {C1 , . . . , Cr } es una particin de este
conjunto de ndices:
286 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Ci {1, . . . , n}; son disjuntos dos a dos, Ci Cj = si i 6= j con


i, j = 1, . . . , n y

ri= Ci = {1, . . . , n}.


Dada una particin del conjunto de ndices podemos calcular la
matriz r r que en la posicin (i, j) tiene la disimilaridad entre el
conjunto Ci y Cj , d(Ci , Cj ) segn alguno de los procedimientos antes
indicados.
Veamos los procedimientos jerrquicos aglomerativos. En estos
procedimientos vamos a iniciar el agrupamiento con la particin:
Ci = {i } con i = 1, . . . , n, es decir, cada grupo es un individuo. En
cada iteracin vamos agrupando el par de conjuntos (elementos de la
particin que tengamos en esa iteracin) que estn ms prximos se-
gn la disimilaridad entre grupos que estemos utilizando. El proceso
contina hasta que tengamos un nico grupo.
Un esquema algortmico del procedimiento indicado puede ser el
siguiente:
Paso 0 Tenemos grupos unitarios formados por cada una de las
observaciones. Tenemos pues una particin inicial Ci = {i } con
i = 1, . . . , n. En un principio, cada dato es un grupo.
Paso 1 Calculamos las disimilaridades entre los elementos de la
particin. Para ello utilizamos cualquiera de los procedimientos
antes indicados.
Paso 2 Agrupamos los dos conjuntos de la particin ms prximos
y dejamos los dems conjuntos igual. Tenemos ahora Ci con i =
1, . . . , k.

Paso 3 Si tenemos un solo conjunto en la particin paramos el proce-


dimiento.

Paso 4 Volvemos al paso 1.


Hay una representacin grfica muy utilizada para describir los re-
sultados de un cluster jerrquico aglomerativo como el que acabamos
de describir. Esta representacin tiene el nombre de dendograma. En
el dendograma se va mostrando a qu valor de la medida de disimi-
laridad se produce la unin de los grupos y simultneamente qu
grupos se estn uniendo para esa disimilaridad. Tambin nos permite
una valoracin rpida de cuntos grupos puede haber en el banco de
datos. Simplemente trazando una linea horizontal a la altura en que
tengamos el nmero de grupos que pensamos que puede haber.
Ejemplo 10 (ruspini). Consideremos los datos ruspini. Apliquemos un
cluster jerrquico aglomerativo utilizando como disimilaridad entre gru-
pos el promedio de las disimilaridades y como medida de disimilaridad la
distancia eucldea.
anlisis cluster 287

ruspini.ag = agnes(ruspini,metric = "euclidean",method="average")


Dendrogram of agnes(x = ruspini, metric = "euclidean", method =
"average")

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

Figura 15.4: Dendograma para un


## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 cluster jerrquico aplicado a los datos
## [24] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 ruspini con mtrica eucldea y el
promedio para la disimilaridad entre
## [47] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4
grupos.
## [70] 4 4 4 4 4 4

Y ahora podemos representar los datos de modo que ponemos en un mis-


mo color los datos que hemos clasificado en un grupo. Lo mostramos en la

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

Ejemplo 12 (golub y disimilaridad basada en correlacin). Vamos


22

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

a utilizar los datos golub y una disimilaridad basada en un coeficiente de


correlacin. Primero calculamos las disimilaridades.
cz.data
Agglomerative Coefficient = 0.77

data(golub,package="multtest") Figura 15.6: Dendograma para datos


golub.cor1 = as.dist(1-cor(t(golub))) cz.data utilizando distancia eucldea y
enlace simple.

Y luego aplicamos un anlisis cluster jerrquico. Observemos que no le


estamos dando los datos originales sino que las disimilaridades.
2
1



Zyxin

0.5 0.0 0.5 1.0 1.5 2.0 2.5


288 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

golub.ag = agnes(golub.cor1,diss=TRUE,method="single")
plot(golub.ag,which=2)

Se puede ver que el dendograma es muy poco til. Tenemos demasiados


genes a clasificar.

15.6 Distancia cofentica

Una vez hemos construido un clustering jerrquico podemos


asociarle una distancia conocida como distancia cofentica. Dadas dos
observaciones (en nuestro caso dos perfiles de expresin) considera-
mos el momento en que ambas observaciones han sido agrupadas en
un mismo grupo. La distancia cofentica entre estas observaciones es
la distancia entre los dos grupos a los que previamente pertenecan
estas observaciones (una en cada uno de ellos) en el momento en que
se unen. Se calcula con la funcin cophenetic del paquete R Core
Team [2016, stats].

Ejemplo 13 (Distancia cofentica con cyclin.ag). Continuamos con el


jerrquico aglomerativo aplicado a los datos cyclin.data. Repetimos el anli-
sis cluster calculando previamente la matriz de disimilaridades. Empezamos
calculando la matriz de distancias.

cyclin.manhattan = daisy(cyclin.data,metric = "manhattan")

Y ahora el cluster jerrquico (observemos que no le damos los datos sino


que le pasamos directamente la matriz de disimilaridades).

cyclin.ag = agnes(cyclin.manhattan,diss = TRUE)

Calculamos la distancia cofentica asociada al cluster jerrquico que


acabamos de realizar.

cyclin.cofe = cophenetic(cyclin.ag)

Y determinamos el coeficiente de correlacin de Pearson.

cor(cyclin.manhattan,cyclin.cofe)

## [1] 0.8501727

El coeficiente de correlacin observado 0.8501727 es un valor grande.


Tenemos pues una buena descripcin del modo en que los datos se agrupan.

Las distancias cofenticas tienen sus problemas. Es una manera


natural de medir disimilaridad entre los datos a partir del modo
anlisis cluster 289

en que estos van agrupndose. Sin embargo, notemos que muchos


pares de observaciones tienen la misma disimilaridad. Esto es lgico,
cuando unimos dos grupos grandes la distancia cofentica entre cada
observacin de un grupo y del otro grupo tienen la misma distancia
cofentica. Se suele calcular el coeficiente de correlacin entre la
matriz de disimilaridad original y la distancia cofentica. Si el valor
es grande indica que el dendograma es una buena descripcin de los
datos.
Un estudio mucho ms amplio de lo visto en esta seccin puede
verse en Sneath and Sokal [1973, captulo 5].

15.7 Mtodos de particionamiento

Suponemos ahora que tenemos una idea de cuntos grupos hay.


Posiblemente hemos realizado un anlisis jerrquico previo con todos
los datos o, si eran muchos, con una seleccin aleatoria de los datos.
Tenemos pues una idea de cuntos grupos tendremos que considerar.
Obviamente podemos luego evaluar los resultados modificando el
nmero de grupos. En principio, vamos a suponer que fijamos el
nmero de grupos a considerar. Suponemos pues que sabemos el
nmero de grupos y lo denotamos por k.

15.7.1 Mtodo de las k-medias


El primer procedimiento que vamos a ver es el mtodo de las k-
medias (que por alguna extraa razn en la literatura de Inteligencia
Artificial se le llama de las c-medias lo que demuestra que cada perso-
na copia a sus amigos o, simplemente, conocidos). Supongamos que
tenemos C1 , . . . , Ck una particin de {1, . . . , n}. Un modo bastante
natural de valorar la calidad del agrupamiento que la particin nos
indica sera simplemente considerar la siguiente funcin.
k
dE (x j , xCi )2 , (15.3)
i =1 jCi

donde d E denota aqu la distancia eucldea y


1
xCi =
|Ci | xj, (15.4)
jCi

es el vector de medias del grupo cuyos ndices estn en Ci . Una parti-


cin ser tanto mejor cuanto menor sea el valor de la funcin dada en
15.3. El procedimiento de agrupamiento de las k-medias simplemente
se basa en elegir como particin de los datos aquella que nos da el
mnimo de la funcin objetivo considerada en ecuacin 15.3. Notemos
290 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

que en muchos textos se hablan del algoritmo de las k-medias y se


identifica con un procedimiento concreto para encontrar el mnimo
de la funcin. Aqu entendemos el procedimiento como la minimiza-
cin de la funcin objetivo. De hecho, R ofrece hasta cuatro posibles
procedimientos de los muchos que cabe proponer. Hay que dife-
renciar claramente el procedimiento del mtodo de aplicacin del
mismo, del mtodo de obtencin de dicho mnimo.
Es importante darnos cuenta de que el procedimiento que acaba-
mos de ver est basado en la utilizacin de la distancia eucldea y
en que, dado un grupo, podemos calcular el vector de medias y esto
solo lo podemos hacer si todas las variables son cuantitativas.
Vamos a aplicar el mtodo de las k-medias en los tres ejemplos
utilizando el nmero de grupos que hemos utilizado previamente.

Ejemplo 14 (ruspini). Aplicamos el k-medias.

ruspini.km = kmeans(ruspini,4)

La clasificacin viene dada por

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

La clasificacin obtenida se corresponde con la que vemos en la figura


15.5.

Ejemplo 15 (Mtodo de las k-medias y datos cz.data). Empezamos con


el k-medias.

cz.km = kmeans(cz.data,2)

Las clasificaciones son

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

Y representamos los resultados.



plot(cz.data,col=cz.km$cluster,pch=cz.km$cluster)

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

cz.km = kmeans(cz.data,4) CCND3 Cyclin D3

plot(cz.data,col=cz.km$cluster,pch=cz.km$cluster) Figura 15.8: Clasificacin obtenida


utilizando el mtodo de las k-medias
aplicada a los datos cz.data.

15.7.2 Particionamiento alrededor de los mediodes


Y si no podemos calcular el vector de medias? Y si no tiene

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

anterior y hablar de k-mediodes.


La idea ahora es sustituir esos centros calculados como vectores





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

Consideremos la siguiente cantidad:

k
d ( x j , x mi ). (15.5)
Zyxin

i =1 jCi
0

En el mtodo de particionamiento alrededor de los mediodes nos


1

planteamos encontrar las observaciones m1 , . . . , mk que minimizan el


valor dado en 15.5. 0.5 0.0 0.5 1.0 1.5 2.0 2.5

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

Ejemplo 17 (cz.data). Empezamos con dos grupos.

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



Supongamos que probamos con tres grupos. En la figura 15.12 tenemos


los resultados.



0.5 0.0 0.5 1.0 1.5 2.0 2.5

cz.pam = pam(cz.data,3) CCND3 Cyclin D3

plot(cz.data,col=cz.pam$cluster,pch=cz.pam$cluster) Figura 15.11: Clasificacin de los datos


cz.data con mtodo PAM y dos grupos.

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

El grupo B donde se alcanza este mnimo, es decir, d(i, B) = b(i ) se le


llama vecino del objeto i. 6 Definimos s(i ) como 6
No parece un nombre inadecuado.

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 )

Esto se puede expresar en una nica ecuacin como

b (i ) a (i )
s (i ) = .
max{ a(i ), b(i )}
anlisis cluster 293

En el caso en que el grupo A contenga un nico objeto no est muy


claro cmo definir a(i ). Tomaremos s(i ) = 0 que es una eleccin
arbitraria. Se comprueba con facilidad que 1 s(i ) 1 para
cualquier objeto i.
Para interpretar el significado de s(i ) es bueno ver los valores
extremos. Si s(i ) es prximo a uno significa que a(i ) es mucho menor
que b(i ) o lo que es lo mismo, que el objeto i est bien clasificado
pues la disimilaridad con los de su propio grupo es mucho menor
que la disimilaridad con los del grupo ms prximo que no es el
suyo. Un valor prximo a cero significa que a(i ) y b(i ) son similares
y no tenemos muy claro si clasificarlo en A o en B. Finalmente un
valor de s(i ) prximo a 1 significa que a(i ) es claramente mayor
que b(i ). Su disimilaridad media con B es menor que la que tiene con
A. Estara mejor clasificado en B que en A. No est bien clasificado.
Los valores de s(i ) aparecern representados para cada cluster en
orden decreciente. Para cada objeto se representa una barra horizon-
tal con longitud proporcional al valor s(i ). Una buena separacin
entre grupos o cluster viene indicada por unos valores positivos
grandes de s(i ). Adems de la representacin grfica se proporcio-
na un anlisis descriptivo. En concreto la media de los valores de la
silueta dentro de cada cluster y la media de la silueta para todo el
conjunto de datos. La clasificacin ser tanto mejor cuanto mayor
sean estos valores medios. De hecho, se puede decidir el nmero de
grupos en funcin del valor medio de las silueta sobre toda la mues-
tra. Vamos probando distintos nmeros de grupos y nos quedamos
con el nmero que nos da la silueta media mxima.
Cundo podemos decir que hay estructura de grupos en los datos
que estamos analizando? Experiencias con datos sugieren la tabla
15.1.

SC Interpretacin Tabla 15.1: Silueta media y estructura


en un conjunto de datos
0,71 1,00 Fuerte estructura
0,51 0,70 Estructura razonable
0,26 0,50 Estructura dbil. Probar otros mtodos
0,25 No se encuentra estructura

Ejemplo 18 (ruspini). Veamos el resumen de la silueta.

ruspini.pam = pam(ruspini,4)
summary(silhouette(ruspini.pam))

## Silhouette of 75 units in 4 clusters from pam(x = ruspini, k = 4) :


## Cluster sizes and average silhouette widths:
## 20 23 17 15
294 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## 0.7262347 0.7548344 0.6691154 0.8042285


## Individual silhouette widths:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
Silhouette plot of pam(x = ruspini, k = 4)
## 0.4196 0.7145 0.7642 0.7377 0.7984 0.8549 n = 75 4 clusters Cj
j : nj | aveiCj si

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

En esta seccin incluimos anlisis cluster completos de algunos


bancos de datos. Utilizamos herramientas no solamente de este tema
sino tambin de los anteriores.
anlisis cluster 295

15.10.1 Un anlisis de los datos ALL


Son los datos del paquete Li [2009, ALL] ( 5.4). Cargamos los
datos.

library("ALL")
data("ALL")

Podemos comprobar que es un ExpressionSet.

class(ALL)

## [1] "ExpressionSet"
## attr(,"package")
## [1] "Biobase"

Se realiza el preprocesado de los datos que indicamos en 5.4.

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

Vemos que all es un ExpressionSet.

class(all)

## [1] "ExpressionSet"
## attr(,"package")
## [1] "Biobase"

Vamos a realizar un filtrado independiente de los genes. En con-


creto los criterios estadsticos sern que el nivel medio de expresin
sea mayor que un cierto valor mnimo tanto en un tipo de biologa
molecular como en el otro.

alltemp0 = nsFilter(all,var.func = mean, var.cutoff = 0.7)


alltemp1 = nsFilter(alltemp0$eset,var.func = IQR, var.cutoff = 0.7)
all1 = alltemp1$eset

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.

Y construimos la tabla de contingencia.


0.36180
Mean

plot(silhouette(all1.km$cluster,all1.d))
summary(silhouette(all1.km$cluster,all1.d))

0.49150
3rd Qu.
Cluster sizes and average silhouette widths:

O un anlisis jerrquico de las muestras en la figura 15.10.1.


Vemos un cluster jerrquico aglomerativo de los genes (figura

Recordemos que las muestras correspondan a dos grupos que


Observemos que aplicamos la funcin agnes a la matriz transpuesta

vienen definidos por la covariable mol.biol que nos daba la biologa


molecular. Veamos si hay coincidencia entre estos tipos y los grupos

8
Height Height

15 20 25 30 35 0 100 200 300

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

Agglomerative Coefficient = 0.34


Agglomerative Coefficient = 0.87
25006 01010 36347_f_at
34308_at
33352_at
1505_at
39710_at
38825_at
1526_i_at
38487_at
36617_at
2062_at
37398_at
39329_at
37600_at
39712_at
39781_at
40215_at
38278_at
1150_at
41577_at
0.8

68001 16009 41273_at


37732_at
40818_at
174_s_at
33774_at
315_at
38035_at
37312_at
41048_at
37324_at
37025_at
37583_at
34378_at
39827_at
32186_at
1403_s_at
245_at
40916_at
1911_s_at
04010 64002 39032_at
34362_at
37544_at
41097_at
35164_at
39331_at
37641_at
36412_s_at
36493_at
32773_at
32035_at
34168_at
38242_at
40607_at
36650_at
41193_at
36398_at
34460_at
307_at
33005
09008 266_s_at
39389_at
38354_at
37701_at
1369_s_at
36103_at
33284_at
41096_at
38363_at
37285_at
33336_at
33516_at
37280_at
36711_at
280_g_at
39120_at
38604_at
36638_at
37006_at
2802128019 1424_s_at
32272_at
37026_at
37420_i_at
35175_f_at
40771_at
32318_s_at
32321_at
151_s_at
36624_at
31481_s_at
35363_at
37720_at
36576_at 38514_at
41214_at
38355_at
32223_at
36224_g_at
30001 36131_at
37033_s_at
37344_at
39864_at
38778_at
34392_s_at
39370_at
38438_at
38065_at
36795_at
32806_at
35625_at
1173_g_at

La matriz traspuesta resulta de in-


28035
28037 40448_at
36097_at
595_at
40103_at
1389_at
36591_at
675_at
40365_at
41745_at
39755_at
36629_at
649_s_at
31511_at
319_g_at
34091_s_at
32588_s_at
31508_at
1461_at
41138_at
48001 41164_at
39318_at 32052_at

Dendrogram of agnes(x = t(exprs(all1)))


2 clusters Cj

tercambiar filas por columnas en una


j : nj | aveiCj si

1.0
2 : 502 | 0.40
1 : 272 | 0.29

Dendrogram of agnes(x = all1.d, diss = TRUE)

matriz. La funcin t(A) nos devuelve la


Silhouette plot of (x = all1.km$cluster, dist = all1.d)
## Silhouette of 774 units in 2 clusters from silhouette.default(x = all1.km$cluster, dist = all1.d) :
anlisis cluster 297

Mediante un heatmap podemos ver conjuntamente los dos den-


dogramas y una representacin grfica de los niveles de expresin.

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

Reflexionar qu nos da este dibujo. Para qu nos puede servir un


39079_at
40417_at
1449_at
37955_at
40129_at
37910_at
32173_at
1468_at
40195_at
39109_at
40979_at
41302_at
41460_at
40521_at
36185_at
40505_at
39009_at
36687_at
37692_at
32849_at
37305_at
37757_at
32506_at
37031_at
39762_at
36032_at
37242_at
32224_at
35843_at
40615_at
37338_at
37229_at
36093_at
36814_at
33219_at
41379_at
38764_at
36633_at
36628_at
41715_at
40074_at
40552_s_at
2003_s_at
32668_at
37615_at
34785_at
41447_at
34355_at
32569_at
37676_at
37343_at
1801_at
38443_at
38011_at
34814_at
36172_s_at
32695_at
40824_at
38864_at
33867_s_at
37543_at
37350_at
1085_s_at
37640_at
34368_at
40827_at
32662_at
1643_g_at
36676_at
38745_at
38990_at
35731_at
37359_at
37532_at
38392_at
35297_at
34773_at
37668_at
41223_at
40198_at
34311_at
35818_at
39092_at
1446_at
33255_at
41400_at
41322_s_at
283_at
1470_at
34338_at
37766_s_at
824_at
35723_at
35741_at
32245_at
41406_at
39348_at
37040_at
32825_at
38116_at
40117_at
1884_s_at
39337_at
32207_at
41812_s_at
35340_at
39097_at
34268_at
36125_s_at
39112_at
32844_at
40955_at
41829_at
1564_at
1100_at
37947_at
39043_at
41396_at

dibujo como este? Bsicamente podemos intentar ver si hay grupos


37981_at
39089_at
577_at
37507_i_at
1630_s_at
41200_at
36959_at
1498_at
1830_s_at
39835_at
39180_at
34176_at
1185_at
37003_at
430_at
752_s_at
735_s_at
32156_at
40007_at
32941_at
39814_s_at
38454_g_at
41139_at
39779_at
33977_at
33924_at
38032_at
36601_at
32319_at
32562_at
37716_at
40928_at
317_at
32593_at
1102_s_at
599_at
40088_at
32112_s_at
40522_at
39929_at
1520_s_at
1693_s_at
36155_at
32749_s_at
1426_at
40742_at
1402_at
38031_at
36913_at
40456_at
38037_at
41779_at
33891_at
40514_at
175_s_at
429_f_at
1318_at
36962_at
35266_at
35763_at
34716_at
38391_at
35869_at
854_at
402_s_at
40296_at
36347_f_at
32533_s_at
1505_at
32623_at
38313_at
37001_at
36493_at
36684_at
41542_at
34333_at
39744_at
37312_at
315_at
38035_at
41048_at
1433_g_at
39822_s_at
36207_at
39175_at
40631_at
37524_at
39411_at
1292_at
32184_at
38717_at
32842_at
41503_at
1526_i_at
38825_at
37600_at
39712_at
39781_at
40215_at
38487_at
37025_at
33352_at
34308_at
37018_at
1911_s_at
39032_at
1107_s_at
32860_g_at
32775_r_at
36412_s_at
37641_at
2062_at
39329_at
37398_at
36617_at
36650_at
40782_at
39827_at
32186_at

formados por filas (genes) y columnas (muestras).


32227_at
34378_at
40019_at
39695_at
39710_at
37583_at
38278_at
1150_at
41577_at
41273_at
40936_at
37732_at
41690_at
35164_at
39331_at
37544_at
32035_at
32773_at
40916_at
38242_at
34168_at
40607_at
41097_at
41193_at
245_at
34362_at
34460_at
307_at
41096_at
38363_at
33284_at
266_s_at
39389_at
1369_s_at
36103_at
38354_at
37701_at
503_at
38451_at
1310_at
37311_at
36992_at
36188_at
39777_at
37348_s_at
37384_at
35312_at
41654_at
37034_at
1287_at
38368_at
36654_s_at
38893_at
35323_at
241_g_at
37023_at
36963_at
35261_at
41485_at
36181_at
38342_at
32716_at
33447_at
459_s_at
181_g_at
41320_s_at
36949_at
37100_at
35260_at
37159_at
932_i_at
39045_at
32336_at
39184_at
33931_at
38621_at
1506_at
2025_s_at
39767_at
723_s_at
41724_at
32157_at
411_i_at
351_f_at
1984_s_at
39327_at
38521_at
37579_at
34224_at
32819_at
31528_f_at
34183_at
38976_at
31898_at
2039_s_at
35769_at
38671_at
37754_at
38119_at
32756_at
39685_at
35983_at
40774_at
36102_at
40891_f_at
38094_at
36620_at
36608_at
41283_at
37569_at
32236_at
947_at
38085_at
1309_at
1695_at
35760_at
40546_s_at
38251_at
34811_at

Supongamos que nos planteamos un PAM y un k-medias con


38060_at
36170_at
40096_at
38610_s_at
36589_at
31432_g_at
36614_at
922_at
37329_at
1268_at
32070_at
35017_f_at
36482_s_at
384_at
38287_at
34651_at
37121_at
32794_g_at
35341_at
40861_at
38149_at
40143_at
37467_at
35816_at
40268_at
946_at
36958_at
39428_at
33943_at
39003_at
39436_at
36162_at
38661_at
40076_at
227_g_at
2042_s_at
33866_at
41241_at
38114_at
38992_at
38357_at
37336_at
32085_at
288_s_at
32508_at
32804_at
33543_s_at
35325_at
34804_at
36975_at
37318_at
37672_at
34745_at
33788_at
31802_at
32832_at
33770_at
39037_at
39040_at
40122_at
140_s_at
32563_at
33456_at
36198_at
32579_at
40140_at
35163_at
35253_at
39376_at
38924_s_at
39897_at
32171_at
35321_at
33380_at
31936_s_at
35802_at
36635_at
40811_at
40437_at
34740_at
39163_at
40610_at
33683_at
38704_at
32597_at
41651_at
39147_g_at
37729_at
39243_s_at
39131_at
34397_at
35271_at
38688_at
35848_at
32808_at
35787_at
36928_at
38075_at
40063_at
36938_at
35682_at
174_s_at
33774_at
40818_at
37416_at
38826_at
33821_at
160029_at
39174_at
40419_at
39072_at
33305_at
40698_at
37324_at
37984_s_at
34819_at
41155_at
40570_at
36537_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.

Figura 15.15: Heatmap


all1.pam = pam(t(exprs(all1)),2)
table(tipos,all1.pam$cluster)

##
## 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

No parece que tengamos ninguna relacin clara. Como siempre


hay que seguir trabajando los datos a ver si se encuentra algo.

15.10.2 Anlisis cluster de GSE20986


Utilizamos los datos preprocesados. Los cargamos.

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

Con cuntas filas nos hemos quedado?

dim(exprs(gse))

## [1] 1849 12

Vamos a clasificar las muestras y compararemos con la clasifi-


cacin original de las mismas. Utilizamos distancia Manhattan y
promedio con el mtodo PAM.
Primero calculamos la matriz de distancias.

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

Lo que sale es muy interesante y tiene una interpretacin.

15.11 Otras cuestiones importantes

Sin duda, un problema de gran inters es lo que se conoce como


biclustering o co-clustering. En este caso intentamos grupos de filas
(genes) y columnas (muestras) que muestren unos valores de expre-
sin similares. Es un problema importante pero no lo tratamos (de
momento) en estas notas. Una referencia fundamental de biclustering
es Madeira and Oliveira [2004].
La clasificacin es tanto mejor cuanta ms informacin se utiliza.
En particular un trabajo de inters para clasificacin de genes incor-
porando informacin de Gene Ontology es Verbanck et al. [2013].
anlisis cluster 299

15.12 Ejercicios

Ejercicio 7. Utilizando los datos ALL se pide:

1. Filtrar las muestras (columnas) con biologa molecular BCR/ABL y


NEG.

2. Quedarse con los genes (filas) que verifiquen las siguientes condiciones:

a) La media de los niveles de expresin sobre las biologas moleculares


indicadas sea superior a 5,62.
b) La desviacin estndar de las expresiones del gen ha de ser superior a
1,85.

3. Aplicar un anlisis cluster jerrquico a los genes. En concreto:

a) Hay que representar el dendograma.


b) Decidir por inspeccin visual qu nmero de grupos parece razonable.
Supongamos que denotamos por k el nmero de grupos.
c) Representar la silueta y obtener su anchura media.

4. Aplicar un anlisis cluster jerrquico a las muestras. En concreto:

a) Hay que representar el dendograma.


b) Decidir por inspeccin visual qu nmero de grupos parece razonable.
Supongamos que denotamos por k el nmero de grupos.
c) Representar la silueta y obtener su anchura media.

5. En este apartado vamos a aplicar un k-medias. En concreto vamos a ir


clasificando segn este mtodo y nos quedaremos con el nmero de grupos
que tengan una anchura media de la silueta mayor.

6. Repetir el apartado anterior utilizando el mtodo PAM. Discutir el n-


mero de grupos.

7. Comparar las clasificaciones obtenidas en los dos apartados anteriores.


Parte V

Anlisis de grupos de genes


16
Grupos de genes

16.1 Introduccin

Hasta ahora hemos trabajado habitualmente a nivel de gen. Ca-


da gen en cada muestra nos da un nivel de expresin. Obviamente
esto supone que por muestra tenemos una muy alta dimensin. Un
anlisis de expresin diferencial supone que tenemos un contraste
por gen. Muchos miles de contrastes supone esto. Si pretendemos
clasificar la muestra en distintos fenotipos entonces la dimensin alta
con la que trabajamos produce un sobreajuste y modelos que no son
generalizables a otros datos. En ambos problemas no es bueno tener
una dimensin tan alta. Podemos utilizar componentes principales
para resumir el perfil de expresin de la muestra ( 14). Otra opcin
puede ser trabajar no con genes individuales sino con grupos de
genes. Si nos interesa la expresin diferencial entre condiciones en-
tonces podemos valorar si el grupo de genes que nos interese, como
grupo, se expresa diferencialmente. Si vamos a clasificar en fenotipos,
podemos resumir la expresin de los genes en una muestra dentro de
cada grupo. Reducimos el nmero de hiptesis a contrastar (expre-
sin diferencial) o bien la dimensin del vector que utilizamos para
clasificar (clasificacin en fenotipo).

Obviamente podemos construir el grupo de genes que nos apetezca


y evaluarlo. No parece algo muy lgico. Es de sobra conocido en
la literatura estadstica que un contraste de hiptesis es til en la
misma medida en que est correctamente formulado. Y formular
correctamente el contraste supone conocimiento sobre el problema
que abordamos. En este caso la comunidad cientfica ha propuesto
y propone y propondr clasificaciones que se han de utilizar para
definir estos grupos.
Tres fuentes vamos a utilizar a la hora de considerar grupos de
genes.
304 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Gene Ontology Podemos utilizar las tres ontologas consideradas


en Gene Ontology. El grupo de genes viene definido por todos
aquellos genes que tienen este trmino.

KEGG Tenemos las rutas de sealizacin para muchos organismos.

MSigDB En MSigDB 1 consideran hasta ocho formas distintas de 1


The Molecular Signatures Database
construir estos grupos.

Como vemos hay muchas formas de definir estos grupos. En cual-


quier caso en su definicin interviene un conocimiento previo. No
utilizamos los propios datos de expresin con los que posteriormente
vamos a trabajar.2 2
No son grupos obtenidos por un
En este tema tratamos de cmo construir grupos de genes utilizan- anlisis cluster previo.

do R/Bioconductor. Es un tema de carcter muy tcnico previo al que


sigue en donde analizaremos la posible expresin diferencial de estos
grupos.3 3
Siempre nuestro inters principal.
Vamos a definir conjuntos de genes o colecciones de conjuntos de
genes utilizando el paquete Morgan et al. [2015a, GSEABase].

library(GSEABase)

16.2 Homo sapiens

La opcin ms simple sera definirnos nuestro propio conjunto


de genes. Para ello podemos utilizar la funcin GSEAbase::GeneSet.
Tomamos como ejemplo GSE20986 ( 5.11).

data(gse20986,package="tamidata")
gse = gse20986

Supongamos que queremos construir un conjunto de genes for-


mado por aquellos que ocupan las filas de la 345 a la 405 (sin ningn
sentido prctico). Los ndices los podemos obtener con

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

Construimos el grupo y le damos nombre.


grupos de genes 305

(egs = GeneSet(gse[345:405, ], setName = "Burjasot"))

Los genes tienen sus identificadores obtenidos de su anotacin


(mostramos los primeros).

head(geneIds(egs))

## [1] "1552739_s_at" "1552740_at" "1552742_at"


## [4] "1552743_at" "1552745_at" "1552747_a_at"

En este caso, como se obtuvo con Affymetrix GeneChip, los iden-


tificadores son los proporcionados por el fabricante y corresponde a
los nombres de los conjuntos de sondas.4 Podemos tener ms infor- 4
Ver 4.
macin con

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

En el ejemplo que acabamos de ver hemos creado un conjunto de


genes a partir de un ExpresionSet pero podemos hacerlo de otros
modos.

showMethods("GeneSet", inherited = FALSE)

## Function: GeneSet (package GSEABase)


## type="BroadCollection"
## type="character"
## type="ExpressionSet"
## type="GeneIdentifierType"
## type="GOCollection"
## type="missing"

Podemos obtener la correspondencia de nuestros identificadores


con otros tipos de identificadores, por ejemplo, los EntrezId:
306 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

mapIdentifiers(egs, EntrezIdentifier(), verbose = TRUE)

Tambin podemos tener una coleccin de conjuntos, GSEABa-


se::GeneSetCollection. Quizs la mejor manera de definir conjuntos
utilizando un ExpresionSet con su anotacin es hacerlo utilizando
Gene Ontology u otra base de datos. Por ejemplo, en el siguiente
ejemplo construimos los conjuntos para nuestro ExpressionSet gse.

gsc = GeneSetCollection(gse, setType = GOCollection())

Podemos ver un resumen de los conjuntos.

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)

Por ejemplo, el correspondiente a GO:0000122 sera

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)'

Ahora vamos convertir estos mismos conjuntos a identificadores


ENTREZ.

gsc = mapIdentifiers(gsc, EntrezIdentifier())

Podemos ver el primero de ellos.

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

Cuntos elementos tiene cada uno de los conjuntos que hemos


construido?

head(sapply(geneIds(gsc), length))

Podemos quedarnos con los dos grupos que tengan un cardinal


mnimo, por ejemplo, por encima de 10.

gsc.filt = gsc[sapply(geneIds(gsc), length) > 10]

Son los siguientes grupos.

geneIds(gsc.filt)

16.3 Grupos con levadura

Veamos cmo construir grupos de genes utilizando los trminos


GO en la Saccharomyces cerevisiae. Empezamos cargando el fichero
de anotacin.

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:

1. Quedarnos con aquellos genes que aparecen en nuestra platafor-


ma.

2. Quedarnos posiblemente con grupos de genes con un tamao


mnimo.

Para ello vamos a utilizar la siguiente funcin.

subsettingGeneSet = function(gs0, fn0) {


geneIds(gs0) = geneIds(gs0)[is.element(geneIds(gs0), fn0)]
gs0
}
308 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Y ahora podemos modificar el GeneSetCollection de modo que


nos quedamos con los genes que tenemos en nuestro estudio tamida-
ta::bdmy.

data(bdmy,package="tamidata")

gsc1 = sapply(gscSc, subsettingGeneSet, fn0 = featureNames(bdmy))


gsc2 = GeneSetCollection(gsc1)

16.4 Grupos para GSE1397

Leemos los datos.

data(gse1397,package="tamidata")

Cargamos la anotacin del ExpressionSet para poder formar gru-


pos.

library(annotate)
annotation(gse1397)

## [1] "hgu133a"

library(hgu133a.db)

Buscamos los conjuntos de genes utilizando Gene Ontology.5 5


Se lleva un tiempo as que paciencia.

library(GSEABase)

gse1397.gsc = GeneSetCollection(gse1397,setType=GOCollection())
names(gse1397.gsc) = unlist(lapply(gse1397.gsc,setName))

En el paquete ?, tamidata tenemos esta coleccin de grupos de


genes y podemos cargarla simplemente con

data(gse1397.gsc,package="tamidata")
gsc = gse1397.gsc

Cuntos grupos tenemos definidos?

length(gsc)

## [1] 12681
grupos de genes 309

Como vemos muchos. Sin embargo, la mayor parte de ellos tiene


muy pocos genes. Podemos ver informacin del primer grupo.

(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)'

Y sus identificadores (AffyId) son

geneIds(g1)

## [1] "202825_at" "203466_at" "204858_s_at"


## [4] "208328_s_at" "209017_s_at" "212607_at"
## [7] "212609_s_at" "214684_at" "214821_at"
## [10] "217497_at" "219393_s_at"

Sus identificadores entrez o Ensembl son

unlist(mget(geneIds(g1),hgu133aENTREZID))

## 202825_at 203466_at 204858_s_at 208328_s_at


## "291" "4358" "1890" "4205"
## 209017_s_at 212607_at 212609_s_at 214684_at
## "9361" "10000" "10000" "4205"
## 214821_at 217497_at 219393_s_at
## "291" "1890" "10000"

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"

La mayor parte de estos grupos son muy pequeos. Lo siguiente


nos da el tamao de estos grupos.

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.

gse1397.gsc.filt = gsc[which(sapply(geneIds(gsc),length) > 50)]

16.5 Grupos GO para levadura

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")

El resultado est en el paquete ?, tamidata.

data(gscSc,package="tamidata")

En lo que sigue ser frecuente que no queramos utilizar todos los


grupos que hemos construido. Cmo quedarnos con aquellos que
tienen al menos un nmero dado de genes? Por ejemplo, quedarnos
con los grupos con 10 o ms genes. El siguiente cdigo lo hace.

gruposGrandes = which(sapply(geneIds(gscSc),length) > 10)


gsc1 = gscSc[gruposGrandes]

Podemos ver el primer grupo.


grupos de genes 311

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)'

16.6 Grupos GO para humanos

En esta seccin construimos los grupos de genes segn Gene


Ontology para humanos. El cdigo es el siguiente:6 6
Para otros organismos sera similar re-
emplazando el paquete Carlson [2015f]
por el correspondiente al organismo
library("org.Hs.eg.db") que nos interese.
frame = toTable(org.Hs.egGO)
goframeData = data.frame(frame$go_id, frame$Evidence, frame$gene_id)
goFrame = GOFrame(goframeData, organism = "Homo sapiens")
goAllFrame = GOAllFrame(goFrame)
gscHs = GeneSetCollection(goAllFrame, setType = GOCollection())

save(gscHs,file = paste(dirTamiData,"gscHs.rda",sep=""))

16.7 Grupos de genes con EnrichmentBrowser

Con EnrichmentBrowser::get.kegg.genesets podemos bajarnos


todos las rutas de KEGG para un organismo dado como conjuntos de
genes.

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

Podemos ver sus nombres.

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"

Y los genes que componen uno determinado con su cdigo EN-


TREZ.

hsaKEGGgsc[[3]]

## [1] "2203" "221823" "226" "229" "22934"


## [6] "230" "2539" "25796" "2821" "414328"
## [11] "51071" "5211" "5213" "5214" "5226"
## [16] "5236" "55276" "5631" "5634" "6120"
## [21] "64080" "6888" "7086" "729020" "8277"
## [26] "84076" "8789" "9104" "9563"

o bien con

hsaKEGGgsc$"hsa00030_Pentose_phosphate_pathway"

Acabamos de hacerlo para humanos. Podemos repetirlo para


los distintos organismos utilizados en KEGG. Hemos de utilizar
el cdigo del organismo correspondiente. Los tenemos en http:
//www.genome.jp/kegg/catalog/org_list.html. Por ejemplo, para la
Saccharomyces cerevisiae (budding yeast) sera

sceKEGGgsc=get.kegg.genesets("sce")

Tambin podemos obtener los grupos de genes utilizando la base


de datos Gene Ontology. En lo que sigue lo hacemos para la dro-
sophila melanogaster. Se requiere tener instalado Carlson [2015e,
org.Dm.eg.db].

dmeGOBPgsc = get.go.genesets(org="dme", onto="BP", mode="GO.db")

La nomenclatura del organismo es la utilizada en KEGG. La op-


cin mode puede ser "GO.db utiliza los paquetes de anotacin de
2

Bioconductor. Son datos menos actualizados pero ms rpido de ob-


tener el resultado. La otra opcin es "biomart". En este caso los datos
se bajan de BioMart. Es una informacin ms actualizada pero tarda
ms en bajarse.
grupos de genes 313

16.8 Ejercicios
Ej. 13 Construir los grupos basados en Gene Ontology y en
KEGG para el ratn (Mus musculus).

Ej. 14 Construir los grupos basados en Gene Ontology y en


KEGG para las cepas de la E. coli que puedas.

Ej. 15 Consultar las anotaciones OrgDb para decidir de qu orga-


nismos podemos construir los grupos.
17
Test de Fisher unilateral

Por alguna razn (que desconozco) a este procedimiento se le


llama en numerosas publicaciones de perfil biolgico test hipergeo-
mtrico. 1 En lo tratado hasta este momento hemos obtenido una 1
La razn de este nombre s la entien-
ordenacin de los genes. Esta lista la hemos estudiado pretendiendo do (la distribucin del estadstico de
contraste es la distribucin hipergeom-
que cuando mayor sea la expresin diferencial del gen este aparezca trica) lo que no entiendo es el cambio
antes en la lista. De este modo el primer gen es el marginalmente (o si de nombre ya que la denominacin test
de Fisher est ms que consolidada y
se prefiere individualmente) tiene una mayor expresin diferencial y debiera de utilizarse.
as sucesivamente. De hecho, el p-valor no es ms que una medida
de esa diferenciacin. Una expresin muy utilizada en la literatura
es que que hay una asociacin entre el gen (su expresin) y el fe-
notipo.2 De alguna forma el p-valor que obtenemos en cada test es 2
La expresin fenotipo se usa de un
una cuantificacin de la asociacin gen-fenotipo. Luego modificamos modo muy amplio porque podemos
estar hablando de caractersticas fe-
estos p-valores de forma que se tiene en cuenta todos los genes que notpicas o simplemente un diseo
simultneamente se estn estudiando. Obtenemos de este modo unos experimental con factores temporales o
diferentes temperaturas.
p-valores ajustados. Finalmente, tanto los p-valores originales como
los ajustados no dejan de ser cuantificaciones marginales de la aso-
ciacin gen-fenotipo. Cuando hemos fijado una tasa de error (FDR o
FWER) lo que hacemos es fijar un punto de corte. En esa lista que he-
mos construido decidimos (con algn criterio de error) en qu punto
de la lista cortamos. Los genes que estn antes del punto de corte se
consideran significativos y los que siguen no. Reducimos nuestra in-
formacin a un si (gen significativo o que tiene expresin diferencial
o que hay asociacin gen-fenotipo3 o un no (no es significativo, no 3
A gusto del consumidor.
hay expresin diferencial o no hay asociacin gen-fenotipo).
Ya tenemos ese conjunto de genes significativos. Incluso hemos
visto cmo generar unos enlaces para que gen a gen examinemos
alguna base de datos online. Es claro que el investigador puede ir
generando hiptesis sobre qu indica esta lista. Pero claramente no es
una labor simple. Una posible ayuda puede ser utilizar informacin
previamente generada por la comunidad cientfica sobre grupos
de genes. Grupos que indican que tienen relacin con una misma
316 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

funcin, o que estn localizados prximos en un mismo cromosoma.


En fin, grupos con sentido (biolgico).
Un poco de notacin que nunca es mala. Sea G es el conjunto
de genes considerado. Quin es este conjunto? En un estudio con
microarrays uno dira que es el conjunto de genes que se est explo-
rando. Sin embargo, un chip suele estar diseado para observar tanto
genes como se pueda y no hay una seleccin previa. Quizs no sea
muy razonable considerar el conjunto total de genes este. En otros
casos no es as. Lo fundamental es darse cuenta que lo que hacemos
depende de un modo esencial del conjunto total de genes considera-
do o universo. S0 ( G) el conjunto de genes que nuestro estudio ha
indicado como significativo y S1 un conjunto de genes predefinido
(misma funcin, misma localizacin). Un primer problema es definir
los conjuntos S1 con los que comparar.4 Una vez definidos nuestro 4
16.
conjunto (S0 ), el conjunto con el que queremos comparar (S1 ) y el con-
junto total de genes considerado (G) la situacin que se presenta la
tenemos reflejada en la tabla 17.1. En esta tabla n11 indica el nmero
de genes que estn tanto en S0 como en S1 , tambin tendremos n12
genes que estn en S0 pero no en S1 , n21 en S1 pero no en S0 y, final-
mente, n22 que no estn ni en S0 ni en S1 . Suponemos que el total de
genes (nuestro universo de genes) G tiene un total de N genes.

S1 S1c = G \ S1 Tabla 17.1: S0 indica el grupo de genes


significativos (grupo predefinido) y
S0 n11 n12 n 1 G \ S0 su complementario respecto del
S0c = G \ S0 n21 n22 n 2 universo de genes considerado G. S1
n 1 n 2 N indica el conjunto de genes contra el
cual comparamos.
En la tabla 17.1 consideramos dados los totales de la fila y la co-
lumna, en otras palabras, consideramos fijos los valores de n1 y n2
(totales de fila) as como los valores de n1 y n2 (totales de columna).
Asumiendo fijos estos totales de fila y columna: cul es la probabili-
dad de observar la tabla 17.1? Utilizando argumentos combinatorios
la respuesta es la siguiente: Si denotamos N11 el nmero aleatorio de
genes en comn entonces, bajo la hiptesis de que no hay ningn
tipo de asociacin entre fila y columna, entonces la probabilidad sera
(nn11
1 )( n2
n1 n11 )
P( N11 = n11 ) = .
(nn1 )
Supongamos que estamos contrastando la posible sobrerepresenta-
cin entonces, bajo la hiptesis de independencia (condicionada a las
marginales), rechazaramos la hiptesis de independencia para un
valor mayor o igual al observado por lo que el p-valor sera la suma
de las probabilidades siguientes
mn{n1 ,n1 } (nt1 )(nn12 t)
p = P( N11 n11 ) = =
(nn1 )
.
t=n11
test de fisher unilateral 317

17.1 Con fisher.test

Supongamos que hemos observado la tabla 17.2 y pretendemos


saber si el solapamiento entre ambos conjuntos de genes es mayor
que el esperable por el puro azar aunque no estn asociados ambos
conjuntos.

S1 S1c Tabla 17.2: S0 (S) indica el grupo de


genes significativos (grupo predefinido)
S0 30 40 70 y S0 (Sc ) su complementario. S1 indica
S0c 120 156 276 el conjunto de genes contra el cual
150 196 346 comparamos.

Podemos utilizar el test exacto de Fisher direccional (o unilateral o


de una cola)

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

Y si valoramos una baja representacin?

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

Observamos que en ambas salidas nos muestra el cociente de los


odds. Su explicacin la encontramos en ??. Un valor del cociente de
odds mayor que la unidad indica sobre expresin mientras que un
valor menor a la unidad indica una expresin menor a la esperable
bajo independencia.

17.2 Sobre la eleccin del universo de genes

Pretendemos evaluar el efecto que tiene la eleccin del universo de


genes. Qu efecto tiene en nuestro anlisis el universo de genes, el
conjunto G total de genes que estamos utilizando? Consideremos los
datos de la tabla 17.3. Qu describe la tabla? Supongamos que tene-
mos dos conjuntos de genes dados, S0 y S1 . Dado este par de grupos
de genes tenemos el nmero de genes en los dos y en uno de ellos
pero no en el otro. Si miramos la tabla 17.3 significa que tenemos per-
fectamente definidas tres entradas de la tabla. Pero si suponemos que
vamos incrementando nuestro universo de genes (sin incluir ningn
gen adicional en S0 o S1 ) entonces la entrada n22 en la tabla 17.3 ser
cada vez mayor. En concreto hemos supuesto que n22 = 156 + k, es
decir, el conteo original ms los k genes que vamos incorporando
al universo de genes. Vamos a tomar un valor de k creciente y re-
presentaremos el p-valor del test de Fisher unilateral. Vemos cmo
conforme el valor de k crece el p-valor decrece (figura ??) y el cocien-
te de odds crece (figura ??). En definitiva la interpretacin tanto del
p-valor como del cociente de odds depende del universo de genes
que estamos considerando.

S1 G \ S1 Tabla 17.3: S0 (respectivamente S1 )


indica el grupo de genes significativos
S0 30 40 70 (el grupo predefinido) y G \ S0 (G \ S1 )
G \ S0 120 156 + k 276 + k su complementario. El universo de
150 196 + k 346 + k genes crece y suponemos que aadimos
k genes.

En la figura 17.1(a) (respectivamente en la figura 17.1(b)) tenemos


el p-valor del test de Fisher unilateral correspondiente a la tabla 17.3
(respectivamente el cociente de odds) cuando el valor de k va 0 a 100.
En trazo rojo discontinuo representamos la lnea horizontal para un
valor de ordenada igual a 0.05. La lnea verde punteada corresponde
con una ordenada de 0.01.
Vemos cmo el incremento del universo de genes tiene como consecuen-
cia que el p-valor del test de Fisher unilateral decrezca.
test de fisher unilateral 319

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

0 50 100 150 0 50 100 150

k k

(a) (b) Figura 17.1: a) p-valores del test de


Fisher unilateral. b) Cocientes de odds.
17.3 Utilizando Category y GOstats

En esta seccin utilizamos los paquetes Gentleman and Falcon


[2015, GOstats] (ver tambin Falcon and Gentleman [2007]) y with
contributions from S. Falcon and D.Sarkar [2015, Category].

17.3.1 GSE1397

Leemos los datos normalizados.

library(Biobase)
data(gse1397,package = "tamidata")
eset = gse1397
y = pData(eset)[,"type"]
remove(gse1397) ## Ahorramos memoria

Determinamos grupo de genes significativos.

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"

Cargamos el paquete con la base de datos correspondiente.

library(hgu133a.db)

Tenemos un solo identicador GO para cada gen?

G1.entreizd = unlist(mget(featureNames(eset), hgu133aENTREZID))


anyDuplicated(G1.entreizd)

## [1] 6

Hay duplicados. Nos quedamos, para cada gen, con el conjunto de


sondas que nos da la mxima variabilidad, por ejemplo, el valor ms
grande del rango intercuartlico.

eset.iqr = apply(exprs(eset), 1, IQR)


uniqGenes = findLargest(featureNames(eset), eset.iqr, "hgu133a")
eset1 = eset[uniqGenes, ]

Y ahora construimos el universo de genes y comprobamos que no


hay duplicidades.

G2.entrezid = unlist(mget(featureNames(eset1), hgu133aENTREZID))


anyDuplicated(G2.entrezid)

## [1] 0

Determinamos la identificacin en la misma base de datos de los


genes declarados significativos.

seleccionados = unlist(mget(featureNames(eset[significativos,]),
hgu133aENTREZID))

Vamos a aplicar un test de Fisher unilateral para los grupos defini-


dos de acuerdo con Gene Ontology. Cargamos paquetes necesarios.

library(GO.db)
library(Category)
library(GOstats)

Y realizamos los tests.6 6


En http://geneontology.org/ tene-
mos una aplicacin en lnea que nos
realiza un anlisis similar.
test de fisher unilateral 321

params = new("GOHyperGParams", geneIds = seleccionados,


universeGeneIds = G2.entrezid,
annotation = annotation(eset), ontology = "BP",
pvalueCutoff = 0.001,conditional = FALSE,
testDirection = "over")
overRepresented = hyperGTest(params)

Finalmente para visualizar los resultados guardamos los resulta-


dos en un fichero y lo vemos con el navegador.

htmlReport(overRepresented, file = "GSE1397overRepresented.html")


browseURL("GSE1397overRepresented.html")

Tambin podemos ver un resumen.

head(summary(overRepresented))

## GOBPID Pvalue OddsRatio ExpCount


## 1 GO:0042776 1.146149e-05 798.7143 0.005714286
## 2 GO:0015985 2.004565e-05 588.2632 0.007500000
## 3 GO:0015986 2.004565e-05 588.2632 0.007500000
## 4 GO:0006754 6.002950e-05 328.2941 0.012857143
## 5 GO:1990542 7.058086e-05 301.5946 0.013928571
## 6 GO:0009206 8.597046e-05 272.0732 0.015357143
## Count Size
## 1 2 16
## 2 2 21
## 3 2 21
## 4 2 36
## 5 2 39
## 6 2 43
## Term
## 1 mitochondrial ATP synthesis coupled proton transport
## 2 energy coupled proton transport, down electrochemical gradient
## 3 ATP synthesis coupled proton transport
## 4 ATP biosynthetic process
## 5 mitochondrial transmembrane transport
## 6 purine ribonucleoside triphosphate biosynthetic process

Con el siguiente cdigo obtenemos un grafo (figura 40) donde los


vrtices corresponden a los grupos definidos por la categoras Gene
Ontology significativas. Las aristas nos muestran la estructura de la
base de datos que es un grafo acclico dirigido. .
322 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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.

data(gse20986, package = "tamidata")


gse = gse20986

En lo que sigue necesitamos la anotacin de este ExpressionSet.

Biobase::annotation(gse)

## [1] "hgu133plus2"

Cargamos el paquete con la base de datos correspondiente.

library("hgu133plus2.db")

Lo primero: definir el universo de genes. Cmo? Una propues-


ta razonable7 podra ser aplicar un filtrado no especfico y que el 7
Y nada ms que esto razonable y tan
universo de genes sean los genes restantes. razonable como muchas otras.

library(genefilter)
gse.filt = nsFilter(gse, var.func = IQR, var.cutoff = 0.6,
require.GOBP = TRUE)$eset

Cuntos genes nos quedan?

dim(gse.filt)

## Features Samples
## 5974 12

Tenemos un solo identicador GO para cada gen?

G1.entreizd = unlist(mget(featureNames(gse.filt), hgu133plus2ENTREZID))


anyDuplicated(G1.entreizd)

## [1] 0
test de fisher unilateral 323

Figura 17.2: Grafo Gene Ontology con


las grupos significativos.
324 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Vemos que no hay duplicidades en los datos filtrados. Sin em-


bargo, si consideramos como universo de genes todos los del chip
entonces s que nos encontramos con duplicidades.

G2.entrezid = unlist(mget(featureNames(gse), hgu133plus2ENTREZID))


anyDuplicated(G2.entrezid)

## [1] 6

La idea sera quedarnos para cada gen con el conjunto de sondas


que nos da la mxima variabilidad. Por ejemplo, con el grupo de
sondas con el mayor rango intercuartlico.

gse.iqr = apply(exprs(gse), 1, IQR)


uniqGenes = findLargest(featureNames(gse), gse.iqr, "hgu133plus2")
gse.filt2 = gse[uniqGenes, ]

Y ahora construimos el universo de genes y comprobamos que no


hay duplicidades.

G2.entrezid = unlist(mget(featureNames(gse.filt2), hgu133plus2ENTREZID))


anyDuplicated(G2.entrezid)

## [1] 0

Aplicamos el procedimiento de expresin diferencial utilizado en


el ejemplo 5.

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))

Vamos a aplicar un test de Fisher unilateral para los grupos defi-


nidos de acuerdo con Gene Ontology. Cargamos paquetes necesarios.

library(GO.db);library(Category);library(GOstats)

Y realizamos los tests.

params = new("GOHyperGParams", geneIds = selected, universeGeneIds = G2.entrezid,


annotation = annotation(gse.filt2), ontology = "BP", pvalueCutoff = 0.01,
conditional = FALSE, testDirection = "over")
overRepresented = hyperGTest(params)
test de fisher unilateral 325

Finalmente para visualizar los resultados guardamos los resulta-


dos en un fichero y lo vemos con el navegador.

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

Realizamos un filtrado no especfico quitando aquellos cuyo rango


intercuartlico est por debajo de la mediana (de los rangos intercuar-
tlicos observados). Adems se requiere que el gen tenga anotacin
en Gene Ontology. Esto lo pedimos con el argumento require.GOBP
= TRUE.8 8
En concreto se pide su anotacin en la
ontologa Biological Process.

bcrneg.filt = nsFilter(bcrneg, var.cutoff = 0.5, require.GOBP = TRUE)$eset

Veamos qu nos queda.

dim(bcrneg.filt)

## Features Samples
## 4032 79

Vamos a generar una lista de genes significativos de un modo muy


bsico9 . Calculamos el p-valor del test de la t y nos quedamos con los 9
Y tampoco muy recomendable.
genes con un p-valor por debajo de 0.05.

fac0 = pData(bcrneg.filt)[, "mol.biol"]


fac0 = factor(fac0) ## Quitamos categoras vacas
rtt = rowttests(bcrneg.filt, fac0)
rttPrb = rtt$p.value
tThresh = rttPrb < 0.05
326 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Le damos nombres a las componentes del vector utilizando los


identificadores de Affymetrix GeneChip.

names(rttPrb) = featureNames(bcrneg.filt)

Guardamos estos identificadores en ids.

ids = featureNames(bcrneg.filt)

Guardamos tambin las correspondencias con Entrez.

map = hgu95av2ENTREZID

Definimos quin es nuestro universo. En nuestro caso todos los


genes que intervenan en nuestro estudio y de los cuales tenamos su
anotacin (hay sondas de control que desaparecen con el filtrado que
acabamos de hacer).

universe = unlist(mget(ids, map))


selected = unlist(mget(ids[tThresh], map))

Elegimos un grupo utilizando un trmino de Gene Ontology.


Primero cargamos el paquete Carlson [2015a, GO.db].

library(GO.db)

Nos fijamos por ejemplo en el trmino siguiente

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

La tabla 17.4 muestra los conteos observados.

InGO Tabla 17.4: Tabla de contingencia para el


trmino GO:0006468.
Selected FALSE TRUE
FALSE 3101 162
TRUE 658 30
Cargamos los paquetes with contributions from S. Falcon and
D.Sarkar [2015, Category] y Gentleman and Falcon [2015, GOstats].
test de fisher unilateral 327

library(Category)
library(GOstats)

params = new("GOHyperGParams", geneIds = selected, universeGeneIds = universe,


annotation = annotation(bcrneg.filt), ontology = "BP", pvalueCutoff = 0.001,
conditional = FALSE, testDirection = "over")
overRepresented = hyperGTest(params)

Veamos el resumen.

head(summary(overRepresented), n = 3)

Guardamos los resultados en un fichero HTML y lo vemos.

fl = tempfile()
htmlReport(overRepresented, file = fl)
browseURL(fl)

17.4 EnrichmentBrowser

Vamos a realizar un anlisis de enriquecimiento por grupos utili-


zando Geistlinger et al. [2016, EnrichmentBrowser].

pacman::p_load(EnrichmentBrowser)
data(gse1397,package="tamidata")
gse1397 =probe.2.gene.eset(gse1397)
gse1397 = de.ana(gse1397) ## t-test moderados (limma)

Necesitamos los grupos de genes.

hsaKEGGgsc = get.kegg.genesets("hsa")

Realizamos un anlisis de sobre representacin con el test de Fis-


her unilateral.

gse1397KEGGora= sbea(method="ora", eset=gse1397, gs=hsaKEGGgsc, perm=0, alpha=0.05)

Los resultados los tenemos en

gs.ranking(gse1397KEGGora)

## DataFrame with 7 rows and 4 columns


## GENE.SET
## <character>
328 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## 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

Podemos repetir el anlisis para los mismos datos pero utilizando


la base de datos de procesos biolgicos en Gene Ontology. Necesita-
mos los grupos de genes.

hsaGOBPgsc = get.go.genesets(org="hsa", onto="BP", mode="GO.db")

save(hsaGOBPgsc,file=paste(dirTamiData,"hsaGOBPgsc.rda",sep=""))

gse1397GOBPora= sbea(method="ora", eset=gse1397, gs=hsaGOBPgsc, perm=0, alpha=0.05)

Los resultados los tenemos en

gs.ranking(gse1397GOBPora)

## DataFrame with 11 rows and 4 columns


## GENE.SET
## <character>
## 1 GO:0042776 mitochondrial ATP synthesis coupled proton_transport
_ _ _ _ _
## 2 GO:0022904_respiratory_electron_transport_chain
## 3 GO:0044237_cellular_metabolic_process
## 4 GO:0006754_ATP_biosynthetic_process
## 5 GO:0060334 regulation of interferon-gamma-mediated_signaling_pathway
_ _ _
## ... ...
## 7 _ _ _
GO:0043010 camera-type eye development
## 8 GO:0021762_substantia_nigra_development
## 9 GO:0015992_proton_transport
test de fisher unilateral 329

## 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

El mtodo que vamos a considerar aparece propuesto en Young


et al. [2010] e implementado en Young [2015, goseq]. Se propone un
anlisis de sobreexpresin de un grupo de genes que previamente se
ha detectado como diferencialmente expresados segn algn procedi-
miento. Las categoras que utilizan estn basadas en Gene Ontology.
Bsicamente lo que se propone es una modificacin del test de Fis-
her unilateral intentando corregir sesgos que aparecen con los datos
RNASeq. Qu sesgos?
1. Transcritos ms largos estn ms representados en la muestra. En
RNASeq los transcritos son troceados y por tanto un transcrito
ms largo da lugar a una mayor cantidad de posibles lecturas
cortas sobre las que muestreamos.

2. Genes ms expresados tambin dan lugar a un mayor nmero de


lecturas.
En resumen genes ms largos y expresados dan lugar a conteos ma-
yores y, por ello, a que sea ms probable que sean detectados como
diferencialmente expresados porque los procedimientos de contraste
son ms potentes.10 Este es el objetivo del procedimiento. Corregir 10
Una misma diferencia de las medias
el test de Fisher unilateral de modo que se tenga en cuenta el tama- se detecta como significativa con una
mayor probabilidad. Genes ms cortos
o y la abundancia de los genes que conforman el grupo de genes o menos expresados pueden tener una
significativos. misma diferencia en los conteos medios
pero tenemos menos probabilidad de
El anlisis de sobrerepresentacin basado en el test de Fisher uni- detectarla, de rechazar la hiptesis de
lateral considerado en 17 utiliza como hiptesis bsica que cual- igualdad de las medias.
quier gen tiene la misma de ser detectado como diferencialmente
330 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

expresado asumiendo cierta la hiptesis nula de que no de que no


hay expresin diferencial. Aqu esta hiptesis no es sostenible por lo
que la distribucin hipergeomtrica en la que se basa el test de Fisher
no se puede utilizar.
Veamos el mtodo GOseq.

1. Determinamos un conjunto de genes diferencialmente expresados,


S0 . Podemos utilizar cualquier procedimiento.

17.5.1 PRJNA297664 con goseq

library(goseq)

Cargamos los datos.

data(PRJNA297664,package="tamidata")

Son datos de levadura. Para manejar SummarizedExperiment nece-


sitamos Aboyoun et al. [2016, GenomicRanges]

library(GenomicRanges)

En este mtodo necesitamos conocer la longitud de los genes y la


correspondencia entre nuestros identificadores y los grupos de Gene
Ontology.
Tenemos en el propio paquete Young [2015, goseq] los datos
necesarios sobre la levadura?
Veamos los genomas que soporta.

View(supportedGenomes())
View(supportedGeneIDs())

Para poder conocer la longitud de los genes necesitamos el paque-


te Carlson and Maintainer [2015, TxDb.Scerevisiae.UCSC.sacCer3.sgdGene].
Determinamos genes con diferencias significativas utilizando Chen
et al. [2016, edgeR].11 11
??.

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")

## Warning in pcls(G): initial point very close to some


inequality constraints


0.15
Proportion DE

0.10


0.05

0 2000 4000 6000 8000

Biased Data in 700 gene bins.

Podemos ver las longitudes de los genes con

length_sc3 = getlength(rownames(PRJNA297664),"sacCer3","sgdGene")

Podemos ver una estimacin de la funcin de densidad con

library(ggplot2)
df1 = data.frame(length_sc3)
ggplot(df1,aes(x=length_sc3))+geom_density()

## Warning: Removed 592 rows containing non-finite values


## (stat_density).
332 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

6e04

4e04
density

2e04

0e+00

0 5000 10000 15000


length_sc3

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 .

1. Realizar, para cada uno de los tres grupos de genes seleccionados,


un anlisis de un sobre solapamiento, utilizando el test de Fisher
unilateral, con los grupos definidos en Gene Ontology. En concreto
hay que utilizar las tres bases de bases de Gene Ontology: BP
(procesos biolgicos), CC (componentes celulares) y MP (funcin
molecular).
18
Anlisis de conjuntos de genes

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.

18.2 Sobre la distribucin de la matriz de expresin

Denotaremos (como siempre) la matriz de expresin (aleatoria)


como

X = [ Xij ]i=1,...,N;j=1,...,n
334 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

donde Xij es la expresin aleatoria del i-simo gen en la j-sima


muestra. Las expresiones observadas sern

x = [ xij ]i=1,...,N;j=1,...,n

Notemos que Xij es una variable aleatoria mientras que xij es un


valor observado. Las columnas de la matriz de expresin X son in-
dependientes. Son vectores aleatorios independientes4 Por tanto 4
Corriendo un tupido velo por toda la
podemos considerar que las distintas muestras son realizaciones de parte de preprocesado de la informa-
cin que hemos visto en 4 para datos
vectores independientes aunque no con la misma distribucin ya que de microarrays. Es claro que el pre-
son observados bajo distintas condiciones experimentales. Si nos fija- procesado de la informacin introduce
dependencias entre valores observa-
mos en las filas de la matriz de expresin, esto es, en los perfiles de dos para distintas muestras pero las
expresin entonces tenemos realizaciones de vectores aleatorios de- ignoramos.
pendientes y que adems no tienen la misma distribucin. Los genes
no son independientes en su comportamiento hay corregulaciones
entre ellos. Adems tampoco tienen porqu comportarse de un modo
(aleatorio) comn.

18.3 Conjunto(s) de genes

Tenemos distintos conjuntos de genes previamente definidos uti-


lizando informacin previa: un grupo(s) definido por el grupo de
investigacin, grupos definidos utilizando Gene Ontology, . . . Lo fun-
damental, estos grupos de genes no han de estar definidos en funcin
de nuestros datos de expresin.5 Si denotamos por G = {1, . . . , N } el 5
16.
conjunto total de genes considerado (o universo de genes) entonces
los conjuntos de genes sern S1 , . . . , SK . En particular, no es extrao
considerar el caso K = 1, es decir, estar interesados en un conjunto de
genes dado. Supondremos que el conjunto Sk tiene cardinal nSk o, si
no hay confusin, simplemente nk . Los distintos conjuntos Sk no son
una particin de G: no son necesariamente disjustos (Si S j 6= para
i 6= j) y su unin no tiene porqu ser todo el universo considerado de
genes.
La cuestin bsica podemos formularla como: Hay asociacin entre
un conjunto de genes y el fenotipo?6 Es una pregunta muy vaga. Se re- 6
Esto es, la misma pregunta que nos
quiere una formulacin ms precisa. Caben distintas interpretaciones formulbamos para cada gen pero
ahora referido a un conjunto dado de
de la pregunta. En Tian et al. [2005] formulan las siguientes dos hip- genes.
tesis nulas que concretan de dos modos distintos la cuestin previa.
Reproducimos las hiptesis nulas.7 7

Hypothesis Q1: The genes in a gene set


Hiptesis Q1: Los genes de un conjunto muestran el mismo patrn de show the same pattern of associa-
asociacin con el genotipo comparado con el resto de genes. tions with the phenotype compared
with the rest of the genes.
Hiptesis Q2: El conjunto de genes no tiene ningn gen cuyo nivel de Hypothesis Q2: The gene set does not
expresin est asociado con el fenotipo de inters. contain any genes whose expres-
sion levels are associated with the
phenotype of interest.
anlisis de conjuntos de genes 335

No tenemos la misma hiptesis nula, no. La hiptesis nula Q1 se


centra en la comparacin entre (la asociacin entre) un conjunto dado
de genes (con el fenotipo) y (la asociacin entre) los otros (con el
fenotipo). En cambio, la hiptesis Q2 se centra en el estudio de la
expresin diferencial de los genes que pertenecen a un conjunto dado
de genes.
Un planteamiento similar lo podemos encontrar en 8 . En concreto 8
Jelle J. Goeman and Peter Bijhl-
mann. Analyzing gene expression
un test que se plantea si un conjunto de genes tiene una asociacin
data in terms of gene sets: metho-
con el fenotipo, la hiptesis Q2, recibe el nombre de test autocontenido dological issues. Bioinformatics, 23
(self-contained test) mientras que si nos ocupamos de la hiptesis nula (8):980987, 2007. doi: 10.1093/bio-
informatics/btm051. URL http:
Q1 hablamos de un test competitivo (competitive test). De hecho el //bioinformatics.oxfordjournals.
formula las hiptesis nulas del siguiente modo: org/content/23/8/980.abstract

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 .

Hiptesis nula autocontenida H0auto : Ningn gen en S est diferencial-


mente expresado.
9 9
Es interesante leer las hiptesis nula
Muchos procedimientos estadsticos propuestos contrastar estas tal como las formulan:
comp
Competitive null hypothesis H0 :
hiptesis no formula expresamente cuales son las hiptesis nulas que The genes in G are at most as often
estn contrastando. De hecho, la reflexin sobre el propio procedi- diferentially expressed as the genes
miento de contraste propuesto es el que nos ha de indicar la hiptesis in G c .
sel f
nula. No tenemos un modelo (estocstico) preciso y esto ocasiona Self-contained null hypothesis H0 :
No genes in G are differentially
esta indeterminacin. expressed.
En lo que sigue veremos procedimientos que asumen una distri-
bucin conocida (o al menos asintticamente conocida) para los esta-
dsticos de contraste. Sin embargo, la opcin ms utilizada es evaluar
la significacin del estadstico asociado al contraste utilizando como
distribucin nula (o distribucin bajo la hiptesis nula) una distribu-
cin de aleatorizacin o una distribucin bootstrap. Qu distribucin
es adecuada depender de la hiptesis que estemos contrastando.
De hecho, desde el punto de vista estadstico, este es el ncleo del
problema. Cmo estimamos la distribucin nula?

18.4 Ejemplos

En esta seccin comentamos los ejemplos que utilizamos.

18.4.1 Un ejemplo simulado de Efron y Tibshirani


En Efron and Tibshirani [2007] se proponen un par de ejemplos
con datos simulados. Son los ejemplos 19 y 20.
336 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Ejemplo 19. Se consideran 1000 genes y 50 muestras. Se supone que las 25


primeras muestras son controles y las ltimas 25 es el grupo de tratamiento.
Definimos los grupos de genes como: las 20 primeras filas (de la matriz de
expresin) corresponden al primer grupo, de la 21 a la 40 el segundo y as
sucesivamente. Los niveles de expresin los generamos aleatoriamente inde-
pendientemente y con la misma distribucin. La distribucin comn es una
normal estndar (Xij N (0, 1)). En el primer grupo aadimos un valor
constante de 2.5 a los primeros 10 genes en las muestras correspondientes a
tratamiento (ltimas 25 columnas de la matriz de expresin). En consecuen-
cia, lo que hacemos es que solamente el primer grupo tiene la mitad de los
genes asociados con el fenotipo y la otra mitad sin ningn tipo de asociacin.
El resto de grupos no tiene ninguna asociacin con fenotipo. Generamos
estos datos.

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

En este ejemplo el vector que nos indica la clasificacin de las muestras


ser

y.et = factor(rep(1:2,rep(25,2)),levels = 1:2,


labels = c("Normal","Tratamiento"))

En lo que sigue utilizaremos como medida de asociacin fenotipo-expresin


el estadstico del t-test.

et1.tt = genefilter::rowttests(et1,y.et)$statistic

En figura 18.2 tenemos una estimacin de la densidad. Podemos ver cmo


se aprecia, por debajo de 8, el valor que corresponde al primer grupo.

pacman::p_load("ggplot2")
0.3

df = data.frame(et1.tt)
ggplot(df,aes(x=et1.tt))+geom_density()
density

0.2

0.1

Ejemplo 20. Este ejemplo se define exactamente como el ejemplo 19 ex-


cepto lo que se haca solamente para el primer grupo lo hacemos para todos:
0.0
sumamos a los 10 primeros genes de cada grupo 2.5 unidades en las mues- 8 4 0 4
et1.tt
tras correspondientes al tratamiento (ltimas 25 columnas de la matriz de
Figura 18.1: Densidad estimada de
expresin). Generamos los datos. et1.tt.
anlisis de conjuntos de genes 337

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

Notemos que la covariable indicando el grupo es la misma que en ejemplo


19. Definimos los grupos para su uso posterior.

gen.name = function(i) paste("g",((i-1)*20 +1):(i*20),sep="")


gsc.et = lapply(as.list(1:50),gen.name)
names(gsc.et) = paste("set",as.character(1:50),sep="")
gsnames.et = paste("set",as.character(1:50),sep="")
genenames.et = paste("g",1:1000,sep="")

et2.tt = genefilter::rowttests(et2,y.et)$statistic
0.06

En figura ?? tenemos una estimacin de la densidad.

pacman::p_load("ggplot2")
0.04
df = data.frame(et2.tt)

density
ggplot(df,aes(x=et2.tt))+geom_density()

0.02

18.5 Cuantificando asociacin gen-fenotipo


0.00

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

descripcin fenotpica con la que se trabaja, un estadstico di para ca-


da gen. La definicin de este estadstico es funcin del fenotipo. Son
perfectamente utilizables como medidas de asociacin gen-fenotipo
(es lo que son).
En lo que sigue a la medida de asociacin gen-fenotipo la denota-
remos genricamente por ti (aunque no sea un t estadstico).

18.6 Enriqueciendo el conjunto de genes

El vector t = (t1 , . . . , t N ) constituye, de hecho, una descripcin


de la asociacin marginal gen-fenotipo. Pero tenemos unos grupos de
genes en los que tenemos inters o que expresan simplemente conoci-
miento previo de posibles asociaciones entre los genes. Sea S uno de
estos conjuntos. Enriquecer el estadstico t para el conjunto consiste
en considerar un resumen de t sobre S. Y esto lo podemos hacer de
muchas formas. Si denotamos el estadstico de enriquecimiento por
t(S) la opcin ms simple es
t
t (S) = niS , (18.1)
i S

es decir, el promedio de los ti observados sobre el conjunto de genes


de inters S. Podemos considerar muchas otras opciones y en las
secciones que siguen las veremos.

18.7 Distribuciones condicionadas a los datos

Sea x la matrix de expresin observada. Y supongamos que el vector


y (de dimensin n) nos indica la covariable de inters de la muestra
(normalmente la pertenencia a un grupo). Para el universo de genes
considerado tendremos el el vector t = (t1 , . . . , t N ).

18.7.1 Distribucin de permutacin para un gen


Para un gen tenemos su perfil de expresin u = (u1 , . . . , un ) y
tenemos el vector y asociado a las muestras.
Sea denota una permutacin aleatoria de (1, . . . , n) de forma
que los (i ) ser el ndice que ocupa la posicin i-sima en la per-
mutacin . En particular denotaremos por 0 la permutacin que
nos devuelve el orden original: 0 ( j) = j. Si el vector asociado a
las muestras es y entonces tendremos el vector (permutado de y)
y = (y (1) , . . . , y (n) ). Obviamente y = y0 .
La cantidad que describe la asociacin entre u y y es t . Utili-
zando esta notacin el valor observado de la asociacin gen-fenotipo
anlisis de conjuntos de genes 339

para u e y ser t0 . Si consideramos B permutaciones aleatorias en-


tonces tendremos los valores t1 , . . . , tB para las B permutaciones
aleatorias.
Si no hay asociacin gen-fenotipo entonces el valor de t0 debe
de ser como los valores t1 , . . . , tB . De hecho, cualquier ordenacin
de t0 , t1 , . . . , tB tiene la misma probabilidad. Podemos considerar
dos casos. En el primero una mayor asociacin se expresa como un
valor mayor de t (normalmente positivo). Cuntos valores tb (con
b = 1, . . . , B) son mayores que t0 ? Si hay pocos indica que no hay
equiprobabilidad y, por lo tanto, rechazamos esa hiptesis. Esto es
un test de aleatorizacin aplicado a las muestras. El p-valor sera la
proporcin de tb s mayores que t0 , es decir,

|{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)

Generamos B = 100 permutaciones aleatorias de y utilizando la funcin


sample.

B = 100
tb = rep(0,B)
for(i in 1:B) tb[i] = t.test(u ~ sample(y.et))$statistic

Determinamos los valores absolutos de los estadsticos.

tb = abs(tb)

El valor observado de t0 es 8.77. Y el p-valor ser la proporcin de los


que su valor absoluto es mayor que el valor absoluto de t0 ), es decir,
340 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

sum(tb > t0) / B

## [1] 0

Tenemos un p-valor nulo. No parece que todas las ordenaciones de los


valores t0 , t1 , . . . , tB sean equiprobables.

La distribucin nula que hemos considerado en esta seccin co-


rresponde con la hiptesis nula autocontenida que veamos previa-
mente. No asumimos ninguna distribucin asinttica para el esta-
dstico enriquecido y generamos una distribucin nula en la que
intercambiamos las etiquetas de las muestras. Si nuestro inters es
contrastar la hiptesis Q2 o hiptesis autocontenida esta sera la dis-
tribucin nula natural.10 10
Podemos hablar de aleatorizacin por
columnas entendiendo que las distintas
muestras corresponden a las distintas
18.7.2 Distribucin de aleatorizacin columnas en la matriz de expresin.

Denotemos por S0 el conjunto de genes original en el que tenemos


inters. Ahora vamos a elegir al azar un grupo S de genes (filas) del
mismo cardinal que S0 . Lo aleatorio ahora no es el vector y sino el
conjunto S de genes. Si S es aleatorio entonces tambin lo es t (S)
(ahora las muestras tienen su ordenacin original). A la distribucin
de probabilidad de t (S) se le llama distribucin de aleatorizacin
del estadstico de enriquecimiento. Si tomamos B selecciones aleato-
rias de nS0 genes tendremos los conjuntos Sb con b = 1, . . . , B y los
valores del estadstico de enriquecimiento observados son t (S0 ) (para
el grupo original) y t (Sb ) con b = 1, . . . , B para los seleccionados al
azar. El p-valor se define anlogamente como

|{b : t(Sb ) > t(S0 )}|


p= . (18.4)
B
si solamente rechazamos para valores grandes (positivos). En el caso
bilateral tendremos
|{b : |t(Sb )| > |t(S0 )|}|
p= . (18.5)
B
La distribucin nula que hemos considerado en esta seccin corres-
ponde con la hiptesis nula competitiva o hiptesis Q1. No asumi-
mos ninguna distribucin asinttica para el estadstico enriquecido
y generamos una distribucin nula en la que seleccionamos al azar
grupos del mismo tamao. Realmente lo que estamos haciendo es ge-
nerar permutaciones aleatorias de las filas en la matriz de expresin.
Si nuestro inters es contrastar la hiptesis Q1 o hiptesis competitiva
esta sera la distribucin nula natural.11 11
Podemos hablar de aleatorizacin
En lo que sigue repasamos distintos paquetes R/Bioconductor que por filas entendiendo que los distintos
genes (o genricamente caractersticas
implementan distintas medidas de enriquecimiento y distribuciones que observamos) corresponden a las
distintas filas en la matriz de expresin.
Tambin se habla de muestreo de genes
o gene sampling.
anlisis de conjuntos de genes 341

nulas en donde permutamos aleatoriamente las columnas (muestras)


o las filas (caractersticas).

18.8 Limma::genSetTest

En el paquete Smyth et al. [2016, limma] tenemos la funcin lim-


ma::geneSetTest. En este caso la medida de enriquecimiento que se
utiliza es la media muestra de los estadsticos calculados para cada
gen. Simplemente se permuta por filas. Contrastamos pues la hipte-
sis competitiva.

Ejemplo 22 (genSetTest y ejemplo 19). Consideremos los datos del ejem-


plo 19 y el t-estadstico para cada gen. El grupo de inters es el primero
(primeras 20 filas). Supongamos que tomamos como alternativa si tienden a
tomar valores mayores en el primer grupo.

library(limma)
geneSetTest(1:20,et1.tt,alternative ="up")

## [1] 0.9984722

El p-valor nos indica que no rechazamos la hiptesis nula. Y si contras-


tamos la alternativa de valores mayores en el segundo grupo?

geneSetTest(1:20,et1.tt,alternative ="down")

## [1] 0.00153168

Vamos a realizar el contraste para cada uno de los 50 grupos considera-


dos.

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)
}

Comprobamos que el p-valor del primer grupo es claramente menor que el


p-valor para los restantes grupos.

Ejemplo 23. Analizamos los grupos definidos en el ejemplo 16.4. Carga-


mos datos y los grupos (de ms de 50 genes).

data(gse1397,package="tamidata")
data(gse1397.gsc,package="tamidata")
gsc = gse1397.gsc
342 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

gruposGrandes = which(sapply(geneIds(gsc),length) > 50)


gsc = gsc[gruposGrandes]

En gsc tenemos la coleccin de conjuntos de genes. Elegimos el primer


grupo.

indices = is.element(featureNames(gse1397),geneIds(gsc[[1]]))

Determinamos los t-estadsticos.

library(genefilter)
fac0 = pData(gse1397)[,"type"]
gse1397.tt = rowttests(gse1397,fac0)$statistic

Y le aplicamos el test de aleatorizacin al primer grupo.

geneSetTest(indices,gse1397.tt,alternative ="mixed")

## [1] 0.988849

Y lo hacemos para todos los grupos.

(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

En la figura 18.3 podemos ver un estimador kernel de la densidad de los


0.4

p-valores observados.
0.2

Qu conjuntos de genes han resultado ms significativos? Lo primero es


ordenar los p-valores obtenidos y recuperar el ndice.
0.0

0.0 0.2 0.4 0.6 0.8 1.0

N = 868 Bandwidth = 0.0731


orden = sort(pvalores,index.return = TRUE)$ix
Figura 18.3: GSE1397: anlisis de
enriquecimiento de conjuntos de genes
Y ahora reordenamos los conjuntos de genes. con genSetTest.

gsc.ordenada = gsc[orden]

Los 10 ms significativos tienen los siguientes identificadores en Gene


Ontology.12 12
Y ahora ya es trabajo del experto de
decidir si es un absurdo o tiene algn
sentido.
anlisis de conjuntos de genes 343

names(gsc.ordenada[1:10])

## [1] "GO:0000075" "GO:0001568" "GO:0000216"


## [4] "GO:0001947" "GO:0000226" "GO:0001937"
## [7] "GO:0000184" "GO:0000079" "GO:0000902"
## [10] "GO:0001843"

18.9 Limma::wilcoxGST

Siguiendo con el paquete Smyth et al. [2016, limma] una opcin


simple (no necesariamente muy potente) y que no utiliza la distribu-
cin de aleatorizacin consiste en tomar los valores del estadstico en
el grupo de inters y en el resto de genes y compararlos utilizando
un test de Wilcoxon.13 Por lo tanto estamos en el caso en que conoce- 13
??.
mos la distribucin nula. No aleatorizamos ni por filas ni por colum-
nas. Es un test exacto. El test de Wilcoxon tampoco asume ninguna
hiptesis distribucional sobre los estadsticos por gen que utilizamos
lo que es una ventaja. Sin embargo, asume independencia entre estos
estadsticos que no se verifica ya que las expresiones de los genes son
interdependientes.
Ejemplo 24 (Datos de ejemplo 19). Utilizamos la funcin 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

Tomemos otro grupo y repitamos el anlisis.

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

cedimiento para contrastar la hiptesis competitiva. Es un procedi- Adjusted MEan RAnk.

miento que tiene en cuenta la correlacin entre las expresiones de los


distintos genes en cada muestra. La mayor parte de los procemien-
tos propuestos para el contraste de la hiptesis competitiva suelen
asumir (falsamente) la independencia de la expresin observada para
distintos genes y su validez depende una hiptesis que sabemos no
es cierta. Se ha visto que no tener en cuenta esta dependencia entre
genes nos lleva a un incremento de la tasa de error FDR.
Se asume que la expresin est cuantificada en escala logartmica
(base 2 como es habitual en este contexto).
p
E[ Xij ] = ij = ik y jk (18.6)
k =1

siendo y jk la k-sima covariable (o variable fenotpica) de la j-sima


muestra. Se supone que las expresiones aleatorias (su perfil aleato-
rio de expresin) de un mismo gen tienen una varianza comn i2 .15 15
Asumible si hemos aplicado pre-
Se asume que las expresiones para distintas muestras son indepen- viamente algn procedimiento de
normalizacin.
dientes pero no entre distintos genes. En particular, denotamos el
coeficiente de correlacin de Pearson16 entre las variables aleatorias 16
31.1.
Xi1 j y Xi2 j como cor ( Xi1 j , Xi2 j ) = i1 ,i2 . Obviamente no asumimos que
estos coeficientes sean nulos.17 17
No asumimos incorrelacin. Recor-
Un contraste, para el gen i-simo viene dado por demos que independencia implica
incorrelacin pero no viceversa.
p
i = c j ik .
k =1

Se est interesado en contrastar la hiptesis nula de que el contraste


es nulo. Tenemos inters en los contrastes de hiptesis: H0 : i = 0
frente a la alternativa de que H0 : i 6= 0. Denotemos el estadstico
del contraste como Zi .18 Qu estadsticos Zi vamos a considerar? No necesariamente con distribucin
18

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

Estamos tomando la media de las partes positivas ti+ , la media de


las partes negativas ti y nos quedamos con el mximo de ambos
valores.

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.

Como medidas de asociacin gen-prototipo ti utilizan las mismas


del paquete Tibshirani et al. [2011, samr] que aparecen en la seccin
10.1.1. Cuando analizan los conjuntos de genes hablan de grupos
de genes positivos y grupos de genes negativos. Un grupo de genes se
dice negativo si corresponden con genes que en la clase 2 tiene expre-
siones menores cuando tenemos dos grupos (1 y 2). Si tenemos una
covariable y numrica entonces los negativos corresponden al caso en
que expresiones menores se asocian a valores mayores de y. Los gru-
pos positivos se definen de modo contrario a los positivos. Cargamos
el paquete.

library(GSA)

Ejemplo 26 (Ejemplo 19 con GSA). Empezamos analizando el ejemplo 19.

grupo = c(rep(1,25),rep(2,25)) #El grupo tiene que numerarse 1,2


et1.gsa = GSA(et1,grupo, genenames=genenames.et, genesets=gsc.et,
resp.type="Two class unpaired", nperms=100)

Podemos ver los estadsticos enriquecidos para los grupos

head(et1.gsa$GSA.scores)

## [1] 3.99534187 -0.01231818 0.11759218


## [4] -0.27081919 0.05557714 -0.07898232

El valor observado para el grupo 1 es 4 mientras que una descriptiva de


los dems es la siguiente
346 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

summary(et1.gsa$GSA.scores[-1])

## Min. 1st Qu. Median Mean 3rd Qu.


## -0.44630 -0.12430 -0.04239 -0.05241 0.05558
## Max.
## 0.21230

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)

## [1] 1.00 0.41 0.55 0.07 0.62 0.32

Nuestro grupo 1 no destaca. Si considerados los p-valores de grupos


positivos (en grupo 2 expresiones mayores) tenemos

head(et1.gsa$pvalues.hi)

## [1] 0.00 0.59 0.45 0.93 0.38 0.68

que para el grupo 1 vale 0 y un resumen de los dems es

summary(et1.gsa$pvalues.hi[-1])

## Min. 1st Qu. Median Mean 3rd Qu. Max.


## 0.1500 0.4500 0.5800 0.5776 0.7300 0.9700

Los valores originales ti los tenemos con

head(et1.gsa$gene.scores)

## [1] 3.485459 3.901185 3.698664 4.143949 3.555439


## [6] 3.656246

En la figura 18.4 podemos ver un diagrama de cajas que compara el


primer grupo con los dems.

fac0 = factor(c(rep(1,20),rep(2,980)),levels = 1:2,labels=c("Grupo 1","Resto"))


boxplot(et1.gsa$gene.scores ~ fac0)
4

En el primer grupo tenemos la mitad de los genes diferenciados y la otra


3

mitad no. En el resto de los genes no hay diferenciacin. De ah la gran


2

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

Figura 18.4: Valores ti para el primer


grupo (izquierda) y los dems. El pri-
mer grupo tiene diez genes claramente
diferenciados mientras que los dems
no lo estn. De ah la gran variabilidad
que muestra el grupo.
anlisis de conjuntos de genes 347

En la figura 18.5 tenemos los grupos de genes que se consideraran sig-


nificativos (diferenciando grupos up y down) y el valor de FDR para que los
declaremos significativos en los datos et1 (ejemplo 19).


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-

0.001 0.005 0.020 0.100 0.500


sin diferencial, no hay un comportamiento diferenciado del grupo respecto
pvalue
de los otros grupos. Los datos son et2 mientras que los grupos los tenemos
en gsc.et con nombres en gsnames.et. Finalmente genenames.tt nos da Figura 18.5: Grupos significativos con
datos et1 en funcin de FDR.
los nombres de los genes.

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)

La figura 18.6 muestra los grupos significativos en funcin de la FDR

1.0

para los datos et2 (ejemplo 20).






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

data(gse1397,package="tamidata") 0.01 0.02 0.05 0.10 0.20 0.50

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

Realizamos el anlisis. Previamente convertimos la variable tipo que es


un factor a un vector numrico con valores 1 y 2 (es como lo pide Efron and
Tibshirani [2010, GSA].

tipo.num = as.numeric(pData(gse)[,"type"])

Utilizamos como nombre de los genes los AffyId.

gse1397.gsa = GSA(exprs(gse),tipo.num, genenames=featureNames(gse),


genesets=geneIds(gsc),resp.type="Two class unpaired", nperms=1000)
save(gse1397.gsa,file="gse1397.gsa.rda")
348 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

library(tamidata)
data(gse1397.gsa)

En la figura 18.7 podemos ver la representacin de la tasa de falsos positi-






































































































































































0.500




vos como funcin del p-valor.

False discovery rate


o Negative
o Positive

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

nuestra coleccin. Figura 18.7: Grupos significativos con


datos gse1397.
(ind.lo = which(gse1397.gsa$pvalues.lo <.05))

## [1] 10 11 40 101 103 143 159 187 311 332 348


## [12] 390 410 495 511 521 569 629 649 715 745 807
## [23] 841

(ind.hi = which(gse1397.gsa$pvalues.hi <.05))

## [1] 15 65 70 97 120 121 122 173 176 184 212


## [12] 229 356 360 385 404 411 450 502 560 586 595
## [23] 597 676 702 770 782 803 816 820 843

Podemos ver sus identificadores en Gene Ontology. Para unos

names(gsc[ind.lo])

## [1] "GO:0000184" "GO:0000186" "GO:0001822"


## [4] "GO:0006469" "GO:0006486" "GO:0006921"
## [7] "GO:0006987" "GO:0007202" "GO:0019722"
## [10] "GO:0030218" "GO:0030968" "GO:0035556"
## [13] "GO:0042542" "GO:0051090" "GO:0051591"
## [16] "GO:0060041" "GO:0005643" "GO:0012505"
## [19] "GO:0022627" "GO:0001102" "GO:0004197"
## [22] "GO:0008234" "GO:0035064"

y para otros

names(gsc[ind.hi])

## [1] "GO:0000226" "GO:0006091" "GO:0006200"


## [4] "GO:0006457" "GO:0006754" "GO:0006766"
## [7] "GO:0006767" "GO:0007162" "GO:0007166"
## [10] "GO:0007190" "GO:0007417" "GO:0007605"
anlisis de conjuntos de genes 349

## [13] "GO:0031398" "GO:0032088" "GO:0035023"


## [16] "GO:0042384" "GO:0042552" "GO:0045665"
## [19] "GO:0051289" "GO:0001726" "GO:0005777"
## [22] "GO:0005811" "GO:0005814" "GO:0031594"
## [25] "GO:0045202" "GO:0005085" "GO:0005215"
## [28] "GO:0008144" "GO:0016491" "GO:0016887"
## [31] "GO:0042277"

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.

18.11.1 GSA con piano aplicado a levadura


Hemos visto que Varemo and Nookaew [2015, piano] tiene en par-
ticular la posibilidad de realizar un anlisis GSA como hemos visto
en 18.11. En esta seccin vamos a analizar unos datos de levadu-
ra (tamidata::bdmy) con el mtodo GSA pero utilizando el paquete
piano. En la seccin 16.5 vemos cmo podemos construir los gru-
pos. Los cargamos.

data(gscSc,package="tamidata")

Cargamos el ExpressionSet con los datos de levadura con los que


vamos a trabajar, tamidata::bdmy.

data(bdmy,package="tamidata")

El ExpressionSet tamidata::bdmy tiene datos faltantes. Vamos a


aplicar un procedimiento de asignacin para eliminarlos. Utilizamos
el algoritmo de normalizacin del k-vecino ms prximo. 21 21
Ver seccin A.2. Est implementado
en Hastie et al. [2015, impute.knn].
library(impute)
exprs1 = impute.knn(exprs(bdmy))$data

Tambin hemos de normalizar los datos.

library(limma)
exprs2 = normalizeBetweenArrays(exprs1)

Ahora intersectamos los grupos que tenamos de la levadura con


los que tenemos en nuestros datos.

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)

Nos vamos a quedar con grupos de al menos 20 genes.

gruposGrandes = which(sapply(geneIds(gsc),length) > 50)


gsc = gsc[gruposGrandes]

Pasamos al formato de piano.

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)

Utilizamos el estadstico maxmean y la permutacin de las mues-


tras. Determinamos los estadsticos y p-valores que cuantifican la
asociacin fenotipo con expresin.

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)

Hay que permutar etiquetas y recalcular estadstico

bdmy.maxmean.sample.piano = runGSA(bdmy.t, gsc=bdmy.gsc.piano,


geneSetStat="maxmean",signifMethod = "samplePermutation")

18.12 GSEA: Gene set enrichment analysis


22 22
Este mtodo no est implementado en
un paquete R. Los autores proporcionan
cdigo en R pero no en forma de
La referencia bsica es Subramanian et al. [2005] que presenta paquete. Por ello lo utilizaremos en
una versin modificada del procedimiento originalmente propuesto la seccin 18.17 pues este paquete
lo lleva como una opcin. Existe un
en Mootha et al. [2003]. Es el mtodo ms popular para realizar un interfaz Java para utilizarlo fuera de
enriquecimiento (agregado). Se basa en el uso del estadstico de R/Bioconductor que no es nuestra
Kolmogorov-Smirnov para dos muestras.23 De hecho, utiliza una opcin de trabajo.
23
En la seccin 29.6 se explica el
versin modificada de este estadstico que lo hace ms sensible a la mtodo.
deteccin de interaccin entre grupo de genes y fenotipo.
anlisis de conjuntos de genes 351

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.

Entradas 1. La matriz de expresin X con N filas y n columnas.


2. Procedimiento de ordenacin con objeto de producir la lista
ordenada de genes, L.
3. Un valor p
4. Un conjunto de genes S.

Clculo del enriquecimiento 1. Calculamos medida de asociacin gen-


fenotipo, ti .
2. Ordenamos el universo de genes de acuerdo a las medidas de
asociacin del paso 1. Denotamos los ndices ordenados con
r1 . . . , r N , es decir,
t r1 . . . t r N .

3. Calculamos para cada i con i = 1, . . . , N

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

El valor de eS es la mxima desviacin de cero de hS (i ) mS (i ),


es decir,
eS = max |hS (i ) mS (i )|. (18.10)
1 i N

Si elegimos S de un modo aleatorio (del universo de genes)


entonces eS tendr un valor pequeo en relacin a lo que se
observa cuando S no es aleatorio bien concentrndose en la
parte superior de la lista o en la inferior o siguiendo algn
patrn no aleatorio. Si p = 0 entonces eS es el estadstico del test
de Kolmogorov-Smirnov (ver seccin 29.6).

Estimacin del p-valor 1. Consideramos una asignacin aleatoria


del fenotipo a las muestras (una permutacin aleatoria de las
muestras manteniendo fijo el fenotipo), reordenamos los genes
y calculamos el valor E(S).
2. Se repite el paso anterior un gran nmero de veces.
352 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

3. Si e0 es el valor de eS sobre los datos originales y e1 , . . . , e B son


los valores de eS para las asignaciones aleatorias de fenotipo a
muestras entonces el p-valor viene dado por

2 |{ei :ei e0 }| , for e > 0,
B 0
p=
2 |{ei :ei e0 }| for e0 < 0.
B

Contrastes mltiples Suponemos que consideramos ahora una colec-


cin de conjuntos de genes de inters: S1 , . . . SK .

1. Calculamos eSk para k = 1, . . . , K.

2. Para cada Sk y 1000 permutaciones fijas i con i = 1, . . . , 1000


(las mismas para todos los conjuntos de genes) del fenotipo,
reordenamos los genes y calculamos el enriquecimiento eSk ,i .

3. Ajustamos por el tamao variable de los conjuntos de genes.


Para ello consideramos los valores
eSk ,i
e+ = |{k, i : eSk ,i > 0}|
,
k,i:eS >0
k ,i

y
eSk ,i
e = |{ k, i : eSk ,i < 0}|
.
k,i:eS <0
k ,i

Consideramos los valores



e0 , si e > 0,
0
e0 = ee+
0 , si e0 < 0.
e

y

eSk ,i , si e
Sk ,i > 0,
eSk ,i = eSe+,
k i , si eS , < 0.
e k i

4. Consideremos un valor normalizado (segn mtodo de punto


anterior) e. Se estima la tasa de falsos positivos para ese valor
como: si e > 0

|{k, i : eSk ,i e}|/|{k, i : eSk ,i 0}|


q(e) =
|{k : eSk e}|/|{k : eSk 0}|

Si e < 0 entonces

|{k, i : eSk ,i e}|/|{k, i : eSk ,i 0}|


q(e) =
|{k : eSk e}|/|{k : eSk 0}|
anlisis de conjuntos de genes 353

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].

bdmy.piano.gsea = runGSA(bdmy.t, gsc=bdmy.gsc.piano,geneSetStat="gsea",


signifMethod = "geneSampling")

18.13 Estudiando interacciones entre genes individuales y gru-


pos de genes

Suponemos que tenemos bien definido un grupo de genes S y pre-


tendemos estudiar la posible asociacin entre un gen g no incluido en
S y el grupo S. Se trata de estudiar posibles asociaciones no conoci-
das previamente entre la actividad del gen individual y la actividad
conjunta del grupo S.
En 24 consideran el caso en que las muestras estn clasificadas en 24
Rosemary Braun, Leslie Cope, and
dos grupos. Se propone el siguiente mtodo. Consideramos la matriz Giovanni Parmigiani. Identifying
differential correlation in gene/pathway
de datos [ xij ]iS,j{1,...,n} . Se aplican una componentes principales combinations. BMC Bioinformatics, 9
a esta matriz de datos y nos quedamos con la primera componente (1):488, 2008. ISSN 1471-2105. doi:
10.1186/1471-2105-9-488. URL http:
principal. Por cada muestra tendremos la primera componente del //www.biomedcentral.com/1471-2105/
grupo S y la expresin del gen de inters. Se calcula el coeficiente de 9/488

correlacin de los pares de valores indicados en un grupo y en otro


(trabajamos en el caso en que las muestras las clasificamos en dos
grupos y se el mdulo de la diferencia de los coeficientes de correla-
cin. Obviamente un valor muy grande indica que el coeficiente de
correlacin en cada uno de los grupos considerados es muy diferente
y por tanto el tipo de asociacin entre el gen y el grupo de genes es
distinto.25 Indican que ha implementado el
25

mtodo en el paquete R GPCscore pero


no se encuentra en ningn repositorio.
18.14 Un mtodo simple pero efectivo

Es un mtodo propuesto en 26 . Insiste mucho en este trabajo en 26


R.A. Irizarry, C. Wang, Y. Zhou,
la innecesaria complejidad del mtodo GSEA comentado en seccin and T.P. Speed. Gene set enrichment
analysis made simple. Statistical
18.12. Su inters est en la deteccin de grupos de genes que se Methods in Medical Research, 18(6):565
asocian con el fenotipo (consideran la situacin en que comparamos 575, December 2009. Gene set analysis
dos grupos) donde algunos de los genes estn sobre expresados (up-
regulated) y otros infra expresados (down-regulated).
Como siempre ti es la medida de asociacin marginal gen-fenotipo
(puede ser el t-estadstico pero no necesariamente). Si considera-
mos el grupo de genes S con nS elementos. Asumiendo (lo que no
354 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

es cierto) que los distintos ti son valores observados de variables in-


dependientes y con varianza igual a 1, entonces aproximadamente
(aplicando teorema central del lmite) se tiene que

E (1) = nS tS N (0, 1), (18.11)

siendo tS = iS ti /nS . Aunque no hay mayores justificaciones de


esta distribucin aproximada los autores indican que, sobre los datos,
es asumible.27 Utilizando esta distribucin podemos tener fcilmente 27
Si la cosa funciona: por qu no?
p-valores que no estn basados en la distribucin de permutacin
sino en la distribucin normal estndar.
El estadstico considerado en 18.11 detecta cambios en la media
pero no cambios de escala. Si un grupo de genes tiene la mitad que
estn sobre expresados y la otra mitad infra expresados entonces no
detectaramos cambios en la media pero la variabilidad de los valores
ti s que se modificara claramente. Proponen utilizar el siguiente
estadstico con la siguiente distribucin aproximada (con nS 20
proponen los autores)

iS (ti tS )2 (nS 1)
E (2) = p N (0, 1) (18.12)
2( n S 1)

28 Tendremos un p-valor asociado a cada grupo de genes. Una vez 28


Bajo la hiptesis de que los ti son
tenemos todos los grupos tenemos un problema de comparaciones independientes, con una distribucin
comn con varianza unitaria entonces
mltiples que resolvemos utilizando lo visto en el captulo 9. En el estadstico tiene una distribucin
particular, los autores utilizan los q-valores de Storey. Esencialmente aproximadamente normal estndar. En
el trabajo original dividen por 2(nS 1)
el trabajo se centra mucho en la comparacin con el mtodo GSEA y no la raiz cuadrada. Entiendo que
destacando su simplicidad frente al otro y que los resultados obte- debe ser una errata.
nidos son esencialmente los mismos. Algunos comentarios propios
(discutibles):

1. En mi opinin hay un uso de resultados asintticos que no siem-


pre son asumibles.

2. En cualquier caso, el tamao de los grupos de genes ha de ser


suficientemente grande para que se verifiquen.

3. Es una buena opcin a probar.

Nota 1 (GSE1397). Cargamos paquetes necesarios.

library(multtest)
library(genefilter)

Cargamos el ExpressionSet.
anlisis de conjuntos de genes 355

data(gse1397,package="tamidata")

Y los grupos que hemos construido previamente.

data(gse1397.gsc,package="tamidata")
gsc = gse1397.gsc
gruposGrandes = which(sapply(geneIds(gsc),length) > 50)
gsc = gsc[gruposGrandes]

Hemos de calcular los t-estadsticos.

tstat = rowttests(exprs(gse1397),pData(gse1397)[,"type"])$statistic

y determinar en qu filas de la matriz de expresin tenemos los genes del


primer grupo.

fset = which(is.element(featureNames(gse1397),geneIds(gsc[[1]])))

Y ahora aplicamos la funcin a estos datos.

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)
}

En la matriz allgsc tenemos los resultados.

18.15 Un mtodo basado en poblaciones finitas

Veamos el mtodo propuesto en 29 . Consideremos el conjunto de 29


Michael A. Newton, Fernando A.
genes S con m genes.30 Tenemos ti la medida de asociacin gen- Quintana, Johan A. den Boon, Srikumar
Sengupta, and Paul Ahlquist. Random-
fenotipo para el i-simo gen. Consideremos la media muestral como set methods identify distinct aspects of
estadstico de enriquecimiento dado por the enrichment signal in gene-set analy-
sis. Annals of Appied Statistics, 1(1):85
t 106, 2007. doi: 10.1214/07-AOAS104.
tS = niS . URL http://projecteuclid.org/
i S euclid.aoas/1183143730
30
Estamos denotando el cardinal de S
por nS . Aqu denotamos por m porque
queremos destacar que es un nmero
fijo y dado una vez tenemos el grupo
de genes S.
356 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

En el resto de aproximaciones lo que se considera aleatorio es la


medida de asociacin ti y fijo el conjunto de genes S. En este trabajo
se adopta otro punto de vista. Tenemos G = {1, . . . , N } un universo
de genes y nuestro conjunto de genes S es un subconjunto aleatorio de
G. Por tanto nos planteamos cul es la distribucin de probabilidad
de tS cuando S es un subconjunto aleatorio de tamao nS de G o,
dicho de otro modo, extraemos al azar y sin reemplazamiento nS
genes del total de N que componen nuestro universo. Los autores
llaman a esta distribucion de probabilidad el modelo de conjunto
aleatorio (random-set model). Notemos que se plantea la distribucin
de probabilidad de tS condicionada a los valores ti . Este es el punto
bsico, los ti estn dados y no se consideran aleatorios sino fijos, dados
previamente. Utilizando resultados de muestreo en poblaciones finitas
se tiene que la media de tS es

ti
= E(tS ) = N
, (18.13)
iG

es decir, la media de todos los ti observados sobre todo el universo


de genes. La varianza es
2 
1 Nm t2i
 
ti
2
= var (tS ) =
m N1 N
N
. (18.14)
iG iG

En este procedimiento no recurrimos a ninguna distribucin de alea-


torizacin del estadstico. Estamos utilizando una distribucin asin-
ttica en el sentido en que se asume un tamao de S suficientemente
grande para que (aplicando el teorema central del lmite) podamos
considerar que tS tiene una distribucin aproximadamente normal.
Como estadstico de enriquecimiento utilizan la versin estandariza-
da de tS , es decir, utilizan

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

En 16.7 hemos visto cmo obtener los grupos de genes para


KEGG y Gene Ontology.
anlisis de conjuntos de genes 357

pacman::p_load("EnrichmentBrowser")
data(gse1397,package="tamidata")

Adaptamos los datos para utilizar el paquete.

gse1397=probe.2.gene.eset(gse1397)

Realizamos el anlisis de expresin diferencial marginal.

gse1397 = de.ana(gse1397)

Cargamos los grupos.

load("hsaKEGGgsc.rda")

El mtodo GSEA ( 18.12) lo podemos aplicar del siguiente modo.

gse1397KEGGgsea= sbea(method="gsea", eset=gse1397, gs=hsaKEGGgsc, perm=0, alpha=0.05)

Y ver los grupos significativos con

gs.ranking(gse1397KEGGgsea)

## DataFrame with 7 rows and 2 columns


## GENE.SET P.VALUE
## <character> <numeric>
## 1 hsa04931_Insulin_resistance 0.00767
## 2 _ _ _
hsa03320 PPAR signaling pathway 0.01450
## 3 hsa04146_Peroxisome 0.01450
## 4 hsa04668_TNF_signaling_pathway 0.02460
## 5 hsa04064_NF-kappa_B_signaling_pathway 0.02540
## 6 hsa00600_Sphingolipid_metabolism 0.02670
## 7 hsa04310_Wnt_signaling_pathway 0.04830

Hagamos un anlisis de grupos utilizando Gene Ontology. En


concreto vamos a utilizar la ontologa BP. Cargamos los grupos.

load("hsaGOBPgsc.rda")

Realizamos el anlisis de grupos de genes.

gse1397GOBPgsea= sbea(method="gsea", eset=gse1397, gs=hsaGOBPgsc, perm=0, alpha=0.05)

Vemos los resultados.


358 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

gs.ranking(gse1397GOBPgsea)

## DataFrame with 136 rows and 2 columns


## GENE.SET
## <character>
## 1 GO:0032287_peripheral_nervous_system_myelin_maintenance
## 2 GO:0001819_positive_regulation_of_cytokine_production
## 3 GO:0036499_PERK-mediated_unfolded_protein_response
## 4 GO:0007283_spermatogenesis
## 5 GO:0001541_ovarian_follicle_development
## ... ...
## 132 GO:0048854_brain_morphogenesis
## 133 GO:1901409_positive_regulation_of_phosphorylation_of_RNA_polymerase_II_C-terminal_domain
## 134 GO:0006402_mRNA_catabolic_process
## 135 GO:0051090 regulation of sequence-specific DNA binding_transcription_factor_activity
_ _ _ _ _
## 136 GO:0051895_negative_regulation_of_focal_adhesion_assembly
## P.VALUE
## <numeric>
## 1 0.00202
## 2 0.00244
## 3 0.00349
## 4 0.00350
## 5 0.00545
## ... ...
## 132 0.0479
## 133 0.0486
## 134 0.0487
## 135 0.0495
## 136 0.0495

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.

te. Es un paquete dedicado a anlisis de enriquecimiento de grupos


de genes aunque tambin incorpora funciones para el anlisis de
microarrays.
En lo relativo al anlisis de grupos de genes no propone ningn
mtodo nuevo. Proporciona es una implementacin de muchos de
los procedimientos que hemos visto aqu de modo que, de un modo
simple, podemos evaluar comparativamente los resultados de los
distintos mtodos. Incorpora aleatorizacin por filas32 , aleatorizacin 32
Gene sampling.
por columnas33 y propone hasta 11 medidas de enriquecimiento 33
Sample randomization.
anlisis de conjuntos de genes 359

distintas.

pacman::p_load(piano)

Utilizamos los datos gse1397.

data(gse1397,package = "tamidata")

Para usar este paquete necesitamos un data.frame con una colum-


na en donde se indiquen los estadsticos a nivel de gen34 Adems las 34
El t-estadstico o bien el p-valor de
etiquetas de las filas nos han de permitir identificar al gen. Utilizare- algn test de expresin diferencial.

mos como estadstico a nivel gen el t-estadstico cuando comparamos


euploides con trisoma 21. Y repetiremos el anlisis utilizando en
lugar del t-estadstico el correspondiente p-valor.

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)

Podemos ver los primeros.

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

Ya tenemos el estadstico a nivel gen. Hemos de definir los gru-


pos de genes. Tenemos definidos los grupos utilizando GEABa-
se::GeneSetCollection. No es el formato que requiere piano.35 35
No es precisamente muy eficiente la
opcin de piano.
data(gse1397.gsc,package="tamidata")
gsc = gse1397.gsc

Necesitamos Morgan et al. [2015a, GSEABase] para trabajar con


colecciones de genes.

pacman::p_load("GSEABase")
360 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

GeneSets = reshape2::melt(geneIds(gsc))

Y ahora lo transformamos a su formato.

gse1397.gsc.piano = loadGSC(GeneSets)

En gse1397.t tenemos los estadsticos a nivel de gen y en GeneSets


tenemos los grupos de genes. Es fundamental que los nombres de las
filas de gse1397.t correspondan con los nombres de los genes en
GeneSets.
Ahora hemos enriquecer (agregar) los estadsticos a nivel de gen
para cada uno de los grupos que hemos definido. Qu procedimien-
tos de enriquecimiento tenemos?

Mtodo de Fisher Combina p-valores y es de uso habitual en meta-


anlisis. Lo tenemos descrito en la seccin 34.1.

Mtodo de Stouffer Como el anterior combina p-valores y es utilizado


en meta-anlisis. Su descripcin est en la seccin 34.2.

Reporter features

PGSEA Parametric analysis of gene set enrichment (PAGE) que est


en el paquete Furge and Dykema [2012, PGSEA]. Ver seccin ??.

GSEA El propuesto en la seccin 18.12.

Media muestral

Mediana

Suma

Maxmean Propuesto en el paquete Efron and Tibshirani [2010, GSA]


y que aparece en la ecuacin 18.7.

No todos los mtodos de enriquecimiento son aplicables para to-


dos los estadsticos (o medidas de asociacin gen con la variable
fenotpica).36 Si como medida de asociacin gen-fenotipo utiliza- 36
En Vremo et al. [2013, pg. 4383,
mos un p-valor entonces podemos utilizar como procedimientos figura 1c] tenemos una explicacin
detallada.
de enriquecimiento fisher,stouffer,reporter,tailStrength. Si
utilizamos un t-estadstico (o similar) entonces podemos utilizar
maxmean,gsea,page.
Una vez hemos obtenido el estadstico enriquecido por grupo de
genes o estadstico a nivel grupo hemos de determinar su signifi-
cacin frente a la hiptesis nula de que no hay asociacin entre el
grupo de genes y la variable fenotpica. El paquete considera tres
opciones.
anlisis de conjuntos de genes 361

Distribucin nula terica En ocasiones el estadstico que agrega tiene


una distribucin conocida o asintticamente conocida y podemos
utilizarla.

Aleatorizacin por filas O seleccin aleatoria de un grupo de genes del


mismo tamao del que estamos considerando.

Aleatorizacin por columnas O intercambio aleatorio de los valores de


la variable fenotpica respecto de las columnas.

gse1397.t.gsa.piano = runGSA(gse1397.t, gsc=gse1397.gsc.piano,


gsSizeLim=c(50,Inf))

Podemos ver un resumen con

gse1397.t.gsa.piano

## Final gene/gene-set association: 19034 genes and 868 gene-sets


## Details:
## Calculating gene set statistics from 19034 out of 22283 gene-level statistics
## Using all 22283 gene-level statistics for significance estimation
## Removed 0 genes from GSC due to lack of matching gene statistics
## Removed 0 gene sets containing no genes after gene removal
## Removed additionally 0 gene sets not matching the size limits
## Loaded additional information for 0 gene sets
##
## Gene statistic type: t-like
## Method: mean
## Gene-set statistic name: mean
## Significance: Gene sampling
## Adjustment: fdr
## Gene set size limit: (1,Inf)
## Permutations: 10000
## Total run time: 7.83 min

Y todo lo que nos devuelve la lista gse1397.t.gsa.piano con

names(gse1397.t.gsa.piano)

## [1] "geneStatType" "geneSetStat"


## [3] "signifMethod" "adjMethod"
## [5] "info" "gsSizeLim"
## [7] "gsStatName" "nPerm"
## [9] "gseaParam" "geneLevelStats"
## [11] "directions" "gsc"
## [13] "nGenesTot" "nGenesUp"
362 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## [15] "nGenesDn" "statDistinctDir"


## [17] "statDistinctDirUp" "statDistinctDirDn"
## [19] "statNonDirectional" "statMixedDirUp"
## [21] "statMixedDirDn" "pDistinctDirUp"
## [23] "pDistinctDirDn" "pNonDirectional"
## [25] "pMixedDirUp" "pMixedDirDn"
## [27] "pAdjDistinctDirUp" "pAdjDistinctDirDn"
## [29] "pAdjNonDirectional" "pAdjMixedDirUp"
## [31] "pAdjMixedDirDn" "runtime"

Como vemos tiene informacin sobre los argumentos y las salidas


que se producen. Sin embargo, para tener informacin til por grupo
utilizamos

head(GSAsummaryTable(gse1397.t.gsa.piano),n=1)

## Name Genes (tot) Stat (dist.dir)


## 1 GO:0000075 202 -0.039336
## p (dist.dir.up) p adj (dist.dir.up)
## 1 0.6862 0.97964
## p (dist.dir.dn) p adj (dist.dir.dn)
## 1 0.3138 1
## Stat (non-dir.) p (non-dir.) p adj (non-dir.)
## 1 0.7432 0.9747 0.9999
## Genes (up) Stat (mix.dir.up) p (mix.dir.up)
## 1 96 0.74052 0.9061
## p adj (mix.dir.up) Genes (down)
## 1 0.99915 106
## Stat (mix.dir.dn) p (mix.dir.dn)
## 1 0.74562 0.9312
## p adj (mix.dir.dn)
## 1 1

Toda la tabla la podemos ver con

View(GSAsummaryTable(gse1397.t.gsa.piano))

El inters de este paquete es doble. En primer lugar, implementa


un montn de distintas posibilidades de estadsticos a nivel de gen
y de formas de agregarlos o enriquecerlos. En segundo lugar, im-
plementa un procedimiento para estudiar la direccionalidad en el
anlisis de los grupos de genes que es de inters para el investigador.
Cmo lo interpretan la direccionalidad?

distint-direccional Mantenemos los estadsticos a nivel de gen con su


valor. Tendremos dos contrastes. Si son significativamente mayo-
anlisis de conjuntos de genes 363

res o bien si son significativamente menores. A los p-valores los


denota p (dist.dir.up) y p (dist.dir.dn).

non-directional Tomamos el valor absoluto de los estadsticos. El p-


valor correspondiente lo denota p (non-dir.).

Nos fijamos en el subconjunto de genes (dentro de nuestro grupo)


con los estadsticos positivos (o genes up) y en el grupo con los es-
tadsticos negativos (o genes down). Dado un grupo de estos genes
tomamos el mdulo del valor observado (si son negativos cam-
biaremos su signo). Aplicamos el test solamente a este grupo. Los
p-valores correspondientes los denotaremos con p (mix.dir.up) y
p (mix.dir.dn).

Los valores en la tabla resumen son

GSAsummaryTable(gse1397.t.gsa.piano)[820,]

## Name Genes (tot) Stat (dist.dir)


## 820 GO:0016887 150 -0.15553
## p (dist.dir.up) p adj (dist.dir.up)
## 820 0.9594 1
## p (dist.dir.dn) p adj (dist.dir.dn)
## 820 0.0406 0.45268
## Stat (non-dir.) p (non-dir.) p adj (non-dir.)
## 820 1.0154 7e-04 0.27487
## Genes (up) Stat (mix.dir.up) p (mix.dir.up)
## 820 74 0.87152 0.2678
## p adj (mix.dir.up) Genes (down)
## 820 0.9298 76
## Stat (mix.dir.dn) p (mix.dir.dn)
## 820 1.1556 0
## p adj (mix.dir.dn)
## 820 0

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

p (non-dir.) que ajustado pasa a valer p adj (non-dir.). Del to-


tal de Genes (tot) genes que forman el grupo tenemos Genes (up)
con valor del estadstico (a nivel gen que en este caso es un t-valor)
positivo y Genes (down) negativos. Trabajando con los valores po-
sitivos y contrastando si son significativamente mayores tenemos
un estadstico deStat (mix.dir.up) que corresponde con un p va-
lor dep (mix.dir.up) que ajustado pasa a serp adj (mix.dir.up).
Si trabajamos con los mdulos de los estadsticos (a nivel gen) ne-
gativos entonces el valor agregado (en este caso su media) vale
Stat (mix.dir.dn) que corresponde con un p-valor de 0.9286 y
ajustado p adj (mix.dir.dn).
Si nos fijamos en una tasa de error FDR de 0.05: Cuntos y cules
de los grupos de genes son significativos?

gse1397.s = GSAsummaryTable(gse1397.t.gsa.piano)

En primer lugar con una tendencia general a sobre regulacin.

table(gse1397.s[,"p adj (dist.dir.up)"] < 0.01)

##
## FALSE TRUE
## 830 38

Despus a infra regulacin.

table(gse1397.s[,"p adj (dist.dir.dn)"] < 0.01)

##
## FALSE TRUE
## 863 5

En cada grupo investigaramos los subgrupos de los genes sobre


expresados e infra expresados.37 37
Un trabajo laborioso.
Podemos guardar los resultados en un fichero externo para su
evaluacin posterior.

GSAsummaryTable(gse1397.t.gsa.piano,save = TRUE, file ="gse1397.t.gsa.piano.ods")

En la figura 18.8 mostramos los grupos que son significativos con


una tasa de error 0.01. El tamao del vrtice indica el tamao del
grupo. Las aristas que conectan los vrtices nos indican el nmero
de genes que comparten los grupos asociados a los vrtices. Mayor
grosor indica ms genes compartidos.
anlisis de conjuntos de genes 365

nw = networkPlot(gse1397.t.gsa.piano,class="non",significance = 0.01)

18.18 GSVA

Este mtodo fue propuesto en Hanzelmann et al. [2013] y est


implementado en el paquete with contributions from Robert Castelo
[2015, GSVA].

18.19 ReactomePA

Realiza anlisis de enriquecimiento de rutas utilizando la base de


datos Reactome.

18.20 Otros paquetes y bibliografa complementaria

Un estudio comparativo de distintos mtodos de anlisis de gru-


pos de genes aparece en Liu et al. [2007].
No hemos utilizado en este tema pero son de inters los paquetes
Alexa and Rahnenfuhrer [2010, topGO] y Furge and Dykema [2012,
PGSEA].
La bibliografa sobre este tema es (muy) grande. Como ejemplo,
podemos citar como bibliografa complementaria Sales et al. [2013],
Tripathi et al. [2013], Chen et al. [2013], Zhou et al. [2013], Maciejews-
ki [2013], Witten and Tibshirani [2013], Martini et al. [2013], Wu and
Smyth [2012], Naeem et al. [2012], Xiong et al. [2012], Culhane et al.
[2012], Geistlinger et al. [2011].
366 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Figura 18.8: Grupos significativos y


grado de interseccin entre los mismos.
19
Enriquecimiento de grafos

En 17 y 18 se ha estudiado la expresin diferencial de grupos


de genes en una aproximacin que tiene dos pasos. Un primer pa-
so que realiza un anlisis de expresin diferencial marginal (o gen
a gen). Una vez tenemos este grupo pasamos a un segundo paso en
el que enriquecemos la seal que cada uno de los genes nos propor-
ciona. No se ha utilizado el conocimiento previo que podemos tener
sobre la interaccin de los distintos genes. Por ejemplo, su pertenen-
cia a una determinada ruta de sealizacin. Los genes se han tratado
como un conjunto1 sin considerar relaciones (interacciones) entre 1
En el sentido matemtico de la expre-
ellos que se suelen modelizar utilizando grafos o redes. De esto va sin.

este captulo. De la incorporacin de esta informacin a la hora de


estudiar expresin diferencial quizs no de grupos de genes sino de
rutas de sealizacin o sistemas biolgicos en los que estos genes in-
tervienen. En la literatura a este problema se le denomina de distintas
formas: gene network enrichment analysis, graph-structured test.
Referencias de inters son Liu et al. [2007]

19.1 DEGraph

El procedimiento fue propuesto en Jacob et al. [2012a] y est im-


plementado en el paquete Jacob et al. [2012b, 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

definirla? Veamos distintas posibilidades. Por ejemplo, consideremos


la laplaciana del grafo L Si G es un grafo no dirigido con matriz de
adjacencia A2 y matriz de grados de incidencia D = diag( A1 p )3 . 2
A = [ aij ]i,j=1,...,p donde aij = 1 si
El elemento i-simo de la diagonal de D, Dii = di es el grado de (i, j) E y cero en otro caso.
3
diag( x denota la matriz diagonal con
incidencia del vrtice i. Se define la matriz laplaciana de G como L = el vector x en la diagonal y 1 p es el
D A y su versin normalizada como Lnorm = I D 1/2 AD 1/2 . vector p 1 con el valor 1 en cada
Supongamos que consideramos la funcin de energa definida posicin.

sobre un vector Rd como

EG () = 0 QG , (19.1)

donde QG es L entonces

EG () = (i j )2 (19.2)
i,jV

mientras que si utilizamos la versin normalizada tendremos


 2
j
EG () = i q
di
(19.3)
i,jV dj

De un modo genrico, si consideremos una matriz semidefinida


positiva QG entonces podemos considerar su descomposicin en
valores singulares
QG = UU 0 , (19.4)

siendo U una matriz ortogonal, = diag(1 , . . . , p ) los valores


propios correspondientes a los vectores propios que forman las co-
lumnas de U.
Pretendemos reducir la dimensin del vector a un espacio de di-
mensin k mucho menor que p de forma que se tengan las funciones
de menor energa. De un modo preciso, pretendemos encontrar los
vectores ui R p con i k tales que

ui = argminvR p EG (v), (19.5)

y cada ui es ortogonal a todos los anteriores u j con j < i. Estos vec-


tores corresponden a los vectores propios asociados a los k valores
propios ms pequeos.4 4
Vemos que estamos utilizando los
Se consideran grafos dirigidos G = (V, E) donde el conjunto de mismos resultados que en componentes
principales 14.
aristas E es un par ordenado de vrtices. La matriz de adyacencia A
puede no ser simtrica y aij 6= 0 si y solamente si (i, j) E o, de otro
modo, una arista va del vrtice vi al vrtice v j . Se utiliza la funcin de
energa
p  2
1
EG () = i aij j , (19.6)
i:d 6=0
di ( j,i)E
i
enriquecimiento de grafos 369

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.

MG = U 0 U. En lo que sigue si x R p entonces se denota x = U 0 x.


El procedimiento propuesto consiste en lo siguiente: en lugar de
trabajar con los datos originales x se trabaja con las primeras k co-
lumnas de la matriz U correspondientes a los k vectores propios
cuyos valores propios son los k menores. Y se aplica sobre estos da-
tos reducidos un test de la T 2 de Hotelling.6 Varios comentarios son 6
https://en.wikipedia.org/wiki/
Hotellings_T-squared_distribution.
importantes. Obviamente no podemos aplicar el test de la T 2 de Ho-
telling por un problema de dimensin. Los autores muestran adems
la ganancia de potencia en el test de comparacin aplicando esta re-
duccin de dimensin. Cmo queda el procedimiento? Denotamos:

1. xi con i = 1, 2 los vectores de medias en ambas condiciones.

2. S la matriz de covarianzas estimada conjuntamente7 7


Pooled estimator.

Si aplicramos el test de T 2 de Hotelling entonces el estadstico del


contraste sera
n1 n2
T2 = ( x x2 )0 S1 ( x1 x2 ). (19.8)
n1 + n2 1
Si en lugar de trabajar en la base original transformamos a una base
ortonormal formada por las columnas de U entonces el estadstico
no cambiara. Si denotamos el estadstico en la nueva base T 2 se tiene
que
n1 n2
T 2 = T 2 = ( x x2 )0 U (U 0 SU )1 U 0 ( x1 x2 ). (19.9)
n1 + n2 1
Realmente no se trabaja con la nueva base completa sino con k com-
ponentes (k p). Denotamos por U[k] la matriz formada por las pri-
meras k componentes de U (correspondientes a los k menores valores
propios) y por I[k] una matriz con todo ceros salvo los k primeros
elementos de la diagonal principal iguales a uno. Considerando la
proyeccin sobre el espacio generado por las primeras k componentes
el estadstico de Hotelling en el nuevo espacio sera

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.

que hemos construido. Por tanto, la posicin en la lista tiene gran


importancia.
Cmo de estable es la ordenacin que hemos obtenido? Cuando
se habla de estable hay que definir frente a qu se pretende estabili-
dad. Una primera fuente de variabilidad a la hora de obtener la lista
es utilizar distintos estadsticos (y por lo tanto distintos p-valores)
cuando contrastamos la expresin diferencial marginal. Por tanto,
estabilidad frente al procedimiento estadstico utilizado. Dentro de
este apartado se puede incluir el hecho que los datos hay que pre-
procesarlos (correcciones de fondo, normalizacin y resumen en
microarrays por ejemplo) y no hay, por supuesto, un nico mtodo.
Una segunda fuente de variabilidad son modificaciones en los
datos que manejamos, pequeas modificaciones de los mismos no
debieran afectar (demasiado) a la lista obtenida.
374 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

En consecuencia, la lista ordenada es variable y hemos de cuantifi-


car la estabilidad de la ordenacin. Esto se trata en 20.1. Un segun-
do aspecto es cmo agregar distintas listas con objeto de obtener una
lista agregada ms estable, ms fiable. Lo vemos en 20.2.

20.1 Estabilidad de la lista ordenada

Tenemos la matriz de expresin x = [ xij ]i=1,...,N;j=1,...,n y el vector


que describe las muestras y = (y1 , . . . , yn )0 . Una lista ordenada es una
permutacin de (1, . . . , N ) que podemos denotar (i ). El gen i ocupa
la posicin (i ) en la lista ordenada. Podemos tambin denotar por
(r1 , . . . , r N ) la lista ordenada de modo que

r j = i (i ) = j.

Por ejemplo, si (1898) = 1 significa que el gen cuyo perfil de ex-


presin est en la fila 1989 est en la primera posicin de la lista
ordenada. Tendremos tambin que r1 = 1989. No vamos a considerar
ordenaciones con empates. Normalmente se suele mostrar la lista de
los k primeros genes en la lista4 donde k suele ser 20 o 50. 4
Top-k list.

20.1.1 Diferentes criterios de ordenacin


Si nos centramos en el caso de dos grupos tenemos muchsimos
procedimientos que nos permiten cuantificar la asociacin entre la
expresin del gen y el fenotipo.
Cargamos el paquete Slawski and Boulesteix. [2015, GeneSelector].

library(GeneSelector)

Utilizamos los datos tamidata::gse1397.

library(tamidata)
data(gse1397)
x = exprs(gse1397)
y = pData(gse1397)[,"type"]

Obtengamos distintos estadsticos. Empezamos con el fold-change

fc = RankingFC(x,y)

Calculamos los t-estadsticos.


listas de caractersticas ordenadas 375

tstat = RankingTstat(x,y)

Los t-estadsticos moderados utilizando el modelo limma Smyth


[2004]

limma = RankingLimma(x,y,proportion=0.01)

Los t-estadsticos de Fox-Dimmic Fox and Dimmic [2006].

foxdimmic = RankingFoxDimmic(x,y,m=100)

El t-estadstico de contraccin5 con 5


Shrinkage t-statistic.

shrinkt = RankingShrinkageT(x,y)

Nos fijamos para comentar en detalle en una de estas ordenacio-


nes. Veamos qu nos han devuelto.

class(tstat)

## [1] "GeneRanking"
## attr(,"package")
## [1] "GeneSelector"

Que tiene los siguientes slots.

getSlots("GeneRanking")

## x y statistic ranking
## "matrix" "factor" "numeric" "numeric"
## pval type method
## "vector" "character" "character"

Por ejemplo, en tstat@x tenemos la matriz de expresin y tstat@y


nos proporciona la variable fenotpica que en este caso simplemente
nos da el grupo al que pertenece la muestra (en cdigo numrico.

tstat@y

## [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2
## Levels: 1 2

La lista la tenemos en tstat@ranking. Veamos los primeros.

head(tstat@ranking)

## 1007_s_at 1053_at 117_at 121_at 1255_g_at


## 12194 12433 2870 8757 15880
## 1294_at
## 234
376 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Nos indica la posicin en la matriz de expresin y tambin tiene


como etiqueta el identificador Affy (AffyID). Tambin podemos ver
los t-estadsticos y los correspondientes p-valores

head(tstat@statistic)

## 1007_s_at 1053_at 117_at 121_at


## -0.6183648 0.6022344 1.5635785 -0.8738516
## 1255_g_at 1294_at
## 0.3815208 2.9096918

head(tstat@pval)

## 1007_s_at 1053_at 117_at 121_at


## 0.54789263 0.55822637 0.14389203 0.39934953
## 1255_g_at 1294_at
## 0.70948639 0.01308856

y recuperar la informacin sobre el test que hemos utilizado que


en este caso es un t-test para muestras independientes.

tstat@type

## [1] "unpaired"

tstat@method

## [1] "ordinaryT"

La funcin GeneSelector::toplist nos proporciona un resumen til


con la lista en la primera columna, el estadstico en la segunda y el
p-valor en la tercera. Podemos ver las 10 primeras posiciones con

toplist(tstat,top=10)

## index statistic pval


## 1 346 -10.517552 2.070655e-07
## 2 1170 -10.344123 2.481752e-07
## 3 1853 -8.762265 1.463473e-06
## 4 6303 7.648232 5.939862e-06
## 5 7889 -7.190209 1.101446e-05
## 6 10450 6.365838 3.579137e-05
## 7 10132 -6.020134 6.027785e-05
## 8 17751 -6.013987 6.084819e-05
## 9 16324 -5.798600 8.491862e-05
## 10 12401 5.637777 1.093774e-04
listas de caractersticas ordenadas 377

Hasta ahora hemos descrito los resultados utilizando el t-test.


Hemos utilizado otros tres. Mostremos de un modo conjunto los
resultados.

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

## fc tstat limma foxdimmic shrinkt


## [1,] 9149 346 346 6303 346
## [2,] 11148 1170 1170 6468 1170
## [3,] 4375 1853 1853 328 1853
## [4,] 8951 6303 6303 651 6303
## [5,] 888 7889 7889 8566 10132
## [6,] 3946 10450 10132 9149 17751
## [7,] 11145 10132 17751 11148 16324
## [8,] 11150 17751 16324 9620 14969
## [9,] 11573 16324 14969 5817 650
## [10,] 11659 12401 9555 966 2277

Tenemos genes que aparecen en las cinco listas consideradas?


Podemos observar que no hay ninguno. La funcin GeneSelec-
tor::GeneSelector nos hace el trabajo de comprobar si hay genes
presentes en la parte superior segn todos los criterios.

lista = list(fc,tstat,limma,foxdimmic,shrinkt)
genesel = GeneSelector(lista,maxrank=10)
show(genesel)

## GeneSelector run with gene rankings from the following statistics:


## Foldchange
## ordinaryT
## Limma
## FoxDimmicT
## ShrinkageT
## Number of genes below threshold rank 10 in all statistics:0
378 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Sin embargo, excluyendo el primer criterio (que no es precisamen-


te el mejor) obtenemos un resultado distinto.

listareducida = list(tstat,limma,foxdimmic,shrinkt)
genesel = GeneSelector(listareducida,maxrank=10)
show(genesel)

## GeneSelector run with gene rankings from the following statistics:


## ordinaryT
## Limma
## FoxDimmicT
## ShrinkageT
## Number of genes below threshold rank 10 in all statistics:1

Podemos ver qu gen es.

which(slot(genesel,"selected") == 1)

## [1] 6303

Repitiendo para los 50 primeros de la lista reducida.

genesel = GeneSelector(listareducida,maxrank=50)
show(genesel)

## GeneSelector run with gene rankings from the following statistics:


## ordinaryT
## Limma
## FoxDimmicT
## ShrinkageT
## Number of genes below threshold rank 50 in all statistics:2

Y son los siguientes.

which(slot(genesel,"selected") == 1)

## [1] 651 6303

Y una tentacin a evitar. Cuando un investigador ha invertido


tiempo y dinero (y necesita publicar desesperadamente) necesita
obtener resultados significativos. Posiblemente tena la hiptesis de
que algn o algunos genes debieran de estar en la parte superior de
la lista. La cosa es fcil. Por qu no elegir estadsticos que lo hagan
entre los disponibles o incluso proponiendo uno nuevo? En definitiva
elegir los criterios utilizando informacin previa (a veces, sin mala
intencin). Obviamente esto sesga los resultados o simplemente los
invalida.6 6
Y el comentario es vlido para mu-
chos otros procedimientos estadsticos.
Siempre hay un evidente sesgo hacia
la publicacin de los resultados sig-
nificativos ignorando los que no lo
son.
listas de caractersticas ordenadas 379

20.1.2 Estabilidad frente a cambios en los datos


Qu ocurre con nuestra lista si quitamos alguna muestra?7 O si 7
De las pocas que habitualmente
cambian un poco los valores? En definitiva, esperamos que pequeas tendremos.

modificaciones en los datos no alteren en demasa nuestra ordenacin


de las caractersticas.
Veamos diferentes opciones para modificar los datos que lleva
implementados Slawski and Boulesteix. [2015, GeneSelector].
La primera opcin puede ser elegir un nmero de muestras k
(< n el nmero total de muestras) y quitarlas de nuestros datos. El
nmero total de posibilidades ser el nmero combinatorio (nk).8 Este 8
Que nos da el nmero de subconjun-
procedimiento es conocido como Jackknife . Un caso particular sera tos distintos de tamao k que podemos
formar con un total de n elementos.
cuando k = 1 y vamos dejando una muestra fuera cada vez. Sera el
procedimiento leaving-one-out . Cuando aplicamos este procedimiento
podemos considerar las (nk) o bien una muestra elegida al azar si son
muchas.
Una segunda opcin es utilizar un mtodo bootstrap. En este caso
lo que hacemos es elegir de las n muestras disponibles un total de n
muestras con reeemplazamiento. Obviamente alguna de las muestras
se puede repetir.9 9
El mtodo bootstrap consiste en
Una tercera opcin puede ser aadir ruido aleatorio a los propios muestrear sobre los propios datos.
O dicho de un modo ms tcnico
datos de expresin. En microarrays podemos aadir ruido normal muestrear de la distribucin emprica
con media nula y un valor pequeo de la varianza que tiene que de las muestras.
tener en cuenta el orden de los datos.10 10
Lo que se conoce como ruido blanco.
Una cuarta opcin es modificar la covariable y. Supongamos que
tenemos un factor experimental (un nmero finito de grupos) y lo
que hacemos es cambiar la etiqueta que identifica el grupo sobre una
pequea cantidad de muestras. En resumen cambiamos el grupo de
un pequeo grupo de muestras.
Fijamos la semilla del generador para obtener los mismos resulta-
dos.

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 = GenerateFoldMatrix(y = as.numeric(y), replicates = 50,


k = 1,minclassize=6)
show(leave1out)

## number of removed samples per replicate: 1


## number of replicates: 14
## constraints: minimum classize for each class: 6
380 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Y la salida la podemos pasar a la funcin GeneSelector::RepeatRanking.

leave1out.tstat = RepeatRanking(tstat,leave1out,scheme="subsampling")

Un dibujo de inters es comparar para cada gen su posicin origi-




nal y las que tiene con los nuevos datos perturbados o modificados.













Es la figura ??.



400










Ranks in perturbed datasets


















300






plot(leave1out.tstat)



































200


























Tambin podemos modificar los datos de modo que vamos cam-

































100
















biando la etiqueta de una muestra cada vez.12






























































































change1.tstat = RepeatRanking(tstat,leave1out,scheme="labelexchange") 0 50 100 150 200

Rank in the original dataset

Tambin generamos muestras bootstrap imponiendo la misma Lo que significa que asignamos esa
12

restriccin sobre el tamao de cada clase. muestra al otro grupo.

boot = GenerateBootMatrix(y = as.numeric(y), replicates = 50,


maxties = 3,minclassize=6)
boot.tstat = RepeatRanking(tstat,boot)

Podemos aadir ruido a las intensidades observadas.

noise.tstat = RepeatRanking(tstat, varlist=list(genewise=TRUE, factor=1/10))

Fijmonos ahora a los resultados obtenidos con las muestras gene-


radas mediante bootstrap.13 13
Resultados no mostrados.

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

pch=".", cex=2.5, main = "intercambio etiqueta")


plot(boot.tstat, col="blue",
pch=".", cex=2.5, main = "bootstrap")
plot(noise.tstat, frac=1/10,
col="blue", pch=".", cex=2.5, main = "ruido")

jackknife intercambio etiqueta


Ranks in perturbed datasets

Ranks in perturbed datasets


400

400
200

200
0

0
0 50 150 0 50 150

Rank in the original dataset Rank in the original dataset

bootstrap ruido
Ranks in perturbed datasets

Ranks in perturbed datasets


400

2000
200
0

0 50 150 0 500 1500

Rank in the original dataset Rank in the original dataset

Figura 20.1: Orden original frente a los


obtenidos modificando los datos.

20.2 Agregacin de listas

Hemos obtenido cinco listas distintas correspondientes a distin-


tos estadsticos. Vamos a plantearnos la obtencin de una sola lista
que las agregue. Lo primero14 es construir un heatmap. Los datos a 14
Porque es bonito aunque tengo mis
clasificar son las distintas ordenaciones. Se realiza una doble clasifica- serias dudas de que sirva para mucho.

cin jerrquica con la distancias eucldea15 y el enlace completo como 15


Notemos que son rdenes y no est
disimilaridad entre grupos.16 demasiada justificada esta eleccin.
16
15.
382 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

En la figura 20.2 tenemos el dibujo. Se aprecia cmo el criterio


del fold change produce una lista claramente distinta a las dems.
Tambin es claro que el t-estadstico y el t-estadstico modera de
Limma producen ordenaciones similares. En cuanto a los genes se
necesita un estudio mucho ms profundo para concluir algo.17 El dibujo es bonito y por eso lo he
17

puesto.
merged = MergeMethods(lista)

HeatmapRankings(merged) merged = MergeMethods(lista)


HeatmapRankings(merged)

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.

AggMean = AggregateSimple(merged, measure = "mean")


Parte VII

Secuencias
21
Secuencias

En este captulo nos planteamos cmo trabajar con secuencias en


Bioconductor. Si queremos trabajar con genomas o bien con datos de
cubrimiento de genoma (RNASeq) necesitamos funciones que nos
permitan manejar este tipo de datos.1 Este captulo fundamental- 1
La vieta del paquete y el material
mente se ocupa de cuestiones de programacin en R/Bioconductor. del curso https://eib.stat.ub.edu/
Materiales-Curso-RNASeq son muy
Son los paquetes bsicos. Cuando trabajamos con datos de expresin recomendables a lo largo de este tema y
obtenidos con microarrays o con protenas no es tan complejo el pro- los siguientes.
blema desde el punto de vista de la programacin. Con secuencias la
cosa no es tan simple. Tenemos un genoma de referencia. Hemos de
alinear sobre el genoma. Hemos de tener anotacin para poder con-
tar lecturas alineadas sobre un exn o sobre un gen o sobre alguna
regin.

21.1 Biostrings

En esta seccin jugamos con el paquete Pages et al. [2016a, Bios-


trings].

library(Biostrings)

En DNA_ALPHABET tenemos la notacin de los cidos nucleicos


formalizada por la IUPAC en 1970.2 2
urlhttps://en.wikipedia.org/wiki/Nucleic_acid_notation

DNA_ALPHABET

## [1] "A" "C" "G" "T" "M" "R" "W" "S" "Y" "K" "V"
## [12] "H" "D" "B" "N" "-" "+" "."

En particular las cuatro bases que componen el DNA las tendre-


mos con
386 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

DNA_ALPHABET[1:4]

## [1] "A" "C" "G" "T"

Podemos generar una secuencia aleatoria de una longitud dada


con base::sample

(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"

Podemos generar un string con

paste(sec,collapse="")

## [1] "ATTTGCACACGTGCT"

Podemos pues generar trozos aleatorios de genoma de este modo.

Clase XString La clase XString es la que permite crear, almacenar y


trabajar con distintos tipos de cadenas de caracteres. Algunas subcla-
ses son BString, DNAString, RNAString y AAString.
Creamos un objeto BString.

bs = BString("De valor siempre hizo alarde la casa de los Echage")

Qu tenemos?

bs

## 52-letter "BString" instance


## seq: De valor siempre hizo... casa de los Echage

Tenemos la longitud con

length(bs)

## [1] 52

Generamos una secuencia de nucletidos incluyendo - que indi-


ca un hueco.

(ds = paste(sample(DNA_ALPHABET[c(1:4,16)],30,replace=TRUE),collapse=""))

## [1] "CAGCCT-CGGACCC-GCGGCCCTAA-GCGC"
secuencias 387

(ds = DNAString(ds))

## 30-letter "DNAString" instance


## seq: CAGCCT-CGGACCC-GCGGCCCTAA-GCGC

Supongamos que, por error, hemos incluido un nucletido que no


corresponde. En este caso podemos comprobar que nos devuelve un
error. En particular, podemos saber la frecuencia de cada base.

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

Vemos que nos muestra todo el alfabeto. Si solamente queremos


mostrar las frecuencias absolutas correspondientes a las bases.

alphabetFrequency(ds,baseOnly=TRUE)

## A C G T other
## 4 13 8 2 3

Y las frecuencias relativas con

alphabetFrequency(ds,baseOnly=TRUE,as.prob=TRUE)

## A C G T
## 0.13333333 0.43333333 0.26666667 0.06666667
## other
## 0.10000000

La secuencia con las bases complementarias la tenemos con

Biostrings::complement(ds)

## 30-letter "DNAString" instance


## seq: GTCGGA-GCCTGGG-CGCCGGGATT-CGCG

La secuencia en orden inverso con

reverse(ds)

## 30-letter "DNAString" instance


## seq: CGCG-AATCCCGGCG-CCCAGGC-TCCGAC

Qu es la siguiente secuencia?
388 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

reverseComplement(ds)

## 30-letter "DNAString" instance


## seq: GCGC-TTAGGGCCGC-GGGTCCG-AGGCTG

Tenemos seleccin de caracteres con

ds[3]

## 1-letter "DNAString" instance


## seq: G

ds[3:8]

## 6-letter "DNAString" instance


## seq: GCCT-C

Para cadenas muy largas es preferible utilizar Biostrings::subseq.


Lo visto en el chunck previo sera

subseq(ds,3,3)

## 1-letter "DNAString" instance


## seq: G

subseq(ds,3,8)

## 6-letter "DNAString" instance


## seq: GCCT-C

XStringViews Seguimos con la secuencia ds. Supongamos que que-


remos ver las partes que estn entre la posicin 3 y 8, entre la 6 y la
15 y finalmente entre la posicin 10 y la 20. Podemos hacerlo con

(ds.v = Views(ds,start=c(3,6,10),end=c(8,15,20)))

## Views on a 30-letter DNAString subject


## subject: CAGCCT-CGGACCC-GCGGCCCTAA-GCGC
## views:
## start end width
## [1] 3 8 6 [GCCT-C]
## [2] 6 15 10 [T-CGGACCC-]
## [3] 10 20 11 [GACCC-GCGGC]

Tendremos
secuencias 389

ds.v[1]

## Views on a 30-letter DNAString subject


## subject: CAGCCT-CGGACCC-GCGGCCCTAA-GCGC
## views:
## start end width
## [1] 3 8 6 [GCCT-C]

Y la secuencia con

ds.v[[1]]

## 6-letter "DNAString" instance


## seq: GCCT-C

Clase XStringSet Es una clase para almacenar varios objetos XString.


En el siguiente cdigo tambin generamos una longitud aleatoria de
la secuencia con distribucin uniforme en 10 y 15.

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=""))

Tenemos un vector con las secuencias generadas.

ds.set

## [1] "AGCCC--TG--CT" "GTATT-AC-T-TA"


## [3] "AT-AAA-CTATA-G" "GG-TG-G--TA-G--"
## [5] "GG-TT-TA-AG"

Lo convertimos en un conjunto de DNAStrings.

(ds.set = DNAStringSet(ds.set))

## A DNAStringSet instance of length 5


## width seq
## [1] 13 AGCCC--TG--CT
## [2] 13 GTATT-AC-T-TA
## [3] 14 AT-AAA-CTATA-G
## [4] 15 GG-TG-G--TA-G--
## [5] 11 GG-TT-TA-AG

Todas las funciones que podamos aplicar a un XString pueden


aplicarse a un XStringSet de modo que nos devuelve el valor en
cada uno de los elementos del conjunto. Por ejemplo,
390 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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

Ejemplo 29 (Biostrings::yeastSEQCHR1). En el paquete tenemos los


datos Biostrings::yeastSEQCHR1. Es una nica cadena de caracteres con-
teniendo la secuencia del DNA del cromosoma 1 de la levadura. Leemos los
datos.

data(yeastSEQCHR1)

Cuntas bases lo componen?

nchar(yeastSEQCHR1)

## [1] 230208

Su longitud es uno ya que es una nica cadena. Lo transformamos en una


XString.

yeastSEQCHR1 = DNAString(yeastSEQCHR1)

que tiene longitud

length(yeastSEQCHR1)

## [1] 230208

Podemos ver el alfabeto utilizado.

alphabet(yeastSEQCHR1)

## [1] "A" "C" "G" "T" "M" "R" "W" "S" "Y" "K" "V"
## [12] "H" "D" "B" "N" "-" "+" "."

Podemos ver las frecuencias relativas de las bases.


secuencias 391

alphabetFrequency(yeastSEQCHR1,baseOnly=TRUE,as.prob=TRUE)

## A C G T other
## 0.3033344 0.1939246 0.1987985 0.3039425 0.0000000

Finalmente indicar que Pages et al. [2016a, Biostrings] implementa


los siguientes alfabetos.

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

El paquete Pages [2015, BSgenome] sirve para el manejo de ge-


nomas cuya representacin utiliza Pages et al. [2016a, Biostrings].
Podemos verlos con

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"

Por ejemplo podemos cargar el correspondiente a la mosca de la


fruta.

library(BSgenome.Dmelanogaster.UCSC.dm3)
head(seqnames(Dmelanogaster))

## [1] "chr2L" "chr2R" "chr3L" "chr3R" "chr4"


## [6] "chrX"

alphabetFrequency(Dmelanogaster[["chr4"]],baseOnly=TRUE)

## A C G T other
## 430227 238155 242039 441336 100
secuencias 393

21.3 IRanges

Cuando trabajamos con secuencias es bsico el trabajar con in-


tervalos que nos indiquen dnde empezamos y acabamos dentro
de la secuencia. Con Pages et al. [2016b, IRanges] trabajaremos con
intervalos de nmeros enteros y podemos modificarlos.

library(IRanges)

Construimos el objeto de clase IRanges.

(ir0 = IRanges(5,10))

## IRanges of length 1
## start end width
## [1] 5 10 6

str(ir0)

## Formal class 'IRanges' [package "IRanges"] with 6 slots


## ..@ start : int 5
## ..@ width : int 6
## ..@ NAMES : NULL
## ..@ elementType : chr "integer"
## ..@ elementMetadata: NULL
## ..@ metadata : list()

Podemos acceder al extremo inferior con

start(ir0)

## [1] 5

y al extremo superior con

end(ir0)

## [1] 10

mientras que la longitud (o anchura) del intervalo sera

width(ir0)

## [1] 6

En relacin con el inicio queremos empezar en la segunda posi-


cin.
394 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

narrow(ir0, start=2)

## IRanges of length 1
## start end width
## [1] 6 10 5

O bien relativo al inicio queremos acabar cinco posiciones desde el


inicio.

narrow(ir0, end=5)

## IRanges of length 1
## start end width
## [1] 5 9 5

flank(ir0, width=3, start=TRUE, both=FALSE)

## 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)])

Cmo podemos obtener partes de los vectores x e y que acaba-


mos de construir? El subvector con los elementos de 4000 a 5400 sera

x0 = window(x,start = 4234, end = 5400)

De un modo similar podemos considerar

head(x)

## [1] 0 0 0 0 0 0

tail(x)

## [1] 0 0 0 0 0 0

summary(x)

## Min. 1st Qu. Median Mean 3rd Qu. Max.


## 0.000 0.000 0.000 0.909 0.000 26.000

21.4 Rle

Con la clase Rle (Run-length encodings) se trata de ahorrar me-


moria al almacenar. En lugar de guardar cada valor lo que hacemos
es guardar una vez el valor y el nmero de veces consecutivas que se
repite.

(r = Rle(c(1,1,1,0,0,-2,-2,-2,rep(-1,20))))

## numeric-Rle of length 28 with 4 runs


## Lengths: 3 2 3 20
## Values : 1 0 -2 -1

str(r)

## Formal class 'Rle' [package "S4Vectors"] with 4 slots


## ..@ values : num [1:4] 1 0 -2 -1
## ..@ lengths : int [1:4] 3 2 3 20
## ..@ elementMetadata: NULL
## ..@ metadata : list()
396 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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

Podemos ver partes de r con

Views(r, start=c(4,2), end=c(7,6))

## Views on a 28-length Rle subject


##
## views:
## start end width
## [1] 4 7 4 [ 0 0 -2 -2]
## [2] 2 6 5 [ 1 1 0 0 -2]

21.5 GenomicRanges

Es el paquete bsico para representar localizaciones en el genoma.


Est construido sobre Pages et al. [2016b, IRanges] y a su vez sirve de
soporte a Pages [2015, BSgenome], Morgan et al. [2015c, Rsamtools],
Morgan et al. [2015b, ShortRead], Lawrence et al. [2016, rtracklayer]
y Carlson et al. [2016, GenomicFeatures]. En este paquete se intro-
ducen tres clases bsicas: GRanges, GRangesList y GAlignments. Con
GRanges las caractersticas en un solo intervalo. Con GRangesList lo
mismo pero con varios intervalos y finalmente con GAlignments se
representan alineamientos sobre el genoma.

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

## GRanges object with 10 ranges and 2 metadata columns:


## seqnames ranges strand | score
## <Rle> <IRanges> <Rle> | <integer>
## a chr1 [ 1, 7] - | 1
## b chr2 [ 2, 8] + | 2
## c chr2 [ 3, 9] + | 3
## d chr2 [ 4, 10] * | 4
## e chr1 [ 5, 11] * | 5
## f chr1 [ 6, 12] + | 6
## g chr3 [ 7, 13] + | 7
## h chr3 [ 8, 14] + | 8
## i chr3 [ 9, 15] - | 9
## j chr3 [10, 16] - | 10
## GC
## <numeric>
## a 1
## b 0.888888888888889
## c 0.777777777777778
## d 0.666666666666667
## e 0.555555555555556
## f 0.444444444444444
## g 0.333333333333333
## h 0.222222222222222
## i 0.111111111111111
## j 0
## -------
## seqinfo: 3 sequences from an unspecified genome; no seqlengths

Podemos extraer las secuencias con

seqnames(gr)

## factor-Rle of length 10 with 4 runs


## Lengths: 1 3 2 4
## Values : chr1 chr2 chr1 chr3
## Levels(3): chr1 chr2 chr3

los rangos con

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)

## factor-Rle of length 10 with 5 runs


## Lengths: 1 2 2 3 2
## Values : - + * + -
## Levels(3): + - *

Los metadatos (como un DataFrame) podemos extraerlo con

mcols(gr)

## DataFrame with 10 rows and 2 columns


## score GC
## <integer> <numeric>
## 1 1 1.0000000
## 2 2 0.8888889
## 3 3 0.7777778
## 4 4 0.6666667
## 5 5 0.5555556
## 6 6 0.4444444
## 7 7 0.3333333
## 8 8 0.2222222
## 9 9 0.1111111
## 10 10 0.0000000

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)

Tambin tenemos mtodos para ver los nombres de los rangos y su


longitud.

names(gr)

## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

length(gr)

## [1] 10

Particionando y uniendo objetos GRanges Podemos particionar un


objeto GRanges en distintos grupos con el mtodo split.

sp = split(gr, rep(1:2, each=5))


sp

## GRangesList object of length 2:


## $1
## GRanges object with 5 ranges and 2 metadata columns:
## seqnames ranges strand | score
## <Rle> <IRanges> <Rle> | <integer>
## a chr1 [1, 7] - | 1
## b chr2 [2, 8] + | 2
## c chr2 [3, 9] + | 3
## d chr2 [4, 10] * | 4
## e chr1 [5, 11] * | 5
## GC
## <numeric>
## a 1
## b 0.888888888888889
## c 0.777777777777778
## d 0.666666666666667
## e 0.555555555555556
##
## $2
## GRanges object with 5 ranges and 2 metadata columns:
## seqnames ranges strand | score
## f chr1 [ 6, 12] + | 6
## g chr3 [ 7, 13] + | 7
## h chr3 [ 8, 14] + | 8
## i chr3 [ 9, 15] - | 9
400 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## j chr3 [10, 16] - | 10


## GC
## f 0.444444444444444
## g 0.333333333333333
## h 0.222222222222222
## i 0.111111111111111
## j 0
##
## -------
## seqinfo: 3 sequences from an unspecified genome

Como vemos nos ha producido un objeto GRangesList. Un GRangesList


puede ser el agrupamiento de los exones de un gen GRanges con

c(sp[[1]],sp[[2]])

## GRanges object with 10 ranges and 2 metadata columns:


## seqnames ranges strand | score
## <Rle> <IRanges> <Rle> | <integer>
## a chr1 [ 1, 7] - | 1
## b chr2 [ 2, 8] + | 2
## c chr2 [ 3, 9] + | 3
## d chr2 [ 4, 10] * | 4
## e chr1 [ 5, 11] * | 5
## f chr1 [ 6, 12] + | 6
## g chr3 [ 7, 13] + | 7
## h chr3 [ 8, 14] + | 8
## i chr3 [ 9, 15] - | 9
## j chr3 [10, 16] - | 10
## GC
## <numeric>
## a 1
## b 0.888888888888889
## c 0.777777777777778
## d 0.666666666666667
## e 0.555555555555556
## f 0.444444444444444
## g 0.333333333333333
## h 0.222222222222222
## i 0.111111111111111
## j 0
## -------
## seqinfo: 3 sequences from an unspecified genome

o bien con
secuencias 401

append(sp[[1]],sp[[2]])

Seleccionando en un objeto GRanges Podemos seleccionar alguna de


las secuencias.

gr[c(3,5)]

## GRanges object with 2 ranges and 2 metadata columns:


## seqnames ranges strand | score
## <Rle> <IRanges> <Rle> | <integer>
## c chr2 [3, 9] + | 3
## e chr1 [5, 11] * | 5
## GC
## <numeric>
## c 0.777777777777778
## e 0.555555555555556
## -------
## seqinfo: 3 sequences from an unspecified genome

Lo mismo lo podemos hacer con

gr[is.element(names(gr),c("c","e"))]

## GRanges object with 2 ranges and 2 metadata columns:


## seqnames ranges strand | score
## <Rle> <IRanges> <Rle> | <integer>
## c chr2 [3, 9] + | 3
## e chr1 [5, 11] * | 5
## GC
## <numeric>
## c 0.777777777777778
## e 0.555555555555556
## -------
## seqinfo: 3 sequences from an unspecified genome

Tambin podemos decidir extraer simultneamente algunas se-


cuencias y algunas de las variables de los metadatos.

gr[7,"GC"]

## GRanges object with 1 range and 1 metadata column:


## seqnames ranges strand | GC
## <Rle> <IRanges> <Rle> | <numeric>
## g chr3 [7, 13] + | 0.333333333333333
## -------
## seqinfo: 3 sequences from an unspecified genome
402 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Operaciones de intervalo para objetos GRanges Son las mismas que


veamos para objetos IRanges. Por ejemplo,

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)

## GRanges object with 3 ranges and 0 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr1 [ 1, 7] -
## [2] chr2 [ 2, 9] +
## [3] chr3 [10, 16] -
## -------
## seqinfo: 3 sequences from an unspecified genome

Tambin podemos usar flank, shift, resize.


Mediante reduce alineamos rangos y se unen rangos que se sola-
pan.

reduce(gr0)

## GRanges object with 3 ranges and 0 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr1 [ 1, 7] -
## [2] chr2 [ 2, 9] +
## [3] chr3 [10, 16] -
## -------
## seqinfo: 3 sequences from an unspecified genome

Podemos tener informacin sobre las regiones entre (una versin


reducida) de nuestros rangos.
secuencias 403

gaps(gr0)

## GRanges object with 11 ranges and 0 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr1 [ 1, 249250621] +
## [2] chr1 [ 8, 249250621] -
## [3] chr1 [ 1, 249250621] *
## [4] chr2 [ 1, 1] +
## [5] chr2 [10, 243199373] +
## [6] chr2 [ 1, 243199373] -
## [7] chr2 [ 1, 243199373] *
## [8] chr3 [ 1, 198022430] +
## [9] chr3 [ 1, 9] -
## [10] chr3 [17, 198022430] -
## [11] chr3 [ 1, 198022430] *
## -------
## seqinfo: 3 sequences from an unspecified genome

Cuntos fragmentos nicos tenemos?

disjoin(gr0)

## GRanges object with 5 ranges and 0 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr1 [ 1, 7] -
## [2] chr2 [ 2, 2] +
## [3] chr2 [ 3, 8] +
## [4] chr2 [ 9, 9] +
## [5] chr3 [10, 16] -
## -------
## seqinfo: 3 sequences from an unspecified genome

Podemos ver el grado de solapamiento entre rangos.

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

## integer-Rle of length 243199373 with 5 runs


## Lengths: 1 1 ... 243199364
## Values : 0 1 ... 0
##
## $chr3
## integer-Rle of length 198022430 with 3 runs
## Lengths: 9 7 198022414
## Values : 0 1 0

Definamos un objeto GRanges que es un subconjunto de gr0, en


concreto, el formado por sus dos primeros rangos.

(gr1 = gr[1:2])

## GRanges object with 2 ranges and 2 metadata columns:


## seqnames ranges strand | score
## <Rle> <IRanges> <Rle> | <integer>
## a chr1 [1, 7] - | 1
## b chr2 [2, 8] + | 2
## GC
## <numeric>
## a 1
## b 0.888888888888889
## -------
## seqinfo: 3 sequences from an unspecified genome

Podemos considerar su interseccin (que coincide con gr1).

IRanges::intersect(gr0,gr1)

## GRanges object with 2 ranges and 0 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr1 [1, 7] -
## [2] chr2 [2, 8] +
## -------
## seqinfo: 3 sequences from an unspecified genome

La unin ser gr0.

IRanges::union(gr0,gr1)

## GRanges object with 3 ranges and 0 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr1 [ 1, 7] -
secuencias 405

## [2] chr2 [ 2, 9] +
## [3] chr3 [10, 16] -
## -------
## seqinfo: 3 sequences from an unspecified genome

La diferencia de gr0 respecto de gr1 ser lo que est en gr0 y no


en gr1).

IRanges::setdiff(gr0,gr1)

## GRanges object with 2 ranges and 0 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## [1] chr2 [ 9, 9] +
## [2] chr3 [10, 16] -
## -------
## seqinfo: 3 sequences from an unspecified genome

La diferencia de gr1 respecto de gr0 ser el vaco.

IRanges::setdiff(gr1,gr0)

## GRanges object with 0 ranges and 0 metadata columns:


## seqnames ranges strand
## <Rle> <IRanges> <Rle>
## -------
## seqinfo: 3 sequences from an unspecified genome

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

## GRangesList object of length 2:


## $txA
## GRanges object with 1 range and 2 metadata columns:
## seqnames ranges strand | score
## <Rle> <IRanges> <Rle> | <integer>
## [1] chr2 [3, 6] + | 5
## GC
## <numeric>
## [1] 0.45
##
## $txB
## GRanges object with 2 ranges and 2 metadata columns:
## seqnames ranges strand | score GC
## [1] chr1 [ 7, 9] + | 3 0.3
## [2] chr1 [13, 15] - | 4 0.5
##
## -------
## seqinfo: 2 sequences from an unspecified genome; no seqlengths

Podemos recuperar el nombre de los GRangess con

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)

## [1] "txA" "txB"

seqlengths(grl)

## chr2 chr1
## NA NA

21.5.3 Alineamientos genmicos


Tenemos la clase GAlignments para alineamientos genmicos.4 4
No solamente, pero tambin, Binary
Permite alineamientos con gaps en la secuencia de referencia (gapped Alignment Map o ficheros BAM.

alignment). Un objeto GAlignments es un objeto tipo vector en donde


cada elemento es una alineamiento. En definitiva cmo una secuencia
(query o read que suele ser corta) se alinea con una secuencia de
referencia (que es larga).
408 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Podemos crear un objeto GAlignments a partir de un fichero BAM.


En el objeto que resulta cada elemento corresponde con un registro
del fichero BAM original. No toda la informacin del fichero original
se conserva en el objeto GAlignments.

Leyendo un fichero BAM en un objeto GAlignments Necesitamos el


paquete Pags et al. [2016, GenomicAlignments].

library(GenomicAlignments)

Leemos un fichero BAM que se tiene en el paquete Morgan et al.


[2015c, Rsamtools]. Leemos los datos.

aln1_file = system.file("extdata", "ex1.bam", package="Rsamtools")


aln1 = readGAlignments(aln1_file)
aln1

## GAlignments object with 3271 alignments and 0 metadata columns:


## seqnames strand cigar qwidth
## <Rle> <Rle> <character> <integer>
## [1] seq1 + 36M 36
## [2] seq1 + 35M 35
## [3] seq1 + 35M 35
## [4] seq1 + 36M 36
## [5] seq1 + 35M 35
## ... ... ... ... ...
## [3267] seq2 + 35M 35
## [3268] seq2 + 35M 35
## [3269] seq2 - 35M 35
## [3270] seq2 - 35M 35
## [3271] seq2 - 35M 35
## start end width njunc
## <integer> <integer> <integer> <integer>
## [1] 1 36 36 0
## [2] 3 37 35 0
## [3] 5 39 35 0
## [4] 6 41 36 0
## [5] 9 43 35 0
## ... ... ... ... ...
## [3267] 1524 1558 35 0
## [3268] 1524 1558 35 0
## [3269] 1528 1562 35 0
## [3270] 1532 1566 35 0
## [3271] 1533 1567 35 0
## -------
secuencias 409

## seqinfo: 2 sequences from an unspecified genome

Cuntas lecturas estn alineadas?

length(aln1)

## [1] 3271

head(seqnames(aln1))

## factor-Rle of length 6 with 1 run


## Lengths: 6
## Values : seq1
## Levels(2): seq1 seq2

seqlevels(aln1)

## [1] "seq1" "seq2"

head(strand(aln1))

## factor-Rle of length 6 with 1 run


## Lengths: 6
## Values : +
## Levels(3): + - *

Mtodos para GAlignments

21.6 Visualizando los datos


5 5
Tomado del curso de Alex Sn-
chez https://eib.stat.ub.edu/
Materiales-Curso-RNASeq.
require (pasillaBamSubset)
fl1 <- untreated1_chr4()
fl2 <- untreated3_chr4()
require(GenomicRanges)
require(GenomicAlignments)
x <- readGAlignments(fl1)
xcov <- coverage(x)
z <- GRanges("chr4",IRanges(456500,466000))
# Bioconductor 2.14
410 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

xnum = as.numeric(xcov$chr4[ranges(z)])
plot(xnum)

Lo hacemos con otro fichero y los representamos conjuntamente.

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)

Podemos ver el cubrimiento de un exn.

plot(xnum, type="l", col="blue", lwd=2, xlim=c(6200,6600))


lines(ynum, col="red", lwd=2)

Vamos a buscar un gen de inters y visualizar su cubrimiento.


El gen es lgs. Empezamos buscando su nombre en la base de datos
Ensembl.

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

## 69 FlyBaseName Protein ID(s) [e.g. cul-2-PB]


## 95 WikiGene Name(s) [e.g. Ir21a]
## 109 Parent term name
## 210 Parent term name

map <- getBM(mart = m,


attributes = c("ensembl_gene_id", "flybasename_gene"),
filters = "flybasename_gene",
values = "lgs")
map

## ensembl_gene_id flybasename_gene
## 1 FBgn0039907 lgs

Ya tenemos el identificador Ensembl del gen lgs.


Cmo podemos tener los exones de cada uno de los genes?

require(GenomicFeatures)
require(TxDb.Dmelanogaster.UCSC.dm3.ensGene)
grl = exonsBy(TxDb.Dmelanogaster.UCSC.dm3.ensGene, by="gene")

Nos interesa el gen con identificador Ensembl

map$ensembl_gene_id[1]

## [1] "FBgn0039907"

Por lo que sus exones vienen dados por

gene = grl[[map$ensembl_gene_id[1]]]
gene

## NULL

Vamos a visualizar el cubrimiento con el paquete Hahne et al.


[2016, Gviz].

require(Gviz)
gtrack <- GenomeAxisTrack()
atrack <- AnnotationTrack(gene, name = "Gene Model")
plotTracks(list(gtrack, atrack))

Vamos a obtener el cubrimiento. Gviz espera los datos como objeto


GRanges.
412 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

xgr <- as(xcov, "GRanges")


ygr <- as(ycov, "GRanges")
dtrack1 <- DataTrack(xgr[xgr %over% z], name = "sample 1")
dtrack2 <- DataTrack(ygr[ygr %over% z], name = "sample 2")
plotTracks(list(gtrack, atrack, dtrack1, dtrack2))

Con otra opcin grfica.

plotTracks(list(gtrack, atrack, dtrack1, dtrack2), type="polygon")

Utilizando ggbio
Repetimos los dibujos anteriores utilizando Yin et al. [2016, ggbio].

require (ggbio)
autoplot(gene)

Y ahora mostramos el cubrimiento.

autoplot(fl1, which=z)

Y en la segunda muestra.

autoplot(fl2, which=z)

21.7 Un lenguaje de consulta

En esta seccin vamos a utilizar el paquete Charif and Lobry [2007,


seqinr]. Cargamos el paquete y vemos las bases de datos disponibles.

library(seqinr)
choosebank()

## [1] "genbank" "embl"


## [3] "emblwgs" "swissprot"
## [5] "ensembl" "hogenom"
## [7] "hogenomdna" "hovergendna"
## [9] "hovergen" "hogenom5"
## [11] "hogenom5dna" "hogenom4"
## [13] "hogenom4dna" "homolens"
## [15] "homolensdna" "hobacnucl"
## [17] "hobacprot" "phever2"
secuencias 413

## [19] "phever2dna" "refseq"


## [21] "greviews" "bacterial"
## [23] "archaeal" "protozoan"
## [25] "ensprotists" "ensfungi"
## [27] "ensmetazoa" "ensplants"
## [29] "ensemblbacteria" "mito"
## [31] "polymorphix" "emglib"
## [33] "refseqViruses" "ribodb"
## [35] "taxodb"

Elegimos GenBank.

choosebank("genbank")

En lo que sigue utilizamos la opcin virtual = TRUE para evitar


bajar las secuencias. Nos preguntamos: Cuntas secuencias kras
tiene genbank?

query("kras0","k=kras",virtual=TRUE)

Y vemos el nmero.

kras0$nelem

## [1] 49

En particular: cuntas secuencias kras tiene Genbank para la


especie homo sapiens?

query("krashd0","sp=homo sapiens AND k=kras",virtual=TRUE)

Y tenemos

krashs0$nelem

## [1] 34

21.8 Informacin sobre las secuencias

Cmo bajamos secuencias? Una vez bajamos la secuencia que-


remos informacin sobre la misma. Bajamos las secuencias de ho-
mo sapiens y con un gen denominado "KRAS". Observemos que
virtual =FALSE por defecto.
414 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

query("krashs","sp=homo sapiens AND k=kras")

Sabemos que hay

krashs$nelem

## [1] 34

Qu cdigo de acceso tiene? Podemos verlos indicando si quere-


mos ver la primera.

getName(krashs$req[1])

## [1] "AF493917"

O bien podemos ver todos los cdigos de acceso.

getName(krashs$req)

## [1] "AF493917" "BC013572.KRAS"


## [3] "EF471933.KRAS" "EF471934.KRAS"
## [5] "EF471935.KRAS" "EF471936.KRAS"
## [7] "EF471937.KRAS" "EF471938.KRAS"
## [9] "EF471939.KRAS" "EF471940.KRAS"
## [11] "EF471941.KRAS" "EF471942.KRAS"
## [13] "EF471943.KRAS" "EF471944.KRAS"
## [15] "EF471945.KRAS" "EF471946.KRAS"
## [17] "EF471947.KRAS" "EF471948.KRAS"
## [19] "EF471949.KRAS" "EF471950.KRAS"
## [21] "EF471951.KRAS" "EF471952.KRAS"
## [23] "EF471953.KRAS" "EF471954.KRAS"
## [25] "EF471955.KRAS" "EF471956.KRAS"
## [27] "EF471957.KRAS" "EF685661.KRAS"
## [29] "EF685662.KRAS" "EU332849.KRAS"
## [31] "HM459605.KRAS" "HUMKRASM.KRAS"
## [33] "JQ248012.KRAS" "JX512447.KRAS"

Otra forma de hacerlo es utilizar sapply. Le pasamos secuencia


que hemos bajado y le aplicamos a cada elemento la funcin getName
que nos da el cdigo correspondiente.

sapply(krashs$req,getName)

## [1] "AF493917" "BC013572.KRAS"


## [3] "EF471933.KRAS" "EF471934.KRAS"
## [5] "EF471935.KRAS" "EF471936.KRAS"
secuencias 415

## [7] "EF471937.KRAS" "EF471938.KRAS"


## [9] "EF471939.KRAS" "EF471940.KRAS"
## [11] "EF471941.KRAS" "EF471942.KRAS"
## [13] "EF471943.KRAS" "EF471944.KRAS"
## [15] "EF471945.KRAS" "EF471946.KRAS"
## [17] "EF471947.KRAS" "EF471948.KRAS"
## [19] "EF471949.KRAS" "EF471950.KRAS"
## [21] "EF471951.KRAS" "EF471952.KRAS"
## [23] "EF471953.KRAS" "EF471954.KRAS"
## [25] "EF471955.KRAS" "EF471956.KRAS"
## [27] "EF471957.KRAS" "EF685661.KRAS"
## [29] "EF685662.KRAS" "EU332849.KRAS"
## [31] "HM459605.KRAS" "HUMKRASM.KRAS"
## [33] "JQ248012.KRAS" "JX512447.KRAS"

Qu longitudes tienen? Otra vez el modo ms rpido es utilizar la


funcin sapply.

sapply(krashs$req,getLength)

## [1] 567 567 76 73 76 77 78 72 75 78 79


## [12] 81 79 72 73 74 77 77 80 69 73 80
## [23] 80 81 80 81 77 111 111 570 100 567 111
## [34] 570

Veamos los primeros 15 nucletidos de la secuencia.

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"

Que podemos transformar en la correspondiente secuencia de


aminocidos.

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" "*"

Tambin podemos obtener su anotacin.

krashsAnot1 = getAnnot(krashs$req[[1]])

21.9 Clculos con secuencias

Vamos a observar las frecuencias de nucletidos y de dinucleti-


dos. Nos fijamos en la primera secuencia que tiene cdigo de acceso
AF493917. Contamos las frecuencias de nucletidos con la funcin
base::table.

table(getSequence(krashs$req[[1]]))

##
## a c g t
## 210 81 133 143

o bien utilizamos la funcin seqinr::count para lo mismo

count(getSequence(krashs$req[[1]]),1)

##
## a c g t
## 210 81 133 143

o para contar los frecuencias de dinucletidos

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

Obviamente segn vamos incrementando el nmero los conteos de


las tablas de frecuencias se van reduciendo.

21.10 Porcentaje de GC

Nos puede interesar el porcentaje de GC de un modo genrico

GC(getSequence(krashs$req[[1]]))

## [1] 0.377425

o bien el porcentaje cuando GC ocupa la primera posicin del


codn

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

Podemos ver estos porcentajes de GC cuando nos limitamos a


secuencias de nucletidos de una longitud dada, por ejemplo, de 50
nucletidos. Primero lo calculamos.

kras = getSequence(krashs$req[[1]])
n = length(kras)

GCperc = double()
for(i in 1:(n-50))
GCperc[i] = GC(kras[i:(i+50)])

Y ahora la representamos grficamente.

plot(GCperc,type="l")
0.5
GCperc

0.4
0.3
0.2

0 100 200 300 400 500

Index

21.11 Hay un sobre o infra representacin de dinucletidos?

Podemos usar la funcin . Consideramos las frecuencias conjun-


tas divididas por las marginales O de otro modo las frecuencias de
dinucletidos divididas por las el producto de las frecuencias de los
secuencias 419

nucletidos. Se define como


f xy
= .
fx fy

Bajo un cierto modelo estocstico (ver Palmeira et al. [2006] y Prum


et al. [1995] se tiene el valor medio y la varianza que vienen dadas
por
E( xy ) = 1,
y
(1 f x )(1 f y )
var ( xy ) = .
n fx fy
Podemos tipificar obteniendo
xy 1
Z= q .
var ( xy )

Y tendremos un valor que aproximadamente sigue una distribucin


normal o, como en ocasiones se expresa, es un Z-valor. Vamos a con-
siderar la secuencia con cdigo de acceso NCBI AF517525.KRAS.
La funcin base::round simplemente nos muestra el nmero de
dgitos que deseamos. Podemos obtener los coeficientes

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

Llama la atencin el valor extremo observado de CG.

21.12 Alineamiento

Cuando tenemos una secuencia larga podemos buscar un pa-


trn en dicha secuencia. Por ejemplo, consideramos la secuencia con
420 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

nmero de acceso NCBI AF517525.KRAS y buscamos el patrn


cccggg. Podemos empezar por buscar el patrn exacto sin permitir
ningn error.

kras = sapply(krashs$req,getSequence)

En kras tenemos las secuencias de nucletidos. Por ejemplo, pode-


mos ver la primera de ellas (primer elemento de la lista).

head(kras[[1]])

## [1] "a" "t" "g" "a" "c" "t"

Podemos transformala en un string (no mostrado).

krasnr1 = c2s(kras[[1]])

Es lo mismo? No. Antes tenamos un vector donde en cada posi-


cin tenamos un nucletido. Ahora tenemos una larga (muy larga)
palabra compuesta por las letras que vemos. Fijamos la secuencia de
bases que buscamos.

subseq = "agacacaa"

Y contamos cuntas veces aparece la secuencia indicada. Estamos


realizando una busqueda exacta, un acoplamiento perfecto. No per-
mitimos ninguna diferencia lo que se indica con max.mismatch=0.

countPattern(subseq,krasnr1,max.mismatch=0)

## [1] 1

Y dnde se produce la coincidencia? Dnde est localizado el


patrn o secuencia que estamos buscando?

matchPattern(subseq,krasnr1,max.mismatch=0)

## Views on a 567-letter BString subject


## subject: atgactgaatataaacttg...aaagtgtgtaattatgtaa
## views:
## start end width
## [1] 375 382 8 [agacacaa]

En el caso anterior buscbamos un acoplamiento perfecto. Vamos a


dejar que difieran en un carcter, esto es, en un nucletido.
secuencias 421

matchPattern(subseq,krasnr1,max.mismatch=1)

## Views on a 567-letter BString subject


## subject: atgactgaatataaacttg...aaagtgtgtaattatgtaa
## views:
## start end width
## [1] 375 382 8 [agacacaa]

Si permitimos que difieran en dos nucletidos tenemos.

matchPattern(subseq,krasnr1,max.mismatch=2)

## Views on a 567-letter BString subject


## subject: atgactgaatataaacttg...aaagtgtgtaattatgtaa
## views:
## start end width
## [1] 168 175 8 [cgacacag]
## [2] 375 382 8 [agacacaa]
## [3] 377 384 8 [acacaaaa]
## [4] 438 445 8 [aaagacaa]
## [5] 440 447 8 [agacaaga]
## [6] 493 500 8 [aaacataa]
## [7] 543 550 8 [aaagacaa]
## [8] 545 552 8 [agacaaag]

Y as sucesivamente.

21.13 Algoritmo de Needleman-Wunsch

Podemos considerar secuencias de aminocidos o bien secuencias


de nucletidos. Esencialmente tenemos un alfabeto finito (bien el n-
mero de aminocidos bien el nmero de bases). Supongamos que nos
planteamos alinear las dos secuencias de nucletidos: GAATTC y GATTA.
Hemos de indicar el grado de similitud entre cada par nucletidos.
En la tabla 21.1 tenemos el valor que sumaremos a la funcin objetivo
cuando se produzca un alineamiento entre fila y columna.

- 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

tiene una puntuacin o valor de la funcin objetivo dada por

2 + 2 - 1 + 2 - 2 -2

## [1] 1

El problema es encontrar un alineamiento que nos de el valor


mximo. Es lo que llamamos un alineamiento ptimo. Necesitamos
otra matriz, la matriz F, que nos va dando los resultados parciales.
Si denotamos por n y m las longitudes de la primera y segunda se-
cuencias respectivamente entonces F tiene dimensin n m y el valor
de Fij nos da la puntuacin obtenida cuando alineamos de un modo
ptimo los primeros i elementos de la primera secuencia y los prime-
ros j elementos de la segunda secuencia. Al finalizar el algoritmo, el
valor Fnm nos da la puntuacin del alineamiento ptimo de ambas
secuencias.
El algoritmo tiene la siguiente estructura:

Inicio
F0j = d j; Fi0 = d i

Recursin

Fij = max{ Fi1,j1 + s( Ai , Bj ), Fi,j1 + d, Fi1,j + d}

Una vez el algoritmo acaba tenemos la puntuacin ptima en la


posicin (n,m) de la matriz F pero no tenemos el alineamiento. El
alineamiento se obtiene con el siguiente algoritmo:

1. Empezamos con Fnm . Vamos a ir retrocediendo hasta llegar a la


primera columna o la primera fila.

2. En cada paso comparamos los tres elementos utilizados para


obtener el valor de esa posicin. Hemos de comparar Fij con
Fi1,j , Fi,j1 , Fi1,j1 . Si al calcular el mximo hemos utilizado el
valor Fi1,j entonces Ai se ha alineado con un hueco; si hemos usa-
do Fi,j1 entonces Bi se ha alineado con un hueco; finalmente, si
hemos utilizado Fi1,j1 entonces hemos alineado Ai con Bi (lo que
no quiere decir que sean iguales).

Encontremos el alineamiento ptimo en nuestro ejemplo.

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

Ejemplo 30. Vamos a alinear dos secuencias de ADN.

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

Ejemplo 31. Vamos a aplicar el algoritmo de Needleman-Wunsch a una


secuencia de aminocidos. Como matriz de puntuaciones s tomamos la
matriz BLOSUM50 y como penalizacin para hueco d = -8.

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

Ya tenemos el mejor alineamiento. Pero: es bueno? Una opcin


sencilla puede ser. Miramos el nmero de letras que contiene ca-
da secuencia y producimos secuencias aleatorias de la longitud de
la secuencia considerada. Esto lo hacemos para cada una de ellas.
Obtenemos para cada par de secuencias producidas de este modo
la puntuacin ptima. Contamos la proporcin de secuencias que
424 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

tienen una puntuacin mayor que la hemos obtenido con nuestras


secuencias originales.

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

La dimensin de nuestros datos es muy alta. Supongamos que


nos planteamos predecir la expresin de un gen y pretendemos uti-
lizar como predictores la expresin de los posibles microRNA que
tienen a este gen como una posible diana y posiblemente variables
fenotpicas. El tamao de nuestra muestra es n, nmero de colum-
nas de la matriz de expresin que suele ser pequeo mientras que
tendremos posiblemente centenares de posibles predictores.
Si la expresin viene cuantificada como conteos de RNASeq en-
tonces la respuesta es un nmero entero positivo. Los predictores
tambin seran valores enteros.

22.1 Modelos de efectos aleatorios

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

En esta seccin vamos a trabajar con el paquete Goeman et al.


[2015, globaltest]. Las referencias son Goeman et al. [2004, 2011].

Goeman et al. [2004]

Tenemos un vector respuesta Y = (Y1 , . . . , Yn ).1 y tenemos p varia- 1


Puede corresponder a una variable
bles predictoras. Para la i-sima muestra tenemos xi = ( xi1 , . . . , xip )0 . fenotpica (clasificacin en un tipo de
cncer, un tiempo de supervivencia) o
Consideramos la matriz x que tiene en la fila i el vector traspuesto xi0 . bien puede corresponder al perfil de
Asumen un modelo lineal generalizado donde la funcin de enlace2 expresin de una caracterstica como un
gen, exn o una regin genmica.
2
Link function.
428 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

es h de modo que
p
h( E(Yi | xi , )) = 0 + xij j . (22.1)
j =1

Se pretende contrastar la hiptesis nula H0 : 1 = . . . = p = 0 frente


a H1 : Existej con j 6= 0.
El problema habitual en datos de alto rendimiento es que el tama-
o de la muestra n es inferior al nmero de variables p y no podemos
utilizar los contrastes habituales ?. Por ello, se adopta un modelo de
efectos aleatorios en el cual los coeficientes j pasan a considerarse
variables aleatorias con media nula, independientes entre s y con
una misma varianza 2 . Reformulan la hiptesis nula anterior con

H0 : 2 = 0,
H1 : 2 > 0.

Estamos considerando un modelo lineal generalizado con efectos


aleatorios. El vector de coeficientes = ( 1 , . . . , p )0 lo consideramos
p
aleatorio. De hecho, E = 0 p 3 y cov( ) = 2 I p 4 Si Ri = j=1 xij j y 3
0 p es el vector con p ceros.
R = ( R1 , . . . , R p )0 entonces 4
I p es la matriz identidad p p.

R = xi0 .

Por tanto se sigue que ER = 0 p y cov( R) = 2 xx0 . Finalmente lo que


estamos asumiendo es que

h( E(Yi | xi , )) = 0 + Ri , (22.2)

donde 0 es fijo y Ri es aleatorio. Tenemos pues un modelo lineal


generalizado de efectos aleatorios.
La funcin de verosimilitud depende de 0 , 2 y posiblemente un
parmetro de dispersin adicional.5 5
La varianza 2 si asumimos Yi con
Supongamos en un primer momento conocidos los parmetros 0 distribucin normal o la dispersin en
un modelo binomial negativo.
y este parmetro de dispersin adicional y, por supuesto, desconoci-
do el parmetro 2 sobre el que queremos contrastar. Se considera un
test score.6 El estadstico del test es 6
Este procedimiento consiste en con-
siderar en cociente entre la derivada
(Y )0 U (Y ) 2 traza(U ) de la logveromilitud y su desvia-
T=  1/2 (22.3) cin estndar evaluada asumien-
2 2 2
22 traza(U ) + (4 32 ) i Uii
2 do cierta la hiptesis nula. https:
//en.wikipedia.org/wiki/Score_test.

siendo:
1 0 1
1. U = m xx . Notemos que U = m 2
cov( R).

2. el vector de medias de Y bajo la hiptesis nula. Si EYi = =


h1 ( 0 ) entonces el vector de medias de Y ser = 1n .7 7
Denotamos 1n el vector n 1 con
todas sus componentes iguales a 1.
modelos para la regulacin de la expresin 429

3. Los valores 2 y 4 son los momentos centrales de orden 2 y 4 res-


pectivamente de Yi (no depende de i) asumiendo cierta la hiptesis
nula H0 .

Bajo H0 se tiene que el estadstico T definido en 22.3 asintticamen-


te sigue una distribucin normal. Otro estadstico equivalente que
podemos usar para contrastar es

(Y ) 0 U (Y )
Q= (22.4)
2

con media EQ = traza(U ) y con varianza var ( Q) = 2traza(U 2 ) +


( 24 3) i Uii2 . Asintticamente Q tambin tiene una distribucin
2
normal.8 Pero U es una matriz no negativa por lo que Q es propor- 8
Es una transformacin lineal de T
cional a una forma cuadrtica. En concreto se tiene que dado en 22.3.

var ( Q) 2
Q 2 . (22.5)
2EQ 2(EQ) /var(Q)

Es interesante ver dos expresiones equivalentes del estadstico Q. Se


tiene que

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

siendo xi el vector (n 1) que nos da el perfil de expresin del i-


simo gen.
Hasta ahora hemos asumido conocidos 0 y, si lo hay, el parmetro
de dispersin de Yi . Esto obviamente no es cierto. Hemos de estimar
estos parmetros y ver cmo se modifica el estadstico Q y su distri-
bucin. La media de Yi para cualquier i lo estimamos con la media
muestral de los Yi , es decir, = n1 in=1 Yi y por tanto el vector de
medias estimado es = 1n . Si hacemos esto tenemos que

Y = ( I H )(Y )

siendo H = n1 1n 10n . En consecuencia

(Y )0 U (Y ) = (Y )0 ( I H )U ( I H )(Y ).

Nos queda estimar 2 momento centrado de segundo orden de Yi .


Su estimador por momentos sera estimarlo con 2 = n1 in=1 (Yi
)2 = n1 (Y )0 (Y ). Si hacemos esto hemos de considerar
que los estimadores del numerador y del denominador de Q estn
430 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

positivamente correlados. Un valor grande de uno se corresponde


con un valor grande del otro y un menor valor del estadstico del
que se debiera de observar. En resumen, un test ms conservador.
En ? se considera el caso normal con funcin de enlace la identidad
(el modelo de regresin lineal mltiple) y el caso de la regresin
logstica en que la respuesta es binaria y la funcin de enlace es la
funcin logit (regresin logstica). Para el caso de la regresin lineal
mltiple tenemos que el estadstico modificado adopta la expresin

(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 )

El mtodo lo tenemos implementado en el paquete Goeman et al.


[2015, globaltest].

Goeman et al. [2011]


Tenemos n datos independientes. Cada dato consiste de una res-
puesta yi y las variables predictoras las vamos a subdividir en dos
subconjuntos de longitudes p y q. En consecuencia el vector respuesta
es el vector columna y = (y1 , . . . , yn )0 . La matriz de diseo la tenemos
particionada en dos submatrices que denotamos por X y Z. En con-
creto en la i-sima fila de X tenemos el transpuesto del vector d 1
xi . De un modo anlogo en la i-sima fila de Z tenemos zi0 de dimen-
sin q 1. Tenemos pues que podemos expresar el modelo lineal
generalizado como

h( E(Yi )) = xi0 + zi0 , (22.9)


siendo h el enlace cannico para la familia de distribuciones elegida.
Si denotamos por H el vector n 1 que tiene por componente i-sima
h( E(Yi )) entonces en forma matricial tendremos

H = X + Z, (22.10)

Se pretende evaluar si las covariables incluidas en el vector z tienen


un efecto significativo sobre la respuesta. De un modo ms formal
pretendemos contrastar.

H0 : =0
H0 : 6= 0.

Se asume p < n pero esta condicin no se asume para q.


modelos para la regulacin de la expresin 431

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:

1. Regresin lineal para respuesta continua.

2. Regresin logstica para respuesta binaria.

3. Regresin logstica multinomial cuando la respuesta es categrica


con ms de dos categoras.

4. Regresin de Poisson cuando la variable respuesta son conteos.

5. Modelo de riesgo proporcional de Cox cuando la respuesta es un


tiempo de supervivencia.

Utilizamos datos generados.

set.seed(1)
Y = rnorm(20)
X = matrix(rnorm(200), 20, 10)
X[,1:3] = X[,1:3] + Y
colnames(X) = LETTERS[1:10]

Tenemos un vector respuesta Y y 10 covariables donde las tres


primeras estn asociadas con Y pero las dems no lo estn.

pacman::p_load("globaltest")

La funcin bsica es globaltest::gt.

22.3 Modelos lineales generalizados regularizados

Se utilizan modelos lineales y lineales generalizados regularizados.


Las referencias bsicas son Friedman et al. [2010], Tibshirani et al.
[2012], ?], ? En ?, glmnet tenemos implementado el procedimiento.
23
microRNA

23.1 Introduccin

En este tema abordamos el problema de la interaccin entre los


microRNA y el mRNA. Sin duda, la mejor referencia sobre este pro-
blema es ?

23.2 microRNA

MicroRNA (miRNA) es un RNA formado por entre 20 y 24 nu-


cletidos y que se pueden enlazar con secuencias complementarias
de mRNA. A los mRNA a los que puede regular se les llama mRNA
diana.1 Se han mostrado como importantes en la regulacin de la 1
Target.
expresin de los genes. Una gran parte de los genes que codifican
protenas estn sujetos a la regulacin de miR. Su accin sobre un
mRNA puede ser silenciar su actividad o bien degradarlo (desestabi-
lizarlo). El primer problema es determinar los mRNA objetivo para
un miR dado. Hay mtodos computaciones que intentan predecir
la correspondencia. Una referencia genrica sobre bases de datos de
microRNA y sus posibles target es http://en.wikipedia.org/wiki/
MicroRNA_and_microRNA_target_database. Una herramienta online
que nos da las correspondencias entre miR y los posibles mRNA es
miRDB.

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)

Las referencias para entender cmo est organizada la informacin


son AMBROS et al. [2003], ?.
Podemos ver los objetos que soporta con
434 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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"

Vemos que es un objeto AnnotationDbi::Bimap.2 Un bimap est 2


Ver ayuda en AnnotationDbi::Bimap.
compuesto de dos conjuntos de objetos: los objetos de la izquierda
y los de la derecha. Cada objeto, bien de derecha o de izquierda,
tienen un nombre nico en cada conjunto (el de la izquierda y el
de la derecha). Los nombres de la izquierda se les llama las claves
izquierda (respectivamente las claves derecha). Abreviadamente se
les llama Lkeys y Rkeys. Tenemos aristas que nos unen la izquierda
con la derecha. Estas aristas pueden tener etiquetas. En resumen un
bimap es un grafo bipartido.
Veamos, para mirbaseMATURE, un resumen.

summary(mirbaseMATURE)

## MATURE map for miRBase (object of class "mirbaseMatureBimap")


## |
## | Lkeyname: mirna_id (Ltablename: mirna)
## | Lkeys: "cel-let-7", "cel-lin-4", ... (total=21264/mapped=21264)
## |
## | Rkeyname: mature_acc (Rtablename: mirna_mature)
## | Rkeys: "MIMAT0000001", "MIMAT0015091", ... (total=25141/mapped=25141)
## |
## | tagname: mature_name
## |
## | direction: L --> R

Algunos mtodos que podemos aplicar son

keys(mirbaseMATURE)[1:4]

## [1] "cel-let-7" "cel-lin-4" "cel-mir-1"


## [4] "cel-mir-2"

Lkeys(mirbaseMATURE)[1:4]
436 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

## [1] "cel-let-7" "cel-lin-4" "cel-mir-1"


## [4] "cel-mir-2"

Rkeys(mirbaseMATURE)[1:4]

## [1] "MIMAT0000001" "MIMAT0015091" "MIMAT0000002"


## [4] "MIMAT0015092"

Llength(mirbaseMATURE)

## [1] 21264

Rlength(mirbaseMATURE)

## [1] 25141

La direccin es de izquierda a derecha ya que nos devuelve 1.

direction(mirbaseMATURE)

## [1] 1

Podemos transformar la informacin en un data.frame.

mirbaseMATURE.df = toTable(mirbaseMATURE)

Tiene las siguientes variables.

names(mirbaseMATURE.df)

## [1] "mirna_id" "mature_acc" "mature_name"


## [4] "mature_from" "mature_to" "evidence"
## [7] "experiment" "similarity"

En particular podemos seleccionar los correspondientes a homo


sapiens.

mirbaseMATURE.hsa =
mirbaseMATURE.df[grep("^hsa",mirbaseMATURE.df[,"mirna_id"]),]

No hay una correspondencia 1-1 como podemos ver.

length(unique(mirbaseMATURE.hsa[,"mirna_id"]))

## [1] 1600

length(unique(mirbaseMATURE.hsa[,"mature_name"]))

## [1] 2042
microrna 437

Cmo seguir los cambios de miRBase? La base de datos est en cons-


tante evolucin.3 Esto hace que sea muy conveniente el uso del pa- 3
Como casi todas las bases de datos
quete ?, miRNAmeConverter que a su vez utiliza la base de datos ?, bioinformticos.

R-miRBaseVersions.db.

23.2.2 targetscan

?, R-targetscan.Hs.eg.db es un paquete de anotacin que utiliza la


informacin de http://www.targetscan.org/. 4 4
http://stackoverflow.
com/questions/20508757/
mirna-target-enrichment-in-r.
library(targetscan.Hs.eg.db)
ls("package:targetscan.Hs.eg.db")

## [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"

Por ejemplo, todos los miRs los tenemos con

ls(targetscan.Hs.egMIRNA)

Supongamos que tenemos el SYMBOL de un gen y pretendemos


recuperar los microRNA que lo tienen como target.
438 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

library('org.Hs.eg.db') # Paquete requerido


library('targetscan.Hs.eg.db')

Elegimos el gen utilizando su nombre abreviado o SYMBOL.

idsymbol = "SLC2A4"

Obtenemos su identificador ENTREZ.

identrez = get(idsymbol, revmap(org.Hs.egSYMBOL))

Podemos comprobar en sentido inverso la correspondencia.

get("6517", org.Hs.egSYMBOL)

## [1] "SLC2A4"

Una vez tenemos el identificador ENTREZ podemos buscar las


familias de miRNA obtenemos de la base de datos TargetScan.

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)

Cules son las familias que los tienen como targets?

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"

Dada una familia de miR obtenemos sus correspondencias en miRBase.


Todas las familias de miRs las tenemos con5 5
No mostrado.

ls(targetscan.Hs.egFAMILY2MIRBASE)

Elegimos las tres ltimas.

fams = tail(ls(targetscan.Hs.egFAMILY2MIRBASE),n=3)

Y buscamos estas familias de miRs a quin corresponden en la


base de datos miRBase.

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

Corresponde al paquete Pajak and Simpson [2015, miRNAtap.db].

23.5 RmiR.Hs.miRNA

Favero [2013a, RmiR.Hs.miRNA]

23.6 RmiR.hsa

Favero [2013b, RmiR.hsa]

23.7 Material adicional

En http://cbl-gorilla.cs.technion.ac.il/miTEA/ tenemos una


herramienta online para el anlisis de enriquecimiento de miRNA.
En http://mirtar.mbc.nctu.edu.tw/human/tutorial.php te-
nemos una herramienta para estudiar las interacciones entre los
microRNAs y sus posibles targets.
microrna 441

23.8 Material adicional

Otra aproximacin al posible efecto de los microRNAs es Su et al.


[2016].

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.

Ej. 18 Consideremos un gen codificado utilizando su identificador


Entrez. Se pide, utilizando los paquetes Reid [2013, mirbase.db] y
Csardi [2013, targetscan.Hs.eg.db] obtener todos los microRNAs tal
que tienen a este gen como target. Los microRNAs han de estar en
codificacin MATURE. Obtener los microRNAs asociados al gen con
codificacin Entrez 59.
Parte IX

Probabilidad y Estadstica
24
Estadstica descriptiva

24.1 Datos

Vamos a trabajar con datos de expresin obtenidos mediante mi-


croarrays para un gen determinado. Tomamos los datos en la fila
3109 de tamidata:yeastgrowthRA.

library(Biobase)
data(yeastgrowthRA,package="tamidata")
y = exprs(yeastgrowthRA)[3109,]

Es el gen

featureNames(yeastgrowthRA)[3109]

## [1] "YOR315W"

Los valores observados son

## ra1 ra2 ra3


## 98.6700000 36.9890000 0.7805000
## ra4 ra5 ra7
## 0.9310000 0.3944000 349.0830000
## ra8 ra9 ra10
## 303.5230000 64.3330000 564.4360000
## ra31 ra32 ra33
## 2393.4090000 137.1524000 108.8010000
## ra34 ra35 ra36
## 93.3780000 4.4843000 2.7790000
## ra37 ra38 ra39
## 4.9046000 8.7920000 0.2649292
## ra40 ra41 ra42
## 0.1974448 0.3011461 9.0680000
446 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Nos fijamos en la cepa a que corresponde cada muestra.

(z = pData(yeastgrowthRA)[,"background"])

## [1] S288C S288C S288C S288C S288C S288C S288C


## [8] S288C S288C S288C W303 S288C S288C W303
## [15] W303 W303 W303 W303 W303 W303 W303
## Levels: S288C W303

Vamos a construir un data.frame con las expresiones de este gen y


la covariable que nos indica la cepa.

df = data.frame(x =z,y=y)

24.2 Introduccin

Tenemos unos datos observados en distintas muestras. De un mo-


do genrico denotaremos por x1 el primer valor observado, por x2
el segundo valor observado y as sucesivamente. En el lenguaje esta-
dstico a esto se le llama una muestra. Por ello, diremos que tenemos
una muestra x1 , . . . , xn de n datos. Se entiende que estos datos se han
tomado en unas condiciones similares. Cmo son estos datos? Pre-
tendemos describirlos de un modo sencillo. Esta descripcin ser de
dos tipos: una descripcin numrica, describimos muchos nmeros
con unos pocos nmeros que tengan un sentido claro; y una descrip-
cin grfica. Describimos los nmeros con grficos que destaquen sus
propiedades bsicas. Al conjunto de tcnicas que nos dan descripcio-
nes numricas y grficas de un conjunto de datos reciben el nombre
de Estadstica descriptiva y, con frecuencia, simplemente descriptiva.
Se habla de la descriptiva de los datos. Veremos que son ideas sencillas
pero de un uso constante. Cuando se describen los datos las pregun-
tas bsicas que hemos de tener en la cabeza pueden ser:

1. De qu orden son?

2. Cmo de dispersos estn?

3. Hay datos anormales que estn muy alejados de los dems?

En la primera pregunta intentamos localizar los valores: estamos


alrededor de 2?, o bien alrededor de 20?, o alrededor de 200000?
Pretendemos localizar la muestra, dar un valor representativo de
todos ellos. En la segunda pregunta nos preguntamos si los datos
se agrupan si estn prximos entre s. Por ltimo, nos planteamos
si tenemos datos que son anormales. Obviamente lo que es anormal
depende de cmo son los otros.
estadstica descriptiva 447

24.3 Descriptivas numricas

Empezamos con las descripciones numricas. De un modo gen-


rico se pretende describir un conjunto de datos numricos mediante
unos pocos nmeros (elegidos, eso s, con gracia). En particular va-
mos a considerar medidas de localizacin y medidas de dispersin. Las
medidas de localizacin intentan responder la pregunta que veamos
antes de: de qu orden son los datos? Las medidas de dispersin
intentan responder a la segunda pregunta, cmo de dispersos son
los datos? Cmo de variables son los datos?
Como medidas de localizacin veremos la media y medianas
muestrales fundamentalmente y como medidas de dispersin bsicas
veremos la varianza y desviacin tpica muestrales.

24.3.1 Media muestral


La medida de localizacin ms utilizada es la media aritmtica o
media muestral (que es el nombre habitualmente usado en Estadstica)
que se define como
n
x
x = i . (24.1)
i =1
n
La podemos calcular con

mean(y)

## [1] 199.1748

Notemos que si conocemos solamente la variable y y queremos


saber cuntos datos tenemos lo mejor es hacer

length(y)

## [1] 21

Y, aunque no muy recomendable, otro modo de calcular la media


muestral es calcular la suma y dividir por el nmero de trminos que
estamos sumando. Esto lo podemos hacer utilizando las funciones
sum y length.

sum(y)/length(y)

## [1] 199.1748

24.3.2 Media ajustada


La media muestral es, sin duda, la mejor forma de localizar una
muestra. No obstante es muy sensible a datos anmalos o extremos
448 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

(y que con frecuencia son errores introducidos en el banco de datos).


Por ejemplo, a nuestros datos originales les vamos a aadir un dato
anmalo. Le aadimos el valor 34.

(yy = c(y,3400))

## ra1 ra2 ra3


## 98.6700000 36.9890000 0.7805000
## ra4 ra5 ra7
## 0.9310000 0.3944000 349.0830000
## ra8 ra9 ra10
## 303.5230000 64.3330000 564.4360000
## ra31 ra32 ra33
## 2393.4090000 137.1524000 108.8010000
## ra34 ra35 ra36
## 93.3780000 4.4843000 2.7790000
## ra37 ra38 ra39
## 4.9046000 8.7920000 0.2649292
## ra40 ra41 ra42
## 0.1974448 0.3011461 9.0680000
##
## 3400.0000000

Podemos comparar la media original y la nueva media muestral.

mean(y)

## [1] 199.1748

mean(yy)

## [1] 344.6669

Se ha modificado muchsimo. Puede que el dato sea real pero pue-


de que sea un error. En cualquier caso es un nico valor entre otros
muchos. Puede interesarnos localizar nuestra muestra sin atender a
estos datos anmalos. Cmo? Una opcin simple es fijarnos en una
cierta proporcin de los datos, por ejemplo, una proporcin y elimi-
nar el por uno de los datos ms pequeos y el por uno de los ms
grandes. La media de los que quedan es la media ajustada. La media
ajustada se obtiene con mean indicndole un parmetro adicional.

mean(y,trim=.1)

## [1] 72.02143

Estamos eliminando el 10 % de los datos mayores y el 10 % de los


datos menores. La media de los restantes es nuestra media ajustada.
estadstica descriptiva 449

Ahora podemos comparar la media ajustada de los datos originales y


de los datos con la observacin anmala.

mean(y,trim=.1)

## [1] 72.02143

mean(yy,trim=.1)

## [1] 99.3778

Vemos cmo no se ha modificado demasiado. Estamos describien-


do la localizacin de la parte central de los datos despreciando los
datos extremos a ambos lados.

24.3.3 Percentiles

Otro manera de localizar los datos es utilizar los percentiles mues-


trales. Supongamos que tomamos un valor p entre 0 y 1. El percentil
de orden p es un valor que tiene por debajo el 100 p por ciento de
los datos y por encima el 100 (1 p) por ciento. Denotaremos el
percentil de orden p como q p . Ordenamos nuestros datos de menor a
mayor con la funcin sort.

sort(y)

## ra40 ra39 ra41


## 0.1974448 0.2649292 0.3011461
## ra5 ra3 ra4
## 0.3944000 0.7805000 0.9310000
## ra36 ra35 ra37
## 2.7790000 4.4843000 4.9046000
## ra38 ra42 ra2
## 8.7920000 9.0680000 36.9890000
## ra9 ra34 ra1
## 64.3330000 93.3780000 98.6700000
## ra33 ra32 ra8
## 108.8010000 137.1524000 303.5230000
## ra7 ra10 ra31
## 349.0830000 564.4360000 2393.4090000

Cuntos de los datos originales son menores o iguales a 1? Po-


demos contar a mano. 1 Otra posibilidad es utilizar la funcin ecdf. 1
Cosa antigua en franco retroceso
y que no est prohibido hacer. El
inconveniente es cuando tenemos
centenares o miles de observaciones.
450 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Fn = ecdf(y)
Fn(1)

## [1] 0.2857143

Vemos pues que la proporcin de datos que son inferiores a 1


es de 0.2857143. O dicho de otro modo: el valor 1 es el percentil de
orden 0.2857143 de los datos.
La funcin bsica para calcular los cuantiles es quantile. El detalle
exacto del procedimiento utilizado para estimar estos valores se
puede consultar con help(quantile). 2 2
Se pueden ver hasta nueve procedi-
La mediana muestral es el percentil de orden 0,5 esto es por debajo mientos distintos.

tiene al menos la mitad de los datos y por encima la otra mitad. La


podemos obtener con

median(y)

## [1] 9.068

De hecho, podemos plantearnos cmo conseguir un percentil de


orden p (con 0 < p < 1) arbitrario. Tomemos p = 0,27.

quantile(y,probs = 0.27)

## 27%
## 1.6702

O bien p = 0,76

quantile(y,probs = 0.76)

## 76%
## 114.4713

Cuando p = 0,25 al percentil le llamamos cuartil inferior. Si p =


0,75 tenemos el cuartil superior.

quantile(y,probs = c(0.25,0.75))

## 25% 75%
## 0.931 108.801

24.3.4 Varianza y desviacin estndar muestrales


Ahora pretendemos cuantificar lo dispersos que estn nuestros
datos. Las dos medidas ms utilizadas son la varianza y la desviacin
estadstica descriptiva 451

estndar. La varianza muestral se define como


n
( xi x )2
s2 = n1
, (24.2)
i =1

y la desviacin estndar (o tpica) muestral se define como


s
n
( x x )2
s = s2 = i . (24.3)
i =1
n1

La varianza se puede calcular con

var(y)

## [1] 274136

y la desviacin estndar la obtenemos con

sd(y)

## [1] 523.58

24.3.5 Rango
El mnimo y el mximo lo podemos obtener con

range(y)

## [1] 0.1974448 2393.4090000

o bien con

min(y)

## [1] 0.1974448

max(y)

## [1] 2393.409

El rango, esto es, el mximo valor menos el mnimo valor lo pode-


mos obtener con

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

24.3.6 Rango intercuartlico


Una medida ms robusta que el rango es el rango intercuartlico.
Se define como la diferencia entre los percentiles de orden 0,75 y 0,25,
es decir, el cuartil superior menos el cuartil inferior. Se puede obtener
con

IQR(y)

## [1] 107.87

24.3.7 La funcin summary


Es una funcin que nos proporciona una descripcin bsica de los
datos. En concreto, nos da el mnimo, el primer cuartil, la media, la
mediana, el tercer cuartil y el mximo.

summary(y)

## Min. 1st Qu. Median Mean 3rd Qu.


## 0.1974 0.9310 9.0680 199.2000 108.8000
## Max.
## 2393.0000

Sin duda, es la opcin ms simple para obtener una descripcin


rpida de los datos.

24.4 MAD

Tenemos unos datos x1 , . . . , xn . Supongamos que m es una mediana


de estos datos. Consideremos los nuevos datos | xi m| con i =
1, . . . , n, es decir, consideramos el valor absoluto de la diferencia entre
cada xi y la mediana. El valor de MAD es la mediana de las valores
| xi m| con i = 1, . . . , n, esto es, la mediana de las desviaciones
absolutas respecto de la mediana de las observaciones.

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.

123.34 78.23 89.6 1.2

Incorporar estas nuevas observaciones a los datos originales y


calcular las descriptivas numricas anteriores sobre los nuevos
datos. Indicar cules de ellas varan y cules no justificando la
respuesta.

24.6 Descripciones grficas de los datos

En esta seccin pretendemos ver algunas de las descripciones


grficas para variables numricas y categricas.

24.6.1 Aadimos variables y seleccionamos casos o variables


Vamos a aadir ms informacin en nuestro banco de datos. Se-
guimos con las concentraciones de nitritos del ejemplo ??. En concre-
to se sabe que las muestras de agua se tomaron en dos localizaciones
de la Albufera distintas. Las primeras 8 muestras se tomaron en el
puerto de Catarroja y las 6 ltimas muestras se tomaron en El Pal-
mar. Nos fijamos ahora en las cepas utilizadas en el estudio tamida-
ta::yeastgrowthRA.

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

simple son los conteos o frecuencias absolutas. Contamos el nmero de


veces que se repiten cada una de las categoras. Tendremos el nmero
de datos que se ha observado en cada zona. Los obtenemos de un
modo simple con la funcin table.

table(z)

## z
## S288C W303
## 12 9

Si dividimos las frecuencias absolutas por el nmero total de datos


tenemos las frecuencias relativas. Por ejemplo, con

prop.table(table(z))

## z
## S288C W303
## 0.5714286 0.4285714

O, de otro modo, si sumamos la tabla nos da el total de casos

sum(table(z))

## [1] 21

y podemos obtener las frecuencias relativas dividiendo los conteos


o frecuencias absolutas por esta suma.

table(z)/sum(table(z))

## z
## S288C W303
## 0.5714286 0.4285714
12.5

Las frecuencias absolutas y relativas las podemos representar gr-


10.0
ficamente con un diagrama de barras. Bien las frecuencias absolutas
(figura 24.1) con el siguiente cdigo 7.5
count

library(ggplot2) 5.0

df0 = data.frame(z)
ggplot(df0,aes(x = z)) + geom_bar() 2.5

0.0

o relativas. Como dibujo es el mismo y solamente nos cambia la S288C


strain
W303

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 }]

y lo subdivimos en un nmero de subintervalos con la misma longi-


tud. A estos subintervalos se les suele llamar clases. Supongamos que
elegimos k clases. Entonces los subintervalos que consideramos son

[ 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

Si no le indicamos nada el programa decide el nmero de clases o


subintervalos (figura 24.2). 10.0

df0 = data.frame(y) 7.5

ggplot(df0,aes(x=y))+geom_histogram()
count

5.0

2.5

24.6.4 Diagramas de cajas


0.0
Es un dibujo basado en los cuartiles fundamentalmente. 3 La idea 0 500 1000 1500 2000 2500
y
es representar una caja como la parte que ms destaca en el dibujo.
Figura 24.2: Histograma sin elegir
Dentro de la caja se representa con una lnea (algo ms gruesa ha- nmero de clases.
bitualmente) la mediana. Los extremos de la caja coinciden con los 3
Una buena explica-
cin se puede consultar en
percentiles del 25 % y del 75 %. La longitud de la caja es la diferencia
http://en.wikipedia.org/wiki/Box_plot.
de estos percentiles, es decir, el rango intercuartlico. La caja muestra
la distribucin de la mitad de los datos, la mitad de los datos que
estn centrados.
Se le aaden unos bigotes que salen de la caja. Son unas lneas que
describen la variabilidad de los datos que estn en los extremos. Hay
456 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

varias opciones para elegir el punto al que llegan los bigotes. Entre
otras opciones las dos ms habituales son:

1. Que lleguen al mnimo y al mximo de los datos.

2. Que lleguen al mnimo y al mximo de los datos que estn en


el intervalo que tiene por extremo inferior el percentil del 25 %
menos 1.5 veces el rango intercuartlico y por extremo superior el
percentil del 75 % mas 1.5 veces el rango intercuartlico. Este valor
de 1.5 obviamente podemos modificarlo.

Supongamos que nos planteamos representar un diagrama de cajas


de toda la muestra. En la figura 24.3 tenemos el resultado.

df0 = data.frame(y)
qplot(t(y),geom="boxplot")
ggplot(df0,aes(y,group = z)) + geom_boxplot()
Figura 24.3: Diagrama de cajas.

24.6.5 Estimadores kernel de la densidad

Es conveniente consultar http://en.wikipedia.org/wiki/Kernel_


density_estimation. Supongamos x1 , . . . , xm los valores observados
(de expresin en este caso) el estimador kernel de la densidad en
cada punto x se calcula utilizando la siguiente expresin
n
x x
 
1
f( x ) = nh
K i
h
,
i

donde la funcin K es no negativa y verifica


Z +
K (u)du = 1,

y
K (u) = K (u),

es decir, es simtrica respecto del origen. Una funcin K que se suele


utilizar es la gaussiana dada por

1 1 2
K (u) = e 2 u .
2

Otros ejemplos de funciones kernel que podemos usar las podemos


ver en http://en.wikipedia.org/wiki/Kernel_%28statistics%29.
En la figura 24.4 aparece un estimador kernel de la densidad utili-
zando una funcin kernel gaussiana.
estadstica descriptiva 457

df = data.frame(y) 0.006

ggplot(df,aes(x=y)) + geom_density()

0.004

24.6.6 Buscando datos anmalos

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

0 500 1000 1500 2000 2500


tualmente utilizadas. En la primera utilizamos media y desviacin y

estndar. En la segunda utilizamos cuartiles. Figura 24.4: Estimador kernel de la


funcin de densidad.
La primera es la que ms tradicin tiene. Dados los datos calcula- 4
La expresin inglesa es outlier.
mos su media y desviacin tpica muestrales: x y s. Se entiende por
dato anmalo aqul que est fuera del intervalo

[ x 3s, x 3s],

es decir, que o bien es extremo porque es menor que x 3s o bien es


extremo porque es mayor que x + 3s. Tenemos datos anmalos en
este sentido en y?

y[y < mean(y) - 3 * sd(y)]

## named numeric(0)

y[y > mean(y) + 3 * sd(y)]

## ra31
## 2393.409

Vemos que detectamos uno de ellos.


El segundo procedimiento utiliza los cuartiles. Denotemos por
q25 y q75 los percentiles de orden 25 % y 75 %, esto es, los cuartiles
inferior y superior. El rango intercuartlico sera

IQR = q75 q25 .

La segunda forma de considerar un dato como extremo es considerar


que lo es si est fuera del intervalo

[q25 1,5 IQR, q75 + 1,5 IQR].

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

(lw = quantile(y,probs=0.25) - 1.5 * IQR(y))

## 25%
## -160.874

(up = quantile(y,probs=0.75) + 1.5 * IQR(y))

## 75%
## 270.606

Y veamos si hay puntos extremos por abajo

y[y < lw]

## named numeric(0)

Detecta el punto aadido por nosotros. Y por arriba.

y[y > up]

## ra7 ra8 ra10 ra31


## 349.083 303.523 564.436 2393.409

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?

Ej. 21 Consideramos los datos del ejercicio 19. La muestra inicial


la denotamos por x mientras que los datos ampliados los denotamos
estadstica descriptiva 459

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

4.Representad las dos funciones de distribucin en un mismo grfi-


co.
25
Probabilidad

25.1 Experimento, suceso y probabilidad

Nos movemos constantemente en situaciones en que no podemos


predecir qu va a ocurrir.1 Realizamos un viaje en coche entre dos 1
Lo cual no es de nuestro agrado. Pero
ciudades dadas. El tiempo que tardamos en realizar el viaje depende la vida es as.

de muchos factores que hacen incierto el resultado. Nos sometemos


a una operacin quirrgica. El resultado tambin es incierto. Quizs
los ejemplos ms simples y, por ello, los que se suelen utilizar estn
asociados con juegos de azar. Lanzamos un dado, el resultado que
obtenemos no lo podemos predecir. Y el nmero de ejemplos es infi-
nito. Nos encontramos en situaciones en donde no podemos predecir
lo que va a ocurrir.

Experimento Estas situaciones son lo que llamamos experimentos. Da-


do un conjunto de condiciones no podemos predecir el resultado.
Los experimentos ms simples de analizar suelen estar ligados a
juegos de azar.

1. Un experimento puede ser lanzar una moneda en donde no


podemos predecir si el resultado va a ser que sale una cara o
bien que sale una cruz.
2. El experimento puede ser lanzar un dado. Aqu tenemos seis
posibles resultados (cada una de las caras del dado). Tambin
es un experimento con resultado incierto si jugamos a la lote-
ra. Aqu el resultado ser el nmero que sale premiado en un
sorteo.

Espacio muestral En estos ejemplos sabemos qu cosas pueden pa-


sar, el conjunto de posibles resultados al que se le llama espacio
muestral y se suele denotar con la letra . Sin embargo, cuando
realizamos el experimento no sabemos exactamente qu va a pa-
sar. No sabemos qu resultado entre los posibles se va a producir
exactamente.
462 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

En el experimento consistente en lanzar una moneda tenemos dos


posibles resultados: el resultado cara y el resultado cruz. Por ello
podemos denotar el espacio muestral como

= {cara, cruz}.

Si lanzamos el dado podramos representar el espacio muestral


como
= {1, 2, 3, 4, 5, 6},

donde el nmero 2 significa que cuando lanzamos el dado sale el


nmero 2 y as sucesivamente.
En una lotera en la que se juegan 15000 nmeros los posibles
resultados son cada uno de estos nmeros. Por tanto, el espacio
muestral sera
= {1, 2, . . . , 15000}.

Suceso aleatorio Se llama suceso aleatorio a cualquier conjunto de


resultados. Por ejemplo, si lanzamos un dado, un suceso puede
ser saber si obtenemos un nmero par. Este suceso es el conjunto
formado por tres resultados. Lo representamos como

A = {2, 4, 6}.

Nos puede interesar saber si el nmero que obtenemos es un valor


mayor o igual a 4. Este es el suceso

A = {4, 5, 6}.

Dado un suceso que nos interesa nuestro problema es saber cmo


de probable es que se produzca. Y conocer esto antes de realizar el
experimento.

Probabilidad Consideremos el experimento en que lanzamos una


moneda. Conocemos el conjunto de resultados que se pueden
producir, el espacio muestral: = {1, 2, . . . , 6}. Nos planteamos
la siguiente pregunta: Qu probabilidad tengo de obtener un
nmero par? Si el dado est bien construido no esperamos que un
resultado ocurra con ms frecuencia que otro. No esperamos que
un resultado sea ms probable que otro. Estamos usando la palabra
probabilidad en su uso del lenguaje comn. El trmino se usa de un
modo impreciso pero comprensible por todos. Diramos que los
resultados son equiprobables o que tienen la misma probabilidad.
En un experimento no queremos saber qu va a pasar. No tiene
mucho sentido plantearnos esto porque es aleatorio sino que nos
conformamos con saber la probabilidad de lo que puede pasar. En el
probabilidad 463

ejemplo del dado parece razonable decir que la probabilidad de un


nmero par sera
3
P(Obtenemos un nmero par) = P({2, 4, 6}) = .
6
Por qu? Si todos los resultados son equiprobables entonces la
probabilidad parece razonable considerar que sera el nmero de
resultados que corresponden con salir un nmero par dividido por
el nmero de resultados que se pueden producir. En resumen, el
nmero de resultados que son favorables a lo que me interesa (que
salga un nmero par) dividido por el nmero total de resulta-
dos. En el mismo experimento: qu probabilidad tenemos de un
nmero mayor o igual a 4?

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.

Tenemos en R una funcin que nos sirve para elegir al azar de un


grupo de elementos previamente definidos y de un modo equipro-
bable entre los posibles resultados del experimento. Es la funcin
sample.

Ejemplo 32 (Lanzamos una moneda muchas veces). Veamos cmo


lanzar una moneda con R. Le decimos cul es el espacio muestral

Omega = c("cara","cruz")

y luego elegimos uno al azar en el espacio muestral.

sample(Omega,1)

## [1] "cruz"

Volvamos a lanzar la moneda.

sample(Omega,1)

## [1] "cara"

Y una tercera vez.


464 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

sample(Omega,1)

## [1] "cara"

De continuar iramos obteniendo una serie de resultados cara o cruz.


Lancemos 30 veces la moneda y veamos qu pasa.

sample(Omega,30,replace=TRUE)

## [1] "cruz" "cruz" "cruz" "cara" "cruz" "cara"


## [7] "cruz" "cara" "cara" "cara" "cara" "cruz"
## [13] "cruz" "cruz" "cara" "cruz" "cruz" "cara"
## [19] "cruz" "cruz" "cara" "cruz" "cara" "cara"
## [25] "cruz" "cruz" "cruz" "cruz" "cara" "cruz"

Y otras 30 veces.

sample(Omega,30,replace=TRUE)

## [1] "cara" "cara" "cara" "cara" "cara" "cruz"


## [7] "cara" "cruz" "cruz" "cruz" "cara" "cruz"
## [13] "cara" "cruz" "cara" "cruz" "cruz" "cara"
## [19] "cruz" "cruz" "cara" "cara" "cara" "cruz"
## [25] "cruz" "cruz" "cara" "cruz" "cara" "cara"

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

Si dividimos por el total de lanzamientos tenemos la frecuencia relativa de


veces que nos ha salido cada uno de los dos posibles resultados. En nuestro
caso tenemos las siguientes frecuencias relativas observadas:

table(x) / 30

## x
## cara cruz
## 0.5333333 0.4666667

Vamos a lanzar 100 veces la moneda y calculamos las frecuencias relati-


vas.
probabilidad 465

x = sample(Omega,100,replace=TRUE)
table(x) / 100

## x
## cara cruz
## 0.52 0.48

Y por qu no lanzar la moneda 1000 veces?

x = sample(Omega,1000,replace=TRUE)
table(x) / 1000

## x
## cara cruz
## 0.522 0.478

Y para acabar con la experiencia vamos a lanzarla 100000 veces.

x = sample(Omega,100000,replace=TRUE)
table(x) / 100000

## x
## cara cruz
## 0.49986 0.50014

Es claro que conforme repetimos el experimento y observamos la frecuen-


cia relativa de veces que ocurre cada resultado nos acercamos cada vez ms al 0.52

valor 0,5 para cada uno de los posibles resultados.


En la figura 25.1 representamos en el eje de abscisas el nmero de veces
Frecuencia relativa de cara

que lanzamos la moneda y en ordenadas la frecuencia relativa de veces que se 0.50

ha observado cara. Podemos ver cmo las frecuencias relativas de aparicin


de cara van aprximandose al valor 0,5.
Supongamos que nos fijamos en la frecuencia relativa de aparicin de las 0.48

cruces. En la figura 25.2 representamos en abscisas el nmero de lanzamien-


tos y en ordenadas la frecuencia relativa de aparicin de cruces. Vemos cmo
0 25000 50000 75000 100000
se estabiliza la frecuencia alrededor del valor 0,5. Lanzamientos

Figura 25.1: Frecuencias relativas


Ejemplo 33 (Lanzamiento de un dado). Cmo lanzamos un dado con de aparicin de cara en sucesivos
R? Pues la funcin sample es adecuada. Empezamos definiendo el espacio lanzamientos de una moneda correcta.

muestral.

(Omega = 1:6)

## [1] 1 2 3 4 5 6

Y ahora lanzamos el dado.

Figura 25.2: Frecuencias relativas


de aparicin de cruz en sucesivos
lanzamientos de una moneda correcta.
466 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

sample(Omega,1)

## [1] 3

O bien lo lanzamos 20 veces.

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

Esperamos que cuando lo lanzamos un gran nmero de veces la frecuen-


cia de veces que ocurre cada resultado se aproxime a 16 .

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

Como as podemos comprobar.

En este tipo de experimentos con resultados equiprobables la


probabilidad de cualquier suceso A viene dada por el cociente entre
el nmero de resultados que tiene A (a los que se suele llamar casos
favorables a la ocurrencia de A) y el nmero total de resultados o casos
posibles.
Si denotamos el cardinal o nmero de elementos de A con | A|
entonces, cuando los resultados son equiprobables, podemos definir
la probabilidad del suceso A como
| A| Casos favorables a que ocurra A
P( A) = = . (25.1)
|| Casos posibles
Se suele conocer como la definin de probabilidad de Laplace. Des-
cribe con precisin situaciones como las descritas asociadas a algunos
juegos de azar y algn otro caso de inters pero, desde luego, no
todos los posibles experimentos en que estamos interesados.
Observemos que, en la definicin de Laplace, si tomamos un suce-
so formado por un solo resultado entonces
1 1
P({ }) = = . (25.2)
|| Casos posibles
La probabilidad de cara es 1/2. La probabilidad de cruz tambin es
1/2. La probabilidad de un seis cuando lanzamos un dado es 1/6.
Tambin lo es la de obtener un 5. O un 4. Finalmente vemos que
1
P( A) = ||
.
A
probabilidad 467

25.1.1 Contando: variaciones, permutaciones y combinaciones


En experimentos con resultados equiprobables hay que contar
el nmero total de resultados y el nmero de casos que contiene el
suceso aleatorio de inters, esto es, hemos de contar casos favorables
y casos posibles.
Para ellos es fundamental un breve repaso de combinatoria: varia-
ciones, permutaciones y combinaciones.

Variaciones sin repeticin Supongamos que tenemos un conjunto de


n elementos (por ejemplo, el conjunto {1, . . . , n} y pretendemos
saber cuntas secuencias ordenadas de k elementos (con k < n)
podemos formar. Para entender el problema supongamos que
n = 3 y k = 2. Entonces las posibles secuencias seran

12 21 13 31 23 32

Tenemos seis secuencias porque consideramos distintas 12 y 21.


Cmo contarlas sin enumerarlas todas ellas? El razonamiento es
sencillo. Para la primera posicin tenemos 3 posibilidades. Una
vez elegido el nmero que ocupa la primera posicin nos quedan 2
posibilidades para el segundo. En total 3 2.
En general, si consideramos n y k tenemos n posibilidades para el
primero. Dada la eleccin nos quedan (n 1) elecciones para el
segundo. Dadas las dos primeras elecciones nos quedan (n 2)
elecciones para el tercero. Para la ltima posicin nos quedarn
(n k + 1) posibles elecciones. En total tendremos

n ( n 1) . . . ( n k + 1).

Esto recibe el nombre de variaciones sin repeticin.

Permutaciones De cuntas maneras podemos ordenar n elementos


distintos? Podemos seguir con el razonamiento del prrafo ante-
rior. Cuando ordenamos n elementos tenemos que elegir el prime-
ro de ellos, con n posibles elementos. Una vez tenemos el primero,
para el segundo tenemos n 1 y as sucesivamente. Podemos ver
que tenemos variaciones sin repeticin donde n = k. Por tanto el
nmero total de permutaciones es

n! = n (n 1) . . . 1.

Combinaciones Cuntos conjuntos distintos de k elementos podemos


formar con un total de n? Estamos en una situacin similar a las
variaciones sin repeticin salvo que no queremos que intervenga el
orden. Por ejemplo, las secuencias
468 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

12 21

son distintas como secuencias. Sin embargo, los conjuntos

{1,2} {2,1}

son el mismo. Una vez hemos elegido los elementos de un conjun-


to (por ejemplo, los elementos 1 y 2) hemos de plantearnos cuntas
secuencias ordenadas podemos formar, 2! en el ejemplo. En resu-
men, de un conjunto de k elementos podemos formar k! secuencias
(ordenadas) distintas. Tenemos n elementos. Con ellos podemos
formar n (n 1) . . . (n k + 1) secuencias ordenadas. Pe-
ro cada k! de estas secuencias tenemos los mismos elementos. En
resumen, el nmero de conjuntos distintos de k elementos que
podemos formar con n elementos distintos es
n ( n 1) . . . ( n k + 1)
 
n
= .
k k!
Fcilmente podemos comprobar que
 
n n!
= .
k k!(n k)!
El nmero (nk) recibe el nombre de combinaciones de n elementos
tomados de k en k.
Ejemplo 34 (Factorial y combinaciones). Dado un valor de n, por ejem-
plo, n = 10 podemos obtener el valor de 10! con

factorial(10)

## [1] 3628800

Las combinaciones de n elementos tomados de k en k para n = 10 y k = 5


las obtenemos con

choose(10,5)

## [1] 252

Obviamente estamos eligiendo 5 elementos de un total de 10. De ah el


nombre de la funcin.
Ejemplo 35 (Pquer). Supongamos el pquer cerrado sin comodines. Nos
planteamos la probabilidad de que nos sirvan en una mano exactamente una
pareja. Estamos en una situacin de resultados equiprobables. Los resultados
posibles son todos los posibles subconjuntos de 5 elementos del total de 52
cartas. Por tanto, el nmero de manos distintas ser
 
52
.
5
probabilidad 469

Contemos ahora el nmero de manos que contienen exactamente una pareja


(y no dos parejas o un tro). Vamos contando. Primero elegimos el nmero
del cual formamos la pareja. Tenemos 13 posibilidades. Una vez elegido el
palo tenemos cuatro cartas con el mismo nmero, por tanto, (42) posibles
parejas con ese nmero. Ahora hemos de elegir los otros tres nmeros que
nos aparecen en la mano. Tenemos 12 nmero disponibles (quitamos el que
hemos utilizado para formar la pareja) y elegimos tres nmeros con un total
de (123 ) posibilidades. Pero una vez elegidos los nmeros tenemos cuatro
cartas de cada nmero. Por lo tanto, por cada eleccin de nmeros tenemos
43 . En total como casos favorables nos encontramos con 13(42)(12 3
3 )4 casos
favorables. La probabilidad buscada es

13(42)(12
3 )4
3
.
(52
5)

La podemos calcular con R.

(casosfavorables = 13 * choose(4,2) * choose(12,3) * 4^3)

## [1] 1098240

(casosposibles = choose(52,5))

## [1] 2598960

casosfavorables / casosposibles

## [1] 0.422569

Tenemos una probabilidad de 2.366.


Esto es como se debe de hacer. Y ahora como no se debe de hacer. Vamos a
jugar con R. Empezamos definido las cartas que tenemos

(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

Y ahora extraemos al azar una mano.

(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

Y ver cuntos conteos me devuelve.

length(conteosmano)

## [1] 4

Si me devuelve 5 quiere decir que no se repite ningn nmero. Si me


devuelve 4 quiere decir que hay una pareja exactamente. Contemos pues el
nmero de veces que se produce esta situacin y repitamos la experiencia
muchas veces. La frecuencia relativa de xitos nos ha de dar la probabilidad.
Un poco de cdigo ms complicado de R.

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

25.1.2 Un poco de teora


2 2
Esta seccin incluye algo de teora. Su
En lo anterior hemos visto ejemplos de experimentos aleatorios lectura no es muy necesaria para seguir
el curso aunque s que es conveniente.
donde todos los resultados son equiprobables y por ello la probabi- No hay nada tan prctico como la
lidad de cada suceso no era ms que el nmero de elementos que teora.

contiene (casos favorables) dividido por el total de resultados posi-


bles (casos posibles). Este es el nico caso que nos encontramos de
experimento aleatorio? Desde luego que no. De hecho, una probabi-
lidad es cualquier funcin que a los sucesos les da valores entre 0 y 1
verificando algunos principios (o axiomas) razonables.

Definition 3 (Probabilidad). Una funcin de conjunto, P, definida sobre


los sucesos es una probabilidad si verifica

1. P( A) 0 para todo suceso A.

2. P() = 1.
probabilidad 471

3. P es aditiva, es decir, si { Ai }i=1,...,n son sucesos disjuntos entonces


n n
P ( A i ).
[
P( Ai ) =
i =1 i =1

A partir de la definicin anterior se deducen algunas propiedades


muy tiles.

1. La probabilidad del vaco es cero: P() = 0.

2. Si tenemos sucesos tales que A B entonces P( A) P( B).

3. Si los sucesos A1 , . . . , An no son disjuntos entonces


!
n
[
P Ai =
i =1
n
P( Ai ) P( Ai A j ) + . . . + (1)n+1 P( A1 . . . A(25.3)
n ).
i =1 i< j

En particular si tenemos dos sucesos

P ( A1 A2 ) = P ( A1 ) + P ( A2 ) P ( A1 A2 ). (25.4)

4. A partir del punto anterior es inmediato que

P ( A c ) = 1 P ( A ). (25.5)

5. Dados los sucesos A1 , . . . , An , la relacin existente entre la pro-


babilidad de la unin de los Ai y la probabilidad de cada uno de
ellos es la siguiente:
!
n n
P ( A i ).
[
P Ai
i =1 i =1

25.2 Ejercicios

Ejercicio 8. Seis personas se sientan a comer en un restaurante. Hay seis


sillas alrededor de la mesa.

1. De cuntas formas distintas pueden sentarse?

2. Supongamos que las sillas estn enfrentadas, tres en un lado de la mesa y


otras tres al otro lado. Adems las seis personas son tres parejas que han
quedado a cenar. Siguiendo una antigua costumbre se sientan a un lado
los hombres y al otro lado las mujeres. De cuntas formas distintas se
pueden sentar?

Ejercicio 9. Supongamos el pquer cerrado sin comodines. Calcular la


probabilidad de obtener un pquer cuando nos dan una mano.
472 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Ejercicio 10. Consideremos el experimento aleatorio consistente en lanzar


dos veces un dado. Se pide:

1. Qu probabilidad tenemos de obtener dos veces el nmero 6?

2. Y de obtener el par de valores 1 y 5?

3. Qu probabilidad tenemos de que coincidan el primer y el segundo


resultado, esto es, de que el primer lanzamiento sea un uno y el segundo
tambin o de que el primer lanzamiento sea un dos y el segundo tambin,
etc?

4. Qu probabilidad tenemos de que la suma de los dos valores sea 7? Y


de que la suma de los dos valores sea mayor o igual que 7? Y de que sea
mayor que 7?

25.3 Variable aleatoria

Supongamos el experimento consistente en elegir al azar o aleato-


riamente a una individuo de la Comunidad Valenciana. Obviamente
el espacio muestral est formado por los distintos individuos. Si los
numeramos tenemos = {i }iN=i donde N es el nmero total de per-
sonas de la Comunidad. Eleccin al azar supone que cada individuo
tiene la misma probabilidad de ser elegido. Por tanto tenemos

1
P({i }) = .
N

El resultado mismo no suele tener un inters especial para nosotros.


Seleccionamos aleatoriamente estas personas porque tenemos inters
en sus ingresos, en el nmero de personas que conviven con el o ella,
si est casada o es soltera, su glucosa o tensin arterial. Son ejem-
plos de valores que nos pueden interesar del individuo seleccionado
dependiendo de que estemos realizando un estudio de tipo socio eco-
nmico o bien un estudio de salud. Por ello nuestro inters no est en
el individuo que obtenemos cuando seleccionamos a una persona
al azar sino que nuestro inters es un valor asociado a que denota-
mos por X ( ) y que puede ser su tensin arterial. Lo que es aleatorio
es porque lo seleccionamos aleatoriamente. Una vez tenemos el
valor X ( ) = x viene dado. Elegimos al azar a una persona, una vez
elegida su edad no es aleatoria, es la que tiene. Elegimos al azar una
muestra de agua en una planta de tratamiento de aguas residuales.
Luego determinamos la demanda qumica de oxgeno. A la funcin
que asocia a un resultado un valor numrico se le llama variable
probabilidad 473

aleatoria. Lo podemos denotar como

X: R
X ( ) = x.

25.3.1 Variable aleatoria discreta


Es una variable aleatoria que toma un nmero finito de valores
o bien toma un nmero infinito de posibles valores que podemos
numerar. 3 3
Para ser rigurosos una variable dis-
Un ejemplo muy simple y habitual es la edad de un individuo creta puede tomar tambin un nmero
infinito numerable de valores. En fin,
seleccionado al azar. La edad suele cuantificarse con valores enteros. detalles tcnicos a los que no hay que
Decimos que una persona tiene 24 aos o que tiene 25 aos. Por lo prestar demasiado inters en un curso
como este.
tanto es un valor entero. Si cuantificamos la edad en aos entonces
los valores posibles de la variable aleatoria son 0, 1, 2, . . . . En cual-
quier caso un nmero finito de posibles valores.
Otro ejemplo puede ser el nmero de organismos que observamos
en una placa al microscopio, el nmero de huevos en una buitrera, el
nmero de pxeles defectuosos en un monitor de ordenador, el nme-
ro de rboles dentro de un quadrat en un muestreo espacial. Todos
son ejemplos de variable aleatoria discreta. Como vemos habitual-
mente son valores que resultan de contar. Es lo ms frecuente pero no
siempre es as.
Supongamos que denotamos por D = { x1 , x2 , . . . , } el conjunto de
valores posibles para la variable. Las probabilidades que hemos de
conocer son
P ( X = x i ),

es decir, la probabilidad de que la variable tome cada uno de sus va-


lores posibles. Estas probabilidades P( X = xi ) con i = 1, . . . , n reciben
el nombre de funcin de probabilidad de la variable aleatoria X.
Cualquier otra probabilidad que nos interese la podemos obtener a
partir de la funcin de probabilidad.
Por ejemplo, supongamos D = {0, 1, . . . , 10} y la funcin de
probabilidad aparece en la tabla 25.1.

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

siendo A cualquier conjunto (por ejemplo, un intervalo).

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.

1. Indicar qu valores puede tomar la variable X.

2. Obtener la funcin de probabilidad de la variable X.

3. Obtener las probabilidades siguientes: P( X 1), P( X 2), P( X >


2), P ( X 4), P (4 X 6), P (4 < X 6), P (4 X < 6).

25.3.3 Variable aleatoria continua


Consideremos el siguiente experimento. Cogemos una muestra de
panga vietnamita y medimos la concentracin de mercurio en dicha
muestra. El resultado es la muestra que hemos tomado. De esta
muestra nos interesa solamente la concentracin de mercurio. Nos
interesa el valor asociado a la muestra y no la muestra misma. Por
ello podemos definir X ( ) = x donde x es la concentracin medida
de mercurio. El valor aleatorio que observamos los denotamos por
X, la variable aleatoria. Una vez hemos observado el valor, esto es,
una vez se ha realizado la determinacin de mercurio el valor ya no
es aleatorio. Es un valor dado, por ejemplo, una concentracin de
0,5 miligramos por kilogramo. Este valor ya no lo denotamos con la
letra mayscula sino con la letra en minscula, x. Qu nos interesa
conocer sobre estos valores aleatorios? Posiblemente muchas cosas
probabilidad 475

pero lo ms bsico (y de lo cual se deduce cualquier otra) es conocer


la probabilidad que tenemos de que el valor que observemos est
entre dos nmeros. Qu probabilidad tenemos de que la muestra
que analicemos de un valor entre 0,3 y 0,6? Qu probabilidad hay
de observar un valor entre 0,4 y 0,8? O bien, si una cierta normativa
afirma que un valor por encima de 0,5 no se permite entonces parece
natural plantearse: cul es la probabilidad de observar una muestra
por encima de este valor? O por el contrario: con qu frecuencia
observamos muestras que no alcance el valor 0,5? Las probabilidades
que acabamos de indicar se denotan como: P(0,3 X 0,6), P(0,4
X 0,8), P( X 0,5) y P( X 0,5). Sin tener que referirnos a
valores concretos podemos denotar de un modo genrico todos los
casos anteriores como P( a X b) donde a y b toman los valores
que queramos. Cuando consideramos P(0,3 X 0,6) estamos
tomando a = 0,3 y b = 0,6. Tambin P( X 0,5) tiene esta forma ya
que estamos tomando a0 = ,5 y b = +. Obviamente, P( X 0,5)
corresponde con a = y b = 0,5.
En resumen, cuando trabajamos con una variable aleatoria lo fun-
damental es conocer las probabilidades P( a X b) donde a y b
son nmeros reales o a = o b = +.
Cuando una variable es continua entonces la probabilidad anterior se
puede calcular como
Z b
P( a < X b) = f ( x )dx.
a

La funcin f recibe el nombre de funcin de densidad (de probabili-


dad) de la variable X.
De hecho se tiene que
Z b
P( a < X b) = P( a X < b) = P( a X b) = f ( x )dx.
a

Ejemplo 36 (Uniforme en el intervalo unitario). Una variable aleatoria


uniforme en el intervalo [0, 1] es un experimento que ya hemos visto. En
las calculadoras suele haber una funcin conocida como rand que cuando la
usamos nos devuelve un valor entre 0 y 1. La idea es que es imprevisible el
100%
valor y no esperamos que aparezca alrededor de nada. Simplemente dentro
del intervalo. La funcin de densidad viene dada por
75%
(
1 si 0x1
f (x) =
0 si x < 0 x > 1. 50%

La podemos ver representada en la figura 25.3.


Supongamos que tomamos 0 a b 1 entonces 25%

Z b Z b
P( a X b) = f ( x )dx = dx = b a, 0%

a a 0.0 0.4 0.8 1.2

Figura 25.3: Funcin de densidad de


una variable uniforme en el intervalo
[0, 1].
476 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

es decir, la probabilidad de que la variable est en el intervalo [ a, b] depende


solamente de la longitud del intervalo y no de dnde est colocado dentro del
intervalo [0, 1].
Podemos generar un valor aleatorio que se comporte como una uniforme
en [0, 1]? Simplemente con

runif(1,min=0,max=1)

## [1] 0.6736497

De hecho, podemos simular el nmero de puntos que queramos. Por


ejemplo, generemos 20 valores.4 4
Ms no que ocupa demasiado espacio.
En cualquier caso podemos probar a
cambiar el valor 20 por el nmero de
runif(20,min=0,max=1)
valores que nos apetezca simular.

## [1] 0.4254709 0.1286097 0.8850760 0.6972555


## [5] 0.3407570 0.2811757 0.7881495 0.3535969
## [9] 0.3210780 0.8187089 0.6592973 0.2631164
## [13] 0.4046266 0.4530579 0.7039735 0.2226044
## [17] 0.6317559 0.4801175 0.4283014 0.0634963

Ejemplo 37. Tambin podemos considerar la uniforme en un intervalo


arbitrario [ a, b] donde a y b son nmeros arbitrarios siendo a menor que b.
La funcin de densidad de la variable es
30%
(
1
b a si axb
f (x) =
0 en otro caso.
20%

Supongamos a = 2 y b = 5. La funcin de densidad la podemos ver en la


figura 25.4. 10%

Adems, si consideramos un par de puntos c y d tales que a c d b


entonces:
Z d Z d 0%

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

3.Calcular P( X 0,5) y P( X > 0,5).


4.Determinar las siguientes probabilidades: P(0,6 < X 0,9),
P(0,6 X < 0,9) y P(0,6 X 0,9).

Ej. 24 Consideremos una variable aleatoria uniforme en el inter-


valo [0, 8]. 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)?
3.Calcular P( X 0,5) y P( X > 0,5).
4.Determinar las siguientes probabilidades: P(0,6 < X 0,9),
P(0,6 X < 0,9) y P(0,6 X 0,9).

25.3.5 Funcin de distribucin


Dada una variable aleatoria X se define la funcin de distribucin
(o funcin de distribucin acumulada) como la funcin que para
valor real x nos da la probabilidad de que la variable sea menor o
igual que este valor, es decir,

FX ( x ) = F ( x ) = P( X x ). (25.6)

Obviamente si la variable que tenemos es discreta y toma valores en


{ x1 , x2 , . . .} entonces

FX ( x ) = P ( X = x i ),
xi :xi x

es decir, sumamos la probabilidad de que la variable tome cada uno


de los valores que puede tomar y que son menores o iguales al valor
x. 0.3

Ejemplo 38. Consideramos la variable aleatoria discreta tal que su funcin

de probabilidad aparece en la tabla 25.1. Vamos a determinar la funcin de


Funcin de probabilidad

0.2

distribucin. Las probabilidades que aparecen en la tabla 25.1 aparecen repre-


sentadas en la figura ??. La funcin de distribucin la hemos representada en
la figura 25.6.
0.1

En el caso de una variable que sea continua se tiene la igualdad


Z x

FX ( x ) = f (t)dt. 0.0

0.0 2.5 5.0 7.5 10.0


x
En general se tiene la siguiente importante igualdad. Figura 25.5: Probabilidades de la tabla
25.1.
P( a < X b) = F (b) F ( a) con a b, a, b R. (25.7)

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

como la diferencia de la funcin de distribucin en los extremos.


0.8


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

25.3.6 Funcin de distribucin muestral o empirica

Tenemos una muestra de datos numricos que denotamos por


{ x1 , . . . , xn }5 Qu es la distribucin emprica de estos valores? Su- 5
En estas notas podran ser las ex-
pongamos un experimento que consiste en elegir uno de los valores presiones a nivel de sonda de un
microarray.
xi completamente al azar o, de otro modo, con la misma probabili-
dad. Sera un experimento que de un modo equiprobable produce
cada los resultados { x1 , . . . , xn }. Esta distribucin de probabilidad se
conoce como distribucin emprica y a la correspondiente funcin
de distribucin como la funcin de distribucin emprica o mues-
tral. Es, por tanto, la distribucin de probabilidad que da probabi-
lidad n1 a cada uno de los datos. De otro modo un experimento que
produce el valor xi con probabilidad 1/n. Dados los datos x1 , . . . , xn ,
la funcin de distribucin muestral se define como
|{ xi : xi x }|
Fn ( x ) = , (25.8)
n
donde | | denota el cardinal, esto es, el nmero de elementos del
conjunto. Para cada punto x consideramos el conjunto formado por
todos los datos xi que son menores o iguales que x. Contamos el
nmero de puntos en este conjunto (su cardinal) y lo dividimos por
el total de datos. En resumen, Fn ( x ) nos da la proporcin de datos
que son menores o iguales que x. Y esto lo consideramos para todos
los valores de x posibles.
ecdf(y)
Vamos a considerar dos funciones para obtener la funcin de
1.0
distribucin muestral. La primera es la funcin ecdf y podemos verla


en la figura 25.7.
0.8





0.6



Fn(x)

plot(ecdf(y))


0.4

Si queremos conocer el valor de Fn en un valor determinado, por


0.2

ejemplo para x = 37 podemos hacer


0.0

0 500 1000 1500 2000 2500

ecdf(y)(37) x

Figura 25.7: Funcin de distribucin


## [1] 0.5714286
muestral con la funcin ecdf.

o bien en 40,

ecdf(y)(40)

## [1] 0.5714286

La segunda opcin es la funcin Ecdf del paquete Harrell [2016,


Hmisc]. Aparece en la figura 25.8.
probabilidad 479

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.

1.Determinar la funcin de distribucin de la variable aleatoria X.


2.Representar de un modo manual la funcin de distribucin que
hemos determinado en el punto 1.
3.Representar la funcin de distribucin utilizando la funcin step-
fun.

Ej. 26 Supongamos una variable uniforme en el intervalo [2, 6]


que denotamos como X U (2, 6). Se pide:
1.Determinar la funcin de distribucin de la variable aleatoria X.
2.Representar grficamente la funcin de distribucin de la variable
aleatoria X.

Ej. 27 Supongamos una variable uniforme en el intervalo [2, 6]


que denotamos como X U (2, 6). Se pide:
1.Representar grficamente la funcin de distribucin utilizando las
funciones plot y punif.

25.4 Media y varianza

Una variable suele describirse de un modo simple mediante su


media y su varianza. La media nos da una idea de alrededor de qu
valor se producen los valores aleatorios de la variable mientras que
la varianza cuantifica la dispersin de estos valores alrededor de la
media.

25.4.1 Media de una variable aleatoria discreta


Ejemplo 39 (La media como lmite de medias muestrales). Supon-
gamos que tenemos una variable que puede tomar los valores {0, 9} con
probabilidades dadas en la tabla 25.2. El experimento supongamos que con-
siste en elegir al azar una vivienda en una gran poblacin (por ejemplo,
480 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Valencia) y observar el nmero de personas que habitan la vivienda. En la


fila etiquetada con x tenemos el nmero de personas y en la fila etiquetada
P( X = x ) la frecuencia de cada valor posible que asumimos conocidas.

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

Supongamos que repetimos el proceso de extraccin 100 veces.

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

Las frecuencias que observamos de cada tipo son las siguientes

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

Se parecen? En las categoras ms probables bastante. Repitamos el


proceso con 1000 muestras.

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

Vemos cmo se parecen ms las frecuencias observadas a las probabi-


lidades de cada uno de los valores. Denotemos los valores simulados por
in=1 yi
{y1 , . . . , yn }. Su media muestral ser yn = n pero

n n
y nx
yn = ni = xn
i =1 x =0

donde n x denota el nmero de veces que aparece el resultado x. Obviamente


cuando el nmero de datos que generamos va creciendo la frecuencia relativa
de veces que aparece el resultado x que viene dada por el cociente n x /n, se
va aproximando a la probabilidad P( X = x ). Por ello tendremos que
n n
nx
yn = x
n
xP(X = x).
x =0 x =0

En nuestro caso el nmero medio de personas que viven en la vivienda


vendra dada por

(mu = sum(x * probabilidades))

## [1] 2.4761

En la figura 25.9 hemos representado con una lnea horizontal cuya 2

ordenada es la media que acabamos que calcular. Luego vamos simulando


valores segn la variable discreta que acabamos de proponer. En el eje de
abscisas consideramos el nmero de valores que vamos promediando. Vemos y 1

cmo la media muestral se va aproximando al valor dado de la media.

Definition 4. Si X es una variable aleatoria discreta que toma los valores


0

{ x1 , x2 , . . .} entonces la media de X se define como 0 2500 5000 7500 10000


x

+ Figura 25.9: Medias muestrales del


EX = X = = x i P ( X = x i ). nmero de personas que habitan una
vivienda en funcin del tamao de la
i =1
muestra. La lnea horizontal punteada
Ejemplo 40. Lanzamos la moneda si sale cara la variable X vale uno y si indica la media poblacional.

sale cruz la variable X vale cero. Cul es su media?

= 1 p + 0 (1 p) = p.

25.4.2 Varianza y desviacin tpica


Definition 5 (Varianza y desviacin tpica). Si X es una variable alea-
toria discreta que toma los valores { x1 , x2 , . . .} entonces la varianza de X se
define como

+
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

Habitualmente adems de la varianza se suele utilizar para medir variabili-


dad la desviacin tpica dada por
v
q u+
= var ( X ) = t ( xi )2 P( X = xi ).
u

i =1

En variables continuas las definiciones de media y varianza son las


anlogas sustituyendo sumatorios por integrales.

Definition 6. Si X es una variable continua con funcin de densidad f


entonces la media de X se define como
Z +
EX = = x f ( x )dx

Definition 7. Si X es una variable continua con funcin de densidad f


entonces la varianza de X se define como
Z +
2
var ( X ) = = ( x )2 f ( x )dx,

mientras que la desviacin tpica de X se define como


s
Z +
X = = ( x )2 f ( x )dx.

Hemos visto antes que si vamos observando valores de una varia-


ble entonces las sucesivas medias muestrales se van aproximando a
la media poblacional. Ocurre algo similar con la varianza y con la
desviacin tpica? Por supuesto que s.

25.5 Variable Bernoulli

Empezamos con algn ejemplo que motiva esta distribucin.

1. Lanzamos una moneda y nos planteamos si sale cara (y lo llama-


mos xito) o si no sale cara (y lo llamamos fracaso). Nos fijamos
en la ocurrencia o no de un suceso: salir cara. Tenemos un espa-
cio muestral = {cara, cruz} y nos planteamos si se produce
A = {cara}.

2. Elegimos al azar a una persona en la poblacin de la Comunidad


Valenciana y nos fijamos si es diabtico (y lo consideramos xito)
o no lo es (fracaso). En este caso el espacio muestral es el conjunto
de individuos de la Comunidad y el suceso que nos interesa sera
el conjunto de individuos que son diabticos en dicha Comunidad.

Tenemos, en los ejemplos anteriores, distintos experimentos donde


nos fijamos en un suceso A y nos planteamos si ocurre o no ocurre
probabilidad 483

este suceso. Una situacin de este tipo recibe el nombre de prueba de


Bernoulli. Dada una prueba de Bernoulli consideramos la variable
aleatoria que nos indica si A se ha producido, esto es, la variable

X ( ) = 1 A ( ),

donde 1 A ( ) = 1 si A y cero en otro caso. Del experimento que


realizamos solamente nos importa saber si un determinado suceso ha
tenido lugar. De hecho, como xito es que el resultado pertenezca
al suceso A entonces la probabilidad de xito ser p = P( A).
El rango de la variable es {1, 0} donde 1 indica el xito y 0 el fra-
caso. Una variable de este tipo recibe el nombre de variable Bernoulli.
Es el ejemplo ms simple de variable aleatoria. Su funcin de proba-
bilidad sera: f X (1) = P( X = 1) = p y f X (0) = P( X = 0) = 1 p que,
de un modo conjunto, podemos representar como

P( X = x ) = p x (1 p)1 x para x = 0, 1. (25.9)

Si una variable sigue una distribucin de probabilidad se dice que es


una variable Bernoulli o que se distribuye Bernoulli y se denota

X Bi (1, p).

Ejemplo 41 (Lanzamiento de moneda correcta). La funcin de probabi-


lidad es f X (1) = P( X = 1) = 1/2 y f X (0) = P( X = 0) = 1/2.

Ejemplo 42 (Seleccin aleatoria de un individuo). Seleccionamos a un


individuo al azar en la poblacin de la Comunidad Valenciana. La funcin de
probabilidad es f X (1) = P( X = 1) = p y f X (0) = P( X = 0) = 1 p.
El valor de p nos indica la proporcin real de diabticos en la poblacin.
Habitualmente el valor de p no es conocido.

25.6 Variable binomial

Consideremos un experimento con dos posibles resultados. A uno


de ellos le llamamos xito y al otro le llamamos fracaso. Suponemos
que hay una probabilidad p de obtener un xito (donde 0 p 1)
y, por lo tanto, una probabilidad 1 p de obtener un fracaso. Un
experimento de este tipo recibe el nombre de prueba de Bernoulli.
El ejemplo ms simple, lanzamiento de una moneda donde identi-
ficamos salir cara con xito y salir cruz como fracaso. En este caso, la
probabilidad de xito es p = 0,5.
Otro ejemplo, elegimos al azar a una persona de la poblacin
espaola e identificamos xito con que la persona tenga un cierto
atributo (sea diabtico por ejemplo) y fracaso con que no tenga el
atributo. La probabilidad de xito p coincide con la proporcin que
realmente hay de diabticos en la poblacin.
484 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Repetimos n veces una prueba de Bernoulli independientemente


una de otra (lanzamos n veces una moneda) y observamos la variable
aletoria que nos da el nmero total de xitos. Una variable de este
tipo recibe el nombre de variable binomial con n pruebas y una probabili-
dad de xito p y se suele denotar como

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

Si tenemos una variable binomial X con n pruebas y una probabili-


dad de xito p, X Bi (n, p), entonces su media es
n  
n x
EX = = x p (1 p)n x = np, (25.11)
x =0
x

mientras que su varianza viene dada por


n  
2 n
var ( X ) = = ( x np)
2
p x (1 p)n x = np(1 p). (25.12)
x =0
x

Ejemplo 43 (Funcin de probabilidad de la binomial). La funcin


dbinom nos permite calcular la funcin de probabilidad de una variable
binomial. Por ejemplo, qu probabilidad tenemos de obtener 70 caras si
lanzamos 123 veces una moneda. La respuesta es

dbinom(70,size=123,prob=0.5)

## [1] 0.02230619

Ejemplo 44 (Simulacin de una variable binomial). Supongamos que


queremos lanzar una moneda 30 veces con R.6 Esto lo podemos hacer con 6
Algo no demasiado raro aunque
pueda parecerlo.
rbinom(30,size=1,prob=.5)

## [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

El uno corresponde con xito (cara) y el cero con fracaso. Si repetimos el


proceso posiblemente no obtengamos los mismos resultados.
probabilidad 485

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

Realmente nos interesa el nmero de xitos y no el orden en que se produ-


cen. Esto lo podemos hacer con

rbinom(1,size=30,prob=.5)

## [1] 16

Si lo repetimos posiblemente no obtengamos el mismo nmero de unos.

rbinom(1,size=30,prob=.5)

## [1] 16

Supongamos que queremos simular 40 veces el experimento consistente


en lanzar 30 veces una moneda y contamos en cada caso el nmero de unos.

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

Si la moneda no est bien construida y pretendemos que la cara tenga una


probabilidad de 0,6, entonces repetimos el experimento anterior con

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

Ejemplo 45 (De cmo calcular probabilidades de la distribucin


binomial). Supongamos que queremos calcular la probabilidad de obtener
23 xitos cuando realizamos 30 pruebas de Bernoulli donde la probabilidad
de xito es 0,6, es decir, pretendemos calcular para X Bi (30, 0,6) la
funcin de probabilidad en x = 23 dada por
 
30
P( X = x ) = (0,6)30 (1 0,6)3023 . (25.13)
23
486 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

dbinom(23,size=30,prob=.6)

## [1] 0.02634109

Podemos conocer las probabilidades de cada uno de los posibles resultados,


es decir, la funcin de probabilidad P( X = x ), con

dbinom(0:30,size=30,prob=.6)

## [1] 1.152922e-12 5.188147e-11 1.128422e-09


## [4] 1.579791e-08 1.599538e-07 1.247640e-06 0.15

## [7] 7.797748e-06 4.010270e-05 1.729429e-04


## [10] 6.341240e-04 1.997491e-03 5.447702e-03


## [13] 1.293829e-02 2.687184e-02 4.894513e-02 0.10

## [16] 7.831221e-02 1.101265e-01 1.360387e-01


y
## [19] 1.473752e-01 1.396186e-01 1.151854e-01
## [22] 8.227527e-02 5.048710e-02 2.634109e-02 0.05

## [25] 1.152423e-02 4.148722e-03 1.196747e-03

## [28] 2.659437e-04 4.274096e-05 4.421478e-06


## [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%

La figura 25.12 muestra la funcin de distribucin de una variable alea-


toria con distribucin binomial con n = 30 pruebas y una probabilidad de 10%

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

2.Calcular la media y varianza muestrales de los valores generados.


3.Comparar la media muestral observada con 20 0,3 y la varianza 0.75


muestral observada con 20 0,3 0,7 que corresponden con la


P(X <= x)

media y la varianza tericas. 0.50

0.25



0.00

0 10 20 30
x

Figura 25.12: Funcin de distribucin de


una binomial con n = 30 pruebas y una
probabilidad 487

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.

Ej. 29 Generamos 10000 valores con distribucin binomial con 20


pruebas y una probabilidad de xito por prueba de 0,3. Comparar la
funcin de distribucin muestral (vista en la prctica anterior) con la
funcin de distribucin terica que acabamos de ver.

Ej. 30 Consideremos una variable aleatoria con distribucin bino-


mial con 45 pruebas y una probabilidad de xito de 0,67. Se pide:

1.P( X 23).

2.P( X < 23).

3.P( X > 29).

4.P( X 29).

5.P(34 < X 45).

6.P(34 X 45).

Ej. 31 Dos especialistas en plagas vegetales difieren en su apre-


ciacin de la proporcin de palmeras afectadas por el picudo en la
Comunidad Valenciana. Uno de ellos (especialista A) afirma que un
30 % de las palmeras estn afectadas. El otro, especialista B, afirma
que es un 45 % de las palmeras. Un tercer especialista decide tomar
una muestra aleatoria simple de la poblacin total de palmeras. En
total muestrea un total de 325 palmeras y observa 133 palmeras afec-
tadas. Se pide:

1.Calcula la probabilidad de las afirmaciones de cada uno de los


especialistas.

2.Qu afirmacin es ms probable? Con cul de los dos juicios nos


quedaramos?

3.Si es cierta la afirmacin del especialista A: qu probabilidad


tenemos de observar 133 o menos?

4.Si es cierta la afirmacin del especialista B: qu probabilidad


tenemos de observar 133 o menos?

5.Se decide continuar el muestreo y observamos el estado de 145


palmeras ms de las cuales estn afectadas 56. Utilizando solamente
la nueva muestra responde a las preguntas 1, 2, 3 y 4.

6.Responder las preguntas 1, 2, 3 y 4 utilizando conjuntamente toda


la muestra.
488 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

25.7 Distribucin Poisson

Esta distribucin aparece ligada a experimentos en los que nos


interesa la ocurrencia de un determinado suceso a lo largo de un
intervalo finito de tiempo7 , verificndose las siguientes condiciones: 7
En un planteamiento ms general, el
intervalo finito de tiempo puede ser
1. la probabilidad de que el suceso ocurra en un intervalo pequeo sustituido por un subconjunto acotado
de tiempo es proporcional a la longitud del intervalo, siendo el de Rk

factor de proporcionalidad,

2. la probabilidad de que el suceso ocurra en dos o ms ocasiones en


un intervalo pequeo de tiempo es prcticamente nula.
Fenmenos como el nmero de partculas que llegan a un contador
Geiger procedentes de una fuente radiactiva, el nmero de llamadas
que llegan a una centralita telefnica durante un intervalo de tiempo,
las bombas cadas sobre la regin de Londres durante la Segunda
Guerra mundial y las bacterias que crecen en la superficie de un cul-
tivo, entre otros, pueden ser descritos mediante una variable aleatoria
Poisson.
La distribucin de Poisson de parmetro es una de las distribu-
ciones de probabilidad discretas ms conocida. Denotaremos que la
variable X sigue una distribucin de Poisson con

X Po ().

El soporte de la distribucin es DX = {0, 1, 2, 3, . . .} y su funcin de


probabilidad viene dada por
e x
f X ( x ) = P( X = x ) = , si x = 0, 1, . . . (25.14)
x!
y cero en el resto. 8 8
Es fcil comprobar que la funcin que
La funcin de distribucin tiene por expresin acabamos de considerar en 25.14 es de
probabilidad. Es no negativa y
e n + +
FX ( x ) = n!
. x
e x! = e
x
x!
= e e = 1.
n x x =0 x =0

Diremos que X es una variable Poisson de parmetro o que X sigue


una distribucin de Poisson y lo denotaremos

X Po ().

Por qu es tan importante la distribucin de Poisson en las aplica-


ciones? Posiblemente9 la razn sea que aproxima a la distribucin 9
Probablemente queda mejor en estas
binomial cuando tenemos un gran nmero de pruebas y una pe- notas

quea probabilidad de xito en cada una de ellas. Esto es hacemos


muchas pruebas pero es muy raro que tengamos un xito en una de
ellas. Por ello, a esta distribucin se le suele llamar la distribucin de
los sucesos raros.
probabilidad 489

Proposicin 2 (La distribucin de Poisson como lmite de distribu-


ciones binomiales). Sea { Xn }n1 una sucesin de variables tales que
Xn Bi (n, pn ) y lmn+ npn = entonces

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

y para n suficientemente grande,

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!

La utilidad de este resultado reside en permitir la aproximacin de


la funcin de cuanta de una binomial con n pruebas y probabilidad
de xito p, Bi (n, p), mediante la funcin de cuanta de una Poisson
con prametro = np cuando n es grande y p pequeo.

25.8 Distribuciones geomtrica y binomial negativa

25.8.1 Distribucin geomtrica


Cul es el nmero de lanzamientos de una moneda (correcta) que
hemos de realizar antes de obtener la primera cara? No prefijamos
el nmero de lanzamientos de la moneda. Solamente prefijamos que
queremos alcanzar el primer xito, la primera cara, y contamos el
nmero de lanzamientos que hemos realizado.
En general, consideremos una sucesin de pruebas Bernoulli (xi-
to o fracaso) independientes con la misma probabilidad de xito, p.
La variable aleatoria que nos interesa es el nmero de pruebas que
490 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

hemos de realizar hasta obtener el primer xito (donde no vamos a


contar el xito). La denotamos por X. Cul es su funcin de proba-
bilidad? Supongamos que denotamos por Ai el sceso consistente en
obtener xito en la prueba i-sima. Es claro que { X = 0} = A1 y

P( X = 0) = P( A1 ) = p.

En general si x > 0 tenemos


  x
P( X = x ) = P A1c ... Acx A x +1 = P( A x ) P( Aic ) = p(1 p) x ,
i =1

donde la segunda igualdad se sigue de la independencia de los suce-


sos Ai . En consecuencia, si X sigue una distribucin geomtrica con
probabilidad de xito p entonces su funcin de probabilidad viene
dada por
P( X = x ) = p(1 p) x si x = 0, 1, . . . ,

y cero en el resto.

25.8.2 Distribucin binomial negativa


10 10
En esta seccin estudiamos la distri-
Consideremos pruebas Bernoulli independientes con la misma bucin binomial negativa en el modo
en que nos resulta til cuando estudia-
probabilidad de xito, p, en cada una de ellas. Fijamos el nmero de mos expresin diferencial utilizando
fracasos que queremos obtener, por ejemplo, r fracasos. Nos plan- conteos.
teamos el nmero de xitos hasta obtener el r-ximo fracaso. La
funcin de probabilidad vendr dada por

k+r1 k
 
P( X = k) = p (1 p )r (25.15)
k

con k = 0, 1, . . . donde El nombre de binomial negativa es consecuen-


cia de

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

Aunque perdemos la interpretacin podemos utilizar un valor


de r que sea un nmero positivo cualquiera, no necesariamen-
te un nmero entero. Recordemos que la funcin gamma de Eu-
ler generaliza el concepto de nmero factorial. La funcin gam-
R +
ma se define como (r ) = 0 xr e x dx. Y, en particular, se tiene
que (r ) = (r 1)(r 1). Si r es un entero positivo tendremos
(r ) = (r 1)!. Teniendo en cuenta esto es natural la generalizacin.

(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+

Si ahora definimos el parmetro = 1/r entonces la forma que


adopta la funcin de probabilidad es
k  1/
(k + 1/)

1
P( X = k) = . (25.21)
k!(1/) + 1/ 1 +

25.9 Distribucin normal

Definition 8 (Variable normal). Una variable aleatoria X se dice que


sigue una distribucin normal con media y varianza 2 (o, simplemente,
que es una variable aleatoria normal) y se denota con X N (, 2 )11 si su 11
Tambin se denota con frecuencia
funcin de densidad viene dada por X N (, ), es decir, se indica
la media y la desviacin tpica o
estndar .
1 ( x )2
12
f (x) = e 2 (25.22)
2

De otro modo, si tomamos dos valores arbitrarios a y b con a b entonces


Z b
P( a X b) = f ( x )dx.
a

En esta seccin asumimos siempre que la variable aleatoria si-


gue una distribucin normal con media y con varianza 2 , X
N (, 2 ).
En la figura 25.11 aparece un ejemplo de la funcin definida en
25.22. En concreto es una normal con media 7 y varianza 4.
Ya lo indicamos en la propia definicin pero se puede demostrar
que la media y varianza de una normal son y 2 . En definitiva
492 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

estamos afirmando que se verifican las siguientes ecuaciones.


Z +
= x f ( x )dx,

Z +
2 = ( x )2 f ( x )dx.

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.

Dado un punto z el valor de la funcin (z) nos da el rea bajo la curva de


la densidad normal entre y el punto z. En la figura 25.14 hemos rayado
en negro esta zona para z = 1,3
Hay tablas que nos proporcionan el valor de esta funcin para diferentes
valores de z.12 Esto era necesario cuando no tenamos herramientas infor- 12
Simplemente poniendo en Google
mticas. Ahora lo lgico es utilizar software. En concreto el valor de (1,3) tablas de la normal nos aparecen un
montn de tablas. Cualquier libro de
(rea de la zona rayada en negro en la figura 25.14 lo obtendramos con R texto de hace unos aos lleva al final
del siguiente modo. del texto unas tablas de la normal.

pnorm(1.3) 0.4

## [1] 0.9031995
0.3

En la figura 25.15 tenemos representada la funcin .


Densidad

0.2

Nota 3 (Estandarizacin o tipificacin). Si tenemos una variable aleatoria


con distribucin normal con media y varianza 2 entonces la variable 0.1

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%

media 7 y varianza 4 y la densidad de la variable tipificada Z.


75%

50%

25%

0%
probabilidad 493

Nota 4 (De cmo calculaban los antiguos las probabilidades con


la normal). Qu problema nos planteamos? Suponemos que una cier-
ta cantidad sigue una distribucin normal con unos parmetros (media y
varianza) dados. Nos planteamos cmo calcular la probabilidad de que la va-
riable est en un cierto intervalo. Por ejemplo, sabemos que el valor aleatorio
que observamos sigue una distribucin normal con media 56 y desviacin
tpica 9. Qu probabilidad tenemos de que la variable aleatoria tome un
valor entre 60 y 63? Nos planteamos el valor de la siguiente probabilidad:
P(60 X 63). Esta probabilidad corresponde con la zona rayada de
negro en la figura 25.17. Para calcular este rea se aplicaban las siguientes
igualdades donde Z = ( X 56)/3,

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)

Pero la variable Z es una normal estndar por lo que

63 56 60 56 63 56 60 56
       
P Z P Z = .
3 3 3 3

De un modo genrico lo que acabamos de indicar es que si X N (56, 9)


entonces

63 56 60 56
   
P(60 X 63) = ,
3 3

siendo la funcin de ditribucin de una normal estndar.


Si suponemos que X N (, 2 ) y tomamos dos nmeros a y b tales que
a b entonces 0.10

b a
   
Densidad

P( a X b) = , (25.27)

0.05

Ejemplo 46 (Calculando la funcin de densidad de una normal).


Supongamos que = 16 y 2 = 4. La funcin de densidad en un punto la 0.00

podemos calcular con 50 55


x
60

Figura 25.17: Densidad de una N (56, 9).


dnorm(14,mean= 16, sd= 2) El rea de la zona rayada en negro
corresponde a la probabilidad de que la
variable est entre 60 y 63.
## [1] 0.1209854

o, en un conjunto de puntos, con


494 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

x0 = seq(10,22,1)
dnorm(x0,mean= 16, sd= 2)

## [1] 0.002215924 0.008764150 0.026995483


## [4] 0.064758798 0.120985362 0.176032663
## [7] 0.199471140 0.176032663 0.120985362 20%

## [10] 0.064758798 0.026995483 0.008764150


## [13] 0.002215924
15%

En la figura 25.18 aparecen tres densidades normales con parmetros


10%
distintos de modo que veamos el efecto de modificar la media y la varianza.
En concreto se representan las densidades de las distribuciones normales
5%
N (16, 4), N (24, 4) y N (16, 9).

Ejemplo 47. Podemos generar valores aleatrios con distribucin normal. 0%

10 20 30 40

rnorm(20,mean= 16, sd= 2) Figura 25.18: Funciones de densidad de


una normal con media 16 y desviacin
## [1] 17.03234 18.49385 15.11046 20.57400 19.35615 tpica 2 (azul), de una normal con
media 16 y desviacin tpica 3 (verde) y
## [6] 16.17576 16.69089 16.81915 13.23524 14.93939
una normal con media 24 y desviacin
## [11] 14.30180 18.22035 17.23786 17.45294 18.62862 tpica 2 (rojo).
## [16] 16.47633 18.45759 18.46499 15.02872 16.07962

La funcin de distribucin de la variable X, es decir, F ( x ) = P( X x )


la obtenemos con 1.00

pnorm(14,mean= 16, sd= 2) 0.75

## [1] 0.1586553
0.50
y

Podemos representar esta funcin (figura 25.19).


Tambin podemos plantear el problema inverso. Consideramos una proba- 0.25

bilidad, por ejemplo 0,34, y buscamos el valor de x donde P( X x ) = 0,34


o dicho de otro modo el percentil de orden 0,34. 0.00

10 15 20
x

qnorm(0.34,mean= 16, sd= 2) Figura 25.19: Funcin de distribucin


(acumulada) de la distribucin normal
con media 16 y desviacin estndar 2.
## [1] 15.17507

Nota 5 (Cmo interpretar la desviacin tpica?). Hemos visto cmo


una desviacin tpica mayor supone una mayor variabilidad. La variable
aleatorio tiende a producir valores ms dispersos. Hemos representado la
funcin de densidad de distintas distribuciones normales y vemos cmo
cuando la desviacin tpica es mayor entonces la grfica es ms plana. Los
valores normales se observan alrededor de la media y estn ms o menos
dispersos segn el valor de sea mayor o menor. Hay una interpretacin
probabilidad 495

sencilla de la desviacin estndar. Consideremos el intervalo [ , + ],


qu probabilidad tenemos de que una variable aleatoria con distribucin
normal est en este intervalo?
X
P( X + ) = P(1 1) = P(1 Z 1)

(25.28)
siendo Z una variable con distribucin normal estndar, Z N (0, 1). Pero,
Z +1
1 x2
P(1 Z 1) = e 2 dx =
1 2
Z +1 Z 11
1 x 2 1 x2
e 2 dx e 2 dx = (1) (1). (25.29)
2 2
Vamos a calcular la diferencia anterior utilizando R.

pnorm(1,mean=0,sd=1) - pnorm(-1,mean=0,sd=1)

## [1] 0.6826895

Por tanto, si X es una variable aleatoria con distribucin normal con


media y desviacin tpica entonces la probabilidad de que la variable est
entre y + es

P( X + ) = 0,6826895. (25.30)

De un modo anlogo si consideramos el intervalo [ 2, + 2 ] entonces

P( 2 X + 2) = P(2 Z 2) (25.31)

que viene dado por

pnorm(2,mean=0,sd=1) - pnorm(-2,mean=0,sd=1)

## [1] 0.9544997

Y finalmente si consideramos el intervalo [ 2, + 2 ] se tiene

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

En la tabla 25.3 tenemos las probabilidades que hemos calculado.


De un modo sencillo podemos decir: la variable dista de la media
en una desviacin estndar con una probabilidad de 0.68, en dos
desviaciones con una probabilidad de 0.95 y en tres desviaciones
estndar con una probabilidad de 0.99.
496 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

P( X + ) 0.6826895 Tabla 25.3: Probabilidad de que la va-


riable diste de la media en un nmero
dado de desviaciones tpicas
P( 2 X + 2 ) 0.9544997

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.

Ej. 33 Consideremos una variable aleatoria con distribucin nor-


mal con media 20 y desviacin tpica 3. Se pide:
1.P( X 23).
2.P( X < 23).
3.P( X > 29).
4.P( X 29).
5.P(34 < X 45).
6.P(34 X 45).
26
Distribucin muestral

26.1 Poblacin y muestra aleatoria

Podemos tener inters en estudiar alguna caracterstica en una


poblacin grande. Por ejemplo, la poblacin puede ser una poblacin
animal o vegetal: los patos de la Albufera; las palmeras de la provin-
cia de Valencia; una especie de pjaros en la provincia de Alicante;
toda la poblacin espaola, etc.
Fijmonos en las palmeras de la provincia de Valencia. Supon-
gamos que la caracterstica que nos interesa es si la palmera est
afectada por el picudo rojo. Queremos conocer la proporcin p de
palmeras afectadas por la plaga. Para ello lo que podemos hacer es
recorrer toda la provincia e ir palmera por palmera observando si el
picudo ha afectado a la palmera. Cuando hayamos observado todas
las palmeras la proporcin de palmeras afectadas ser el cociente
entre el nmero de palmeras afectadas y el nmero total de palme-
ras que hay. Realmente no es difcil. Sin embargo, parece laborioso,
caro y, posiblemente, innecesario. Es ms barato (y esperemos que
suficiente) elegir al azar un conjunto de n palmeras (con un nmero
n no muy grande) y observar su estado. Es decir, tomar una muestra
aleatoria de palmeras y, con lo que observamos en la muestra, intentar
estimar el valor de la proporcin en toda la poblacin o proporcin
poblacional.

26.2 Distribucin muestral de una variable binomial

Ejemplo 48. Tenemos una poblacin de individuos. Intentamos estudiar


la prevalencia de una enfermedad no muy frecuente, la hidatidosis. Vamos a
suponer que la proporcin real de personas con la enfermedad es p = 0,034.

N=2374560
X = rbinom(N,size=1,prob=.034)
498 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Hemos numerada a la poblacin y guardado los datos en el vector X. Si la


i-sima persona tiene la enfermedad entonces guardamos en la posicin i del
vector X un valor uno, si no la tiene guardamos un valor cero. Por ejemplo,
los 10 primeros individuos de la poblacin son

X[1:10]

## [1] 0 0 0 0 0 0 0 0 0 0

Y el individuo que ocupa la posicin 100000 es

X[100000]

## [1] 0

Ahora vamos a simular el muestreo aleatorio de la poblacin. Tomamos


una muestra de tamao n = 100 y observamos la proporcin de personas
enfermas en la muestra.

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

De hecho el total de individuos enfermos en la muestra lo podemos ver


con

sum(x)

## [1] 4

Repitiendo el proceso obtenemos

x = sample(X,100)
sum(x)

## [1] 2

Y si lo hacemos como unas 20 veces obtenemos los siguientes valores


observados
distribucin muestral 499

## [1] 3 5 5 2 3 2 3 7 6 4 4 0 4 4 2 4 6 3 3 2

Si, en lugar de contar el nmero de enfermos observados, nos fijamos en


la proporcin observada tenemos

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

Con qu frecuencia observamos 3 enfermos?


La obtenemos con la expresin
 
n
,0343 (1 0,034)97
3

En general si en una seleccin aleatoria de n individuos contamos el nmero


de individuos con la enfermedad (que entendemos como el nmero de xitos)
entonces  
n k
P( X = k) = p (1 p ) n k
k
siendo p la proporcin en la poblacin de enfermos (que en nuestro ejemplo
estamos suponiendo p = 0,034).

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?

Ej. 35 2 Alguien afirma que la probabilidad de perder dinero 2


Wilcox [2009, pg. 80, problema 4]
cuando se utiliza una estrategia de inversin para la compra y venta
de los productos bsicos es de 0,1. Si esta afirmacin es correcta:
cul es la probabilidad de obtener p 0,05 sobre la base de una
muestra aleatoria de 25 de los inversores?

Ej. 36 3 Imaginemos que un millar de equipos de investiga- 3


Wilcox [2009, pg. 80, problemas 6-7]
cin extraen una muestra al azar de una distribucin binomial con
p = 0,4, cada estudio est basado en una muestra de tamao 30. Ten-
dremos 1000 valores de p. Si promediamos estos 1000 valores: Cul
sera aproximadamente el resultado? Si calculamos la varianza mues-
tral de los valores de p: Cul sera aproximadamente el resultado?
500 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

26.3 Distribucin muestral de la media bajo normalidad

Supondremos que es una poblacin normal con media = 160 y


una desviacin estndar de 10.23. Podra corresponder con la altura
de los individuos. Suponemos que hay N = 237456 personas en
la poblacin en estudio. Como no vamos a medir a tantas personas
ahorramos tiempo generando aleatoriamente estos valores.

N = 237456
X = rnorm(N,mean=160,sd=10.23)

Es una poblacin de 2,37456 105 individuos. Por X estamos de-


notando toda la poblacin. Es decir, suponemos (de un modo irreal)
que tenemos a toda la poblacin. Podemos ver los 10 primeros ele- 30000

mentos de la poblacin con

X[1:10] 20000

## [1] 143.7714 148.5352 151.5329 151.3984 175.6894

count
## [6] 172.3557 164.0881 176.9400 148.9404 142.8552
10000

La figura 26.1 tenemos un histograma de toda la poblacin. La


figura 26.2 tiene un estimador kernel de la densidad de probabilidad.
0

Como conocemos toda la poblacin podemos conocer su media o 125 150 175 200
X

media poblacional y vale: Figura 26.1: Histograma de la poblacin


de alturas.
(mu=mean(X))
0.04

## [1] 160.0128

0.03

Tomamos una muestra de n = 100 individuos de la poblacin con


la funcin sample.
density

0.02

n = 100
x = sample(X,n) 0.01

Parece natural aproximar o, dicho con propiedad, estimar el valor 0.00

110 130 150 170 190 210


desconocido de con la media muestral. Veamos el valor: X

Figura 26.2: Estimador kernel de la


densidad de las alturas.
mean(x)

## [1] 157.9384

Si repetimos la seleccin de los individuos y el clculo de la media


muestral tenemos
distribucin muestral 501

x = sample(X,n)
mean(x)

## [1] 158.9058

Podemos repetirlo muchas veces e iremos obteniendo valores dis-


tintos. En la figura ?? estimador kernel de la densidad de los valores
generados.
Supongamos que repetimos lo anterior pero incrementando el
tamao de la muestra. En lugar de tomar muestras de tamao 100
pasamos a tomar muestras de tamao 400. En la figura ?? mostramos
las medias muestrales obtenidas para diferentes muestras. Las me-
dias muestrales estn mucho ms prximas a la media poblacional.

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

El resultado dado en 26.1 tambin lo podemos expresar como


160.2
Media muestral

Xn
n N (0, 1) (26.2)
159.8


Nos interesa conocer probabilidades como
159.4

P( X b) 0 5000 10000 15000 20000

Muestra

o en general probabilidades como


Figura 26.4: Generamos muestras
de tamao creciente. Calculamos la
P( a X b) media muestral de cada muestra.
En el eje de abscisas mostramos el
donde a y b son valores que nos pueden ir interesando dependiendo tamao de la muestra que hemos
generado. En el eje de ordenadas en
del problema. valor observado de la media muestral.
La lnea horizontal muestra la media
poblacional. Vemos cmo las medias
muestrales se aproximan a la media de
la poblacin.
502 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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)

Y la probabilidad la podemos obtener con

pnorm(162,mean=mu,sd=sigma/sqrt(n))

## [1] 0.9741615

Qu probabilidad tenemos de que la media est entre 159 y 162?

pnorm(162,mean=mu,sd=sigma/sqrt(n)) -
pnorm(159,mean=mu,sd=sigma/sqrt(n))

## [1] 0.8135001

O de que sea mayor que 160?

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. 38 5 Alguien dice que dentro de un determinado barrio, el 5


Wilcox [2009, pg. 84, problemas
coste medio de una casa es de = 100000 euros con una desviacin 10-11]

estndar de = 10,000 euros. Supongamos que, basndonos en


n = 16 viviendas, observamos una media muestral X = 95,000.
Suponiendo normalidad, cul es la probabilidad de obtener una
media muestral como la observada o menor si las afirmaciones sobre
la media y desviacin estndar son verdaderas? Y la probabilidad de
tener una media muestral entre 97500 y 102500 euros?

Ej. 39 6 Supongamos que eres un profesional de la salud intere- 6


Wilcox [2009, pg. 85, problema 13]
sado en los efectos de la medicaci en la presin arterial diastlica
de las mujeres adultas. Para un medicamento en particular que est
siendo estudiado, se encuentra que para n = 9 mujeres, la media
muestral es X = 85 y la varianza muestral es s2 = 160,78. Estimar
el error estndar de la media muestral asumiendo que tenemos una
muestra aleatoria.

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?

26.4 Distribucin muestral de la media en poblaciones no norma-


les. Teorema central del lmite

El resultado que damos en 26.1 es aproximadamente cierto in-


cluso aunque los datos no sigan aproximadamente una distribucin
normal.

26.4.1 Aproximacin de la distribucin binomial

Con datos binomiales, el estimador de la proporcin p, p podemos


verlo como una media muestral

in=1 Xi
p = ,
n

donde Xi = 1 si hay un xito en la i-sima prueba de Bernoulli.


Utilizando el teorema central del lmite tenemos que

p p
Z= p . (26.3)
p(1 p)/n
504 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Si n es suficientemente grande tenemos que para cualesquiera valores


reales a y b tenemos

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

La calidad de la aproximacin depende los valores de n y de p. Una


regla simple es que la aproximacin es buena si np 15 y n(1 p)
15.

26.4.2 Ilustracin del teorema central del lmite


Hemos utilizado en la seccin anterior este resultado probabi-
lstico. El teorema central del lmite dice que si tenemos variables
aleatorias X1 , X2 , . . . independientes entre s y con una misma dis-
tribucin8 entonces la media muestral se comporta asintticamente 8
En definitiva repetimos indepen-
dientemente un mismo experimento y
segn una distribucin normal. En concreto, si la media y varianza
observamos una misma cantidad cada
comn a todas las variables son and 2 entonces vez.

Xn
 
lm P z = P( Z z) (26.5)
n+ n

donde Z es una variable con distribucin normal con media 0 y va-


rianza 1, es decir, una normal estndar o tpica.

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).

Ej. 42 1.Supongamos una distribucin binomial con p = 0,5 y


n = 100 y queremos calcular la probabilidad de que p sea me-
nor o igual a 0,55. 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,45 p 0,55).
27
Estimacin

27.1 Introduccin

Tratamos el problema de la estimacin. En concreto, en poblacio-


nes normales, nos planteamos la estimacin de la media y varianza.
Tambin consideramos la estimacin de una proporcin. Se aborda
el problema del clculo del tamao de la muestra para estimar los
parmetros con un error mximo dado.

27.2 La poblacin

Qu es una poblacin? La Estadstica se ocupa del estudio de


grandes poblaciones. Pero, otra vez, y qu es una poblacin? La
respuesta no es simple ni tampoco es nica.
El primer sentido que podemos dar al trmino poblacin es una
gran coleccin de elementos de los cuales queremos conocer algo.
Algunos ejemplos son:

1. la poblacin espaola a da 2 de noviembre de 2011;

2. la poblacin de samaruc el 2 de diciembre de 2010;

3. la poblacin de fartet en la Comunidad Valenciana en febrero de


2012;

4. Los pinos de los Montes Universales;

y muchsimos ejemplos similares. Todos los ejemplos que acabamos


de proponer se caracterizan porque toda la poblacin est ah y, en
principio, podramos observarla. Podemos tener la santa paciencia de
observar todos y cada uno de los pinos de los Montes Universales.
Estos ejemplos son poblaciones finitas, es decir, son grandes conjuntos
de individuos pero un nmero finito. Tenemos inters en alguna
caracterstica de la poblacin. Por ejemplo, cul es la longitud media
506 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

de un samaruc adulto de la Albufera? Cul es la proporcin de


pinos en los Montes Universales afectados por la procesionaria?
Cmo podemos obtener este valor? Es una poblacin finita y los
peces estn ah. Pues los cogemos y medimos cada uno de ellos. La
cantidad buscada no es ms que la media de las longitudes de cada
uno de los peces. Simple de decir s pero, obviamente, impractica-
ble. Aunque, sobre el papel, es una poblacin accesible; realmente, es
una poblacin inaccesible. No podemos acceder a toda la poblacin. Por
ello, hemos de considerar el experimento consistente en elegir al azar
un individuo de la poblacin. Si el individuo elegido lo denotamos
por , una vez lo tenemos, podemos medirlo, podemos observar la
caracterstica que nos interesa, podemos observar la variable X en
el individuo , siendo x el valor que observamos. Este proceso es
lo que se denota abreviadamente como X ( ) = x. Sin embargo, no
observamos la variable aleatoria X una sola vez. Elegimos indepen-
dientemente y de la misma poblacin de peces n individuos. Antes
de elegirlos tenemos una coleccin de valores aleatorios que son in-
dependientes entre s y que repiten el experimento. Esto es lo que se
conoce como muestra aleatoria y denotamos { X1 , . . . , Xn }. Los valores
observamos una vez hemos elegido a los n peces los denotamos con
x1 , . . . , x n .
En otras ocasiones la poblacin no es un concepto tan concreto.
Por ejemplo, estamos la demanda biolgica de oxgeno en muestras
de agua tomadas en la playa de Canet den Berenguer. En principio,
el nmero de muestras es infinito. Adems, aunque asumamos que
las muestras tienen un comportamiento aleatorio similar en la playa
de Canet, es claro que necesitamos indicar, al menos, el da en que las
tomamos. En este caso, la poblacin no existe. Son las infinitas repeti-
ciones que podemos hacer del experimento consistente en tomar una
muestra de agua y determinar la demanda biolgica de oxgeno.

27.3 Estimacin puntual

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

## [1] 177.5 157.7 168.7 159.7 156.7 148.1 167.3


## [8] 168.7 155.6 162.9

Por X estamos denotando toda la poblacin. Por lo tanto la media de la


poblacin o media poblacional la conocemos. Simplemente hemos de realizar
estimacin 507

la media muestral de todas las estaturas.

(mu=mean(X))

## [1] 159.9979

Pretendemos estimar la media poblacional (que en nuestro ejemplo arti-


ficial conocemos) utilizando una muestra aleatoria de 10 individuos (una
muestra no muy grande ciertamente). Podemos elegir la muestra aleatoria
con la funcin sample. Por ejemplo, una primera muestra estara compuesta
por los individuos

n = 10
(x = sample(X,n))

## [1] 168.5169 168.9821 156.0773 158.9585 153.9803


## [6] 162.6075 163.4428 159.8155 157.7173 162.8265

Nuestra estimacin sera

(mediamuestral = mean(x))

## [1] 161.2925

de modo que el error que cometemos es

mediamuestral - mu

## [1] 1.2946

Supongamos que repetimos la estimacin varias veces y veamos los diez


primeros valores que obtenemos

## [1] 157.9951 160.6831 158.2117 157.8345 157.5257


## [6] 161.5840 158.9663 159.0471 160.0989 161.1504

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

## Min. 1st Qu. Median Mean 3rd Qu. Max.


0.05

## -5.2060 -1.0760 -0.2979 -0.2590 0.5081 4.4410


0.00

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

por lo tanto, podemos conocer la media de la poblacin. Esto no es nunca


as. Conocemos una muestra aleatoria de la poblacin que denotaremos por
X1 , . . . , Xn y, con estos valores, pretendemos estimar la media de la pobla-
cin . De hecho, hemos utilizado estos valores y obtenido un mtodo para
estimar , a esto le podemos llamar un estimador de y denotarlo como
n
Xi
= Xn = n
.
i =1

Antes de tomar la muestra, Xn es un valor aleatorio pero despus de


tomar la muestra tenemos que X1 = x1 , . . . , Xn = xn , es decir, que no son
valores aleatorios sino unos valores dados. En el ejemplo anterior, antes de
utilizar la funcin sample tenemos un valor aleatorio pero despus tenemos
el valor observado correspondiente. Por lo tanto una vez seleccionada la
muestra decimos que tenemos los valores observados x1 , . . . , xn y la variable
aleatoria Xn toma el valor fijo xn = in=1 xi /n.

27.4 Algunas definiciones

Definition 9 (Muestra aleatoria). Una muestra aleatoria (de tamao n)


son n valores aleatorios X1 , . . . , Xn que tienen la misma distribucin y son
independientes entre s.

Definition 10 (Estimador). Un estimador es cualquier funcin de la


muestra aleatoria X1 , . . . , Xn que toma valores admisibles para el parmetro
que estimamos.

27.5 Estimacin puntual de la media

Si pretendemos estimar la media de una poblacin su estimador


usual es la media muestral, Xn . Si tenemos una muestra aleatoria
donde cada Xi sigue una distribucin normal entonces

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

27.6 Intervalo de confianza para la media

Hemos considerado en el apartado anterior la estimacin pun-


tual de la media poblacional, , mediante la media muestral, X. Es
una opcin natural. Otra opcin puede ser estimar la media de la
estimacin 509

poblacin dando un intervalo que la contenga. En lugar de decir


estimamos la media poblacional en 158.96, esto es utilizar un valor
numrico exclusivamente podemos utilizar una expresin como la
media poblacional es mayor que 158,37 y menor que 162,79. Este
segundo tipo de estimacin es la que se hace con un intervalo de
confianza. En resumen estimamos la media poblacional o bien me-
diante un punto (estimador puntual) o bien mediante un intervalo
(estimacin por intervalos). Al primer mtodo se le llama estimador
puntual y al segundo intervalo de confianza.

27.6.1 Asumimos que conocemos la varianza


Vamos a asumir en un primer momento algo que no tiene ninguna
realidad (raramente nos lo vamos a encontrar en una aplicacin real)
pero nos facilita la presentacin. En concreto asumimos que no cono-
cemos la media (es lo que queremos estimar) pero, sin embargo, s
conocemos la desviacin estndar, .
Una segunda hiptesis (que s se verifica con frecuencia) que va-
mos a asumir es que los datos proceden de una poblacin normal. Ya
discutiremos qu hacemos despus con cada una de estas hiptesis.
Siendo y la media y la desviacin tpica reales, por el teore-
ma central del lmite se verifica que aproximadamente (o con ms
precisin si el tamao de la muestra aleatoria, n, es grande) la media
muestral tiene una distribucin normal con media y desviacin

estndar / n,
2
X N (, ),
n
o, lo que es equivalente, que
X
n N (0, 1),

donde N (0, 1) es una normal con media cero y varianza uno, lo que
se conoce como una normal estndar o normal tpica. 2 2
Es equivalente porque si una varia-
Notemos que, asumiendo la desviacin estndar conocida, en la ex- ble aleatoria X suponemos que tiene
X distribucin normal con media y
presin n conocemos todos los trminos que aparecen (X, varianza 2 entonces la variable alea-
y n) una vez hemos tomado la muestra salvo el valor de la media toria ( X )/ sigue una distribucin
normal con media 0 y varianza 1 que
poblacional . Precisamente es lo que queremos estimar. se conoce como una normal tpica o
Fijemos una probabilidad alta, por ejemplo, una probabilidad de normal estndar. Esto se suele indi-
car como: X N (, 2 ) entonces
0,95. Podemos determinar un valor positivo c tal que ( X )/ N (0, 1)
X
 
P c n c = 0,95

Por las propiedades de simetra de la normal c ha de verificar que

X
 
P c = 0,975

510 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Podemos determinarlo con la funcin qnorm del siguiente modo.

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

Vemos que el intervalo [ X 1,96 n , X + 1,96 n ] tiene una probabi-


lidad de 0,95 de contener a o tambin de cubrir a . Si ahora susti-
tuimos los valores aleatorios Xi con i = 1, . . . , n con los valores obser-
vados en la muestra entonces el intervalo aleatorio [ X 1,96 n , X +
1,96 n ] pasa a ser un intervalo fijo [ x 1,96 n , x + 1,96 n ] que
conocemos como intervalo de confianza con nivel de confianza 0,95.

Nota de R 1 (Intervalo de confianza con R). Vamos a evaluarlo con R.


Empezamos tomando los datos.

(x = sample(X,10))

## [1] 161.5809 157.8007 163.0352 163.1040 159.8206


## [6] 171.4148 152.8761 157.8963 153.0372 162.3603

Determinamos la media muestral y la desviacin estndar muestral.

media = mean(x)
s = sd(x)

Por lo tanto el intervalo tendr por extremo inferior

(extremo.inferior = mean(x) - qnorm(0.975,mean=0,sd=1)*sd(x)/sqrt(n))

## [1] 156.9302

y por extremo superior.

(extremo.superior = mean(x) + qnorm(0.975,mean=0,sd=1)*sd(x)/sqrt(n))

## [1] 163.6551
estimacin 511

Si en lugar de 0,95 elegimos como nivel de confianza (utilizando la


notacin habitual) 1 con un valor pequeo (en el ejemplo anterior
= 0,05) podemos determinar c que verifique
X
P(c n c) = 1

o que
X
P( c)) = 1 .
2
Denotamos el valor de c que verifica lo anterior como Z1 . Finalmente el
2
intervalo

[ X Z1 2 , X + Z1 2 ]
n n
cubre a con una probabilidad de 1 y el intervalo de confianza es el
que obtenemos cuando sustituimos los valores aleatorios por los valores
observados. Es decir, el intervalo de confianza viene dado por

[ x Z1 2 , x + Z1 2 ]
n n
De un modo genrico: Cmo podemos determinar el intervalo de confianza
que acabamos de ver? Fijamos el nivel de confianza 1 (en este caso a
1 = 0,99 o equvalentemente = 0,01).

alpha = 0.01

Determinamos el extremo inferior:

(extremo.inferior = mean(x) - qnorm(1-alpha/2,mean=0,sd=1)*sd(x)/sqrt(n))

## [1] 155.8736

y el superior

(extremo.superior = mean(x) + qnorm(1-alpha/2,mean=0,sd=1)*sd(x)/sqrt(n))

## [1] 164.7116

El intervalo es el siguiente:

c(extremo.inferior,extremo.superior)

## [1] 155.8736 164.7116

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

27.6.2 No asumimos la varianza conocida


No es realista asumir que conocemos la varianza 2 (o la desviacin
tpica ). En absoluto lo es. Por qu vamos a desconocer la media
y conocer la varianza? 3 Salvo situaciones realmente esotricas esto 3
Van por ah los datos diciendo somos
no es as. En consecuencia lo lgico es sustituir normales no te decimos la media pero te
q la desviacin tpica decimos la varianza? Los pobre datos no
poblacional por su estimador natural S = 1
n 1 in=1 ( Xi X )2 . Si dicen nada.
lo hacemos tendremos la cantidad
X
n . (27.2)
S
En la expresin anterior lo conocemos todo (una vez tenemos los
datos) excepto el valor de . Sin embargo, la distribucin de probabi-
lidad de esta cantidad ya no es una normal estndar. Nos aparece una
distribucin de probabilidad nueva que se conoce como la distribu-
cin t de Student. 4 4
La expresin exacta de esta densidad
X  (n+1)/2
De hecho, William Sealy Gossett demostr que la cantidad n S ( n+
es f ( x ) = n
1
2 )
2
1 + tn
se comporta como una t de Student con n 1 grados de libertad. Esto R +
donde ( x ) = 0 t x1 et dt es la
lo denotaremos como funcin Gamma de Euler. La miris y
ya est. No hace falta saberla pero por
X lo menos es bueno verla una vez en la
T= n t n 1 . (27.3)
S vida.

En la figura 27.2 hemos representado la funcin de densidad de una t


de Student con 9 grados de libertad.

0.4
0.3
dt(u, df = 9)

0.2
0.1
0.0

3 2 1 0 1 2 3

Figura 27.2: Funcin de densidad


de una t de Student con 9 grados de
libertad
estimacin 513

Nota 7 (Qu relacin tiene la t de Student con la normal?). Hay dos


puntos interesantes a tener en cuenta cuando utilizamos una distribucin
t de Student. La primera es qu relacin tiene con una distribucin nor-
mal estndar y la segunda es qu ocurre cuando modificamos los grados de
libertad.
Para ver la relacin con la normal estndar hemos representado en la
figura 27.3 la densidad de la normal en trazo continuo y la densidad de una

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

y comenta este hecho.


Figura 27.3: Funciones de densidad de
la normal estndar (trazo continuo)
Y ahora vamos a repetir lo visto en la seccin anterior sustituyen- y de densidades t de Student con 2
do a la normal estndar con la densidad de la t de Student con n-1 grados de libertad.
grados de libertad. Dada una probabilidad, por ejemplo 0,95, pode-
mos determinar el valor c tal que

0.4
P(c T c) = 0,95.

0.3
En concreto verificar que
0.2
P( T c) = 0,975
0.1

y el valor de c (por ejemplo, para 9 grados de libertad) lo obtendre-


0.0

mos con 3 2 1 0 1 2 3

qt(0.975,df=9) Figura 27.4: Funciones de densidad de


la normal estndar (trazo continuo) y
## [1] 2.262157 de densidades t de Student con 2, 7 y
12 grados de libertad. Segn el nmero
de grados de libertad de la t es mayor
Denotamos el valor de c tal que ms se aproxima la densidad de la t a
la normal. Por ello, la ms alejada es la
t(2) y la ms prxima es la t(12).
P( T c) = 1 ,
2
como tn1,1/2 . Entonces

S S
P( X tn1,1/2 X + tn1,1/2 ) = 1 . (27.4)
n n

El intervalo de confianza lo obtenemos sustituyendo los valores alea-


torios por los valores observados.
514 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Teorema 2. Si suponemos que tenemos una muestra aleatoria de datos


normales X1 , . . . , Xn y observamos los datos X1 = x1 , . . . , Xn = xn
entonces el intervalo
 
s s
x tn1,1/2 , x + tn1,1/2
n n

es un intervalo de confianza con nivel de confianza 1 para la media .


De un un modo abreviado el intervalo anterior se puede escribir como
s
x tn1,1/2
n

Nota de R 2 (Clculo del intervalo de confianza con R). Y cmo


hacerlo con R? Fijamos el nivel de confianza (en este caso a 0,99).

alpha = 0.01

Determinamos el extremo inferior:

(extremo.inferior = mean(x) - qt(1-alpha/2,df=n-1)*sd(x)/sqrt(n))

## [1] 154.7173

y el superior

(extremo.superior = mean(x) + qt(1-alpha/2,df=n-1)*sd(x)/sqrt(n))

## [1] 165.8679

El intervalo es el siguiente

c(extremo.inferior,extremo.superior)

## [1] 154.7173 165.8679

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

Si queremos una salida en la que solamente nos aparezca el intervalo de


confianza podemos hacer

alpha = 0.05
t.test(x,conf.level=1-alpha)$conf.int

## [1] 156.4117 164.1735


## attr(,"conf.level")
## [1] 0.95

Nota 9 (Evaluando el intervalo de confianza). Podemos repetir el proce-


so de estimacin muchas veces y ver en cuntas ocasiones el intervalo con-

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

segmento horizontal se ha dibujado de modo que las abcisas de sus extremos


40

corresponden con el extremo inferior y superior del correspondiente intervalo


20

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.

Sc.Nor = Sc[COUN == "NOR"]

La funcin bsica es t.test.


516 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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

Si queremos obtener el intervalo de confianza solamente podemos hacer lo


siguiente.

Sc.t = t.test(Sc.Nor)
Sc.t$conf.int

## [1] 2.479107 3.078706


## attr(,"conf.level")
## [1] 0.95

o simplemente

t.test(Sc.Nor)$conf.int

## [1] 2.479107 3.078706


## attr(,"conf.level")
## [1] 0.95

Por defecto el nivel de confianza que se elige es 0,95. Podemos modificarlo.


Bien bajndolo

t.test(Sc.Nor,conf.level=.90)$conf.int

## [1] 2.527873 3.029940


## attr(,"conf.level")
## [1] 0.9

o bien tomando un nivel de confianza mayor, 0,99.

t.test(Sc.Nor,conf.level=.99)$conf.int

## [1] 2.382708 3.175105


## attr(,"conf.level")
## [1] 0.99
estimacin 517

Ejemplo 51. Lo vamos a ilustrar con datos de los resultados de la selec-


tividad en la Comunidad Valenciana. Estos datos se pueden encontrar en
http://www.edu.gva.es/univ/val/prueba_acceso.htm Los datos nos dan la
media y desviacin estndar muestrales de las notas obtenidas en Matem-
ticas II en el examen de selectividad en la Comunidad Valenciana el ao
2010. Tenemos estos valores distinguiendo por universidad y si los resulta-
dos se han obtenido en la fase general o en la fase especfica. Tenemos unos
datos agregados. Conocemos unos resmenes de los datos pero no los datos
mismos.8 8
No es tan extraa esta situacin. Con
frecuencia cuando lees un informe o
bien un artculo cientfico no sueles
disponer de los datos originales sino
de los resmenes que de los mismos
proporcionan los autores en la publica-
Universidad Matric. Present. Aptos Media DE cin. Tiene sentido e inters ver cmo
UA 783 771 401 4,989 2,124 calcular estos intervalos a partir de los
datos resumidos.
UJI 530 518 249 4,857 2,088
UMH 693 673 262 4,369 1,922
UPV 1073 1049 589 5,274 2,070
UV 1525 1488 851 5,212 2,053
SUV 4604 4499 2352 5,021 2,077

Universidad Present. FG Present. FE Aprob. FE


UA 276 495 254
UJI 213 305 148
UMH 267 406 154
UPV 422 627 357
UV 546 942 537
SUV 1724 2775 1450

Universidad Media FG DE FG Media FE DE FE


UA 5,053 1,839 4,954 2,267
UJI 4,852 1,874 4,860 2,225
UMH 4,304 1,812 4,412 1,989
UPV 5,135 1,959 5,367 2,137
UV 5,170 1,89 5,237 2,141
SUV 4,969 1,909 5,054 2,174 Tabla 27.1: Resumen de los resulta-
dos de Matemticas II. Las etiquetas
Utilizando los datos de la tabla 27.1 vamos a calcular intervalos de con- indican: Matric., matriculados; Pre-
sent.,presentados; Aptos, aptos; Media,
fianza para la nota media en cada una de las universidades y en el total de
nota media; DE, desviacin estndar;
todas las universidades. Vamos a centrarnos en los resultados globales, esto Present. FG, presentados fase general;
es, la ltima lnea de la tabla. Empezamos construyendo un intervalo de Present. FE, presentados fase especfica;
Aprob. FE, aprobados fase especfica;
confianza para la media global. En el siguiente cdigo Media FG, media fase general; DE FG,
desviacin tpica fase general; Media
FE, media fase especfica; DE FG, des-
viacin tpica fase especfica. En filas
tenemos las universidades de Alicante
(UA), la Jaume I de Castelln (UJI), la
Miguel Hernndez de Elche (UMH),
la Universidad de Valencia (UV) y to-
dos los estudiantes en el Sistema de
Universidades Valencianas (SUV).
518 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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

(extremosuperior = media + qt(1-alpha/2,df=n-1) *


desviacion.estandar / sqrt(n))

## [1] 5.100796

De modo que el intervalo de confianza viene dado por [4.941,5.101].


Y ahora para la nota en la fase general.

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

El intervalo es [4.85, 5.088]. Y terminamos con la media en la fase espec-


fica.

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

(extremosuperior = media + qt(1-alpha/2,df=n-1) *


desviacion.estandar / sqrt(n))

## [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 13. Determinar el intervalo de confianza para la concentracin


media de escandio en toda la zona de estudio, esto es, considerando los tres
pases conjuntamente. 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:

1. Determinar los intervalos de confianza con niveles de confianza 0,95 y


0,99 para la nota media en la fase especfica en cada una de las cinco
universidades de la Comunidad Valenciana.

2. Determinar los intervalos de confianza con niveles de confianza 0,95


y 0,99 para la nota media en la fase general en cada una de las cinco
universidades de la Comunidad Valenciana.

27.7 Error absoluto y tamao de la muestra

En esta seccin nos planteamos (por primera vez) un problema


de clculo de tamao de la muestra. Cuntos datos hemos de tener
para que nuestro estudio tenga validez? Es una pregunta muy ge-
nrica sin respuesta. La respuesta necesita que concretemos ms lo
que queremos de nuestros datos. En esta seccin nos planteamos la
siguiente pregunta: Cuntos datos necesitamos para que cuanto es-
timamos una media poblacional el error mximo que cometemos sea
menor que una cantidad que previamente especificamos? Por ejem-
plo, queremos conocer la concentracin media de un elemento en una
zona. Queremos conocer esta cantidad, denotada por , con un error
mximo de unidades siendo una cantidad positiva que fijamos
nosotros. Lo primero que hemos de tener en cuenta es que en Esta-
dstica nunca podemos afirmar con seguridad nada. Podemos pedir
que sea muy probable o, mejor, que tengamos mucha confianza en que
ocurra pero que seguro que ocurra es mucho pedir. Siempre hacemos
afirmaciones basadas en la probabilidad de sucesos que pueden o no
ocurrir y, por lo tanto, afirmar que nuestro error va a ser menor que
un cierto nivel siempre o seguro no es posible.
Vamos a responder a la pregunta anterior utilizando los datos cho-
rizon del proyecto Kola. Pretendemos estimar la concentracin media
de escandio en Noruega (dentro del proyecto Kola). Ya hemos de-
terminado un intervalo de confianza para con un nivel 1 . Por
ejemplo, con = 0,05 el intervalo es
520 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

t.test(Sc.Nor,conf.level=.95)$conf.int

## [1] 2.479107 3.078706


## attr(,"conf.level")
## [1] 0.95

Tenemos una confianza de 0,95 de que el valor de est dentro


(est cubierto por) el intervalo anterior. Asumamos que la cosa ha
ido bien, esto es, asumamos que est dentro. No lo sabemos pero
confiamos con un nivel de confianza 0,95 que esto sea as. Pues bien,
lo asumimos. A la pregunta: en cunto estimas ?, respondemos (sin
dudar) que en

mean(Sc.Nor)

## [1] 2.778906

esto es, respondemos dando el valor de la media muestral x de


las concentraciones utilizadas para calcular el intervalo. Esta media
muestral es el punto medio del intervalo. Por lo tanto si est en
intervalo entonces la diferencia entre y el centro es menor o igual
que la mitad de la longitud de dicho intervalo que vale

## [1] 0.5995994

Qu error absoluto tenemos con la muestra que se tom? Guarda-


mos el intervalo de confianza en Sc.ci.

Sc.ci = t.test(Sc.Nor,conf.level=.95)$conf.int

Sabemos que el error absoluto es la mitad de la longitud del inter-


valo de confianza. Lo calculamos.

(Sc.ci[2] - Sc.ci[1]) / 2

## [1] 0.2997997

Supongamos que nos parece excesivo y pretendemos un error


absoluto mximo de 0,2.
Cul era el tamao muestral en Noruega? Cuntas muestras se
han tomado en Noruega?

length(Sc.Nor)

## [1] 128

De hecho, es ms fcil saber el nmero de muestras que hemos


tomado en cada pas.
estimacin 521

table(COUN)

## COUN
## FIN NOR RUS
## 187 128 290

El intervalo de confianza para la media de una poblacin normal


viene dado por la siguiente expresin.
 
S S
X tn1,1 , X + tn1,1
2 n 2 n

En consecuencia, el error absoluto vendr dado por

S
tn1,1
2 n

Esta expresin en R se calcula con el siguiente cdigo.

alpha = .05
n = length(Sc.Nor)
qt(1-alpha/2,df=n-1)*sd(Sc.Nor)/sqrt(n)

## [1] 0.2997997

Suponemos que la desviacin estndar no se va a modificar mucho


si tomamos ms muestras.

sd0 = sd(Sc.Nor)

Fijamos un valor para el error que queremos cometer.

delta = 0.2

Se tiene que verificar

S
tn1,1
2 n

Si asumimos que s es aproximadamente constante.

m = n + 10
qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)

## [1] 0.2885306

Vemos que no es suficiente. Y 100 observaciones ms?


522 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

m = n + 100
qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)

## [1] 0.2236826

Y 200 observaciones ms?

m = n + 200
qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)

## [1] 0.1861879

Quizs nos hemos pasado. Veamos con 150.

m = n + 150
qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)

## [1] 0.2023752

Una manera de hacerlo sera

for(m in 280:290)
print(c(m,qt(1-alpha/2,df=m-1)*sd(Sc.Nor)/sqrt(m)))

## [1] 280.0000000 0.2016448


## [1] 281.0000000 0.2012826
## [1] 282.0000000 0.2009223
## [1] 283.0000000 0.2005639
## [1] 284.0000000 0.2002074
## [1] 285.0000000 0.1998529
## [1] 286.0000000 0.1995002
## [1] 287.0000000 0.1991493
## [1] 288.0000000 0.1988003
## [1] 289.0000000 0.1984532
## [1] 290.0000000 0.1981078

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.

1. Determinar el nmero de datos (tamao de la muestra) que necesitamos


en Finlandia para tener un error mximo de 0,20. Y si queremos un
error mximo de 0,1?

2. Repetir el apartado 1 para Rusia.


estimacin 523

Ejercicio 16. Supongamos que asumimos que el nivel medio de escandio no


es distinto para los distintos pases y por lo tanto usamos todos los valores.
Cul es el error mximo observado?

27.8 Estimacin de la varianza en poblaciones normales

Si X1 , . . . , Xn es una muestra aleatoria de una normal con media


y varianza 2 entonces
n
( Xi Xn )2 ( n 1) S2
2
=
2
2n1 .
i =1

( 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

k = 13 Figura 27.6: Funcin de densidad de


qchisq(p,df=k) una ji-cuadrado con 10 grados de
libertad.

## [1] 15.98391

Entonces tenemos que


0.10
0.08

( 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

es un intervalo de confianza para 2 con nivel de confianza 1 .


Es claro que el correspondiente intervalo de confianza (con nivel
de confianza 1 ) para la desviacin estndar poblacional vendr
dado por
s s
( n 1) S2 ( n 1) S2

,
21/2,n1 2/2,n1

Veamos cmo hacerlo con R. La funcin que nos da los percentiles


de la ji-cuadrado es pchisq. Tomamos los datos.

n = 100
x = sample(X,100)

Y construimos el intervalo de confianza.

alpha = .05
s2 = var(x)
(extremoinferior = (n-1)*s2 / qchisq(1-alpha/2,df=n-1))

## [1] 18.5795

(extremosuperior = (n-1)*s2 / qchisq(alpha/2,df=n-1))

## [1] 32.52428

El intervalo de confianza para 2 con un nivel de confianza de 0,95


es [18,58, 32,524].

27.8.1 Ejercicios
Ejercicio 17. Consideremos los datos StatDA::chorizon. Se pide:

1. Utilizando el cdigo

help(chorizon)

consulta qu tipo de datos son.

2. Calcular un intervalo de confianza para la varianza de la concentracin


de nquel en Rusia con un nivel de confianza de 0,99.

3. Repite el apartado anterior utilizando un nivel de confianza de 0,9. Qu


intervalo es ms grande? Por qu?

4. Repite los apartados 2 y 3 para el nivel medio de nquel en Finlandia y


para el nivel medio de nquel en Noruega.

Ejercicio 18. Con los datos de la tabla 27.1 se pide:


estimacin 525

1. Construir un intervalo de confianza para la varianza y otro para la


desviacin estndar de la nota en Matemticas II.

2. Repetir el apartado 1 para la varianza y la desviacin estndar de la nota


de Matemticas II en la fase general.

3. Repetir el apartado 1 para la varianza y la desviacin estndar de la nota


de Matemticas II en la fase especfica.
28
Contraste de hiptesis

28.1 Introduccin

Se introduce el problema del contraste de hiptesis en una pobla-


cin.
En concreto, vamos a asumir que tenemos una muestra aleatoria
de una distribucin normal, X1 , . . . , Xn , variables aleatorias indepen-
dientes y con una misma distribucin. La distribucin comn que
asumimos es normal con media y varianza 2 . Es decir, estamos
asumiendo que
Xi N (, 2 )

y que los distintos valores son independientes entre si.


En este tema nos planteamos el problema del contraste de hip-
tesis y lo estudiamos estudiando, fundamentalmente, los contrastes
sobre la media de la variable que observamos (concentracin de
contaminante, nivel de radiacin o de ruido).
Asumimos normalidad en los datos con los que trabajamos. Pero:
es razonable est hiptesis? Nos ocupamos al final de este tema de
lo que se conoce como contrastes de normalidad.

28.2 Constrastes para una muestra

Vamos a plantear el problema del contraste de hiptesis utilizando


el problema de una muestra en poblaciones normales.

28.2.1 Un contraste unilateral


Empezamos comentando un ejemplo que nos ayude a entender el
problema del contraste de hiptesis.

Ejemplo 52 (Un problema inventado). Un fabricante de bombillas afirma


que sus bombillas tienen una duracin media de al menos 1500 horas.
Muy bien, esta persona afirma esto. Nuestro problema es tomar una entre
528 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

dos decisiones. Admitir que lo que afirma es correcto o bien que no lo es


y la duracin media real es claramente menor que 1500. Lo primero que
necesitamos para tomar la decisin son datos. Hemos tomado una muestra
de bombillas y hemos repetido el experimento consistente en tenerlas en
funcionamiento ininterrumpido hasta que la bombilla deja de funcionar.1 En 1
Alguna bombilla dura algo ms.
definitiva tenemos una muestra aleatoria de duraciones de bombillas de este http://www.centennialbulb.org/index.htm.

fabricante. Supongamos que las duraciones observadas son

## [1] 1530.7 1160.7 1263.5 1372.7 1655.8 1606.3


## [7] 1384.9 1456.2 1848.0 2183.6 1408.1 1501.9
## [13] 1917.8 1433.0 1830.9 1782.4 1429.7 1921.0
## [19] 1852.9 1550.3 1449.0 1448.8 1581.4 1644.2
## [25] 1734.7 1315.4 1344.3 1221.0 1548.4 1575.7
## [31] 1436.4 1221.0 1415.8 1909.4 1391.8 1325.7
## [37] 1168.0 1086.3 1679.3 1444.8 1584.1 1571.1
## [43] 1570.8 1295.3 1015.3 1593.7 1379.6 1574.4
## [49] 1347.2 1301.4 1576.7 1809.6 1204.9 1773.2
## [55] 1362.1 1334.1 1740.7 1631.4 1543.6 1631.3
## [61] 1528.8 1480.9 1590.5 1371.6 1906.5 1681.2
## [67] 1581.8 1636.6 1767.4 1575.2 1692.3 1643.5
## [73] 1156.8 1566.5 1442.6 1476.8 1805.1 1401.3
## [79] 1777.0 1377.0 1495.9 1419.1 1872.6 1519.0
## [85] 1707.5 1665.4 1684.4 1237.4 1478.0 1480.4
## [91] 1596.3 1902.3 2320.0 1584.7 1418.0 1925.5
## [97] 1634.1 1551.7 1200.4 1794.4

La afirmacin del fabricante la consideramos como una hiptesis que he-


mos de evaluar. En concreto nos planteamos dicha hiptesis y su negacin.
De un modo ms preciso la hiptesis de una duracin media menor o igual a
1500 y su negacin seran

H0 : 1500,
H1 : > 1500,

donde H0 y H1 son las hiptesis nula y alternativa respectivamente.2 2


En algunos textos se denotan las
Hemos de elegir entre una de ellas. Elegir supone decidir. Hemos de decidir, hiptesis nula y alternativa como H0 y
Ha respectivamente.
con los datos que tenemos sobre las duraciones de las bombillas, cul de
las hiptesis es ms compatible con los datos: la nula o la alternativa. Esto
supone tomar una decisin: bien rechazamos la hiptesis nula o bien no
rechazamos la hiptesis nula.
Y cmo decidimos? El procedimiento que se utiliza es tomar una funcin
de la muestra aleatoria, T ( X1 , . . . , Xn ), y en funcin de los valores que
toma decidir. En este contraste, el estadstico habitualmente utilizado es el
contraste de hiptesis 529

siguiente
Xn 1500
T= . (28.1)
S/ n
Si consideramos los valores observados tenemos
xn 1500
t0 = , (28.2)
s/ n

que toma el siguiente valor

(t0 = (mean(x) - 1500) / (sd(x)/sqrt(n)))

## [1] 2.106962

Si observamos la definicin de T parece razonable definir como regla de


decisin: rechazamos la hiptesis nula si

Tc

donde c es un valor que elegiremos adecuadamente. Si asumimos que la


media poblacional es = 1500, es decir, el valor lmite entre ambas hiptesis
entonces se verifica que T (definido en 28.1) sigue una distribucin t de
Student con n-1 grados de libertad, es decir,

Xn 1500
T= t n 1 . (28.3)
S/ n

Supongamos que no queremos equivocarnos rechazando la hiptesis nula


cuando es cierta ms que un 5 % de las ocasiones. Al error que cometemos
cuando hacemos esto se le llama error tipo I. Esto supone que, colocndonos
en la situacin lmite entre las hiptesis nula y alternativa, hemos de elegir el
valor de la constante c de modo que

P( T c) = 0,05, (28.4)

o, equivalentemente, que

P( T c) = 1 0,05 = 0,95. (28.5)

La constante c es el percentil o cuantil de orden 0,95 de una distribucin t de


Student con n-1 grados de libertad que denotamos tn1,0,95 . El valor de c lo
podemos calcular con R con el siguiente cdigo

qt(.95,df=99)

## [1] 1.660391

ya que n = 100. Ya lo tenemos todo. El valor observado de T es t0 .


530 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

t0

## [1] 2.106962

Como t0 es mayor que tn1,0,95 rechazamos la hiptesis nula lo que in-


dica que el fabricante no menta: sus bombillas tienen una duracin media 0.4

superior a 1500.
Grficamente podemos representar lo que acabamos de hacer. En la figura 0.3

28.1 representamos la densidad cuando la media vale 0 = 1500. En lnea


discontinua ms a la izquierda (trazo discontinuo) indicamos la posicin del 0.2

y
estadstico t0 .
0.1

Y ahora planteamos el problema de un modo genrico. Considera-


mos el contraste de hiptesis.
0.0

10 5 0 5 10

H0 : 0 , valores.x

Figura 28.1: Contraste unilateral sobre


H1 : > 0 . la media.

Hemos de tomar una entre dos posibles decisiones: rechazamos la


hiptesis nula o bien no rechazamos la hiptesis nula. Un problema de
contraste de hiptesis consiste en tomar una decisin. Cuando deci-
dimos nos equivocamos.3 De hecho, nos podemos equivocar de dos 3
Algunos sostienen que lo mejor en la
modos. El primer tipo de error consiste en rechazar la hiptesis nula vida es no tomar decisiones. Que las
cosas pasen y asumirlas.
cuando realmente es cierta, el error tipo I. Es el error al que tradi-
cionalmente se le ha prestado ms atencin. Se considera el error a
controlar. Por ello, se le pone una cota, un valor mximo. Esta cota es
el nivel de significacin . El valor ms habitual para es 0,05. Otros
valores que habitualmente se utilizando son 0,01 o 0,1. El otro posi-
ble error consiste en no rechazar la hiptesis nula cuando realmente
no es cierta. Es el error tipo II. Como todo error ha de ser pequeo.
Este tipo de error lo podemos controlar utilizando muestras grandes.
Fijamos un y con ms muestra tendremos un menor error tipo II.
El procedimiento para realizar un contraste de hiptesis es el
siguiente:

1. Planteamos el contraste de hiptesis.

2. Fijamos un nivel de significacin .

3. Tomamos los datos.

4. Evaluamos el valor del estadstico.

5. Si el estadstico est en la regin crtica rechazamos la hiptesis


nula. En otro caso, no rechazamos dicha hiptesis nula.
contraste de hiptesis 531

Realidad Tabla 28.1: Errores que podemos co-


meter en un problema de contraste de
Decisin H0 H1 hiptesis.
Rechazamos H0 Error tipo I
No rechazamos H0 Error tipo II

Suponemos fijado . Calculamos el estadstico.

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:

Rechazamos H0 si T > tn1,1 , o dicho de otro modo, rechazamos


si T [tn1,1 , +).

En otro caso, no rechazamos H0 .

Si denotamos C = [tn1,1 , +) entonces estamos rechazando


cuando el valor del estadstico est en C. Rechazamos H0 si T C
y no la rechazamos en otro caso. A este intervalo le llamamos regin
crtica.
Lo que acabamos de hacer se puede hacer de otro modo.

1. Supongamos que calculamos el rea a la derecha de t0 en una t


de Student con n 1 grados de libertad. Este valor lo vamos a
denotar con la letra p y recibe el nombre de p-valor. Es decir, el
p-valor viene dado por

p = P( T t0 )dondeT tn1 .

El p-valor lo podemos calcular con el siguiente cdigo.

(pvalor=1-pt(t0,df=n-1))

## [1] 0.01882416

2. Las dos afirmaciones siguientes son equivalentes:


532 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

a) Se verifica que t0 > tn1,1 y por lo tanto rechazamos la


hiptesis nula.

b) El rea a la derecha de t0 sea menor que .

Es equivalente que a que el rea a la derecha de t0 sea menor que el


rea a la derecha de tn1,1 . El rea a la derecha de t0 es el valor de
p o el p-valor mientras que el rea a la derecha de tn1,1 es . Por

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

t.test(x,mu=1500,alternative="greater") Figura 28.2: El p-valor corresponde con


el rea de la zona negra.
##
## One Sample t-test
##
## data: x
## t = 2.107, df = 99, p-value = 0.01882
## alternative hypothesis: true mean is greater than 1500
## 95 percent confidence interval:
## 1510.214 Inf
## sample estimates:
## mean of x
## 1548.188

Vemos cmo la funcin no nos da el valor a partir del cual rechazamos.


Simplemente nos indica el p-valor y la hiptesis alternativa. Qu hiptesis
nula tenemos? La hiptesis nula la obtenemos por negacin de la alternativa
que nos da la salida. Y la decisin la hemos de tomar nosotros que,
al fin y al cabo, somos el decisor. El nivel de significacin lo hemos
elegido a priori. Si trabajamos con un nivel de significacin = 0,05
entonces podemos ver en la salida anterior que dicho p-valor es menor que
0,05 y rechazamos la hiptesis nula. Ah se acaba la historia. Un contraste de
hiptesis se acaba cuando se ha tomado una decisin.

Ejemplo 54. Vamos a fijarnos en la concentracin de nquel en Rusia en


los datos chorizon del paquete StatDA Filzmoser [2015]. Vamos a suponer
que una concentracin media por encima de 20 es peligrosa. Con los datos
observados, podemos considerar que la concentracin media es 20 o mayor?
Formulamos el siguiente contraste. Hay que demostrar que efectivamente
contraste de hiptesis 533

estamos por debajo del nivel de peligrosidad.

H0 : 20,
H1 : > 20.

Vamos a realizar el contraste. Cargamos los datos y seleccionamos las con-


centraciones relativas a Rusia.

data(chorizon,package="StatDA")
attach(chorizon)
Ni.Rus = Ni[which(COUN == "RUS")]

Ahora podemos aplicar el test.

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.

28.2.2 Otro problema de contraste unilateral


Supongamos que una empresa vierte sus residuos a un rio. La
concentracin media de una cierta sustancia contaminante no puede
superar un cierto valor 0 . Cmo formulamos el contraste y cmo
contrastamos las hiptesis?
El contraste lo podemos formularamos como:

H0 : 0 ,
H1 : < 0 .

La empresa debe de probar que las concentraciones medidas en las


muestras de agua no superan en media el valor que se le indica. El
contraste se puede hacer con dos procedimientos equivalentes.
534 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Primer procedimiento 1. En primer lugar elegimos el nivel de signifi-


cacin .
2. Calculamos el estadstico T = t0 definido en ecuacin 28.6.
3. Rechazamos la hiptesis nula si t0 < tn1, y no rechazamos en
otro caso.

Segundo procedimiento 1. Elegimos el nivel de significacin .


2. Calculamos el estadstico T = t0 definido en ecuacin 28.6.
3. Calculamos el rea a la izquierda de t0 en una t de Student con
n-1 grados de libertad. Este es el valor p o p-valor.
4. Rechazamos la hiptesis nula si p < y no rechazamos en otro
caso.

Hagmoslo con R. Supongamos que el valor por debajo del cual


ha de mantenerse en media es 0 = 34 unidades (en la unidad que
queris).
Supongamos que los datos con los que trabajamos son los siguien-
tes:

## [1] 35.156 29.834 22.451 34.964 35.991 18.059


## [7] 20.592 27.080 26.360 22.235 17.145 27.065
## [13] 31.630 44.717 36.533 7.743 30.797 31.665
## [19] 38.061 36.683 30.505 37.982 27.888 29.195
## [25] 29.198 29.110 21.904 35.651 35.738 28.696
## [31] 32.707 38.393 26.612 29.173 21.525 32.176
## [37] 36.572 35.721 17.150 34.111 23.061 41.332
## [43] 23.456 30.153 32.510 29.672 32.220 21.955
## [49] 31.285 24.978 27.227 27.438 30.205 32.250
## [55] 31.294 22.840 35.778 24.232 32.720 22.289
## [61] 32.005 23.333 31.665 32.783 30.932 29.506
## [67] 26.607 47.816 28.543 25.640 36.277 32.017
## [73] 42.450 36.749 27.417 30.433 34.234 33.469
## [79] 26.213 38.943 33.074 33.894 26.246 35.261
## [85] 37.475 41.267 23.491 43.466 23.118 44.490
## [91] 29.239 31.717 25.362 39.966 35.024 38.057
## [97] 28.135 31.223 31.860 25.655 33.763 31.835
## [103] 34.978 41.674 41.056 21.187 32.268 34.583
## [109] 37.977 32.385 27.383 37.498 28.453 22.242
## [115] 29.501 25.623 45.093 36.049 47.077 25.766
## [121] 32.696 32.589 22.064 26.014 23.782 22.720
## [127] 27.873 25.673 43.711 46.702 29.771 36.050
## [133] 37.861 39.578

Tenemos n = 134. Tomamos = 0,05. El estadstico vale


contraste de hiptesis 535

n = 134
mu0 = 34
(t0 = (mean(x) - mu0) / (sd(x)/sqrt(n)))

## [1] -4.724447

Determinamos el punto a partir del cual rechazamos: tn1,

alpha = 0.05
qt(alpha,df=n-1)

## [1] -1.656391

Como t0 < tn1, entonces rechazamos la hiptesis nula.


El segundo procedimiento es ms simple de aplicar y es el que
usaremos.

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

Como el p-valor es notablemente menor que 0,05 rechazamos la


hiptesis nula.

28.2.3 Y, finalmente, el contraste bilateral


Suponemos que queremos valorar si la media de la variable de
inters podemos considerar que toma un valor prximo a 0 . Cmo
formulamos el contraste? El contraste lo formularamos como:

H0 : = 0 ,
H1 : 6 = 0 .

El contraste se puede hacer con dos procedimientos equivalentes.


Primer procedimiento 1. En primer lugar elegimos el nivel de signifi-
cacin .
536 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

2. Calculamos el estadstico T = t0 (definido en ecuacin 28.6).


3. Rechazamos la hiptesis nula si t0 < 1 tn1,1/2 o bien si
t0 > tn1,1/2 y no rechazamos en otro caso.

Segundo procedimiento 1. Elegimos el nivel de significacin .


2. Calculamos el estadstico T = t0 (definido en ecuacin 28.6).
3. Calculamos el rea a la izquierda de |t0 | ms a la derecha de
|t0 | en una t de Student con n-1 grados de libertad. Este es el
valor p o p-valor.
4. Rechazamos la hiptesis nula si p < y no rechazamos en otro
caso.

Ejemplo 55. Vamos a trabajar con las concentraciones de nquel en Rusia


en los datos StatDA::chorizon. Supongamos que nos planteamos contrastar
si estamos alrededor de una concentracin de 23. El contraste es pues el
siguiente:

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

Con el p-valor 0.4836 no podemos rechazar la hiptesis nula a ninguno de


los niveles de significacin habituales de 0,01 o 0,05 o 0,1.
Y de 24? El contraste es ahora:

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

El p-valor es todava mayor, 0.9809. No rechazamos la hiptesis nula


con un nivel de significacin de 0,05. De hecho, tampoco con un nivel de
significacin de 0,1 Notemos que el argumento alternative toma el valor
two.sided por defecto. @

28.3 Intervalo de confianza y contraste de hiptesis

Hemos estudiado cmo estimar, mediante un intervalo de confian-


za, la media de una variable normal. El intervalo de confianza con

un nivel de confianza 1 viene dado por [ xn tn1,1/2 s/ n, xn

tn1,1/2 s/ n]. Supongamos que tomamos 0 en este intervalo. Nos
planteamos el siguiente contraste:

H0 : = 0 ,
H1 : 6 = 0

y pretendemos contrastar estas hiptesis con un nivel de significacin .



Si calculamos el valor del estadstico t0 = ( xn 0 )/(s/ n) tenemos
que se verifica que |t0 | tn1,1/2 y por lo tanto no rechazamos la
hiptesis nula consistente en que la verdadera media de la poblacin
toma el valor 0 .
Este resultado lo hemos formulado referido a la media de una po-
blacin normal. Sin embargo, es un resultado vlido en general. Si
suponemos que tenemos un parmetro de toda la poblacin (media,
varianza, desviacin estandar en poblaciones normales o bien la pro-
babilidad de xito en poblaciones binomiales) que vamos a denotar
de un modo genrico como . Tenemos un intervalo de confianza
(con un nivel de confianza 1 ) para que depende de la muestra
{ x1 , . . . , xn } y que denotamos por [ A( x1 , . . . , xn ), B( x1 , . . . , xn )] o sim-
plemente como [ A, B]. Entonces, si A 0 B y consideramos el
538 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

contraste bilateral

H0 : = 0 ,
H1 : 6 = 0

no rechazaremos la hiptesis nula con un nivel de significacin .


Y viceversa: si consideremos todos los valores 0 para los cuales
no rechazamos la hiptesis nula (con un nivel de significacin )
en el contraste formulado anteriormente tenemos un intervalo de
confianza para con nivel de confianza 1 .

Ejemplo 56. Vamos a ilustrar con datos lo dicho. Recuperamos el contraste


de si la media de nquel en Rusia es de 23.

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

Podemos comprobar que si tomamos como valores para la media cual-


quier valor 0 que est en el intervalo de confianza el p valor que observare-
mos para el contraste H0 : = 0 frente a H1 : 6= 0 ser mayor que
= 0,05 y por lo tanto no la rechazamos.
Y al revs, si vamos contrastando H0 : = 0 frente a H1 : 6= 0 para
todos los posibles valores de 0 y nos quedamos con los valores de 0 para
los cuales no rechazamos con un nivel de significacin entonces tenemos
un intervalo de confianza con nivel de confianza 1 .

28.4 Contraste de normalidad

Hemos vistos que, con mucha frecuencia, los procedimientos esta-


dsticos que hemos utilizado (y mucho de lo que sigue) asumen que
los datos que estamos manejando pueden considerarse una mues-
tra de una distribucin normal. Y esto es as sin ms? Hemos de
asumirlo y confiar en nuestra suerte? No. Podemos contrastar esta
hiptesis. La hiptesis de que los datos que estamos usando siguen
una distribucin normal es una hiptesis a contrastar. Y estamos en
contraste de hiptesis 539

condiciones de poder hacerlo. El contraste lo podemos formular de


un modo informal como:

H0 : Tenemos una muestra de una distribucin normal.

H1 : No tenemos una muestra de una distribucin normal.

Quizs una formulacin ms formalista del contraste puede ser la


siguiente donde X es el valor aleatorio que estamos observando n
veces.

H0 : X N (, 2 ) con < < + y 2 > 0.

H1 : X no sigue una distribucin normal.

Consideremos unos datos y veamos cmo evaluar si han sido gene-


rados segn una distribucin normal. Realmente vamos a considerar
dos conjuntos de datos. Uno de ellos (que denotamos por x) s que
sigue una distribucin normal mientras que la segunda muestra (que
denotamos por y) no sigue una distribucin normal. Vamos a estu-
diar la normalidad de estas dos muestras y recordemos que nos ha
de salir siempre una valoracin afirmativa para x y negativa para y.

28.4.1 Grficos para evaluar la normalidad


Parece que lo primero es ver grficamente cmo son estos datos.
En esta seccin vemos el uso del dibujo q-q o dibujo cuantil-cuantil.

Nota 10 (Estimando la densidad de puntos). Una primera opcin (bas-


tante natural pero nada aconsejable) para evaluar la normalidad es utilizar
un histograma o un estimador kernel de la densidad. Nos dan una idea de
cmo se distribuyen los puntos. En las figuras 28.3(a) y 28.3(b) mostramos
el histograma y el estimador kernel de la densidad respectivamente para la
muestra x. Las figuras 28.3(c) y 28.3(d) son las anlogas para la muestra y.
Qu se espera ver en estas dos figuras si los datos son normales? La mejor
respuesta a esta pregunta es otra pregunta: se parecen las figuras a una
densidad normal? Yo dira que las figuras 28.3(a) y 28.3(b) correspondientes
a la muestra s que recuerdan la forma de la densidad normal mientras que
esto no es cierto para las figuras 28.3(c) y 28.3(d).

No es muy fcil evaluar hasta qu punto es normal la muestra con


aproximaciones de la densidad normal que es lo que son el histo-
grama y el estimador kernel de la densidad. De hecho, este tipo de
representaciones no son nada aconsejables para este propsito.
Hay una representacin grfica muy popular para este problema
concreto: el dibujo q-q o dibujo cuantil-cuantil. Qu se pretende
evaluar? Si los datos pueden haber sido generados segn un modelo
normal con la media y varianza que sean. Si X es la variable que
540 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

(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

estamos observando (n veces), pretendemos evaluar hasta qu punto


es cierto que
X N (, 2 ), (28.9)
para algn y algn 2 . Supongamos que es cierta la afirmacin,
suponemos cierta que la variable sigue una distribucin normal.
Elegimos una serie de probabilidades pi .4 . En concreto estos valores 4
Una explicacin detallada de cmo
tienen la forma elegir estos valores lo podemos encon-
i trar en o en ?, pginas 18 y siguientes
pi = , (28.10)
n 2 + 1
donde i = 1, . . . , n. Dos son los valores de que suelen utilizarse 5 5
La funcin pppoints nos indica los
valores que realmente se utilizan.
= 0,375, (28.11)

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 ) .

Notemos que el i-simo estadstico ordenado x(i) es aproximada-


mente el percentil de orden pi . Ahora consideramos una distribucin
normal estndar y consideramos el valor qi tal que si Z es una varia-
ble aleatoria con distribucin normal estndar entonces
Z q
i 1 x2
pi = P ( Z qi ) = e 2 dx.
2
De hecho, es habitual denotar
Z y
1 x2
(y) = e 2 dx.
2
Entonces
p i = ( q i ),
es decir,
q i = 1 ( p i ).
En el dibujo q-q representamos los puntos (qi , x(i) ) con i = 1, . . . , n.
La nota 57 nos muestra cmo realizar el dibujo de un modo simple
utilizando las funciones qqnorm y qqline.

Ejemplo 57 (Dibujo q-q con las funciones qnorm y qqline). La funcin


qqnorm nos proporciona el dibujo q-q fcilmente. En la figura 28.4(a)
tenemos la representacin grfica para la muestra x.
542 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

qqnorm(x)

La figura 28.4(c) muestra el mismo dibujo para la segunda muestra. Po-


demos considerar que los puntos de la figura 28.4(a) estn sobre una lnea
recta, estn alineados? Yo dira que s. Y los puntos de la figura 28.4(c)?
Creo que coincidiramos que no.
En las dos figuras estamos intentando ver si podemos superponer una
lnea recta a los puntos que estamos representando. No viene mal una ayuda
visual que nos coloque una buena lnea y sobre ella veamos si los puntos
estn cercanos a la lnea. Se pueden superponer muchas lneas. Existe una
prctica a la hora de elegir esta lnea. Para trazar una lnea necesitamos dos
puntos. Se eligen dos buenos puntos y consideramos la lnea que pasa por
ellos. El primero es el punto correspondiente a los percentiles de orden 0,25,
esto es, el cuartil inferior. Determinamos este cuartil inferior en los datos
observados (y es el valor de la ordenada) y en una distribucin normal es-
tndar (y es el valor de la abscisa). El segundo punto es el correspondiente
al cuartil superior o percentil de orden 0,75. Su abscisa y ordenada son los
percentiles de orden 0,75 en la distribucin normal estndar y el observado
en los datos. En las figuras 28.4(b) y 28.4(d) tenemos los dibujos q-q aa-
diendo la lnea que pasa por los cuartiles inferior y superior. Para los datos x
se obtiene con el siguiente cdigo.

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.

28.5 Constrastes de normalidad

Un procedimiento grfico siempre ayuda a descartar situaciones


claras. En la seccin anterior hemos visto cmo podamos rechazar
la normalidad de los datos y mediante un dibujo q-q. Para los datos
x no hemos podido rechazarla. Nos quedamos con esto? Admiti-
mos que son datos normales y en paz? No. El siguiente paso a dar
consiste en utilizar un contraste de hiptesis. Vamos a comentar rpi-
damente los contrastes ms utilizados. En este seccin utilizamos el
paquete de R nortest Gross and Ligges [2015] para los test ji-cuadrado
contraste de hiptesis 543

(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

y Kolmogorov-Smirnov. El test de Shapiro-Wilk lo aplicamos con la


funcin shapiro.test de R Core Team [2016, stats].

28.5.1 Test de ShapiroWilk


Es otro test para determinar si podemos considerar unos datos
normales Apliqumoslo a nuestros datos. Para la muestra x

shapiro.test(x)

##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.98523, p-value = 0.158

No rechazamos con un nivel de significacin de 0,05. Para la se-


gunda muestra,

shapiro.test(y)

##
## Shapiro-Wilk normality test
##
## data: y
## W = 0.79546, p-value = 1.082e-11

Vemos como rechazamos claramente.


Una buena explicacin de este test se puede encontrar en http:
//en.wikipedia.org/wiki/Shapiro%E2%80%93Wilk_test

28.5.2 Test ji-cuadrado


Lo podemos hacer con la funcin pearson.test del paquete Gross
and Ligges [2015, nortest]. La aplicamos a ambos conjuntos de datos.
Primero a los datos x.

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

Vemos cmo rechazamos la normalidad de la muestra y mientras


que no la rechazamos para la muestra x a un nivel de significacin
= 0,05.

28.5.3 Test de Kolmogorov-Smirnov


Para aplicar este test utilizamos la funcin lillie.test del paquete
Gross and Ligges [2015, nortest]. Empezamos con los datos x.

lillie.test(x)

##
## Lilliefors (Kolmogorov-Smirnov) normality
## test
##
## data: x
## D = 0.074098, p-value = 0.06842

Y ahora para los datos y.

lillie.test(y)

##
## Lilliefors (Kolmogorov-Smirnov) normality
## test
##
## data: y
## D = 0.17916, p-value = 3.019e-10

Vemos cmo rechazamos la normalidad de la muestra y mientras


que no la rechazamos para la muestra x a un nivel de significacin
= 0,05.
29
Comparacin de dos poblaciones

29.1 Introduccin

Distintos problemas relativos a comparar dos poblaciones se tratan


en este tema. Empezamos abordando el problema de la comparacin
mediante herramientas puramente descriptivas de las dos muestras
de que disponemos, una por poblacin en estudio. Seguimos con la
comparacin de dos poblaciones normales, en particular, la compa-
racin de sus medias y varianzas. Continuamos con la comparacin
mediante el test de Kolmogorov-Smirnov para dos muestras. Termi-
namos con un test de Montecarlo para comparar las medias de dos
poblaciones.

29.2 Comparacin descriptiva de las muestras

Pretendemos comparar dos poblaciones. De cada una de ellas


disponemos de una muestra. Hablamos de dos muestras indepen-
dientes porque proceden de poblaciones distintas.
Por ejemplo, podemos tener la expresin de un gen dado obser-
vado bajo dos condiciones (salvaje y modificado) y pretendemos
compararlas. Para ilustrar tomamos muestras concretas. Tenemos
dos muestras x e y, una por poblacin. Lo primero es la comparacin
descriptiva de estas muestras.
La primera muestra es

## [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

mientras que la segunda muestra es


548 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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

Qu significa comparar las dos muestras? Desde un punto de


vista estadstico las dos muestras son realizaciones de variables alea-
torias. Si repetimos el muestreo obtendremos valores distintos en
cada una de las dos zonas observadas. Por tanto, la comparacin no
puede ser comparar los valores numricos uno a uno. Tampoco pue-
de ser comparar sin ms algn resumen de los datos como la media
y la varianza muestrales. En nuestro caso, los valores observados son
para la primera muestra

mean(x)

## [1] 22.51776

sd(x)

## [1] 2.065475

y para la segunda

mean(y)

## [1] 30.19877

sd(y)

## [1] 3.274895

Casi tiene un mayor inters la comparacin grfica de ambas


muestras. En la figura 29.1 tenemos el histograma y el estimador
kernel de la densidad de las muestras x e y. Podemos considerar que
ambas muestras han sido obtenidas de una misma poblacin? O, por
el contrario: proceden de distintas poblaciones?
Una primera cuestin es que pretendemos comparar muestras obte-
nidas de posiblemente dos poblaciones distintas. No parece una buena
opcin utilizar figuras distintas (bien histogramas bien estimadores
kernel). Ambos dibujos se configuran para su propia muestra. Por
ejemplo, el nmero de clases de cada histograma depende del n-
mero de datos y por lo tanto es distinta. La anchura de banda de los
comparacin de dos poblaciones 549

(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

estimadores kernel tambin son distintos. En resumen, si queremos


comparar lo lgico es representar conjuntamente ambas muestras.
Cmo? Utilizar histogramas conjuntos no es especialmente til o
de interpretacin fcil. Es preferible utilizar colocar en una misma
grfica los dos estimadores kernel. Un detalle, el nivel de suavizado
debe de ser el mismo para los dos estimadores, o dicho de otro modo,
la anchura de banda ha de ser la misma. En la figura 29.2 se mues-
tra una representacin conjunta de ambos estimadores kernel de la
densidad. Los datos muestran una forma simtrica y vemos que la
muestra y toma valores mayores que la muestra x. Sin embargo, es 0.2

una pura interpretacin grfica. Hemos de estimar las diferencias en-


tre las muestras y contrastar si ambas muestras proceden de distintas v

density
x

poblaciones con contrastes de hiptesis formales. Es lo que vamos a 0.1


y

hacer.
Cuando comparamos dos poblaciones hay que hacerse varias pre-
guntas y en funcin de las respuestas que obtengamos planteamos la
0.0

comparacin. Son los datos normales? Es la primera pregunta que 20 25 30 35


u
debemos responder: Podemos considerar que los datos proceden
Figura 29.2: Estimadores kernel de
de dos poblaciones normales? De otro modo: la primera muestra la densidad de x e y. Los datos de la
procede de una poblacin normal con media y varianza X y X2 muestra y tienden a tomar valores
mayores que los de x.
desconocidos y la segunda muestra procede de una poblacin nor-
mal con media y varianza Y y Y2 desconocidos? Obviamente esto
supone pasar test de normalidad a nuestros datos. Cada una de las
dos muestras ha de pasar el test de normalidad. Supongamos que
la respuesta es afirmativa. El problema de comparar las poblaciones
se simplifica. Cmo es la densidad de una normal? Si la variable
aleatoria X N ( X , Y2 ) entonces su funcin de densidad es

( x X )2
1 12
2
f (x) = e X (29.1)
2X

La de la variable Y con distribucin Y N (Y , Y2 ) tiene la misma


expresin en donde cambiamos x por Y y X por Y . En resumen
si las medias son la misma, X = Y y las varianzas son iguales
X2 = Y2 entonces las densidades son la misma. Tenemos la misma
poblacin normal. En resumen, si asumimos que las dos poblaciones
son normales entonces comparar las poblaciones se reduce a com-
parar las medias y las varianzas. Adems cuando no sean iguales
podremos saber a qu se debe. Las situaciones en que nos podemos
encontrar son las siguientes:

1. La misma media y varianza.

2. Distinta media y la misma varianza. En la figura ?? mostramos


dos densidades normales verificndolo.
comparacin de dos poblaciones 551

3. La misma media y distinta varianza. En la figura ?? vemos las


funciones de densidad.

4. Distinta media y varianza. En la figura ?? tenemos un ejemplo de


densidades normales verificando esto.

En la situacin 1 de la enumeracin anterior no tenemos dos po-


blaciones. Tenemos una sola poblacin. Sin embargo, en los casos
2, 3 y 4 tenemos dos poblaciones distintas bien porque la media, la
varianza o ambas son distintas. Podemos evaluar (contrastar) si la
diferencia entre las poblaciones se da en la variabilidad (en las va-
rianzas) en las medias o en ambas cosas. Esto nos da una visin clara
de las diferencias entre las poblaciones.
En la seccin 29.4.2 planteamos el correspondiente contraste de
hiptesis en donde comparamos las varianzas de dos poblaciones
normales. Obviamente si rechazamos la hiptesis de igualdad de las
varianzas tenemos dos poblaciones distintas ya que sus varianzas lo
son. Lo que no sabemos es sus medias son o no iguales. Esto va des-
pus. Si no hemos rechazado que las varianzas sean iguales entonces
comparamos las medias asumiendo una misma varianza en las dos
poblaciones, es decir, asumimos que la primera muestra aleatoria es
de una poblacin normal con media X y varianza 2 mientras que
la segunda muestra es de una normal con media Y y varianza 2 .
Finalmente, tambin podemos realizar el contraste de hiptesis para
comparar las medias cuando las varianzas son distintas.

(a) (b) (c)


Figura 29.3: Densidades normales: (a)
distinta media y la misma varianza; (b)
misma media y distinta varianza; (c)
distintas medias y varianzas.
29.3 Comparando las medias de dos poblaciones normales

Asumimos, en esta seccin, que las muestras son de poblaciones


normales. Desde el punto de vista del usuario el inters suele estar
en comparar medias independientemente de si las varianzas son
552 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

iguales o no. Esto es una visin algo miope porque la diferencia de la


varianza tambin indica que tenemos poblaciones distintas.
Tenemos una muestra X1 , . . . , Xn de una variable X N ( X , X2 ) y
otra muestra Y1 , . . . , Ym de Y N (Y , Y2 ).

29.3.1 Estimacin de la diferencia de medias


Nos interesa estudiar si X y Y son iguales o no. Esto se puede
formular de varias formas. En primer lugar podemos plantearnos
estimar la diferencia de los dos valores. El estimador de esta cantidad
es
X Y = X Y = Xn Ym .
\
La expresin anterior significa que el estimador de la diferencia
X Y , que denotamos como \ X Y , tomamos la diferencia de
los estimadores de X y Y que son respectivamente Xn y Ym . El va-
lor a estimar X Y es un nmero desconocido, lo que llamamos
parmetro, que estimamos mediante el estimador puntual Xn Ym .
Hemos visto antes como construir intervalos de confianza pa-
ra cada una de las medias X y Y . Estos intervalos (asumiendo

normalidad) tienen la expresin xn tn1,1/2 s X / n y ym

tm1,1/2 s X / m.
Ejemplo 58. Supongamos que tomamos un nivel de confianza 1 =
0,95. Con los datos que tenemos los intervalos son, para la primera muestra,

t.test(x)$conf.int

## [1] 21.89723 23.13830


## attr(,"conf.level")
## [1] 0.95

y para la segunda

t.test(y)$conf.int

## [1] 29.30489 31.09264


## attr(,"conf.level")
## [1] 0.95

El primer intervalo contiene a X con un nivel de confianza 1 y


el segundo a Y con el mismo nivel de confianza. Pero esto ya lo saba
y no me resuelve nada. Queremos un intervalo para la diferencia de
medias X Y con un nivel de confianza previamente especificado
1 . Para ello se utiliza la siguiente cantidad.
( Xn Ym ) ( X Y )
T= (29.2)
SE( Xn Ym )
comparacin de dos poblaciones 553

donde SE( Xn Ym ) denota la desviacin estndar de la variable


Xn Ym . Esta cantidad no tiene una expresin nica. De hecho, de-
pende de si las varianzas son iguales o distintas. Adems el compor-
tamiento aleatorio de T definido en la ecuacin 29.2 tambin depende
de si son la misma varianza o son distintas. En cualquier caso T va
a tener una distribucin de probabilidad que es una t de Student
donde sern distintos los grados de libertad. Si de momento deno-
tamos como estos grados (tomar dos valores posibles) entonces el
intervalo de confianza para X Y con un nivel de confianza 1
tendr la expresin general

Xn Ym t,1/2 SE( Xn Ym ).

Como vemos no es muy distinto al caso de una sola muestra en que


estimamos una sola media.

Ejemplo 59. En nuestro caso, y antes de ver las expresiones, podemos


obtener el intervalo de confianza asumiendo varianzas iguales con

t.test(x,y,var.equal=TRUE)$conf.int

## [1] -8.799484 -6.562526


## attr(,"conf.level")
## [1] 0.95

y asumiendo que son distintas (que es la opcin por defecto) con

t.test(x,y,var.equal=FALSE)$conf.int

## [1] -8.757018 -6.604992


## attr(,"conf.level")
## [1] 0.95

Como vemos son bastante parecidos los dos intervalos. Posiblemente no


deben de ser muy distintas las varianzas de las dos poblaciones.

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

tiene una distribucin t de Student con n + m 2 grados de libertad.


El intervalo de confianza lo podemos construir utilizando el resulta-
do dado en 29.3 y vendra dado por
Sp
Xn Ym tn+m2,1/2 .
n+m2
Ejemplo 60. Este intervalo viene dado, para un nivel de 1 = 0,95 por

t.test(x,y,var.equal=TRUE,conf.level=0.95)$conf.int

## [1] -8.799484 -6.562526


## attr(,"conf.level")
## [1] 0.95

y, para un nivel de 1 = 0,99 por

t.test(x,y,var.equal=TRUE,conf.level=0.99)$conf.int

## [1] -9.161699 -6.200311


## attr(,"conf.level")
## [1] 0.99

Como vemos un mayor nivel de confianza supone un intervalo ms gran-


de. Tenemos ms confianza en que el valor verdadero de X Y est en el
intervalo pero el intervalo al ser mayor nos estima la diferencia de medias
con una precisin menor.
Y ahora consideremos el caso con varianzas posiblemente distin-
tas, esto es, suponemos que X2 6= Y2 . No tiene ahora sentido estimar
una varianza comn que no existe. Estimamos cada una de ellas con
su estimador natural: X2 con S2X y Y2 con SY2 . El error estndar de
q
S2X Sy2
Xn Ym , SE( Xn Ym ), viene dado por SE( Xn Ym ) = n + m y la
expresin que adopta 29.2 y su distribucin aproximada es
Xn Ym ( X Y )
T= q t0 (29.4)
S2X Sy2
n + m
con  
S2X Sy2
n + m
0 = .
(S2X /n)2 (SY2 /m)2
n 1 + m 1
Es decir, que T se distribuye aproximadamente como una distribu-
cin t de Student 0 grados de libertad donde 0 no tiene porqu ser
un nmero entero. El intervalo de confianza con nivel de confianza
1 viene dado por
s
S2X Sy2
Xn Ym t0 ,1/2 + .
n m
comparacin de dos poblaciones 555

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

## [1] -8.757018 -6.604992


## attr(,"conf.level")
## [1] 0.95

t.test(x,y,var.equal=FALSE,conf.level=0.99)$conf.int

## [1] -9.106204 -6.255805


## attr(,"conf.level")
## [1] 0.99

29.3.2 Contraste de hiptesis


Otra manera de comparar las medias de dos poblaciones es con-
trastar si sus medias son iguales o bien si alguna de ellas es mayor
que la otra. Vamos a considerar el contraste de igualdad de medias
frente a la desigualdad lo que tambin se llama contraste bilateral,
bidireccional o de dos colas.

H0 : X = Y ,
H1 : X 6 = Y .

La regin crtica, es decir, los valores para los cuales rechazamos la


hiptesis nula es:
| T0 | > t,1/2

siendo
X Y
T0 = q , (29.5)
S p n1 + 1
m

y = n + m 2 si las varianzas se asumen iguales. Para varianzas


desiguales:
Xn Ym
T0 = q 2 (29.6)
SX Sy2
n + m

y = 0 . El p-valor viene dado por

p = P( T0 |t0 |)

siendo t0 el valor observado de T0 en cada caso.


556 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Ejemplo 62 (Test de la t para comparar medias). Supongamos que el


nivel de significacin elegido es = 0,01. Vamos a contrastar la igualdad de
medias en los dos casos. Con varianzas iguales tendremos:

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

El p-valor 0 es muy pequeo por lo que rechazamos la hiptesis nula.

29.3.3 Los contrastes unilaterales o direccionales


Los otros dos contrastes seran los correspondientes unilaterales, o
direccionales o de una cola.

H0 : X Y ,
H1 : X > Y .

H0 : X Y ,
H1 : X < Y .

Ejemplo 63. Vamos a comparar las concentraciones de bario en Rusia y


Noruega para los datos del proyecto Kola. En principio vamos a suponer
que las varianzas de dichas concentraciones las podemos considerar iguales.
Primero leemos los datos.

data(chorizon,package="StatDA")
attach(chorizon)

Los intervalos de confianza para la diferencia de medias y el contraste


de hiptesis para la igualdad de las medias frente a la alternativa de medias
distintas asumiendo que las varianzas son la misma lo podemos obtener con

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

Estimamos la diferencia de medias como 23.539 y el intervalo de con-


fianza con nivel 0,95 es [5.865,41.212]. Adems el p-valor observado es
0.0091663 menor que 0,01 por lo que rechazamos la hiptesis nula de igual-
dad de medias.
Vamos a repetir el estudio sin asumir que la varianza es la misma en las
dos poblaciones.
558 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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

El estimador puntual de la diferencia de medias no cambia, 23.539. Sin


embargo, el intervalo de confianza con nivel 0,95 s que cambia. Ahora es
[10.459,36.619]. Adems el p-valor observado es 4,5 104 sigue siendo
menor que 0,01 por lo que rechazamos la hiptesis nula de igualdad de
medias. La pregunta obvia es: qu opcin elegir? Desde el punto de vista
aplicado lo lgico es asumir varianzas desiguales (que por otra parte suele
ser el caso). Por ello la opcin por defecto de t.test es precisamente asumir
varianzas distintas. Adems cuando las varianzas son realmente iguales o
casi iguales los resultados que se obtienen asumiendo que las varianzas son
la misma o sin asumirlo son prcticamente las mismas.

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.

Ej. 44 Las mediciones de plomo. A continuacin damos las con-


centraciones medidas de plomo en soluciones que son idnticas,
salvo por la cantidad de plomo que se ha aadido. Catorce muestras
comparacin de dos poblaciones 559

contenan 1,25mg / L y 14 contenan 2,5 mg / L. Es consistente la di-


ferencia de los medias muestrales observadas con la diferencia (real)
de 1,25 mg / l?
Con 1.25 mg/L
1.1 2.0 1.3 1.0 1.1 0.8 0.8 0.9 0.8 1.6 1.1 1.2 1.3 1.2
Con 2.5 mg/L
2.8 3.5 2.3 2.7 2.3 3.1 2.5 2.5 2.5 2.7 2.5 2.5 2.6 2.7

29.4 Inferencia sobre las varianzas de dos poblaciones normales

Hasta ahora no nos hemos preocupado de las varianzas de las


poblaciones normales con las que estamos trabajando. Ya es hora de
hacerlo. Adems es enormemente importante estimar y contrastar
cosas sobre las varianzas. Tenemos dos muestras correspondientes a
dos poblaciones. Tenemos, como siempre, un doble inters: estimar y
contrastar.

29.4.1 Estimacin del cociente de varianzas


Ejemplo 64. Vamos a generar unos datos con distribucin normal de los
cuales sabemos sus medias y varianzas.

n = 45
m = 54
x = rnorm(n,mean=23,sd=2.45)
y = rnorm(m,mean=30,sd=3.45)

Si llamamos a la funcin var.test tenemos lo siguiente:


Si miramos la ltima lnea vemos que no nos est estimando cada varian-
za separadamente. En lugar de ello, como nos interesa compararlas, lo que
estimamos es el cociente X2 /Y2 .

Las varianzas de las dos poblaciones se comparan utilizando el


cociente X2 /Y2 . Podemos estimarlo o bien contrastar hiptesis sobre
el cociente. El estimador puntual de esta cantidad es

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

que tiene una distribucin F (de Fisher) con n 1 y m 1 grados de 1.5

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

## [1] 1.75846 Figura 29.4:

Teniendo en cuenta el resultado 29.9 el intervalo de confianza para


2
S2X /X
SY2 /2 es el siguiente:
Y

SY2 SY2
 
1 1
,
S2X F1/2 (n 1, m 1) S2X F/2 (n 1, m 1)

29.4.2 Contraste de hiptesis para el cociente de varianzas


Nuestro inters fundamental es valorar si podemos considerar
que las varianzas son iguales o que son distintas. Tenemos un pro-
blema de contraste de hiptesis. De hecho, estamos interesados en el
siguiente contraste:

H0 : X2 = Y2 ,
H1 : X2 6= Y2 .

que lo reformulamos como


X2
H0 : Y2
= 1,
X2
H1 : Y2
6= 1.

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

y podemos contrastar que las varianzas sean la misma rechazando la


hiptesis nula de igualdad con un nivel de significacin si

F < F/2 (n 1, m 1) o F > F1/2 (n 1, m 1).

Ejemplo 65. Vamos a plantearnos si podemos considerar que las concen-


traciones de bario en Rusia y Noruega tienen varianzas similares o no. En
comparacin de dos poblaciones 561

primer lugar podemos observar las varianzas muestrales de ambas muestras

var(Ba[COUN=="RUS"])

## [1] 9730.406

var(Ba[COUN=="NOR"])

## [1] 1372.308

Vemos que la variabilidad en Rusia es mayor que la que tenemos en


Noruega.

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

El cociente lo estimamos como 7.091. El intervalo de confianza para el


cociente de las varianzas es [5.228,9.452]. Como vemos el valor uno no est
en el intervalo de confianza y no podemos considerar que la variabilidad de
las medidas sean semejantes.
Por consiguiente lo correcto es elegir la opcin por defecto de varianzas
desiguales que nos da el siguiente cdigo.

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.

Ej. 46 Los bioslidos de una planta de tratamiento de aguas resi-


duales industriales se aplicaron a 10 parcelas seleccionadas aleatoria-
mente de un total de 20 parcelas de ensayo de las tierra agrcola. El
maz se cultiva en las parcelas tratadas (T) y no tratadas (UT) con los
siguientes rendimientos (fanegas / acre).
UT 126 122 90 135 95 180 68 99 122 113
T 144 122 135 122 77 149 122 117 131 149
Se pide calcular el intervalo de confianza al 90 % para la diferencia de
las producciones medias.

Ej. 47 La presencia de arsnico en el agua potable de la red pbli-


ca es un riesgo para la salud. Se han tomado medidas de la concen-
tracin de arsnico en 20 poblaciones de la regin de Murcia y en 20
poblaciones de la Comunidad Valenciana. Los valores observados son
los siguientes:
9.304729 7.521734 12.709850 16.142454 7.475735 11.741802 16.330484
15.435159 14.835557 9.759411 12.250387 9.426963 15.992894 17.116555
15.507461 11.764259 11.381000 19.548472 11.412476 13.776614
y
27.02096 20.59237 18.38069 23.80335 25.07857 22.43169 21.49625 20.86017
24.24796 22.88794 20.23317 23.99709 18.30906 25.35573 19.92300 23.65616
23.58910 17.72509 17.93796 26.33419 25.73931 24.29759 20.00022
Se pide:
comparacin de dos poblaciones 563

1.Introducir los datos en un fichero texto (por ejemplo, con Calc de


OpenOffice.org). Hay que introducir dos variables. En una de ellas
hemos de poner todas las concentraciones indicadas correspon-
dientes a las dos comunidades autnomas. En la otra indicamos
con un cdigo numrico si estamos en una u otra comunidad.
Llamad a este fichero arsenico.txt.

2.Podemos considerar que la varianza de las muestras es la misma?

3.Comparar las medias teniendo en cuenta la respuesta que hemos


dado en el apartado anterior.

29.5 Comparacin de medias con muestras apareadas

Volvemos al problema de comparar dos muestras. Ahora ya no


hablamos de muestras independientes. No son dos zonas distintas en
las que medimos una concentracin y tomamos mediciones en cada
una de ellas. O dos grupos de enfermos distintos de modo que en un
grupo administramos una medicacin y en el otro grupo administra-
mos la otra. Ahora vamos a suponer que tenemos muestras apareadas
o emparejadas (paired es la expresin inglesa). Por ejemplo, si medi-
mos la humedad en una localizacin un da y repetimos la medicin
otro da pero en el mismo lugar entonces tenemos dos observaciones
apareadas. Son el mismo punto y lo que cambia es el momento en
que observamos. Esto lo hacemos en n localizaciones distintas y tene-
mos: ( xi , yi ) con i = 1, . . . , n. El factor que empareja es lo localizacin
en que medimos.
Un ejemplo mdico habitual es medir algo en un enfermo antes y
despus de tomar una medicacin. Los datos son apareados pues co-
rresponden a la misma persona. El factor que empareja es la persona.
Hablando con (un poco) de precisin lo que tenemos son n ob-
servaciones independientes de dos variables aleatorias que denotamos
( Xi , Yi ) con i = 1, . . . , n. Notemos que las dos variables aleatorias Xi e
Yi no son independientes, estn relacionadas porque bien corresponden
a la misma localizacin o a una misma persona. Siendo X y Y las
medias de las variables X e Y nos interesa (lo que no es mucha no-
vedad) conocer la diferencia de medias X Y . Como es sabido la
media de la variable diferencia es la diferencia de las medias de cada
variable, esto es, X Y = X Y . Teniendo en cuenta este resultado
lo que vamos a hacer es olvidarnos de las variables X e Y y trabajar
con la variable D = X Y y contrastar si la media de la variable D es
nula.

Ejemplo 66. Supongamos las siguientes mediciones de humedad en n


localizaciones con una diferencia de un da en la observacin.
564 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Los valores de las muestras x e y (mostramos los 10 primeros solamente


por razones de espacio) son:

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

Si hacemos lo indicado. Empezamos calculando las diferencias y vemos los


10 primeros valores.

d = x -y
d[1:10]

## [1] 2.0820275 -17.7635350 -10.9931817


## [4] 3.4793012 -14.8625948 -0.4792472
## [7] -12.2557202 3.4849390 -8.5910210
## [10] -4.6856664

Ahora podemos obtener el estimador puntual de la diferencia de medias,


el intervalo de confianza y el contraste de si la diferencia de medias vale cero
utilizando t.test sobre las diferencias.

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

Otra opcin en la que no necesitamos calcular previamente las diferencias


es la siguiente:

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

Como vemos lo que sale es lo mismo.

Ejemplo 67. Se trata de evaluar el efecto de la dieta y el ejercicio en el nivel


de colesterol. Se midi la concentracin antes y despus de un programa
de ejercicio aerbico y cambio a una dieta baja en grasas. Los datos son los
siguientes

(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

donde x corresponde a los niveles antes e y a los niveles despus. Podemos


contrastar la igualdad de medias frente a la desigualdad con

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

Podemos observar que el valor 0 no est en el intervalo de confianza.


Por el tipo de dato que tenemos parece ms natural contrastar las hiptesis
H0 : X Y frente a H1 : X > Y .

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

Vemos que el p-valor 0 es menor que = 0,05 y por lo tanto rechazamos


la hiptesis nula. De hecho, tambin rechazamos con un nivel de significa-
cin = 0,01.

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]

oficial y con un nuevo mtodo. Difieren significativamente los proce-


dimientos?
Muestra 1 2 3
Mtodo nuevo 2.964 3.030 2.994
Mtodo estndar 2.913 3.000 3.024

Ej. 49 2 Seguimos con los datos de arsnico que hemos analizado 2

en el ejercicio ??. Tanto en Murcia como en la Comunidad Valenciana


se modific el procedimiento de depuracin de las aguas potables.
Se repitieron las medidas en las mismas poblaciones despus de la
modificacin indicada. Los nuevos valores observados fueron los
siguientes:
10.070679 9.715279 8.267526 10.214574 12.710386 11.647418 7.818922
9.805545 5.662589 14.808491 5.809585 8.732512 12.487733 8.146030
6.216196 5.901716 6.489493 7.509617 3.819655 7.923631
y
comparacin de dos poblaciones 567

12.901566 14.898103 19.722906 16.463436 19.689758 22.498737 20.082501


12.142602 15.509206 13.028103 13.517140 10.484259 4.246902 11.312456
18.731691 19.317701 14.559483 20.541582 10.797239 15.124459 20.216890
9.673123 14.935897
Se pide:
1.Vamos a introducir en el fichero que hemos construido en el pri-
mer apartado del ejercicio ?? (que sugera llamar arsenico.txt aun-
que casi seguro que nadie me ha hecho caso) una nueva variable.
En ella vamos a colocar las nuevas concentraciones de arsnico.
2.Estimar el cambio medio que se ha producido en la concentracin
de arsnico en Murcia y en la Comunidad Valenciana.
3.Ha sido significativo el cambio en cada una de las comunidades
autnomas con un nivel de significacin de 0,01.
4.Es significativamente distinto el cambio observado en una y otra
comunidad autnoma?

Ej. 50 3 Medicin de nitrito. Los siguientes datos se obtuvieron a 3


Berthouex and Brown [2002, ejercicio
partir de mediciones apareadas del nitrito en agua y en aguas resi- 17.2]

duales por el mtodo del electrodo directo selectivo de iones (ISE) y


un mtodo colorimtrico. Son los dos mtodos consistentes?
ISE 0.32 0.36 0.24 0.11 0.11 0.44 2.79 2.99 3.47
Color 0.36 0.37 0.21 0.09 0.11 0.42 2.77 2.91 3.52

Ej. 51 4 Pruebas de demanda de oxgeno bioqumico. Los datos 4


Berthouex and Brown [2002, ejercicio
que figuran abajo son comparaciones por pares de las pruebas de de- 17.3]

manda de oxgeno bioqumico hechos utilizando la botella estndar


de 300 ml y con botellas experimentales de 60 ml. Se pide estimar
la diferencia entre los resultados obtenidos con los dos tamaos de
botella. Por estimar la diferencia entendemos tanto el estimador pun-
tual de la diferencia media como el intervalo de confianza (que lo
pedimos a un 90 %).
300 mL 7.2 4.5 4.1 4.1 5.6 7.1 7.3 7.7 32 29 22 23 27
60 mL 4.8 4.0 4.7 3.7 6.3 8.0 8.5 4.4 30 28 19 26 28

Ej. 52 5 Seguimiento de una corriente. Una industria voluntaria- 5


Berthouex and Brown [2002, ejercicio
mente monitoriza un arroyo para determinar si su objetivo de elevar 17.5].

el nivel de contaminacin en 4 mg / L o menos se verifica. Las medi-


ciones que siguen para septiembre y abril se realizaron cada cuatro
das de trabajo. Se est cumpliendo el objetivo de la industria?
Septiembre Abril
Rio arriba Rio abajo Rio arriba Rio abajo
7.5 12.5 4.6 15.9
8.2 12.5 8.5 25.9
568 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

8.3 12.5 9.8 15.9


8.2 12.2 9.0 13.1
7.6 11.8 5.2 10.2
8.9 11.9 7.3 11.0
7.8 11.8 5.8 9.9
8.3 12.6 10.4 18.1
8.5 12.7 12.1 18.3
8.1 12.3 8.6 14.1

Ej. 53 Un procedimiento importante para certificar la calidad del


trabajo que se hace en un laboratorio es el anlisis de muestras es-
tndar que contienen cantidades conocidas de una cierta substancia.
Estas muestras son introducidas en la rutina del laboratorio de mo-
do que el analista no conoce la identidad de la muestra. A menudo
el analista no conoce que estas muestras introducidas para evaluar
la calidad del trabajo que se realiza han sido introducidas. En este
ejemplo, se propuso a los analistas que midieran la concentracin de
oxgeno disuelto en una misma muestra con dos mtodos distintos.
Se enviaron muestras a 14 laboratorios preparadas con una baja con-
centracin de oxgeno disuelto (1.2 mg/L). Cada laboratorio realiz
sus determinaciones utilizando el mtodo de Winkler y el mtodo
del electrodo. La cuestin que nos planteamos es si los dos mtodos
predicen distintas concentraciones de oxgeno disuelto.
Laboratorio 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Winkler 1.2 1.4 1.4 1.3 1.2 1.3 1.4 2.0 1.9 1.1 1.8 1.0 1.1 1.4
Electrodo 1.6 1.4 1.9 2.3 1.7 1.3 2.2 1.4 1.3 1.7 1.9 1.8 1.8 1.8
Se pide:

1.Podemos considerar que las mediciones realizadas con el mtodo


de Winkler difieren significativamente del valor 1,2? Responded a
esta pregunta utilizando el intervalo de confianza y el contraste de
hiptesis correspondiente.Trabajar con un nivel de confianza de 0,9
y un nivel de significacin de 0,1.

2.Podemos considerar que las mediciones realizadas con el mtodo


del electrodo difieren significativamente del valor 1,2? Responded
a esta pregunta utilizando el intervalo de confianza y el contraste
de hiptesis correspondiente. Trabajar con un nivel de confianza
de 0,9 y un nivel de significacin de 0,1.

3.Difieren entre si los dos mtodos de medicin de la concentracin


de oxgeno disuelto? La pregunta hemos de responderla utilizando
intervalos de confianza para la diferencia de medias y el contraste
de hiptesis correspondiente. El nivel de confianza a utilizar es 0,9
y el nivel de significacin 0,1.
comparacin de dos poblaciones 569

29.6 Test de Kolmogorov-Smirnov para dos muestras

En esta seccin nos ocupamos del test no paramtrico conocido


como test de Kolmogorov-Smirnov para dos muestras. 6 6
Es aconsejable consultar http://en.
wikipedia.org/wiki/Kolmogorov%E2%
Hasta ahora hemos comparado poblaciones asumiendo que am-
80%93Smirnov_test.
bas poblaciones tienen una distribucin normal. Las variables que
observbamos seguan una distribucin normal. Qu ocurre cuan-
density.default(x = x, bw = h)
do no lo podemos asumir? Qu ocurre cuando nuestros datos son
marcadamente no normales?

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

Vemos cmo el test de normalidad rechaza claramente que po-


damos considerarlas muestras normales. No parece muy razonable
utilizar un test de comparacin de medias basada en la distribucin
t. Hay otras opciones? S que las hay. Adems no son malas solucio-
nes. En esta seccin nos ocupamos del test de Kolmogorov-Smirnov
para dos muestras. Es un procedimiento no paramtrico. Un proce-
dimiento se dice no paramtrico cuando no asume ningn modelo
particular para los datos. No suponemos que son normales o que
son binomiales o que son exponenciales, etc. A veces se les llama de
distribucin libre indicando que no estamos sujetos a un modelo es-
Normal QQ Plot

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

pago. Asumimos menos hiptesis pero tambin son procedimientos


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.

Para contrastar, como siempre, necesitamos un estadstico del con-


Normal QQ Plot
traste, un estadstico que compare ambas muestras. El estadstico
no se basa en la comparacin de las medias y varianzas muestrales

20
como en los test anteriores. Denotamos las muestras como x1 , . . . , xn

Sample Quantiles

15

e y1 , . . . , ym de tamaos respectivos n y m. Consideramos las funcio-


nes de distribucin empricas o muestrales que denotamos Fn para


10

muestra de las xs y por Gm para la muestra de las ys. Es decir:




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

D = max | Fn (z) Gm (z)|, (29.11)


z

es decir, D nos da la mxima diferencia que observamos entre las


funciones de distribucin muestrales Fn y Gm . En la figura 29.8 repre-
1.0

sentamos con un segmento vertical la mxima diferencia entre ambas


0.8

2
funciones, esto es, el valor del estadstico D. Por la definicin del es-
Proportion <= x

0.6

tadstico D es claro que rechazamos para valores grandes de D. Si d


0.4

es el valor observado entonces el p-valor vendra dado por


0.2

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

La salida se autoexplica. Observamos un p-valor de 104 . Si trabajamos


con un nivel de significacin de = 0,05 entonces como el p-valor es menor
que este nivel rechazamos la hiptesis nula. Podemos decir que hay diferen-
cias significativas en la distribucin de los datos a un nivel de significacin
0,05.

29.7 Test de Wilcoxon

Es un procedimiento no parmetrico7 Pretendemos comparar 7


No asumimos ningn modelo para-
dos poblaciones (dos condiciones experimentales por ejemplo). El mtrico para las variables aleatorias. En
particular, no asumimos normalidad.
valor aleatorio correspondiente a la primera poblacin corresponde
a una variable aleatoria X mientras que Y es la variable que nos
describe a una observacin de la segunda poblacin. Tenemos dos
muestras aleatorias: X1 , . . . , Xn una muestra de la primera poblacin
e Y1 , . . . , Ym correspondiente a la segunda poblacin.
30
Datos categricos

30.1 Estimacin de una proporcin

Supongamos que denotamos por p la proporcin a estimar (pro-


porcin de aprobados en un examen, proporcin de votantes de un
cierto partido poltico). Realmente disponemos (antes de tomar los
datos) de una muestra aleatoria X1 , . . . , Xn donde cada valor aleatorio
Xi puede tomar los valores 1 y cero con probabilidades p y 1 p. El
estimador de p viene dado por
n
Xi
p = n
.
i =1

Por el teorema central del lmite sabemos que aproximadamente


(cuando el nmero de datos n es grande) p tiene una distribucin
normal con media p y varianza p(1 p)/n, es decir,

p N ( p, p(1 p)/n).

Esto lo podemos escribir como


p p
p N (0, 1).
p(1 p)/n
Sin embargo, esto no es utilizable para determinar un intervalo de
confianza. Una opcin es estimar la varianza mediante p(1 p)/n y
considerar que aproximadamente (lo cual quiere decir que hemos de
tener una muestra grande) se verifica
p p
p N (0, 1).
p(1 p)/n
Si denotamos (como hemos indicado antes) el percentil de orden
(0 < < 1) de una normal estndar como Z entonces se verifica
para un dado

p p
 
P Z1/2 p Z1/2 = 1 .
p(1 p)/n
574 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

o, escrito de otro modo, que


r r
p(1 p) p(1 p)
 
P p Z1/2 p p + Z1/2 = 1 .
n n

Teorema 3 (Intervalo de confianza para una proporcin). Si X1 , . . . , Xn


son una muestra aleatoria de variables binomiales con una prueba y probabi-
lidad de xito p entonces el intervalo
r
p(1 p)
p Z1/2
n

es un intervalo de confianza para la proporcin p siendo

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.

Ataque fatal y no fatal No ataque Tabla 30.1: Efecto preventivo de la


aspirina
Placebo 189 10845
Aspirina 104 10933

Vamos a estimar la proporcin de personas que tomando placebo tienen


un ataque cardaco.

library(Hmisc,T)
binconf(x=189, n=11034, method="asymptotic")

## PointEst Lower Upper


## 0.01712887 0.01470788 0.01954987

Del mismo modo podemos estimar la proporcin de los que, tomando


aspirina, tienen ataque cardaco. La estimacin puntual y el intervalo de
confianza vienen dados en la siguiente salida.

binconf(x=104, n=11037, method="asymptotic")

## PointEst Lower Upper


## 0.00942285 0.007620423 0.01122528

En principio parece que si tomas aspirina tienes una probabilidad menor


de tener el ataque. En cualquier caso en lo que sigue veremos el problema de
comparar las proporciones.
datos categricos 575

30.1.1 Ejercicios
Ejercicio 19. Para los datos de la tabla 27.1 se pide:

1. Estimar la proporcin de aptos para cada una de las universidades y para


todo el sistema universitario valenciano.

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 Tamao de la muestra en la estimacin de una proporcin

En la seccin anterior hemos visto un intervalo de confianza pa-


q
p(1 p)
ra estimar una proporcin. Es el intervalo p Z1/2 n , p +
q 
p(1 p)
Z1/2 n . Este intervalo tiene nivel de confianza 1 . Da-
dos unos datos tenemos el intervalo. Supongamos que la cosa ha ido
bien: El intervalo que calculamos cubre al valor verdadero de p. Te-
nemos una confianza 1 de que esto sea cierto. Bien. El intervalo
cubre a p pero nuestra estimacin puntual de p es p. Si nos piden
que demos un valor para p responderemos dando la estimacin pun-
tual, dando el valor p. La diferencia entre la estimacin puntual que
damos y el valor real de p (que desconocemos y siempre descono-
ceremos) es como mucho la mitad de la longitud del intervalo de
576 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

confianza (siempre asumiendo que p est dentro de este intervalo).


En otras palabras:
r
p(1 p)
| p p| Z1/2 .
n
Un intervalo que acierte mucho es bueno, esto es, un nivel de con-
fianza alto es bueno. De hecho, menos de un 90 % no se suele utilizar.
Pero no slo importa el nivel de confianza. Por ejemplo, el interva-
lo [0, 1] tiene un nivel de confianza de 1. Cul es la proporcin de
personas que sufren ataque de corazn tomando aspirina? Si respon-
demos que esta proporcin est entre 0 y 1 estamos haciendo una
afirmacin con una confianza de uno. No nos equivocamos en ab-
soluto. Pero tambin la afirmacin es absolutamente intil. No nos dice
nada que no supieramos previamente. En resumen el intervalo que
damos para estimar p tiene que ser tal que confiemos que contiene el
valor que queremos conocer pero tambin tiene que ser preciso, tan
estrecho como podamos para que sea informativo. Es fcil suponer
que precisin supone ms muestra, ms datos.
El problema se plantea normalmente del siguiente modo. Quiero
estimar la proporcin p y quiero que hacerlo con un error mximo
dado (por ejemplo, = 0,02). Necesitamos una primera muestra.
Para qu? Para tener una estimacin inicial de p. Denotemos el
tamao de esta primera muestra como n0 y la estimacin puntual de
p obtenida como p0 . Entonces podemos plantearnos qu valor de n
verifica que r
p0 (1 p0 )
Z1/2
n
Esto es simple. Despejamos en la desigualdad anterior el valor de n y
tenemos que
p0 (1 p0 )
n Z12/2
2
La estimacin inicial de la proporcin no necesariamente la tene-
mos que obtener de una muestra inicial. Puede que tengamos alguna
muestra previa de esa poblacin o alguna estimacin que obtenga-
mos de alguna publicacin.

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:

1. Cul es el error mximo observado con un nivel de confianza de 0,95?

2. Tomamos como estimacin inicial de p el valor observado con la primera


muestra de 100 palmeras. Supongamos que nos planteamos estimar la
datos categricos 577

proporcin de palmeras afectadas con un error mximo de 0,04 y un


nivel de confianza de 0,95. Cul ha de ser el nmero total de palmeras a
observar?

3. Responde a la pregunta del apartado 2 suponiendo que deseamos un nivel


de confianza en el error mximo de 0,99. Mantenemos el error mximo en
0,04.

4. Responde a la pregunta del apartado 2 suponiendo que deseamos un nivel


de confianza en el error mximo de 0,95 pero queremos un error mximo
de 0,02.

5. Ms nivel de confianza supone ms muestra? Responde la pregunta


considerando los apartados anteriores.

6. Menor error supone una mayor muestra? Responde la pregunta utili-


zando los apartados anteriores?.

30.3 Varias variables categricas

En esta seccin vemos algunas cuestiones bsicas cuando tra-


bajamos con datos categricos. Sin duda, una magnfica referencia
bibliogrfica para saber ms (muchsimo ms y muchsimo mejor) es
Agresti [2002]. Todo este material est tomado (notacin incluida) de
este texto. Es un breve y, a veces, crptico resumen de algunas partes
de los temas 2 y 3 de Agresti [2002]. Fundamentalmente utilizamos el
test exacto de Fisher.

30.3.1 Probabilidad y tabla de contingencia


Supongamos que tenemos dos variables aleatorias X e Y con I y J
categoras. Su distribucin conjunta viene dada por

ij = P( X = i, Y = j),

con i = 1, . . . , I y j = 1, . . . , J. Es decir, la probabilidad de que


simultneamente X tome el valor i y la variable Y tome el valor j.
Tambin podemos considerar el comportamiento marginal de estas
variables y preguntarnos por las distribuciones marginales que se
definen como
J J
i = P ( X = i ) = P(X = i, Y = j) = ij
j =1 j =1

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

Habitualmente una variable, por ejemplo Y, es una variable respues-


ta y la otra, X es explicativa o predictora. En esta situacin no tiene
sentido hablar de distribucin conjunta y s de distribucin condicio-
nada que se define como
ij
P (Y = j | X = i ) = j | i = .
i
Dos variables aleatorias categricas se dicen independientes si

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.

Si X e Y son variables respuesta entonces hablamos de independencia.


Si Y es respuesta y X explicativa hablamos de homogeneidad.
Supongamos que tomamos una muestra ( xi , yi ) con i = 1, . . . , n.
Cmo estimamos la distribucin conjunta, las marginales y las con-
dicionadas? Un ejemplo puede ser tomar una muestra de hombres
en un cierto grupo de edad. Asignamos a cada individuo en el estu-
dio a uno de dos posibles grupos: toma una aspirina diaria (grupo
aspirina) o bien le damos diariamente un placebo (grupo placebo).
Se toma una gran muestra y los resultados los tenemos en la tabla
30.2 donde el nmero que aparece en cada celda de la tabla indica el
nmero de veces que se da simultneamente el valor correspondiente
de la fila y columna consideradas. Esta tabla recibe el nombre de tabla
de contingencia1 o tabla de clasificacin cruzada. De un modo genrico 1
Nombre debido a Karl Pearson.
podemos considerar la tabla 30.3 donde denotamos por nij el nmero
de ocurrencias del valor i de X y del valor j de Y. Por ni denotamos
la suma de los conteos de la fila, esto es, del total de veces que X to-
ma el valor i. Anlogamente por n j denotamos el total de la columna
j y nos da el nmero total de veces que la variable Y ha tomado el
valor j. Notemos que estimamos la distribucin conjunta (ver tabla
30.4) con
nij
P( X = i, Y = j) = ij = (30.1)
n
La distribucin condicionada de la variable Y a la variable X (tabla
30.5) la estimaramos con
nij
P(Y = j| X = i ) = j|i = . (30.2)
ni
De un modo similar podemos estimar la distribucin condicionada
de la variable X a la variable Y.
nij
P( X = i |Y = j) = i| j = . (30.3)
n j
datos categricos 579

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

De un modo genrico la tabla 30.2 correspondera a la tabla 30.3. A


partir de estos conteos tendremos la distribucin conjunta estimada
que mostramos en la tabla 30.4. La distribucin condicional estimada
de Y a X (de la columna a la fila) la mostramos en la tabla 30.5.

Test positivo Test negativo Total Tabla 30.3: Tabla de contingencia 2 2.


Enfermo n11 n11 n 1
No enfermo n21 n22 n 2
Total n 1 n 2 n

ij Test positivo Test negativo Total Tabla 30.4: Distribucin conjunta


estimada
Enfermo n11 /n n11 /n n1 /n
No enfermo n21 /n n22 /n n2 /n
Total n1 /n n2 /n 1

30.3.2 Comparacin de proporciones


Muchos estudios se disean para comparar grupos basndonos
en una respuesta binaria, Y. Con dos grupos tenemos una tabla de
contingencia 2 2. Supongamos que denotamos las probabilidades
condicionadas del siguiente modo:

P (Y = 1 | X = i ) = i , (30.4)
P (Y = 2 | X = i ) = 1 i . (30.5)

Estudiar la posible asociacin entre las variables X e Y es equiva-


lente a comparar las proporciones 1 y 2 . Cmo comparamos las
proporciones? Podemos estimar la diferencia de las proporciones2 2
Por su simplicidad suele la opcin ms
1 2 . Otra opcin es trabajar con odds. Qu son los odds? habitual en los textos introductorios de
Estadstica.
Definition 11 (Odds). Para un suceso aleatorio A con probabilidad P( A)
los odds se definen como el cociente
P( A)
.
1 P( A)
En concreto se trata de considerar los odds del suceso Y = 1 en la
distribucin condicionada a X = 1 frente a los odds del suceso Y = 1
en la distribucin condicionada a X = 2. Estamos considerando el
siguiente cociente
/ (1 1 )
= 1 .
2 / (1 2 )
580 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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:

Puede ser cualquier valor positivo.

= 1 significa que no hay asociacin entre X e Y, que X e Y son


independientes.

Valores de alejados de 1 indican una asociacin mayor.

Se suele trabajar con log pues entonces el valor que tenemos es


simtrico respecto a cero.

El odds ratio no cambia cuando intercambiamos filas y columnas.

30.3.3 Test de Fisher


Consideramos una tabla 2 2. La hiptesis nula es de indepen-
dencia. Condicionamos a los totales marginales de fila y columna.
Solamente nos queda libre un conteo (por ejemplo, n11 ) y

(nt1 )(nn12 t)
p(t) = P(n11 = t) =
(nn1 )
donde los valores posibles son

m n11 m

con m = max{0, n1 + n1 n} y m = mn{n1 , n1 }. Queremos


contrastar independencia. En tablas 2 2 lo podemos formular en
trminos del cociente de odds, . Recordemos que la independen-
cia de las variables binarias o dicotmicas es equivalente a que el
cociente de odds sea igual a 1.

H0 : = 1

frente a (alternativa unilateral)

H1 : > 1
datos categricos 581

Para el test anterior, si t0 es el valor observado de n11 , entonces el


p-valor sera
P(n11 t0 ).

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.

Prediccin primer servicio Tabla 30.6: Fisher y el t.


Primer servicio Leche T Total
Leche 3 1 4
T 1 3 4
Total 4 4
En este experimento sera ms extrema la tabla con n11 = 4. El p-valor
sera
P(n11 = 3) + P(n11 = 4) = 0,243.
Estamos ordenando las tablas de acuerdo con n11 .
31
Modelos lineales

El problema que se trata en este tema es bsico. Estudiar relaciones


entre una variable que llamaremos variable respuesta y una (o ms de
una) variable que llamaremos variables predictoras. Tambin se utilizan
las denominaciones de variable dependiente para la variable respuesta
y variables independientes en lugar en predictoras.
Si denotamos a la variable respuesta por Y (al valor observado lo
denotaremos por y) y a la variable predictora por X nuestro proble-
ma es intentar conocer el valor de Y cuando conocemos el valor de la
variable X.

Ejemplo 70. Vamos a utilizar los datos tamidata:yeastgrowthRA.

library(Biobase)
data(yeastgrowthRA,package="tamidata")

Nos fijamos en el gen que ocupa la fila 3109 en la matriz de expresin.

y = exprs(yeastgrowthRA)[3109,]

Qu gen es?

featureNames(yeastgrowthRA)[3109]

## [1] "YOR315W"

Empezamos representando en figura 31.1 la expresin del gen como


funcin de la tasa de crecimiento de la clula.
2000

x = pData(yeastgrowthRA)[,"growthrate"]
1500

plot(x,y)
y

1000

Nuestro problema es intentar predecir la expresin del gen a partir de la


500

tasa de crecimiento.






0

0.15 0.20 0.25 0.30 0.35 0.40 0.45

Figura 31.1: Expresin del gen 3109


frente a la tasa de crecimiento celular.
584 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

31.1 Coeficiente de correlacin de Pearson

Tenemos la matriz de expresin y consideramos el perfil de expre-


sin de dos genes. Supongamos que nos planteamos la siguiente
pregunta: estn relacionadas linealmente las expresiones de los ge-
nes que estamos considerando? Denotemos los niveles de expresin
del primer y segundo gen mediante ( xi , yi ) con i = 1, . . . , n. Es decir,
en la muestra i el gen 1 se expresa xi y el gen 2 se expresa yi . Supon-
gamos que los datos observados son los que aparecen en la figura
??.
Un valor que se utiliza frecuentemente para responder esta pre-
gunta es el coeficiente de correlacin de Pearson. Se define del siguiente
modo. Fu propuesto por Karl Pear-
son.
Definition 12 (Coeficiente de correlacin de Pearson).

in=1 ( xi xn )(yi yn )
r= q q .
in=1 ( xi xn )2 in=1 (yi yn )2

Veamos una ilustracin grfica del concepto. En la figura 31.2(a)


mostramos los datos con los que vamos a trabajar.

(a) (b) (c)


Figura 31.2: a) Datos. b) Los datos
con dos lneas: la lnea horizontal que
En la figura 31.2(b) aadimos al diagrama de puntos mostrado en corta al eje de ordenadas en y y la lnea
la figura 31.2(a) un par de lneas que se cortan en el punto ( x, y): la vertical que corta al eje de abscisas en
x. c) Los datos, la lnea horizontal que
lnea horizontal que corta al eje de ordenadas en y y la lnea vertical
corta al eje de ordenadas en y y la lnea
que corta al eje de abscisas en x. vertical que corta al eje de abscisas
Consideremos los productos cruzados ( xi x )(yi y). En la figura en x. Representamos en rojo aquellos
puntos donde el producto cruzado
31.2(c) reproducimos el dibujo de la figura ??(b). Simplemente, repre- ( xi x )(yi y) es positivo y en azul
sentamos en rojo aquellos puntos donde el producto cruzado anterior aquellos puntos donde el producto
toma un valor negativo.
es positivo y en azul aquellos puntos donde el producto toma un
valor negativo.
modelos lineales 585

Tenemos una relacin razonablemente lineal entre las dos variables


y por ello vemos muchos ms puntos rojos que azules. El coeficiente
de correlacin lineal de Pearson vale

cor(x1,y1)

## [1] 0.8448371

Vamos a repetir el mismo anlisis con otros dos conjuntos de da-


tos. En uno de ellos la asociacin lineal es mayor mientras que en el
otro buscaremos que no haya prcticamente asociacin lineal entre
las variables.

(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

Mayor que en el caso anterior. Y un tercer ejemplo donde la asocia-


cin lineal es casi inexistente. En las figuras 31.3(c) y (d) mostramos
los dibujos anlogos al caso anterior. Vemos cmo hay muchos ms
puntos azules que en los dos casos anteriores. El nuevo coeficiente de
correlacin lineal de Pearson es

cor(x3,y3)

## [1] -0.01681442

Esta es la ilustracin grfica de la idea que subyace a este concep-


to. Cuanto ms se aproximan los puntos a una lnea recta mayor es
el valor absoluto del coeficiente de correlacin, ms prximo a uno.
Si cuando x crece y crece entonces la recta el valor de coeficiente de
correlacin es positivo. Si cuando x crece y decrece entonces el coefi-
ciente de correlacin es negativo.
Si vemos la definicin 12 que acabamos de dar se tiene que
s xy
r= .
s x sy
La covarianza muestral
in=1 ( xi xn )(yi yn )
s xy = ,
n1
est estimando la cantidad

E( X X )(Y Y ),

mientras que las desviaciones tpicas muestrales, s x y sy , no son


ms que estimaciones de las desviaciones tpicas poblacionales X
y Y . En resumen que r = s xy /(s x sy ) no es ms que un estimador
del coeficiente de correlacin de Pearson que damos en la siguiente
definicin.

Definition 13. Dadas dos variables aleatorias X e Y definimos su coeficien-


te de correlacin de Pearson como
E( X X )(Y Y )
= .
X Y
Esta cantidad es una cuantificacin de la asociacin lineal entre
X e Y. Es importante notar que aqu no hay predictor y respuesta.
Ambas variables son tratadas de un modo simtrico. De hecho si
intercambiamos las variables el valor del coeficiente de correlacin no
se modifica, es el mismo. Adems se tiene que

1 1.

Se puede probar que si = 1 entonces existe dos constantes a y b


(con b positiva) tales que Y = a + bX (con probabilidad uno). Si =
modelos lineales 587

1 entonces existen a y b (con b negativa) tales que Y = a + bX (con


probabilidad uno). En resumen que si el coeficiente de correlacin es
1 o -1 entonces una variable es funcin lineal de la otra. La recta es
creciente si la correlacin es positiva y decreciente si es negativa.

31.2 Matriz de covarianzas y matriz de correlaciones

Ahora consideramos una muestra de dimensin d, y1 , . . . , yn . Si




yi1
.
..
yi =
yip

Entonces podemos representar toda la muestra como la siguiente


matriz

y10 y11 . . . y1d
. . .. ..
Y= .. = .. . .

y0n yn1 . . . ynd

El vector de medias muestral viene dado por la siguiente expre-


sin en trminos de la matriz Y,
n
1 1 0
y =
n yi = n
Y 1n . (31.1)
i =1

siendo 1n el vector n 1 con todos los valores iguales a uno. Tambin


denotaremos

y1
.
y = ..


y p

La matriz de covarianzas muestral es aquella matriz que tiene en la


posicin ( j, k) la covarianza muestral entre las componentes j y k, es
decir,
n
1
n 1 i
s jk = (yij y j )(yik yk ),
=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

Finalmente, si denotamos por r jk el coeficiente de correlacin entre


las variables j y k, es decir,

in=1 (yij y j )(yik yk ) s jk


r jk = q = (31.2)
in=1 (yij y j )2 in=1 (yik yk )2 s jj skk

Denotaremos por R la matriz de correlaciones muestrales R = [r jk ].

Ejemplo 71 (Matrices de covarianza y correlacin muestrales). Cmo


calculamos las matrices de covarianzas y de correlaciones con R.
Supongamos la siguiente matriz de expresin con 9 genes y cuatro mues-
tras.

## muestra1 muestra2 muestra3 muestra4


## gen1 19.93897 24.18056 20.73145 23.67065
## gen2 21.24857 24.44546 22.24318 22.89275
## gen3 25.39048 23.48665 22.11069 19.00336
## gen4 22.19192 18.80119 22.08156 20.46012
## gen5 27.21533 19.56285 23.24227 20.22825
## gen6 19.45776 19.26472 23.55205 23.15382
## gen7 23.75526 25.00087 22.83491 22.82725
## gen8 20.60263 20.85558 20.13963 24.19282
## gen9 22.15760 23.67709 21.59811 24.34753

La matriz de covarianzas entre las muestras viene dada por

cov(M)

y las covarianzas entre los genes por

cov(t(M))

Anlogamente la matriz de correlacin entre las muestras es

cor(M)

y entre los genes viene dada por

cor(t(M))

31.3 Regresin lineal simple

En todos los ejemplos antes comentados el problema comn es


determinar el valor de Y a partir del valor de X. Obviamente la res-
puesta ms simple sera buscar una funcin que podemos denotar
modelos lineales 589

por f de modo que para un valor dado x simplemente calculamos


y = f ( x ). Un poco de imaginacin y conocimiento de la posible re-
lacin entre x e y podran darnos una idea de qu funcin f buscar.
Este planteamiento es de base muy restrictivo. Por qu? Pues en pri-
mer lugar porque estamos asumiendo que, para un valor de x, existe
un nico valor de y asociado. Y esto nunca (o casi) es as. Un detalle,
a veces X es una variable aleatoria que observamos simultneamente
con Y, en otras ocasiones es un valor que nosotros prefijamos (dosis
de medicacin, tratamiento en un problema de diseo de experimen-
tos). Sin embargo, desde el punto de vista de la regresin X siempre
lo consideramos fijo y estudiamos cmo se comporta Y dado el valor
de X = x. Es decir, de la distribucin condicionada de Y al valor de
X = x.
Un ejemplo muy famoso de Galton. Se tomaba como variable pre-
dictora la estatura del padre y como variable respuesta o a predecir,
la estatura de un hijo. Es claro que para un mismo padre la estatura
de sus hijos es variable. No todos los hijos de un mismo padre miden
lo mismo. No tiene ningn sentido asumir una relacin funcional
entre la estatura de un padre y la de un hijo.
Tan tontos no son los estadsticos (que no estadistas). De hecho, lo
que se modeliza es la relacin entre el valor x y el valor medio de la
variable Y dado ese valor x. Siguiendo con el ejemplo de Galton. Si
consideramos un padre de estatura X = 178 centmetros. Supondre-
mos que la media de la variable Y que nos da la estatura aleatoria de
un hijo es la que se relaciona con x. Denotemos por E[Y | x ] esta me-
dia (estatura media de todos los hijos de un padre con estatura 178
centmetros). Hemos de admitir que adems de lo que mide el padre,
algo tendr que decir la madre, y tambin otros muchos factores que
todos podemos imaginar. De modo que Y, conocida la estatura del
padre, sigue siendo una cantidad aleatoria. De hecho, se asume que
la distribucin de Y es normal cuya media depende de Y, E[Y | x ],
pero cuya varianza no depende de x, es decir, es una cantidad cons-
tante que denotaremos por 2 . En resumen, estamos asumiendo que

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)

Las hiptesis asumidas en 31.3 y 31.4, podemos expresarlas conjunta-


mente diciendo que la variable respuesta Y se puede expresar como

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

donde los ei N (0, 2 ) e independientes entre si. Entonces el modelo


dado en 31.7 lo podemos reescribir como

Y = X + e, (31.8)

con e Nn (0, 2 Inn ).


Este modelo probabilstico es conocido como el modelo de regre-
sin lineal simple. No lo estudiaremos en ms detalle porque nos
vamos a ocupar de la situacin ms general en que tenemos ms
de una variable predictora. No es ms que un caso particular y sin
mucha dificultad adicional se puede estudiar el situacin general de
regresin lineal mltiple.
modelos lineales 591

31.4 Regresin lineal mltiple

Pretendemos determinar la relacin que liga a una variable res-


puesta Y como funcin de p 1 variables predictoras, x1 , . . . , x p1 .
Siguiendo el razonamiento anterior podemos plantearnos un modelo
muy general como el que sigue.

Y = f ( x1 , . . . , xn ) + e, (31.9)

donde f es una funcin desconocida y e es el trmino del error. Va-


mos a asumir una situacin ms simple. En concreto que la funcin
f es lineal de modo que la relacin sera Y = 0 + 1 x1 + . . . +
p1 x p1 . Realmente observamos n vectores (yi , xi1 , . . . , xi,p1 ) en
consecuencia nuestro modelo estocstico ha de considerar el mode-
lo para los n valores aleatorios Yi , donde cada Yi tiene asociado un
vector xi . Vamos a suponer que para una combinacin de valores
( xi1 , . . . , xi,p1 ) vamos a observar un valor aleatorio Yi con distri-
bucin normal cuya media es 0 + 1 xi1 + . . . + p1 xi,p1 y cuya
varianza va a ser constante e igual a 2 . Adems los distintos Yi son
independientes entre si.
Vamos a formular conjuntamente estas hiptesis. Denotaremos

0
Y1 1 x11 . . . x1,p1 e1
. . . . 1 .
.. X = .. .. ..
Y= = . e=.
.

.
.

Yn 1 xn1 . . . xn,p1 en
p 1
El modelo estocstico bsico es el que sigue

Y = X + e. (31.10)

En este modelo a X le llamaremos la parte sistemtica mientras que


e es la componente aleatoria del modelo. Estamos expresando los
datos como la suma de una parte sistemtica ms una parte aleato-
ria. La parte sistemtica es la media del vector Y. Notemos que la
dimensin del espacio en que estamos trabajando es n, el nmero de
observaciones. El vector de medias o parte sistemtica del modelo
tiene dimensin p por lo que la parte no explicada, el residuo, tiene
dimensin n p.

Figura 31.4: Expresamos la observacin


31.5 Estimacin de y como suma ortogonal de una parte
sistemtica ms un residuo.
Cmo estimamos los parmetros ? Nuestros datos son (yi , xi1 , . . . , xi,p1 )
con i = 1, . . . , n. Nuestro objetivo es estimar los coeficientes de mo-
do que X est prximo a y. En concreto vamos a minimizar
n
ei2 = e0 e = (y X)0 (y X). (31.11)
i =1
592 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Si desarrollamos la expresin anterior tendremos que

(y X)0 (y X) = y0 y 20 X 0 y + + 0 X 0 X.

Diferenciando respecto de los distintos j e igualando a cero nos da


el siguiente sistema de ecuaciones normales:

X 0 X = X 0 y. (31.12)

Si asumimos que la matriz X 0 X es una matriz no singular entonces


tendremos que
= ( X 0 X )1 X 0 y, (31.13)
y en consecuencia se sigue que

X = X ( X 0 X )1 X 0 y = Hy. (31.14)

La matriz H = X ( X 0 X )1 X 0 y = Hy es la matriz de proyeccin de y


sobre el espacio engendrado por los p vectores columna de la matriz
X. Es una matriz n n.
Utilizando la matriz H podemos calcular las predicciones para
cada una de los xi originales. Vienen dadas por

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

y sera, como funcin de la matriz H,

e0 e = y0 ( I H )( I H )y = y0 ( I H )y. (31.18)

Veamos una interpretacin geomtrica que nos ayude a entender qu


son los estimadores mnimo cuadrticos que utilizamos. Estamos
minimizando (y X)0 (y X). Si vemos la figura 31.4 el valor de
que nos da el mnimo coincide con el punto que nos da la proyeccin
ortogonal de y sobre el plano que viene engendrado por las columnas
de la matriz X. De este modo es claro que

(y y1n )0 (y y1n ) = (y X )0 (y X ) + (y y1n )0 (y y1n ).


(31.19)
modelos lineales 593

o de otro modo la ecuacin anterior la podemos expresar como


n n n
(yi y)2 = (yi yi )2 + (yi y)2 . (31.20)
i =1 i =1 i =1
Las sumas de cuadrados que acabamos de considerar reciben la
siguiente denominacin:
Suma de cuadrados total
n
SS( Total ) = (y y1n )0 (y y1n ) = (yi y)2 . (31.21)
i =1

Suma de cuadrados del error


n
SS( Error ) = (y X )0 (y X ) = (yi yi )2 . (31.22)
i =1

Suma de cuadrados de la regresin


n
SS( Regresion) = (y y1n )0 (y y1n ) = (yi y)2 . (31.23)
i =1

31.6 Algunos casos particulares

Supongamos en primer lugar la situacin en que no tenemos nin-


gn predictor. Esto es, nuestro modelo es Y = + e. En este caso
se tiene que la matriz de diseo X = 1n = (1, . . . , 1)0 , X 0 X = n y,
finalmente, = ( X 0 X )1 X 0 y = n1 10n y = y.
El segundo ejemplo que podemos considerar sera con una sola
variable predictora o lo que es lo mismo, el modelo de regresin
lineal simple. En este caso, tendremos

Y1 1 x1 " # e1
. . ..
0 + ..

. = .
. . . .
1
Yn 1 xn en
Notemos que podemos hacer Yi = 0 + 1 x + 1 ( xi x ) + ei . Nuestra
matriz de diseo sera


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

Dados los datos ( xi , yi ) con i = 1, . . . , n la verosimilitud de y =


(y1 , . . . , yn )0 vendra dada por
1 1
L( , ) = n exp{ (y X)0 (y X)} (31.25)
(2 ) 2 n 22

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.

31.8 Distribucin muestral de

Hemos visto que = ( X 0 X )1 X 0 Y. Aplicando propiedades sim-


ples de la media tenemos que

E = ( X 0 X )1 X 0 ( EY ) = , (31.27)

o, lo que es lo mismo, que es un estimador insesgado de , el esti-


mador tiene por vector de medias el vector de parmetros que esti-
ma. Es una buena propiedad. La matriz de covarianzas del error se
obtiene fcilmente como

var ( ) = ( X 0 X )1 X 0 (2 I ) X ( X 0 X )1 = ( X 0 X )1 2 . (31.28)

Esta matriz de covarianzas depende de la varianza desconocida del


error 2 . Si estimamos esta varianza tendremos un estimador de
dicha matriz de covarianzas. Se puede probar que

E[SS( Error )] = (n p)2 (31.29)

de donde, un estimador insesgado para la varianza 2 viene dado


por
e0 e
2 = . (31.30)
np
Ya podemos estimar var ( ). Este estimador sera

c ( ) = ( X 0 X )1 2 .
var (31.31)

Si ( X 0 X )1 = [ aij ]i,j=1,...,p entonces el estimador de la varianza de i ,


var ( i ), sera aii 2 . Recordemos que i es un estimador insesgado de
modelos lineales 595

i y por lo tanto su varianza coincide con su error cuadrtico medio.


Finalmente el error estndar de i , es decir, su desviacin tpica (raz
cuadrada de su varianza) sera

c ( i ) = aii .
SE (31.32)

Realmente de sabemos ms cosas: = ( X 0 X )1 X 0 Y y puesto


que Y Nn ( X, 2 Inn ) entonces, por propiedades bsicas de la
distribucin normal multivariante se tiene que

Np ( , ( X 0 X )1 2 ). (31.33)

Una vez realizado el ajuste con la funcin summary podemos ob-


servar los valores estimados de (etiquetado como Residual standard
error y los errores estndar de i .

31.9 Bondad de ajuste

Hemos supuesto una relacin lineal entre la media de la variable


respuesta y las variables predictoras. Asumiendo la relacin hemos
considerado una funcin objetivo y minimizando dicha funcin he-
mos obtenido los estimadores mnimo cuadrticos. Sin embargo, la
primera pregunta que hay que responder es: tenemos un ajuste ra-
zonable? La respuesta se da utilizando medidas que comparan los
valores observados con las predicciones asumiendo el modelo, es
decir, comparando yi con yi para los distintos datos. En concreto, con
diferencia la ms utilizada es el coeficiente de determinacin que se
denota por R2 y se define como

in=1 (yi yi )2 SS( Error )


R2 = 1 n = 1 . (31.34)
i =1 i
( y y i ) 2 SS( Total )

Es habitual denominar a in=1 (yi yi )2 , suma de cuadrados del error


mientras que a SS( Regresion) = in=1 (yi y)2 se le llama suma de
cuadrados de la regresin. Tenemos pues que

in=1 (yi y)2 SS( Regresion)


R2 = = . (31.35)
in=1 (yi yi )2 SS( Total )

El ajuste que estamos realizando se supone que ser tanto mejor


cuanto ms pequea sea SS( Error ). Tampoco sera natural que
SS( Error ) fuera nula pues sera tanto como asumir que los distin-
tos valores aleatorios son iguales a su media. Notemos que SS( Total )
es una cuantificacin de la variabilidad de los distintos yi sin tener en
cuenta las variables predictoras mientras que SS( Error ) nos cuantifi-
ca la variacin residual despus de utilizar las variables predictoras.
Es de esperar que un mejor ajuste vaya acompaado de un valor de
596 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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.

31.10 Valoracin de las hiptesis del modelo

Un modelo de regresin lineal mltiple supone, como hemos visto,


varias hiptesis. Es necesario valorar lo razonables, lo asumibles que
son estas hiptesis. Las hiptesis del modelo que vamos a valorar son
las siguientes:
1. Tenemos errores independientes, con la misma varianza y con
distribucin normal? Esto es, nos preguntamos si es asumible la
hiptesis e Nn (0, 2 Inn ).

2. Asumimos que E[Yi | xi ] = 0 + 1 xi1 + . . . + p1 xi,p1 .


Los errores e no son directamente observables. Observamos los re-
siduos e = y y que no es lo mismo. Las propiedades de am-
bos vectores son distintas. En particular, estamos asumiendo que
var (e) = 2 Inn . Sin embargo, esta afirmacin no es cierta para los
residuos observados e. Notemos que
y = X ( X 0 X )1 X 0 y = Hy.
De modo que
e = y y = ( I H )y = ( I H ) X + ( I H )e = ( I H )e.
La tercera igualdad anterior es consecuencia de que HX = X por-
que H es la matriz de proyeccin sobre el espacio engendrado por las
columnas de X y X est en este espacio por lo que la proyeccin es
el propio punto. Notemos que I H tambin es una matriz de pro-
yeccin (sobre el espacio ortogonal al engendrado por las columnas
de X) de modo que ( I H )2 = I H. Aplicando esta propiedad se
tiene que
var (e) = var ( I H )e = ( I H )2 , (31.37)
ya que var (e) = 2 Inn . Vemos pues que, aunque asumimos que los
errores e son incorrelados y con la misma varianza, esto no es cierto
para los residuos e.
modelos lineales 597

31.10.1 Homogeneidad de la varianza


La mera observacin de los residuos sin considerar su posible
asociacin con otra variable no nos proporciona informacin sobre si
la varianza de los mismos es constante. Hemos de considerarlos en
relacin con otras variables. Es habitual considerar un diagrama de
puntos de los residuos e como funcin de las predicciones y. Cuando
la varianza es constante debemos de observar los residuos dispersos
de un modo aleatorio respecto del eje de abscisas. Tambin podemos
ver un comportamiento no aleatorio alrededor del eje de abscisas
cuando la parte estructural del modelo no es lineal, es decir, cuando
no se verifica que EY = X.

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"]

Construimos un data.frame para su uso posterior.

yeastgrowth3109 = data.frame(expression = y,medium = x1, growthrate = x2)

Hacemos el ajuste lineal.

gen3109.lm = lm(y ~ x1 + x2,data=yeastgrowth3109) Residuals vs Fitted


1000 1500 2000

ra31

Notemos que elegimos el primer dibujo (figura 31.5).


Residuals

plot(gen3109.lm, which = 1)
500

Cuando no tenemos una varianza constante una opcin es trans-




ra1
500

ra3

formar las variables. Si y es la variable original y h(y) la transfor-


100 0 100 200 300 400
mada queremos determinar h de modo que la transformada tenga
Fitted values
varianza constante. Transformaciones habituales que podemos valo- lm(y ~ x1 + x2)

Figura 31.5: Predicciones frente a


rar son la raz cuadrada o el logaritmo de la variable respuesta.
residuos del ajuste.
Qu tipo de representacin cabe esperar cuando la varianza no es
constante? Veamos distintas representaciones de los residuos frente a
los valores ajustados correspondiendo a varianza constante, varianzas
no constantes y situaciones en que no hay linealidad.
598 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Ejemplo 73 (Hiptesis del modelo de regresin). Ilustramos cmo ob-


servaramos residuos cuya varianza es constante. En la figura 31.6 tenemos
50 posibles residuos en donde la varianza es constante.

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

Figura 31.6: Residuos cuando se verifica


la homogeneidad de la varianza.
En la figura 31.7 tenemos como abscisas valores que van de 1 a 50 en
incrementos unitarios. El valor de residuo que generamos tienen varianza
creciente. En concreto vamos multiplicando el valor con distribucin N (0, 1)
por una constante c. La varianza es del orden del cuadrado del valor por el
que multiplicamos.
modelos lineales 599

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

Figura 31.7: Residuos con varianza


creciente con la variable predictora.

En la figura 31.8 los valores por los que multiplicamos son 1, 2, 3, . . . , 50
por lo que las varianzas se incrementan mucho menos de una abscisa a la si-
guiente.
600 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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

Figura 31.8: Residuos con varianza


creciente con la variable predictora.
Finalmente en la figura 31.9 mostramos un ejemplo de un residuo no
lineal. Es un caso en que no podemos suponer que la media es una funcin
lineal de los predictores.

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)

cos((1:50) * pi/25) + rnorm(50)







1

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)

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

Figura 31.9: Residuo no lineal con la


variable predictora.
602 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

El histograma no es muy adecuado para ver la normalidad de los


residuos.

Ejemplo 74 (Dibujos cuantil-cuantil). Para los datos representamos


un dibujo q-q. En la figura que sigue mostramos cmo hacerlo despus de
ajustar el modelo y utilizando la funcin plot (realmente estamos utilizando Normal QQ

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

Pero: y qu pasa cuando no tenemos normalidad. Esto es lo intere-

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-

mo se modifican los dibujos q-q con otras distribuciones de probabilidad.

0




En esta nota consideramos cuatro distribuciones de probabilidad. En la si-

guiente aparecen las densidades de los modelos considerados. La primera es 2 1 0 1 2

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

Figura 31.12: Densidades normal,


lognormal, Cauchy y uniforme.
604 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

residuos = rnorm(50)
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))

par(mfrow=c(2,2)) for(i in 1:4) residuos = rnorm(50) qqnorm(residuos) qqline(residuos) par(mfrow=c(1,1))


@
Figura 31.13: Densidad normal de los
residuos.
La figura 31.14 que sigue muestra el dibujo q-q con datos simulados
correspondientes a la distribucin lognormal.

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))

Como vemos no es simple la interpretacin de estos dibujos. Por


ejemplo, no es fcil diferenciar entre una distribucin con colas ms
modelos lineales 605

par(mfrow=c(2,2))
for(i in 1:4){
residuos = exp(rnorm(50))
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))

Normal QQ Plot Normal QQ Plot


Sample Quantiles

Sample Quantiles

0 2 4 6 8
12

2 1 0 1 2 2 1 0 1 2

Theoretical Quantiles Theoretical Quantiles

Normal QQ Plot Normal QQ Plot


Sample Quantiles

Sample Quantiles
12



8 12
8

2 1 0 1 2 2 1 0 1 2

Theoretical Quantiles Theoretical Quantiles

Figura 31.14: Densidad lognormal de


los residuos.
606 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

par(mfrow=c(2,2))
for(i in 1:4){
residuos = rcauchy(50)
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))

Normal QQ Plot Normal QQ Plot


Sample Quantiles

Sample Quantiles


400 800

5






















5



15

2 1 0 1 2 2 1 0 1 2

Theoretical Quantiles Theoretical Quantiles

Normal QQ Plot Normal QQ Plot


Sample Quantiles

Sample Quantiles


20


100































50


20

2 1 0 1 2 2 1 0 1 2

Theoretical Quantiles Theoretical Quantiles

Figura 31.15: Densidad Cauchy de los


residuos.
modelos lineales 607

par(mfrow=c(2,2))
for(i in 1:4){
residuos = runif(50)
qqnorm(residuos)
qqline(residuos)
}
par(mfrow=c(1,1))

Normal QQ Plot Normal QQ Plot


Sample Quantiles

Sample Quantiles


0.8

0.6














0.4











0.2







0.0

2 1 0 1 2 2 1 0 1 2

Theoretical Quantiles Theoretical Quantiles

Normal QQ Plot Normal QQ Plot


1.0

1.0
Sample Quantiles

Sample Quantiles

















0.6


0.6



















0.2




0.2

2 1 0 1 2 2 1 0 1 2

Theoretical Quantiles Theoretical Quantiles

Figura 31.16: Densidad uniforme de los


residuos.
608 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

largas de una situacin en donde tenemos observaciones anmalas.


Cmo hacerlo? Si quitamos las observaciones extremas y aparecen
otras estamos en una distribucin con colas largas.
Si tenemos muestras grandes el problema de la no normalidad se
alivia. El problema de la no normalidad es mayor para colas largas
que para colas ms cortas. La asimetra se resolvera transformando
los datos.
Tambin podemos usar un test de normalidad. Un test de normali-
dad es un cualquier test estadstico donde la hiptesis nula es que los
datos observados (en nuestro caso los residuos observados) proceden
de una distribucin normal. Una opcin que viene implementada con
la funcin shapiro.test es el test de Shapiro-Wilk.

Ejemplo 76 (Residuos y test de normalidad de Shapiro-Wilks). Apli-


camos un test de Shapiro-Wilks a los residuos observados en el ajuste de
los datos gen3109. Vemos que el p-valor observado es muy grande y no
podemos rechazar la normalidad de los residuos.

residuals(gen3109.lm)

## ra1 ra2 ra3 ra4


## -355.02742 -323.50813 -401.61401 -250.11992
## ra5 ra7 ra8 ra9
## -281.43826 -59.29685 52.47208 -137.12510
## ra10 ra31 ra32 ra33
## 156.05615 2040.60731 88.09025 -216.63914
## ra34 ra35 ra36 ra37
## -224.36670 -46.28795 -36.02257 -33.89697
## ra38 ra39 ra40 ra41
## -30.00957 -38.53664 -16.37286 -23.96460
## ra42
## 137.00090

shapiro.test(residuals(gen3109.lm))

##
## Shapiro-Wilk normality test
##
## data: residuals(gen3109.lm)
## W = 0.53133, p-value = 4.009e-07

31.10.3 Incorrelacin de los errores


Estamos asumiendo que los errores son incorrelados. La correla-
cin entre los datos pueden venir de que han sido observados pr-
modelos lineales 609

ximos bien en el tiempo bien en el espacio. Cmo contrastar si los


residuos son incorrelados?
Un test de la hiptesis de incorrelacin es el test de Durbin-Watson
que utiliza el siguiente estadstico

in=2 (ei ei1 )2


DW = , (31.38)
in=1 ei2
bajo la hiptesis nula de incorrelacin la distribucin es una combi-
nacin lineal de distintas distribuciones 2 .

Ejemplo 77. Vamos a aplicar el test de Durbin-Watson de correlacin


serial.

library(lmtest)

Aplicamos el test de Durbin-Watson.

dwtest(gen3109.lm)

##
## Durbin-Watson test
##
## data: gen3109.lm
## DW = 1.5844, p-value = 0.1085
## alternative hypothesis: true autocorrelation is greater than 0

31.10.4 Observaciones anmalas y observaciones influyentes


Algunas observaciones no ajustan bien al modelo y son llamadas
observaciones anmalas. Otras observaciones influyen mucho en el
ajuste y lo modifican de un modo substantivo. Estas ltimas reciben
el nombre de observaciones influyentes. Una observacin dada
puede ser o bien anmala o bien influyente o ambas cosas.
Empecemos estudiando qu se entiende por influencia de una
observacin. Llamaremos a hi = Hii , esto es, el valor en la posicin
(i, i ) de la matriz H la influencia (leverage en ingls). Notemos que
var (ei ) = 2 (1 hi ). En consecuencia, una influencia alta supone
una varianza del correspondiente residuo baja. Forzamos al ajuste
p
a que est prximo a yi . Se tiene que i=1 hi = p. En consecuencia
el valor medio de los hi es p/n. Como una regla simple de aplicar si
la influencia hi es mayor que 2p/n debemos de observar el dato con
atencin. Buscamos valores grandes de las influencias.

Ejemplo 78. Calculamos las influencias el ajuste gen3109.lm. En la si-


guiente figura aparece una representacin de las influencias respecto de los
residuos estandarizados. Calculamos las influencias.
610 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

gen3109.inf = influence(gen3109.lm)
gen3109.inf$hat

## ra1 ra2 ra3 ra4


## 0.23997325 0.09075724 0.13411463 0.16029689
## ra5 ra7 ra8 ra9
## 0.11401602 0.14347139 0.16029689 0.27884994
## ra10 ra31 ra32 ra33
## 0.14347139 0.08700539 0.12131128 0.08425135
## ra34 ra35 ra36 ra37
## 0.08645405 0.12249107 0.11558803 0.11558803 plot(gen3109.lm, which = 5)
## ra38 ra39 ra40 ra41
## 0.11558803 0.11558803 0.11115932 0.11145786
Residuals vs Leverage
## ra42
ra31

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

0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35


e
ri = i (31.39) Leverage
lm(y ~ x1 + x2)
1 hi
Figura 31.17: Influencias para el ajuste
Estos son los residuos estudentizados. Si el modelo que asumimos gen3109.lm.

es correcto entonces la varianza de estos residuos es uno y son apro-


ximadamente incorrelados. Notemos que la estudentizacin corrige
las varianzas desiguales de los residuos cuando las varianzas de los
errores son iguales entre si. En otro caso esto no es cierto. Si las va-
rianzas de los errores no son iguales (tenemos heterocedasticidad)
entonces la estudentizacin no hace homogneas las varianzas de los
residuos. Algunos autores (y programas) tienden a usar en lugar de
los residuos originales, los residuos estudentizados.
Una observacin anmala es una observacin que no se ajusta a
nuestro modelo. Hemos de protegernos frente a este tipo de puntos.
Un test para observaciones anmalas es til si nos permite distin-
guir entre observaciones que son realmente anmala y aquellas que
simplemente tienen un residuo grande aunque no excepcionalmente
grande.
Para detectar este tipo de puntos, lo que hacemos es excluir el
punto i-simo y ajustamos el modelo sin ese punto obteniendo los
estimadores (i) y (2i) . Tendremos para el punto i-simo la siguiente
estimacin
y(i) = xi0 (i) . (31.40)
Si el valor yi y(i) es grande entonces el caso i es una observacin
modelos lineales 611

anmala. Con objeto de valorar si estos nuevos residuos son anorma-


les hemos de estandarizarlos. Notemos que

c (yi y(i) ) = (2i) (1 + xi0 ( X(0 i) X(i) )1 xi )


var

de modo que podemos definir los residuos jackknife como


yi y(i) yi y(i)
ti = q = q t n p 1 ,
c (yi y(i) )
var (i) 1 + xi0 ( X(0 i) X(i) )1 xi

asumiendo que el modelo es correcto. Se tiene la siguiente expresin


1/2
n p1

e
ti = i = ri .
(i) 1 hi n p ri2

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

Ejemplo 79 (Residuos estudentizados). Calculamos para los datos


gen3109 los residuos estudentizados con la funcin rstudent. La pregunta
que nos hacemos es si alguno de estos residuos es muy grande o muy peque-
o. Comparamos el mdulo de los residuos estandarizados con tn p1,1 .
2n

gen3109.rs = rstudent(gen3109.lm)

Comparamos los residuos con el percentil correspondiente.

abs(gen3109.rs) > qt(1-.05/(50*2),44)

## ra1 ra2 ra3 ra4 ra5 ra7 ra8 ra9


## FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## ra10 ra31 ra32 ra33 ra34 ra35 ra36 ra37
## FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## ra38 ra39 ra40 ra41 ra42
## FALSE FALSE FALSE FALSE FALSE
612 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Un punto influyente es aquel que cuando lo quitamos causa una


modificacin importante del ajuste. Un punto influyente puede ser
o no una observacin anmala, puede tener o no una alta influencia
pero tender a tener al menos una de las dos propiedades. El estads-
tico de Cook es una de las maneras de medir la influencia. Se define
plot(gen3109.lm, which = 4)
como
(yi y(i) )0 (yi y(i) ) 1 hi
Di = = ri2 . (31.41)
p2 p 1 hi Cook's distance

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)

Figura 31.18: Distancias de Cook para el


## ra4 ra5 ra7
ajuste gen3109.lm.
## 1.749044e-02 1.414852e-02 8.456201e-04
## ra8 ra9 ra10
## 7.697695e-04 1.239891e-02 5.856981e-03
## ra31 ra32 ra33
## 5.345140e-01 1.499399e-03 5.798673e-03
## ra34 ra35 ra36
## 6.413156e-03 4.191483e-04 2.358215e-04
## ra37 ra38 ra39
## 2.088122e-04 1.636642e-04 2.698869e-04
## ra40 ra41 ra42
## 4.638501e-05 9.970693e-05 1.892595e-02

31.11 Inferencia sobre el modelo

Hemos formulado un modelo probabilstico en donde relaciona-


mos la variable respuesta con una serie de variables predictoras. Es
claro que el experimentador introduce en el modelo como variables
predictoras variables que a priori sospecha que pueden ser relevan-
tes a la hora de predecir. Esto no quiere decir que luego podamos
prescindir de alguna o algunas de ellas. Bien porque se demuestra
que dicha variable no es relevante o bien porque la informacin que
contiene esa variable predictora est contenida en las otras.
Supongamos que nos planteamos el siguiente contraste de hipte-
sis: H0 : i1 = . . . = ir = 0 frente a la alternativa H1 : No H0 . Si un
coeficiente determinado i es nulo entonces la variable respuesta Y
modelos lineales 613

no dependera de la variable asociada a dicho coeficiente. En definiti-


va, la hiptesis nula considerada se podra formular diciendo que la
variable Y no depende de las variables xi1 , . . . , xir . Cmo contrastar
las hiptesis indicadas? Se puede hacer mediante el test del cociente
de verosimilitudes, es decir, utilizando el estadstico

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

SS( Error )0 SS( Error )


SS( Error )

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

SS( Error )0 SS( Error )


2r
2 r
y
SS( Error )
2n p
2 ( n p )
adems ambas cantidades son independientes. Por ello se verifica que

(SS( Error )0 SS( Error ) )/r


F= Fr,n p .
(SS( Error ) )/(n p)

De modo que rechazaremos la hiptesis nula de que H0 : i1 = . . . =


ir = 0 si
F > Fr,n p,1

donde Fr,n p,1 es el percentil 1 de una F con r y n p grados


de libertad.
Realmente depende la variable respuesta de alguna de las varia-
bles predictoras? Realmente nos estamos planteando la hiptesis de
que todos los coeficientes, salvo el trmino constante 0 , valen cero,
es decir, la hiptesis nula H0 : 1 = . . . = p1 = 0. En este caso
tendremos que

((y 1n y)0 (y 1n y) (y X )0 (y X ))/( p 1)


F= Fp1,n p .
(y X )0 (y X )/(n p)
614 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Como segundo caso tendramos la situacin en que contrastamos que


un solo coeficiente vale cero, es decir, la hiptesis nula H0 : i = 0
frente a la alternativa H1 : i 6= 0. Tenemos que bajo la hiptesis nula
indicada
i
ti = tn p
SE( i )

donde SE( i ) es el error estndar de i y viene dado en ecuacin


31.32. Se tiene, de hecho, que

F = t2i .

Rechazaremos la hiptesis nula si

|ti | > tn p,1 2

o bien si
F = t2i > F1,n p,1 .
2

Ambos procedimientos son equivalentes como se puede ver fcilmen-


te.

Ejemplo 81 (Contrastes sobre los coeficientes). Cuando contrastamos


la hiptesis de que cada coeficiente valga cero vemos que podemos rechazarlo
para las dos variables predictoras. Realizamos un summary del modelo de
regresin ajustado.

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

Podemos tener intervalos de confianza para cada uno de los coefi-


i i
cientes i . Teniendo en cuenta que tn p entonces el intervalo
SE( i )
de confianza al nivel 1 para el coeficiente i sera

i tn p,1 SE( i ).
2

Ejemplo 82 (Intervalos de confianza). Calculamos los intervalos de


confianza para los coeficientes de gen3109 con la funcin confint.

confint(gen3109.lm)

## 2.5 % 97.5 %
## (Intercept) -1015.3096 1122.3790
## x1W303 -780.5354 207.2582
## x2 -2251.8728 3961.9699

Supongamos que consideramos un vector de predictores x0 y pre-


tendemos predecir la correspondiente media de la variable respuesta.
Esta media viene dada por

E[Y | x0 ] = x00 .

La estimacin de esta media es

x00 ,

que tiene varianza

var ( x00 ) = x00 ( X 0 X )1 x0 2 .

Esta varianza la estimamos mediante

c ( x00 ) = x00 ( X 0 X )1 x0 2 .
var

Y el intervalo de confianza sera


q
x00 tn p,1 x00 ( X 0 X )1 x0 .
2

Supongamos que, en lugar de predecir la media de la variable res-


puesta para un conjunto de predictores dados, pretendemos predecir
la propia variable respuesta. Recordemos que segn nuestro modelo
tenemos
Y = x00 + e.
En consecuencia la prediccin de la propia observacin sera

x00

pero hay que considerar la varianza aadida por el error e de modo


que la varianza al predecir Y dado x0 sera

var ( x00 ) + 2
616 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

que estimaramos como

c ( x00 ) + 2 = x00 ( X 0 X )1 x0 2 + 2 = ( x00 ( X 0 X )1 x0 + 1)2 .


var

Finalmente tendremos que el intervalo de confianza para una obser-


vacin Y que tiene predictores x0 es el siguiente
q
x00 tn p,1 x00 ( X 0 X )1 x0 + 1
2

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)

## ra1 ra2 ra3 ra4


## 453.69742 360.49713 402.39451 251.05092
## ra5 ra7 ra8 ra9
## 281.83266 408.37985 251.05092 201.45810
## ra10 ra31 ra32 ra33
## 408.37985 352.80169 49.06215 325.44014
## ra34 ra35 ra36 ra37
## 317.74470 50.77225 38.80157 38.80157
## ra38 ra39 ra40 ra41
## 38.80157 38.80157 16.57031 24.26574
## ra42
## -127.93290

En segundo lugar, obtenemos los intervalos de confianza para la predic-


cin de la media.

predict(gen3109.lm, interval = "confidence")

## fit lwr upr


## ra1 453.69742 -82.118338 989.5132
## ra2 360.49713 30.982494 690.0118
## ra3 402.39451 1.830298 802.9587
## ra4 251.05092 -186.870932 688.9728
## ra5 281.83266 -87.499386 651.1647
## ra7 408.37985 -5.921858 822.6816
## ra8 251.05092 -186.870932 688.9728
modelos lineales 617

## ra9 201.45810 -376.131469 779.0477


## ra10 408.37985 -5.921858 822.6816
## ra31 352.80169 30.169908 675.4335
## ra32 49.06215 -331.902479 430.0268
## ra33 325.44014 7.955665 642.9246
## ra34 317.74470 -3.863211 639.3526
## ra35 50.77225 -332.040404 433.5849
## ra36 38.80157 -333.067874 410.6710
## ra37 38.80157 -333.067874 410.6710
## ra38 38.80157 -333.067874 410.6710
## ra39 38.80157 -333.067874 410.6710
## ra40 16.57031 -348.105549 381.2462
## ra41 24.26574 -340.899479 389.4310
## ra42 -127.93290 -773.426644 517.5608

Y finalmente obtenemos los intervalos de confianza para la prediccin de


la observacin.

predict(gen3109.lm, interval = "prediction")

## Warning in predict.lm(gen3109.lm, interval = "prediction"):


predictions on current data refer to _future_ responses

## fit lwr upr


## ra1 453.69742 -764.2828 1671.678
## ra2 360.49713 -781.8501 1502.844
## ra3 402.39451 -762.4355 1567.224
## ra4 251.05092 -927.1480 1429.250
## ra5 281.83266 -872.6297 1436.295
## ra7 408.37985 -761.2453 1578.005
## ra8 251.05092 -927.1480 1429.250
## ra9 201.45810 -1035.4683 1438.384
## ra10 408.37985 -761.2453 1578.005
## ra31 352.80169 -787.5791 1493.183
## ra32 49.06215 -1109.1741 1207.298
## ra33 325.44014 -813.4951 1464.375
## ra34 317.74470 -822.3469 1457.836
## ra35 50.77225 -1108.0732 1209.618
## ra36 38.80157 -1116.4751 1194.078
## ra37 38.80157 -1116.4751 1194.078
## ra38 38.80157 -1116.4751 1194.078
## ra39 38.80157 -1116.4751 1194.078
## ra40 16.57031 -1136.4109 1169.552
## ra41 24.26574 -1128.8703 1177.402
## ra42 -127.93290 -1397.9878 1142.122
618 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

31.12 Seleccin de variables

Habitualmente tenemos un gran conjunto de variables y preten-


demos determinar un buen conjunto de variables. En qu sentido
bueno? En primer lugar, bueno en el sentido de sencillo. Tener pocas
variables supone un modelo ms simple, ms fcil de entender. Es
bueno tener pocas variables porque luego no tendremos que recoger
esta informacin. Es bueno porque los estimadores de los parmetros
que intervienen en el modelo son mucho menos variables.
Dos son las aproximaciones al problema de la seleccin de varia-
bles. En la primera vamos comparando modelos sucesivos y, bsi-
camente, consideramos si los modelos sucesivos que comparamos
difieren significativamente como modelos. En la segunda se adopta
una medida de calidad global del ajuste y se plantea el problema de
determinar el modelo que optimiza ese criterio global.

31.12.1 Procedimientos que comparan modelos

Tres procedimientos se pueden considerar: seleccin backward,


seleccin forward y seleccin stepwise. En el primer procedimiento,
seleccin backward (seleccin hacia atrs), empezamos el proceso de
seleccin con un modelo en que tenemos todas las variables conside-
radas a priori. Elegimos aquella que, cuando la quitamos, el p-valor
resultante de comparar ambos modelos (completo y aquel que le falta
la variable considerada) es mayor. Si este p-valor es mayor que un
valor previamente especificado entonces eliminamos la variable
del modelo. Y as continuamos hasta que al eliminar una variable el
p-valor correspondiente sea menor que el elegido.
El procedimiento seleccin forward (o hacia adelante) empezamos
con un modelo en el cual solamente tenemos la constante. Elegimos
para entrar la variable tal que cuando se incorpora el modelo cambia
lo ms posible. Esto es, el p-valor es el ms significativo. Si el p-valor
de la comparacin de los modelos es menor que (siempre elegido
antes de iniciar el proceso de seleccin y no reajustado a lo largo del
mismo) entonces la variable entra en el modelo. Continuamos hasta
que el modelo no cambia significativamente.
El procedimiento ms usado es el seleccin stepwise (hacia ade-
lante y hacia atrs). Vistos los anteriores es de esperar cmo funciona
este mtodo. Despus de la inclusin de una variable consideramos
la posible exclusin de las variables que estn en el modelo. Si es
posible eliminar una lo hacemos y nos planteamos la inclusin de la
variable que produzca un cambio ms significativo.
modelos lineales 619

31.12.2 Procedimientos basados en criterios


Estamos ajustando un modelo de regresin lineal mltiple con al-
gn propsito. Podemos fijarnos en una medida global de calidad del
ajuste y buscar la seleccin de variables que nos da el ptimo segn
ese criterio. Una medida global puede ser AIC (Akaike Information
Criterion) definido como

AIC = 2 max logverosimilitud + 2p.

A partir de la definicin de esta medida global es claro que un valor


pequeo indica un mejor ajuste.

Ejemplo 84 (Seleccin de variables). Notemos que con en la funcin step


podemos indicar con el argumento direction si queremos both (stepwise), o
bien backward o bien forward. Utilizamos MASS::stepAIC.

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

Vemos que se conservan ambas variables predictoras.


32
Conceptos fundamentales de Estadstica

El contenido tratado en los temas anteriores es intencionadamente


muy bsico. Se pretende llegar al lector que no tiene ningn cono-
cimiento de Probabilidad y Estadstica. Sin embargo, hay procedi-
mientos que se tratan en este manual y que requieren un nivel de
formalizacin mayor. En este tema se aborda este otro nivel. Para una
primera lectura del manual no se requiere. Pero s para una lectura
completa. El lenguaje utilizado es ms preciso y directo.

32.1 Verosimilitud

Sea y = (y1 , . . . , yn ) una realizacin del vector aleatorio Y =


(Y1 , . . . , Yn ). Es habitual asumir que Y tiene una funcin de densidad
conjunta f en una cierta familia F . Para una funcin dada f , el valor
f (y) nos muestra cmo vara la densidad dentro del espacio muestral
de valores posibles de y. Y viceversa, si consideramos unos datos y
y lo que hacemos variar es la funcin de densidad entonces estamos
viendo cmo de verosmil es cada una de las funciones dados los
datos y. Esta funcin recibe el nombre de verosimilitud de f dados
los datos y y se suele denotar como

Verosimilitud[ f ; y] = L( f ; y) = f (y). (32.1)

Con frecuencia, es conveniente trabajar con el logaritmo natural de la


funcin anterior y hablaremos de la log-verosimilitud.

l [ f ; y] = log f (y). (32.2)

Una simplificacin adicional (que es habitual en las aplicaciones)


supone que la funcin de densidad f pertenece a una familia para-
mtrica F , esto es, cada elemento de la familia es conocido comple-
tamente salvo un nmero finito de parmetros = (1 , . . . , p ) de
modo que denotaremos f (y; ) o f Y (y; ). Al conjunto de valores po-
sibles de se le llama espacio paramtrico y lo denotaremos por .
622 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

En este caso, la logverosimilitud es una funcin de y denotaremos

Verosimilitud[; y] = l (; y) = log f (y; ). (32.3)

Supongamos una transformacin 1-1 de Y a Z, Z = g(Y ). Las densi-


dades de ambos vectores se relacionan segn la siguiente relacin

y
f Z (z) = f Y (y) ,
z

y
donde z es el jacobiano de la transformacin de z a y. Se tiene la
siguiente relacin entre las verosimilitudes

y
L Z (; z) = LY (; y).
z

Esto sugiere que es mejor trabajar con el cociente de las verosimilitu-


des para dos vectores de parmetros 1 y 2 en lugar de los valores
aislados.
Si asumimos que los distintos Y1 , . . . , Yn son independientes enton-
ces
n
LY (; y) = f Y (y) = fYi (yi ),
i =1
y
n n
ly (; y) = log fYi (yi ) = LYi (; yi ).
i =1 i =1
Veamos algunos ejemplos de verosimilitud.

Ejemplo 85 (Pruebas Bernoulli). Y1 , . . . , Yn son independientes y con la


misma distribucin (i.i.d.) P(Yi = yi ) = yi (1 )1yi y
n n
L(; y) = i=1 yi (1 )ni=1 yi

Ejemplo 86 (Nmero de xitos en n pruebas Bernoulli). Nuestros


datos son ahora el nmero total de xitos en un nmero dado de pruebas de
Bernoulli, r. Entonces la variable correspondiente R tiene una distribucin
binomial con n pruebas y una probabilidad de xito . La verosimilitud viene
dada por  
n r
L(; r ) = (1 ) n r
r
Ejemplo 87 (Muestreo Bernoulli inverso). Nuestros datos son ahora el
nmero total de pruebas necesarias para alcanzar un nmero previamente
especificado de xitos. La variable aleatoria correspondiente N tendr una
distribucin binomial negativa con r xitos y una probabilidad de xito . La
funcin de verosimilitud correspondiente viene dada por

n1 r
 
L(; n) = (1 ) n r
r1
conceptos fundamentales de estadstica 623

Consideremos los tres ejemplos anteriores 85, 86 y 87. Si conside-


ramos dos valores del parmetro 1 y 2 entonces el cociente de las
verosimilitudes calculados en ambos valores tiene el mismo valor en
los tres ejemplos.

32.2 Estimacin

Denotamos por el espacio formado por los valores que puede


tomar o espacio paramtrico. Un estimador del parmetros o vector
paramtrico es cualquier funcin de la muestra X1 , . . . , Xn que toma
valores en el espacio paramtrico. Si ( X1 , . . . , Xn ) es un estimador
del parmetro entonces se define el error cuadrtico medio como

MSE() = E[( X1 , . . . , Xn ) ]2 (32.4)

En el caso en que se verifique que E( X1 , . . . , Xn ) = = , es decir,


que el estimador sea insesgado entonces:

MSE() = E[( X1 , . . . , Xn ) ]2 = E[( X1 , . . . , Xn ) ]]2 = var ().

Y el error cuadrtico medio no es ms que la varianza del estimador.


Consideremos la siguiente cadena de igualdades. Denotamos

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.

32.2.1 Estimacin insesgada de media y varianza


Dada una muestra Y1 , . . . , Yn de una variable. Un estimador habi-
tualmente utilizado para estimar = EYi es la media muestral dada
por
1 n
Y = Yi . (32.6)
n i =1
Notemos que
n n n
1 1 1
EY = E[
n Yi ] = n EYi = n = .
i =1 i =1 i =1
624 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

En definitiva, la media muestral es un estimador que no tiene ningn


sesgo cuando estima la media de Yi (la media poblacional) o, lo que
es lo mismo, es un estimador insesgado.
Para estimar de un modo insesgado la varianza 2 a partir de una
muestra Y1 , . . . , Yn se utiliza la varianza muestral dada por
n
1
S2 = (Y Y )2 .
n 1 i =1 i
(32.7)

La razn de la divisin por n 1 en lugar de dividir por n viene de


las siguientes igualdades.

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

pero E(Yi )2 = 2 y E(Y )2 = var (Y ) = 2 /n. En consecuencia,


n
2
E (Yi Y )2 = n2 = n2 2 = (n 1)2 ,
i =1
n

de donde,
n
1
n 1 i
ES2 = E (Yi Y )2 = 2 ,
=1

es decir, S2 estima la varianza 2 sin sesgo.

32.2.2 Estimacin insesgada del vector de medias y la matriz de cova-


rianzas
Ahora consideramos una muestra de un vector de dimensin d,
Y1 , . . . , Yn i.i.d. con vector de medias = EYi y matriz de covarianzas
= cov(Yi ). Los estimadores insesgados de y son las versiones
multivariantes de la media y varianza muestrales. Si

Yi1
.
..
Yi =
Yip

Entonces podemos representar toda la muestra como la siguiente


matriz

Y10 Y11 . . . Y1d
. . .. ..
Y= .
.

= .
. . .

Yn0 Yn1 . . . Ynd
conceptos fundamentales de estadstica 625

mientras que los datos observados, la matriz de datos, vendra dada


por

y10 y11 . . . y1d
. . .. ..
y= .. = .. . .

y0n yn1 . . . ynd

El vector de medias muestral viene dado por la siguiente expresin


en trminos de la matriz Y,
n
1 1 0
Y =
n Yi = n
Y 1n . (32.9)
i =1

siendo 1n el vector n 1 con todos los valores iguales a uno. Tambin


denotaremos

Y1
.
Y = ..


Y p

El estimador de la matriz de covarianzas (poblacional) sera la


matriz de covarianzas muestral que tiene en la posicin ( j, k) la cova-
rianza muestral entre las componentes j y k,
n
1
S jk = (Y Y j )(Yik Yk ),
n 1 i=1 ij

de modo que


S11 ... S1d
n
= 1 (Yi Y )(Yi Y )0 = 1 Q.
. .. ..
S = ..

. . n 1 i =1 n1
Sd1 ... Sdd

Es inmediato que EY = porque componente a componente hemos


visto que se verifica la igualdad. A partir de los vectores Yi conside-
ramos Xi = Yi de modo que se verifica X = X . Se sigue
que
n n n
(Yi Y )(Yi Y )0 = (Xi X )(Xi X )0 = Xi Xi0 nX X 0 .
i =1 i =1 i =1

Los vectores X1 , . . . , Xn tienen vector de medias nulo y matriz de


covarianzas , la misma que los Yi . En consecuencia, E X X 0 = y
n

EQ = cov(Yi ) n cov(Y ) = n n cov(Y ) = n n n = (n 1).
i =1

Tenemos pues que S es un estimador insesgado de la matriz .


626 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Finalmente, si denotamos por r jk el coeficiente de correlacin entre


las variables j y k, es decir,

in=1 (Yij Y j )(Yik Yk ) S jk


r jk = q = q (32.10)
in=1 (Yij Y j )2 in=1 (Yik Yk )2 S jj Skk

Denotaremos por R la matriz de correlaciones muestrales R = [r jk ].

32.3 Estimador mximo verosmil

El mtodo de estimacin que vamos a utilizar en este curso el


mtodo de mxima verosimilitud. El estimador mximo verosmil
de , que denotaremos por , se obtienen mximizando la funcin
de verosimilitud o, equivalentemente, la transformacin montona
de dicha funcin que es la funcin de logverosimilitud. Utilizaremos
para denotar el estimador mximo verosmil la notacin inglesa
MLE.
L( ) = max L( ), (32.11)

o tambin
= argmax L( ), (32.12)

Ejemplo 88 (Bernoulli). Se puede comprobar sin dificultad que p =


in=1 xi
n .

Una propiedad importante de los estimadores mximo verosmiles


consiste en que si = f ( ) siendo f una biyeccin entonces el
estimador mximo verosmil de es verifica que

= f ( ). (32.13)

Ejemplo 89 (Normal). En este caso se comprueba que = Xn y que


b2 = n 1 2 1 n 2
n S = n i =1 ( Xi Xn ) . Teniendo en que cuenta la propiedad
q
n 1 2
enunciada en 32.13 tendremos que = n S .

En muchas situaciones la funcin L( ) es cncava y el estimador


mximo verosmil es la solucin de las ecuaciones de verosimilitud
L(
= 0. Si cov ( ) denota la matriz de covarianzas de entonces,
para un tamao muestral grande y bajo ciertas condiciones de regu-
laridad (ver 1 , pgina 364), se verifica que cov( ) es la inversa de la 1
C.R. Rao. Linear Statistical Inference and
matriz de informacin cuyo elemento ( j, k) viene dado por Its Applications. Wiley, 1967

 2 
l ( )
E (32.14)
j k

Notemos que el error estndar de j ser el elemento que ocupa la


posicin ( j, j) en la inversa de la matriz de informacin. Cuanto ma-
yor es la curvatura de la logverosimilitud menores sern los errores
conceptos fundamentales de estadstica 627

estndar. La racionalidad que hay detrs de esto es que si la curva-


tura es mayor entonces la logverosimilitud cae rpidamente cuando
el vector se aleja de . En resumen, es de esperar que est ms
prximo a .

Ejemplo 90 (Binomial). Supongamos que una muestra en una poblacin


finita y consideremos como valor observado el nmero de xitos. Entonces la
verosimilitud sera  
n y
L( p) = p (1 p ) n y , (32.15)
y
y la logverosimilitud viene dada como
 
n
l ( p) = log + y log p + (n y) log(1 p), (32.16)
y

La ecuacin de verosimilitud sera


l ( p) y ny y np
= = . (32.17)
p p 1 p p (1 p )
y
Igualando a cero tenemos que la solucin es p = n que no es ms
que la proporcin muestral de xitos en las n pruebas. La varianza
asnttica sera
 2
ny
  
l ( p) y n
E 2
= E 2
+ 2
= . (32.18)
p p (1 p ) p (1 p )

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).

32.4 Contraste de hiptesis

Genricamente vamos a considerar situaciones en donde particio-


namos el espacio paramtrico en dos conjuntos 0 y 1 , es decir,
0 1 = (son disjuntos) y y 0 1 = (cubren todo el espacio
paramtrico). Consideramos el contraste de hiptesis siguiente.

H0 : 0 (32.19)
H1 : 1 (32.20)

Basndonos en una muestra aleatoria X1 , . . . , Xn hemos de tomar


una decisin. Las decisiones a tomar son una entre dos posibles: (i)
Rechazar la hiptesis nula o bien (ii) no rechazar la hiptesis nula.
Notemos que, una vez hemos tomado una decisin, podemos tener
dos posibles tipos de error como recoge la siguiente tabla. En las
columnas indicamos la realidad mientras que en las filas indicamos la
decisin que tomamos.
628 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

H0 H1
Rechazamos H0 Error tipo I
No rechazamos H0 Error tipo II

Supongamos que Rn es el conjunto de valores que puede tomar


el vector aleatorio ( X1 , . . . , Xn ). Entonces el contraste de hiptesis se
basa en tomar un estadstico o funcin de la muestra que denotamos
( X1 , . . . , Xn ) de modo que si ( X1 , . . . , Xn ) C entonces rechazamos
la hiptesis nula mientras que si ( X1 , . . . , Xn ) / C entonces no
rechazamos la hiptesis nula. Notemos que simplemente estamos
particionando el espacio muestral (que suponemos) Rn en dos partes,
C y C c , de modo que tomamos una decisin basndonos en si el
estadstico est en C o bien est en el complementario de C. Al
conjunto C se le suele llamar la regin crtica. La funcin potencia se
define como
( ) = P ( C | ). (32.21)

32.4.1 Contraste de la media en la poblaciones normales


Si tenemos una muestra X1 , . . . , Xn de una poblacin normal con
media y varianza 2 donde ambos parmetros se asumen descono-
cidos un test habitualmente considerado es si la media toma un valor
dado. l test formalmente planteado sera:

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).

Si suponemos que trabajamos con un nivel de significacin la re-


gin crtica en la cual rechazamos la hiptesis nula sera

| T | > tn1,1 2 .

32.4.2 Test del cociente de verosimilitudes


El cociente de verosimilitudes para contrastar estas hiptesis se
define como
max 0 L( )
= (32.24)
max L( )
conceptos fundamentales de estadstica 629

Es razonable pensar que en la medida en que tome valores me-


nores entonces la hiptesis alternativa sea ms plausible que la hi-
ptesis nula y por lo tanto rechacemos la hiptesis nula. Realmente
se suele trabajar con 2 log pues bajo la hiptesis nula tiene una
distribucin asinttica ji-cuadrado donde el nmero de grados de
libertad es la diferencia de las dimensiones de los espacios para-
mtricos = 0 1 y 0 . Si denotamos L0 = max 0 L( ) y
L1 = max L( ) entonces = LL0 y
1

L0
2 log = 2 log = 2 ( l0 l1 ) (32.25)
L1

siendo l0 y l1 los logaritmos de L0 y L1 respectivamente que tambin


corresponden con los mximos de la logverosimilitud sobre 0 y
sobre .

32.4.3 Test de Wald

Supongamos que el es un parmetro y denota su estimador


mximo verosmil. Supongamos que queremos contrastar las siguien-
tes hiptesis:

H0 : = 0 , (32.26)
H1 : 6= 0 . (32.27)

Denotamos por SE( ) el error estndar bajo la hiptesis alternativa


de . Entonces el estadstico

0
z= (32.28)
SE( )

tiene, bajo la hiptesis nula, aproximadamente una distribucin nor-


mal estndar, z N (0, 1). Este tipo de estadsticos donde se utiliza
el error estndar del estimador bajo la hiptesis alternativa recibe el
nombre de estadstico de Wald.
Supongamos que es un vector de parmetros y queremos con-
trastar las hiptesis dadas en 32.26. La versin multivariante del
estadstico dado en 32.28 viene dada por

W = ( 0 )0 [cov( )]1 ( 0 ), (32.29)

donde cov( ) se estima como la matriz de informacin observada en


el MLE . La distribucin asinttica de W bajo la hiptesis nula es
una distribucin ji-cuadrado donde el nmero de grados de libertad
coincide con el nmero de parmetros no redundantes en .
630 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

32.4.4 Intervalos de confianza


Empezamos recordando el concepto de intervalo de confianza
con un ejemplo muy conocido como es la estimacin de la media en
poblaciones normales.

Ejemplo 91 (Intervalo de confianza para la media de una normal).


Vemoslo con un ejemplo y luego planteamos la situacin ms general.
Tenemos una muestra aleatoria X1 , . . . , Xn i.i.d. tales que Xi N (, 2).
Entonces es conocido que

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

La ecuacin anterior la podemos reescribir como

S S
P( Xn tn1,1/2 Xn + tn1,1/2 ) = 1 . (32.32)
n n

Tenemos una muestra aleatoria X1 , . . . , Xn y por lo tanto tenemos un in-


tervalo aleatorio dado por [ Xn tn1,1/2 Sn , Xn + tn1,1/2 Sn ]. Este
intervalo tiene una probabilidad de 1 de contener a la verdadera me-
dia. Tomemos ahora la muestra y consideremos no los valores aleatorios de
Xn y de S2 sino los valores observados xn y s. Tenemos ahora un intervalo
[ xn tn1,1/2 sn , xn + tn1,1/2 sn ] fijo. Es posible que est en este
intervalo y es posible que no lo est. Sabemos que antes de tomar la muestra
tenamos una probabilidad de 1 de contener a la verdadera media pero
despus de tomar la muestra tenemos una confianza de 1 de contener
a la verdadera media. Al intervalo [ xn tn1,1/2 sn , xn + tn1,1/2 sn ]
se le llama intervalo de confianza para con nivel de confianza 1 .

Vamos a ver un planteamiento ms general del problema. Su-


pongamos que tenemos un test para contrastar la hiptesis simple
H0 : = 0 frente a la alternativa H1 : 6= 0 . Supongamos que
elegimos un nivel de significacin para contrastar las hiptesis an-
teriores y consideramos el siguiente conjunto formado por todos los
0 tales que no rechazamos la hiptesis nula al nivel . Este conjunto
es un conjunto de confianza al nivel 1 . Cuando el conjunto de
confianza es un intervalo hablamos de intervalo de confianza.
Supongamos que consideramos el test del cociente de verosimilitu-
des. Denotemos por 2k (1 ) el percentil 1 de una distribucin
conceptos fundamentales de estadstica 631

ji-cuadrado con k grados de libertad. Entonces el intervalo de con-


fianza al nivel 1 sera el conjunto

{0 : 2[l (0 ) l ( )] < 2k (1 )} (32.33)

Consideremos ahora un test de Wald. En este caso, el intervalo de


confianza de Wald vendra dado por el siguiente conjunto:

| 0 |
{ 0 : < Z1/2 } (32.34)
SE( )

donde SE( ) es el error estndar estimado de bajo la hiptesis


alternativa.
33
Miscelnea

33.1 Introduccin

En el texto hemos utilizado una serie de tcnicas y conceptos es-


tadsticos. Es preferible, antes que insertar su explicacin en el texto
incluirlos en un captulo aparte. Cada seccin responde a un concep-
to distinto. No hay ningn tipo de continuidad entre las secciones. Es
un captulo auxiliar para el resto de los captulos. Cuando explicamos
los conceptos tambin indicamos cmo hacerlo con R.

33.2 Algoritmo bipesado de Tukey de un solo paso

Su denominacin en la literatura estadstica sera One-Step Tukeys


Biweight Algorithm. Veamos cmo funciona. Tenemos unos datos
x1 , . . . , xn de los cuales pretendemos tener algn tipo de valor medio
o de valor central que no est muy afectado por valores anmalos
como lo est, por ejemplo, la media muestral.

1. Calculamos la mediana m x de los datos x1 , . . . , xn .

2. Determinamos las distancias di = | xi m x |.

3. Calculamos la mediana md de di con i = 1, . . . , n. Esta mediana


md o mediana de las desviaciones absolutas se suele denotar com
MAD (median absolute deviation). Es una medida de dispersin.

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

5. Consideremos una funcin bicuadrada (bisquare) definida como


(
(1 u2 )2 si |u| 1
w(u) =
0 si |u| > 1

6. Se define el estimador en un solo paso como

in=1 w(ui ) xi
Tbi ( x1 , . . . , xn ) = .
in=1 w(ui )

Notemos que si sustituimos el valor m x por Tb podramos aplicar ite-


rativamente el procedimiento hasta que se estabilice. No lo hacemos.
Simplemente se hace una sola iteracin.

Ejemplo 92. Supongamos que tenemos los datos siguientes

x = c(12,3,45,21,34,35,21,456)

Y ahora podemos usar la funcin tukey.biweight del paquete Gautier


et al. [2004, affy].

library(affy)
tukey.biweight(x, c = 5, epsilon = 1e-04)

## [1] 25.1902

33.3 Median polish

Tenemos una matriz de datos tal que en la fila i y columna j tene-


mos yij con i = 1, . . . , I y j = 1, . . . , J. El procedimiento del median
polish consiste en expresar estos valores de la siguiente forma

yij = m + ai + b j + eij

de forma que se verifique que:

La mediana de { a1 , . . . , a I } sea cero. Abreviadamente denotamos


Mediana{ a1 , . . . , a I } = 0.

Mediana{b1 , . . . , b J } = 0.

Mediana{ei1 , . . . , eiJ } = 0 para cada i.

Mediana{e1j , . . . , e I j } = 0 para cada j.

Pueden haber muchas soluciones para las ecuaciones y restricciones


que acabamos de considerar. Consideremos la siguiente matriz.
miscelnea 635

y11 ... y1J


.. ..
. .
y I1 ... yI J

El algoritmo median polish (propuesto por Tukey y Mosteller) con-


siste en aumentar la matriz con una columna y una fila adicionales.
Consideremos la matriz aumentada siguiente

e11 ... e1J a1


.. .. ..
. . .
e I1 ... eI J aI
b1 ... bJ m

El procedimiento acta iterativamente sobre esta matriz aumenta-


da del siguiente modo:

1. Inicializamos el procedimiento con todos los ai = 0 y b j = 0, m = 0


y eij = yij .

2. Calculamos la mediana de las columnas de la 1 a la I.

3. Restamos dicha mediana a cada elemento de las filas de la 1 a la


I y se la sumamos a la columna I+1, esto es, se la sumamos a los
valores ai y m.

4. Calculamos la mediana de cada columna para

5. Restamos dicha mediana a cada elemento de la columna.

6. Sumamos, para cada columna j, la mediana de la columna al valor


de la ltima columna.

7.

Ejemplo 93. Consideremos los datos.

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)

Veamos los datos.

## sonda 1 sonda 2 sonda 3 sonda 4 sonda 5


## chip 1 18 4 16 7 15
## chip 2 11 13 7 16 12
## chip 3 8 7 15 6 18
## chip 4 21 5 6 19 5
636 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Y aplicamos una median polish.

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

Trata del problema de combinar los resultados de distintos experi-


mentos o anlisis con el fin de obtener una conclusin nica.

34.1 Mtodo de Fisher

Supongamos que contrastamos una misma hiptesis nula, H0 ,


k veces de un modo independiente (distintos conjuntos de datos
obtenidos independientemente uno de otro). Si suponemos que el
estadstico del contraste que estamos utilizando tiene una distribu-
cin continua entonces el p-valor sigue una distribucin uniforme
en el intervalo unitario [0, 1], P U (0, 1) para cada uno de los tests.
Una forma de combinar estos p-valores es la propuesta por Ronald
A. Fisher y conocida como el mtodo de Fisher.1 Tenemos que los p- 1
Fishers method o Fishers combined
valores, P1 , . . . , Pk (antes de tomar las muestras) son independientes y probability test.

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

Asumiendo que la hiptesis nula H0 es cierta (bajo la hiptesis nula)


y que los tests son independientes entonces el estadstico anterior se
distribuye como una ji-cuadrado con 2k grados de libertad. 2 2
Si el estadstico tiene una distribucin
continua entonces P U (0, 1). Es fcil
k ver que 2 ln P Exp(1) = Ga(1, 1),
X 2 = 2 ln Pi 2k . (34.2) es decir, P se distribuye exponencial
i =1 con media 1 que es una distribucin
gamma con parmetros (1, 1). Entonces
Notemos que un p-valor significativo significa un valor p pequeo y ik=1 ln Pi Ga(k, 1) y finalmente
2 ik=1 ln Pi Ga(k, 1/2). Pero una
por lo tanto su logaritmo neperiano ser muy pequeo (y negativo). gamma con parmetros k y 1/2 no es
Finalmente el estadstico X 2 ser grande si los pi observados son ms que una ji-cuadrado con 2k grados
pequeos, esto es, si nos indican que la hiptesis nula no es cierta. de libertad.

El p-valor asociado al test anterior est calculado bajo la hiptesis de


tests independientes. Y si son dependientes? La dependencia que
638 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

cabe esperar es de tipo positivo, esto es, si son pequeos tendern


a ser todos pequeos. De este modo observaremos un p-valor en el
test anterior menor al que observaramos si realmente tuviramos
p-valores independientes.

34.2 Mtodo de Stouffer


3 Es un procedimiento muy relacionado con el mtodo de Fisher. 3
Stouffers Z-score method.
Si Pi son los p-valores aleatorios originales y denotamos por la
Rz 1 2
funcin de distribucin de la normal estndar,4 entonces definimos el 4
(z) = 1 e 2 t con < z <
2
Z-score o la puntuacin Z como +.

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)

Figura 34.1: Comparamos la aportacin


de cada test segn mtodo de Fisher
y Stouffer. En abscisas ln( p) y en
ordenadas 1 (1 p).
Parte X

Investigacin reproducible
35
Investigacin reproducible

35.1 Introduccin

En este tema se trata el problema de la investigacin reproducible,


1 un trmino que est relacionado con la programacin comentada2 . 1
Reproducible research
Estamos acostumbrados a que los investigadores3 en sus publicacio- 2
Literate programming
nes comenten los resultados que han obtenido en sus investigaciones.
3
Estamos hablando obviamente de
investigadores experimentales.
Han utilizado unos datos, han realizado un tratamiento de estos
datos y, finalmente, han interpretado. Hemos de creer que han pro-
ducido los datos correctamente, que han aplicado un tratamiento
adecuado (o al menos que han hecho lo que dicen que han hecho) y
que, finalmente, la interpretacin de los resultados de las tcnicas uti-
lizadas es correcta. Creer que han hecho como dicen que han hecho
y adems correctamente.4 Dnde estn los datos? Exactamente (no 4
Mucho creer y la f no es algo que
aproximadamente) qu anlisis de los datos han realizado? En otras sobre precisamente.

palabras, deme el cdigo para que yo (y cualquier otro miembro de la


comunidad) pueda reproducir exactamente el tratamiento estadstico
que se ha realizado. La interpretacin es lo nico que siempre est: es
la publicacin que estamos leyendo.
En lo que sigue despus de hacer algo de historia vamos a propo-
ner distintas opciones implementadas en el paquete (fundamental)
Xie [2016, knitr].

R/Markdown R para analizar y Markdown para escribir.

R R para analizar y LATEXpara escribir.

De un modo genrico son de inters las referencias Gentleman and


Lang [2004], Gentleman [2005] as como las siguientes direcciones
web:

1. El task view en el repositorio de R http://cran.r-project.org/web/views/ReproducibleResearch.html.

2. La pgina de Harrell http://biostat.mc.vanderbilt.edu/twiki/bin/view/Main/StatReport


642 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

3. Si se elige la opcin de investigacin reproducible utilizando


LATEXentonces una (muy) buena referencia Oetiker et al. [2010].

4. La mayor parte de opciones que vamos a considerar en lo que


sigue pueden realizarse utilizando el paquete Xie [2016, knitr].

La opcin de trabajo preferida en lo que sigue es R/Markdown.


Para un documento ms complejo es necesario la opcin R/LATEX. En
35.2 se comenta el lenguaje Markdown.
En lo que sigue vamos ilustrar la investigacin reproducible ha-
ciendo un tratamiento estadstico bsico. En concreto vamos a reali-
zar el siguiente anlisis:

1. Generamos una matriz de datos con 100 observaciones y dos


variables.

2. La primera variable, x, va a tener una distribucin normal con


media 20 y desviacin estndar 2.

3. La segunda variable, y, ser 2 veces la primera ms 3 ms un


error aleatorio con distribucin normal con media 0 y desviacin
estndar 0.5.

4. Obtenemos una descriptiva numrica de cada una de las variables


que acabamos de generar.

5. Representaremos una variable frente a la otra.

35.2 Markdown

Es un lenguaje de marcas ligero (minimal sera ms correcto).


Pretende ser una forma rpida de escribir HTML. Segun su autor,
John Gruber, HTML is a publishing format; Markdown is a writing
format.
La direccin indicada contiene una muy buena exposicin de este
lenguaje de marcas.

35.3 R/Markdown

Ttulo Empezamos definiendo el ttulo del documento.

% Un anlisis estadstico simple


% Amadeo Isbert
% 13/08/1963

Generacin de datos Definimos un primer bloque generando los datos.


investigacin reproducible 643

# 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)
```

Descriptivas numricas ## Descriptivas de x e y


- Veamos una descripcin numrica de **x* y de **y**.
```{r descripcionxy}
summary(x)
summary(y)
```
# Representaciones grficas

## Diagrama de puntos
- Representamos la

35.4 Software

35.4.1 RStudio y R/Markdown

Es la mejor opcin. RStudio permite elegir esta opcin y lleva


incorporados en los mens opciones para generar informes en forma-
tos html, pdf e incluso5 en formado Word. 5
En el colmo de las locuras.

emacs y R/Markdown %

El editor emacs puede ser configurado para trabajar con R y Mark-


down. Consiste en utilizar el paquete polymode Siguiendo lo indica-
do en esta pgina los pasos a seguir (y funciona) son los siguientes:

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

2. Incluimos en .emacs los caminos correspondientes as como los


modos necesarios. Hay que aadir las siguientes lneas (sustituyen-
do el directorio personal por el correspondiente a cada uno).

(add-to-list 'load-path "/home/gag/.emacs.d/polymode/")


(add-to-list 'load-path "/home/gag/.emacs.d/polymode/modes/")
(require 'poly-R)
(require 'poly-markdown)

Y ya funciona. Podemos ejecutar el cdigo desde los correspon-


dientes chunks de cdigo. Supongamos que tenemos el fichero
prueba.Rmd. Cargamos Xie [2016, knitr].

library(knitr)

Y ejecutamos

knit("prueba.Rmd")

35.5 RMarkdown

El paquete Allaire et al. [2016, rmarkdown] incorpora una im-


plementacin del lenguaje de marcas Markdown y utilizado con-
juntamente con Xie [2016, knitr] permite generar unos muy buenos
informes. La pgina http://rmarkdown.rstudio.com/ es el mejor
lugar para aprender a manejarlo.
A
Datos faltantes

A.1 Introduccin

Tenemos nuestra matriz de datos de expresin X y tenemos da-


tos faltantes en algunas caractersticas para algunas muestras. Una
posibilidad es no perder datos utilizando alguna tcnica que impute
un valor a los datos que no tenemos. En A.2 explicamos el proce-
dimiento utilizado por el mtodo SAM ( 10.1) y por el mtodo GSA
( 18.11).

A.2 Algoritmo de normalizacin del k-vecino ms prximo

Fijamos el nmero de vecinos k a utilizar en la imputacin. Por


defecto se toman k = 10. El procedimiento es el siguiente:
1. Para cada gen i con al menos un valor faltante:

a) Denotamos por Si las muestras para los cuales conocemos la


expresin del gen.
b) Determinamos los k-vecinos ms prximos del gen i utilizando
solamente las muestras Si para calcular la distancia eucldea.
Si los otros genes tienen datos faltantes en las muestras Si se
utilizan las muestras de las cuales se conoce su expresin.
c) Para las muestras que no estn en Si asignamos el promedio
de los k-vecinos ms prximos. Si alguno de estos k-vecinos no
tiene alguna expresin entonces hacemos la media de los que
disponemos.

2. Si un gen tiene todava un dato faltante entonces asignamos la


expresin media de la muestra considerada.
El algoritmo anterior puede ser lento cuando tenemos muchos genes.
Con objeto de acelerar el proceso de asignacin de datos faltantes se
combina con el siguiente procedimiento de agrupamiento recursivo
basado en el k-medias ( 15.7.1).
646 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

1. Si el nmero de genes p es mayor que pmax (por defecto, vale


1500):

a) Ejecutamos una clasificacin del procedimiento k-medias con k


= 2 al conjunto de los genes (clasificamos genes y no muestras).
Las distancias entre los genes estn basadas en las muestras
para las cuales se conocen ambas expresiones.
b) Formamos dos matrices de expresin una con cada conjunto de
genes. Aplicamos recursivamente el paso anterior.

2. Si p < pmax entonces aplicamos el procedimiento de imputacin


utilizando el promedio de los k-vecinos ms prximos en cada uno
de los grupos encontrados previamente.

El procedimiento fue propuesto en Troyanskaya et al. [2001] y est


implementado en la funcin impute::impute.knn.
B
Datos multimodales

B.1 TCGA

Los datos con los que vamos a trabajar proceden de TCGA.1 1


The Cancer Genome Atlas. Podemos
Lo que sigue est tomado (en gran parte) de la vieta del paquete bajar datos con los conteos ya calcu-
lados en https://tcga-data.nci.
Zhao et al. [2014, RnaSeqSampleSizeData]. nih.gov/tcga/tcgaHome2.jsp y en
Los datos se pueden bajar de https://tcga-data.nci.nih.gov/ https://cghub.ucsc.edu/ podemos
conseguir datos originales.
tcga/tcgaDownload.jsp. Por ejemplo, en https://tcga-data.nci.
nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/
brca/cgcc/unc.edu/illuminahiseq_rnaseqv2/rnaseqv2/ se tiene las
distintas versiones de las muestras de BRCA. Los conteos estn en los
ficheros .rsem.genes.results.

B.2 Expression Atlas

Lo encontramos en https://www.ebi.ac.uk/gxa/home
C
Datos

En este tema simplemente damos un listado de los datos que uti-


lizamos. Se indica la direccin en donde podemos encontrar todo el
procesamiento necesario para poder utilizarlos. Los ficheros siempre
estn en formato html pero se incluye el fichero fuente original que
puede ser RMarkdown (Rmd) o Org-babel (org). Algunos de estos
datos se han incluido en ?, tamidata. El listado lo tenemos en la tabla
C.1.

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

Solucin (Ej. 1) Cargamos la base de datos de tipo OrgDb corres-


pondiente a homo sapiens.
pacman::p_load(org.Hs.eg.db)

Buscamos cmo acceder al SYMBOL o nombre abreviado del gen.


keytypes(org.Hs.eg.db)
## [1] "ACCNUM" "ALIAS" "ENSEMBL"
## [4] "ENSEMBLPROT" "ENSEMBLTRANS" "ENTREZID"
## [7] "ENZYME" "EVIDENCE" "EVIDENCEALL"
## [10] "GENENAME" "GO" "GOALL"
## [13] "IPI" "MAP" "OMIM"
## [16] "ONTOLOGY" "ONTOLOGYALL" "PATH"
## [19] "PFAM" "PMID" "PROSITE"
## [22] "REFSEQ" "SYMBOL" "UCSCKG"
## [25] "UNIGENE" "UNIPROT"

Por tanto los nombres abreviados de los genes los tendremos con
keys(org.Hs.eg.db, keytype="SYMBOL")

Una opcin muy simple puede ser


(posBRCA1 = which(keys(org.Hs.eg.db, keytype="SYMBOL") == "BRCA1"))
## [1] 554
(posBRCA2 = which(keys(org.Hs.eg.db, keytype="SYMBOL") == "BRCA2"))
## [1] 556
posBRCA = c(posBRCA1,posBRCA2)

Supongamos que no tenemos claro su nombre exacto y sabemos que


es BRCA seguido de algo ms. Podemos mirar aquellos genes que
empiezan por BRCA.
(beginBRCA = grep("^BRCA",keys(org.Hs.eg.db, keytype="SYMBOL")))
## [1] 554 556 6429 14172 24125 38093 44505
652 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Cules son sus nombres abreviados?


keys(org.Hs.eg.db, keytype="SYMBOL")[beginBRCA]
## [1] "BRCA1" "BRCA2" "BRCATA" "BRCA3"
## [5] "BRCA1P1" "BRCAT54" "BRCAT107"

Construimos un data.frame con la informacin pedida.


symbol = keys(org.Hs.eg.db, keytype="SYMBOL")[posBRCA]
entrezid = keys(org.Hs.eg.db, keytype="ENTREZID")[posBRCA]
ensembl = keys(org.Hs.eg.db, keytype="ENSEMBL")[posBRCA]
go = keys(org.Hs.eg.db, keytype="GO")[posBRCA]
data.frame(symbol, entrezid,ensembl,go)
## symbol entrezid ensembl go
## 1 BRCA1 672 ENSG00000125730 GO:0071949
## 2 BRCA2 675 ENSG00000244731 GO:0003993

Solucin (Ej. 2) pacman::p_load(org.Mm.eg.db)


(posBRCA1 = which(keys(org.Mm.eg.db, keytype="SYMBOL") == "BRCA1"))
## integer(0)

Solucin (Ej. 10) 1.Seleccionamos:

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

Seleccionamos las muestras.

eset = gse20986[,sel]

Con el siguiente cdigo eliminamos las categoras que no utiliza-


mos.

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")

Los p-valores ajustados seran

tt1$adjp[,2]

4.Tenemos como significativos

sum(tt1$adjp[,2] < 0.05,na.rm = TRUE)

## [1] 1828

que ocupan las siguientes posiciones en la matriz original.

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)

Y el resultado (no mostrado) es

sigIRC

Que corresponde con los genes.

featureNames(gse20986[sigIRC,])

Solucin (Ej. 11) Leemos los datos.


data(gse1397,package="tamidata")
eset = gse1397
654 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

1.tt = genefilter::rowttests(eset,pData(eset)[,"type"])

Solucin (Ej. 12) 1.pacman::p_load("SummarizedExperiment","GenomicRanges","edgeR","multtest")


data(PRJNA297664,package="tamidata")
se = PRJNA297664
rm(PRJNA297664)
pvalor13 = binomTest(assay(se)[,1], assay(se)[,3])

2.tt = multtest::mt.rawp2adjp(pvalor13,"BH")
pvalor13.BH = tt$adjp[,"BH"]

3.numsig = sum(pvalor13.BH < 0.001)


sig13 = rownames(se)[tt$index[1:numsig]]

4.pvalor25 = binomTest(assay(se)[,2], assay(se)[,5])


tt = multtest::mt.rawp2adjp(pvalor25,"BH")
pvalor25.BH = tt$adjp[,"BH"]
numsig = sum(pvalor25.BH < 0.001)
sig25 = rownames(se)[tt$index[1:numsig]]

5.intersect(sig13,sig25)

Solucin (Ej. 18) Cargamos paquetes.


pacman::p_load("targetscan.Hs.eg.db","mirbase.db")

Una posibilidad, en forma de funcin, puede ser


soluciones ejercicios 655

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
}

Para el gen 59 tenemos


id = "59"
entrez2maturemiRs(id="59")
## [1] "MIMAT0004501" "MIMAT0000084"
Bibliografa

H. Abdi and L. J. Williams. Principal component analysis. Wiley


Interdisciplinary Reviews: Computational Statistics, 2(4):433459, 2010.
URL /home/gag/BIBLIOGRAFIA/REPRINTS/AbdiWilliams10.pdf.

P. Aboyoun, H. Pags, and M. Lawrence. GenomicRanges: Represen-


tation and manipulation of genomic intervals and variables defined along a
genome, 2016. R package version 1.22.4.

A. Agresti. Categorical Data Analysis. Wiley, second edition,


2002. URL /home/gag/BIBLIOGRAFIA/MISLIBROS/Agresti_Alan_
Categorical_Data_Analysis_2nd_ed_2002.pdf.

Adrian Alexa and Jorg Rahnenfuhrer. topGO: Enrichment analysis for


Gene Ontology, 2010. R package version 2.22.0.

JJ Allaire, Joe Cheng, Yihui Xie, Jonathan McPherson, Wins-


ton Chang, Jeff Allen, Hadley Wickham, Aron Atkins, and Rob
Hyndman. rmarkdown: Dynamic Documents for R, 2016. URL
https://CRAN.R-project.org/package=rmarkdown. R package
version 0.9.6.

VICTOR AMBROS, BONNIE BARTEL, DAVID P. BARTEL, CHRIS-


TOPHER B. BURGE, JAMES C. CARRINGTON, XUEMEI CHEN,
GIDEON DREYFUSS, SEAN R EDDY, SAM GRIFFITHS-JONES,
MHAIRI MARSHALL, MARJORI MATZKE, GARY RUVKUN,
and THOMAS TUSCHL. A uniform system for microrna annota-
tion. RNA, 9(3):277279, 2003. doi: 10.1261/rna.2183803. URL
http://rnajournal.cshlp.org/content/9/3/277.abstract.

S. Anders, D. J. McCarthy, Y. Chen, M. Okoniewski, G. K. Smyth,


W. Huber, and M. D. Robinson. Count-based differential expression
analysis of rna sequencing data using r and bioconductor. Nat.
Protocols, 8(9):17651786, 2013. doi: 10.1038/nprot.2013.099.

Simon Anders and Wolfgang Huber. Differential expression


analysis for sequence count data. Genome Biology, 11(10):R106,
2010. ISSN 1465-6906. doi: 10.1186/gb-2010-11-10-r106. URL
http://genomebiology.com/2010/11/10/R106.
658 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Yoav Benjamini and Yosef Hochberg. Controlling the false discovery


rate: A practical and powerful approach to multiple testing. Journal
of the Royal Statistical Society. Series B (Methodological), 57(1):pp. 289
300, 1995. ISSN 00359246. URL http://www.jstor.org/stable/
2346101.

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.

P.M. Berthouex and L.C. Brown. Environmental Engineers. Lewis


Publishers, second edition, 2002. URL /home/gag/BIBLIOGRAFIA/
MISLIBROS/Berthouex_Brown_Statistics_for_Environmental_
Engineers_2nd_Ed_CRC_Press_2002.pdf.

J. M. Bland and D. G. Altman. Statistical methods for assessing


agreement between two methods of clinical measurement. Lancet,
pages 307310, 1986. URL http://www-users.york.ac.uk/~mb55/
meas/ba.htm.

Ben Bolstad. Methods in Microarray Normalization, chapter 3, pages


4160. Number 10 in Drug Discovery Series. CRC Press, 2008.

Ben Bolstad. affyPLM: Methods for fitting probe-level models, 2015. URL
https://github.com/bmbolstad/affyPLM. R package version 1.46.0.

B.M. Bolstad, R.A Irizarry, M. strand, and T.P. Speed. A compa-


rison of normalization methods for high density oligonucleotide
array data based on variance and bias. Bioinformatics, 19(2):185
193, 2003. doi: 10.1093/bioinformatics/19.2.185. URL http://
bioinformatics.oxfordjournals.org/content/19/2/185.abstract.

Anne-Laure Boulesteix and Martin Slawski. Stability and aggrega-


tion of ranked gene lists. Briefings in Bioinformatics, 10(5):556568,
2009. doi: 10.1093/bib/bbp034. URL http://bib.oxfordjournals.
org/content/10/5/556.abstract.

Richard Bourgon, Robert Gentleman, and Wolfgang Huber. Inde-


pendent filtering increases detection power for high-throughput
experiments. Proceedings of the National Academy of Sciences, 107
(21):95469551, 2010. doi: 10.1073/pnas.0914005107. URL
http://www.pnas.org/content/107/21/9546.abstract.

Rosemary Braun, Leslie Cope, and Giovanni Parmigiani. Identif-


ying differential correlation in gene/pathway combinations. BMC
Bioinformatics, 9(1):488, 2008. ISSN 1471-2105. doi: 10.1186/1471-
2105-9-488. URL http://www.biomedcentral.com/1471-2105/9/488.
bibliografa 659

Andrew C Browning, Eugene P Halligan, Elizabeth A Stewart,


Daniel C Swan, Rosamund Dove, Govindi J Samaranayake, and
Winfried M Amoaku. Comparative gene expression profi-
ling of human umbilical vein endothelial cells and ocular vas-
cular endothelial cells. British Journal of Ophthalmology, 96(1):
128132, 2012. doi: 10.1136/bjophthalmol-2011-300572. URL
http://bjo.bmj.com/content/96/1/128.abstract.

M. Carlson, H. Pags, P. Aboyoun, S. Falcon, M. Morgan, D. Sarkar,


and M. Lawrence. GenomicFeatures: Tools for making and manipulating
transcript centric annotations, 2016. R package version 1.22.13.

Marc Carlson. GO.db: A set of annotation maps describing the entire


Gene Ontology, 2015a. R package version 3.2.2.

Marc Carlson. hgu133a.db: Affymetrix Human Genome U133 Set anno-


tation data (chip hgu133a), 2015b. R package version 3.2.2.

Marc Carlson. hgu133plus2.db: Affymetrix Human Genome U133 Plus


2.0 Array annotation data (chip hgu133plus2), 2015c. R package version
3.2.2.

Marc Carlson. hgu95av2.db: Affymetrix Human Genome U95 Set anno-


tation data (chip hgu95av2), 2015d. R package version 3.2.2.

Marc Carlson. org.Dm.eg.db: Genome wide annotation for Fly, 2015e. R


package version 3.2.3.

Marc Carlson. org.Hs.eg.db: Genome wide annotation for Human, 2015f.


R package version 3.2.3.

Marc Carlson. org.Mm.eg.db: Genome wide annotation for Mouse,


2015g. R package version 3.2.3.

Marc Carlson and Bioconductor Package Maintainer.


TxDb.Scerevisiae.UCSC.sacCer3.sgdGene: Annotation package for TxDb
object(s), 2015. R package version 3.2.2.

Benilton Carvalho and Rafael Irizarry. oligo: Preprocessing tools for


oligonucleotide arrays, 2016. R package version 1.34.2.

D. Charif and J.R. Lobry. SeqinR 1.0-2: a contributed package to the


R project for statistical computing devoted to biological sequences
retrieval and analysis. In U. Bastolla, M. Porto, H.E. Roman, and
M. Vendruscolo, editors, Structural approaches to sequence evolution:
Molecules, networks, populations, Biological and Medical Physics,
Biomedical Engineering, pages 207232. Springer Verlag, New York,
2007. ISBN : 978-3-540-35305-8.
660 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

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.

Quan Chen, Xianghong J. Zhou, and Fengzhu Sun. Finding genetic


overlaps among diseases based on ranked gene lists. Journal of
Computational Biology, 22(2):111123, February 2015. ISSN 1066-5277.
doi: 10.1089/cmb.2014.0149. URL http://dx.doi.org/10.1089/
cmb.2014.0149.

Yunshun Chen, Aaron Lun, Davis McCarthy, Xiaobei Zhou, Mark


Robinson, and Gordon Smyth. edgeR: Empirical analysis of digital gene
expression data in R, 2016. URL http://bioinf.wehi.edu.au/edgeR.
R package version 3.12.1.

Peter J A Cock, Christopher J Fields, Naohisa Goto, Michael L


Heuer, and Peter M Rice. The sanger fastq file format for sequences
with quality scores, and the solexa/illumina fastq variants. Nucleic
Acids Research, 38(6):17671771, November 2009. ISSN 1362-4962.
URL http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2847217/.

Ana Conesa, Pedro Madrigal, Sonia Tarazona, David Gomez-


Cabrero, Alejandra Cervera, Andrew McPherson, Micha Wojciech
Szczesniak, Daniel J. Gaffney, Laura L. Elo, Xuegong Zhang, and Ali
Mortazavi. A survey of best practices for rna-seq data analysis. Ge-
nome Biology, 17(1):119, 2016. ISSN 1474-760X. doi: 10.1186/s13059-
016-0881-8. URL http://dx.doi.org/10.1186/s13059-016-0881-8.

Gabor Csardi. targetscan.Hs.eg.db: TargetScan miRNA target predictions


for human, 2013. R package version 0.6.1.

Aedn C. Culhane, Markus S. Schrder, Razvan Sultana, Shai-


ta C. Picard, Enzo N. Martinelli, Caroline Kelly, Benjamin Haibe-
Kains, Misha Kapushesky, Anne-Alyssa St Pierre, William Flahi-
ve, Kermshlise C. Picard, Daniel Gusenleitner, Gerald Papen-
hausen, Niall OConnor, Mick Correll, and John Quackenbush.
Genesigdb: a manually curated database and resource for analy-
sis of gene expression signatures. Nucleic Acids Research, 40
(D1):D1060D1066, 2012. doi: 10.1093/nar/gkr901. URL
http://nar.oxfordjournals.org/content/40/D1/D1060.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

Nicolas Delhomme and Ismael Padioleau. RnaSeqTutorial: RNA-Seq


Tutorial (EBI Cambridge UK, October 2011), 2015. R package version
0.8.0.

S. Dudoit, J.P. Shaffer, and J.C. Boldrick. Multiple hypothesis tes-


ting in microarray experiments. Statistical Science, 18:71103, 2003.
Microarrays.

Sandrine Dudoit and Robert Gentleman. Cluster analysis in dna


microarray experiments, 2002. URL http://www.bioconductor.org/
help/course-materials/2002/Seattle02/Cluster/cluster.pdf.
Bioconductor Short Course Winter 2002.

Steffen Durinck and Wolfgang Huber. biomaRt: Interface to BioMart


databases (e.g. Ensembl, COSMIC ,Wormbase and Gramene), 2015. R
package version 2.26.1.

Brad Efron and R. Tibshirani. GSA: Gene set analysis, 2010. URL
https://CRAN.R-project.org/package=GSA. R package version 1.03.

Bradley Efron and Robert Tibshirani. On testing the significance of


sets. Annals of Applied Statistics, 1(1):107129, 2007. doi: 10.1214/07-
AOAS101. Gene set analysis.

Brent Ewing and Phil Green. Base-calling of automated sequencer


traces using phred. ii. error probabilities. Genome Research, 8(3):186
194, 1998. doi: 10.1101/gr.8.3.186. URL http://genome.cshlp.org/
content/8/3/186.abstract.

Brent Ewing, LaDeana Hillier, Michael C. Wendl, and Phil Green.


Base-calling of automated sequencer traces usingphred. i. ac-
curacy assessment. Genome Research, 8(3):175185, 1998. doi:
10.1101/gr.8.3.175. URL http://genome.cshlp.org/content/8/
3/175.abstract.

S. Falcon and R. Gentleman. Using gostats to test gene lists for


go term association. Bioinformatics, 23(2):257258, 2007. doi:
10.1093/bioinformatics/btl567. URL http://bioinformatics.
oxfordjournals.org/content/23/2/257.abstract.

Francesco Favero. RmiR.Hs.miRNA: Various databases of microRNA


Targets, 2013a. R package version 1.0.7.

Francesco Favero. RmiR.hsa: Various databases of microRNA Targets,


2013b. R package version 1.0.5.

Peter Filzmoser. StatDA: Statistical Analysis for Environmental Data,


2015. URL https://CRAN.R-project.org/package=StatDA. R
package version 1.6.9.
662 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Richard Fox and Matthew Dimmic. A two-sample bayesian t-test for


microarray data. BMC Bioinformatics, 7(1):126, 2006. ISSN 1471-2105.
doi: 10.1186/1471-2105-7-126. URL http://www.biomedcentral.
com/1471-2105/7/126.

Alyssa Frazee, Ben Langmead, and Jeffrey Leek. Recount: A multi-


experiment resource of analysis-ready rna-seq gene count data-
sets. BMC Bioinformatics, 12(1):449, 2011. ISSN 1471-2105. doi:
10.1186/1471-2105-12-449. URL http://www.biomedcentral.com/
1471-2105/12/449.

Jerome Friedman, Trevor Hastie, and Rob Tibshirani. Regularization


paths for generalized linear models via coordinate descent. Jour-
nal of Statistical Software, 33(1):122, 2010. ISSN 1548-7660. doi:
10.18637/jss.v033.i01. URL http://www.jstatsoft.org/index.php/
jss/article/view/v033i01.

Kyle Furge and Karl Dykema. PGSEA: Parametric Gene Set Enrich-
ment Analysis, 2012. R package version 1.44.0.

Laurent Gautier, Leslie Cope, Benjamin M. Bolstad, and Rafael A.


Irizarry. affyanalysis of affymetrix genechip data at the probe
level. Bioinformatics, 20(3):307315, 2004. ISSN 1367-4803. doi:
http://dx.doi.org/10.1093/bioinformatics/btg405.

Ludwig Geistlinger, Gergely Csaba, Robert Kffner, Nicola Mul-


der, and Ralf Zimmer. From sets to graphs: towards a realistic
enrichment analysis of transcriptomic systems. Bioinformatics, 27
(13):i366i373, 2011. doi: 10.1093/bioinformatics/btr228. URL
http://bioinformatics.oxfordjournals.org/content/27/13/
i366.abstract.

Ludwig Geistlinger, Gergely Csaba, and Ralf Zimmer. Enrichment-


Browser: Seamless navigation through combined results of set-based and
network-based enrichment analysis, 2016. R package version 2.0.15.

R. Gentleman. annotate: Annotation for microarrays, 2015. R package


version 1.48.0.

R. Gentleman and S. Falcon. GOstats: Tools for manipulating GO and


microarrays., 2015. R package version 2.36.0.

R. Gentleman, V. Carey, W. Huber, R. Irizarry, and S. Dudoit, edi-


tors. Bioinformatics and Computational Biology Solutions Using R and
Bioconductor. Springer, 2005.

R. Gentleman, V. Carey, M. Morgan, and S. Falcon. Biobase: Base


functions for Bioconductor, 2015. R package version 2.30.0.
bibliografa 663

R. Gentleman, V. Carey, W. Huber, and F. Hahne. genefilter: methods


for filtering genes from high-throughput experiments, 2016. R package
version 1.52.1.

Robert Gentleman. Reproducible research: A bioinformatics case


study. Statistical Applications in Genetics and Molecular Biology, 4(1):2,
2005. doi: 10.2202/1544-6115.1034.

Robert Gentleman and Duncan Temple Lang. Statistical analyses


and reproducible research. Technical report, Bioconductor Project.
Bioconductor Project Working Papers, 2004.

Jelle Goeman, Jan Oosting, with contributions by Livio Finos, and


Aldo Solari. globaltest: Testing Groups of Covariates/Features for Asso-
ciation with a Response Variable, with Applications to Gene Set Testing,
2015. R package version 5.24.0.

Jelle J. Goeman and Peter Bhlmann. Analyzing gene expression


data in terms of gene sets: methodological issues. Bioinformatics,
23(8):980987, 2007. doi: 10.1093/bioinformatics/btm051. URL
http://bioinformatics.oxfordjournals.org/content/23/8/980.
abstract.

Jelle J. Goeman, Sara A. van de Geer, Floor de Kort, and Hans C.


van Houwelingen. A global test for groups of genes: testing asso-
ciation with a clinical outcome. Bioinformatics, 20(1):9399, 2004.
doi: 10.1093/bioinformatics/btg382. URL http://bioinformatics.
oxfordjournals.org/content/20/1/93.abstract.

Jelle J. Goeman, Sara A. Van De Geer, and Hans C. Van Houwelin-


gen. Testing against a high dimensional alternative. Journal of the
Royal Statistical Society: Series B (Statistical Methodology), 68(3):477
493, 2006. ISSN 1467-9868. doi: 10.1111/j.1467-9868.2006.00551.x.
URL http://dx.doi.org/10.1111/j.1467-9868.2006.00551.x.

Jelle J. Goeman, Hans C. van Houwelingen, and Livio Finos.


Testing against a high-dimensional alternative in the genera-
lized linear model: asymptotic type i error control. Biometri-
ka, 98(2):381390, 2011. doi: 10.1093/biomet/asr016. URL
http://biomet.oxfordjournals.org/content/98/2/381.abstract.

T. R. Golub, D. K. Slonim, P. Tamayo, C. Huard, M. Gaasenbeek, J. P.


Mesirov, H. Coller, M. L. Loh, J. R. Downing, M. A. Caligiuri, C. D.
Bloomfield, and E. S. Lander. Molecular classification of cancer:
class discovery and class prediction by gene expression monitoring.
Science, 286(5439):531537, Oct 1999. URL 10.1126/science.286.
5439.53.
664 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Todd Golub. golubEsets: exprSets for golub leukemia data, 2015. R


package version 1.12.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.

Florian Hahne, Wolfgang Huber, Robert Gentleman, and Seth Fal-


con. Bioconductor Case Studies. Use R! Springer, 2008.

Florian Hahne, Steffen Durinck, Robert Ivanek, Arne Mueller, Steve


Lianoglou, Ge Tan, Lance Parsons, and Shraddha Pai. Gviz: Plotting
data and annotation information along genomic coordinates, 2016. R
package version 1.14.7.
Sonja Hanzelmann, Robert Castelo, and Justin Guinney. Gsva:
gene set variation analysis for microarray and rna-seq data. BMC
Bioinformatics, 14(1):7, 2013. ISSN 1471-2105. doi: 10.1186/1471-
2105-14-7. URL http://www.biomedcentral.com/1471-2105/14/7.
Frank E Harrell, Jr. Hmisc: Harrell Miscellaneous, 2016. URL https:
//CRAN.R-project.org/package=Hmisc. R package version 3.17-4.

Trevor Hastie, Robert Tibshirani, Balasubramanian Narasimhan, and


Gilbert Chu. impute: Imputation for microarray data, 2015. R package
version 1.44.0.
Wolfgang Huber, Vincent J Carey, Robert Gentleman, Simon An-
ders, Marc Carlson, Benilton S Carvalho, Hector Corrada Bravo,
Sean Davis, Laurent Gatto, Thomas Girke, Raphael Gottardo, Flo-
rian Hahne, Kasper D Hansen, Rafael A Irizarry, Michael Lawrence,
Michael I Love, James MacDonald, Valerie Obenchain, Andrzej K
Oles, Herve Pages, Alejandro Reyes, Paul Shannon, Gordon K
Smyth, Dan Tenenbaum, Levi Waldron, and Martin Morgan. Or-
chestrating high-throughput genomic analysis with bioconductor.
Nat Meth, 12(2):115121, February 2015. ISSN 1548-7091. URL
http://dx.doi.org/10.1038/nmeth.3252.

Affymetrix Inc., Crispin J Miller, and PICR. plier: Implements the


Affymetrix PLIER algorithm, 2015. R package version 1.40.0.

R.A. Irizarry, B. Hobbs, F. Collin, Y.D. Beazer, K.J. Antonellis,


U. Scherf, and T.P. Speed. Exploration, normalization, and sum-
maries of high density oligonucleotide array probe level data. Bios-
tatistics, 4(2):249264, 2003. doi: 10.1093/biostatistics/4.2.249. URL
bibliografa 665

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.

Rafael A. Irizarry, Laurent Gautier, Benjamin Milo Bolstad, Cris-


pin Miller with contributions from Magnus Astrand <Mag-
nus.Astrand@astrazeneca.com>, Leslie M. Cope, Robert Gentleman,
Jeff Gentry, Conrad Halling, Wolfgang Huber, James MacDonald,
Benjamin I. P. Rubinstein, Christopher Workman, and John Zhang.
affy: Methods for Affymetrix Oligonucleotide Arrays, 2015. R package
version 1.48.0.

Laurent Jacob, Pierre Neuvial, and Sandrine Dudoit. More po-


wer via graph-structured tests for differential expression of gene
networks. Ann. Appl. Stat., 6(2):561600, 06 2012a. doi: 10.1214/11-
AOAS528. URL http://dx.doi.org/10.1214/11-AOAS528.

Laurent Jacob, Pierre Neuvial, and Sandrine Dudoit. DEGraph:


Two-sample tests on a graph, 2012b. R package version 1.22.0.

Arnoud J. Kal, Anton Jan van Zonneveld, Vladimir Benes, Marlene


van den Berg, Marian Groot Koerkamp, Kaj Albermann, Normann
Strack, Jan M. Ruijter, Alexandra Richter, Bernard Dujon, Wilhelm
Ansorge, and Henk F. Tabak. Dynamics of gene expression revealed
by comparison of serial analysis of gene expression transcript pro-
files from yeast grown on two different carbon sources. Molecular
Biology of the Cell, 10(6):18591872, 1999. doi: 10.1091/mbc.10.6.1859.
URL http://www.molbiolcell.org/content/10/6/1859.abstract.

Audrey Kauffmann, Ibrahim Emam, and Michael Schubert. Arra-


yExpress: Access the ArrayExpress Microarray Database at EBI and build
Bioconductor data structures: ExpressionSet, AffyBatch, NChannelSet,
2015. R package version 1.30.1.

L. Kaufman and P.J. Rousseeuw. Finding Groups in Data. An Introduc-


tion to Cluster Analysis. Wiley, 1990.

Eija Korpelainen, Jarno Tuimala, Panu Somervuo, Mikael Huss, and


Garry Wong. RNA-seq Data Analysis A Practical Approach. CRC Press,
2015.

Michael Lawrence, Vince Carey, and Robert Gentleman. rtracklayer:


R interface to genome browsers and their annotation tracks, 2016. R
package version 1.30.4.
666 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Eric Lecoutre. R2HTML: HTML exportation for R objects, 2014. URL


https://CRAN.R-project.org/package=R2HTML. R package version
2.3.1.

Jun Li and Robert Tibshirani. Finding consistent patterns: A


nonparametric approach for identifying differential expres-
sion in rna-seq data. Statistical Methods in Medical Research,
22(5):519536, 2013. doi: 10.1177/0962280211428386. URL
http://smm.sagepub.com/content/22/5/519.abstract.

Xiaochun Li. ALL: A data package, 2009. R package version 1.12.0.

Q. Liu, I. Dinu, A.J. Adewale, J.D. Potter, and Y. Yasui. Comparative


evaluation of gene-set analysis methods. BMC Bioinformatics, 8(1):
115, 2007. ISSN 1471-2105. doi: 10.1186/1471-2105-8-431. URL
http://dx.doi.org/10.1186/1471-2105-8-431.

Michael Love. airway: RangedSummarizedExperiment for RNA-Seq in


airway smooth muscle cells, by Himes et al PLoS One 2014, 2015a. R
package version 0.104.0.

Michael Love. parathyroidSE: RangedSummarizedExperiment for RNA-


Seq of primary cultures of parathyroid tumors by Haglund et al., J Clin
Endocrinol Metab 2012., 2015b. R package version 1.8.0.

James W. MacDonald. affycoretools: Functions useful for those doing


repetitive analyses with Affymetrix GeneChips, 2008. R package version
1.42.0.

Henryk Maciejewski. Gene set analysis methods: statistical models


and methodological differences. Briefings in Bioinformatics, 2013.
doi: 10.1093/bib/bbt002. URL http://bib.oxfordjournals.org/
content/early/2013/02/09/bib.bbt002.abstract.

S. C. Madeira and A. L. Oliveira. Biclustering algorithms for


biological data analysis: a survey. IEEE/ACM Transactions on
Computational Biology and Bioinformatics, 1(1):2445, 2004. doi:
10.1109/TCBB.2004.2.

Martin Maechler, Peter Rousseeuw, Anja Struyf, and Mia Hubert.


cluster: "Finding Groups in Data": Cluster Analysis Extended Rousseeuw
et al., 2016. URL https://CRAN.R-project.org/package=cluster. R
package version 2.0.4.

Paolo Martini, Gabriele Sales, M. Sofia Massa, Monica Chiog-


na, and Chiara Romualdi. Along signal paths: an empirical
gene set approach exploiting pathway topology. Nucleic Acids
Research, 41(1):e19, 2013. doi: 10.1093/nar/gks866. URL
http://nar.oxfordjournals.org/content/41/1/e19.abstract.
bibliografa 667

V.K . Mootha, C.M. Lindgren, K.F. Eriksson, A. Subramanian,


S. Sihag, J. Lehar, P. Puigserver, E. Carlsson, M. Ridderstrale, E. Lau-
rila, N. Houstis, M.J. Daly, N. Patterson, J.P. Mesirov, T.R. Golub,
P. Tamayo, B. Spiegelman, E.S. Lander, J.N. Hirschhorn, D. Alts-
huler, and L.C. Groop. Pgc-1alpha-responsive genes involved in
oxidative phosphorylation are coordinately downregulated in hu-
man diabetes. Nature Genetics, 34:26773, 2003.

Martin Morgan, Seth Falcon, and Robert Gentleman. GSEABase:


Gene set enrichment data structures and methods, 2015a. R package
version 1.32.0.

Martin Morgan, Michael Lawrence, and Simon Anders. ShortRead:


FASTQ input and manipulation, 2015b. R package version 1.28.0.

Martin Morgan, Herv Pags, Valerie Obenchain, and Nathaniel


Hayden. Rsamtools: Binary alignment (BAM), FASTA, variant call
(BCF), and tabix file import, 2015c. URL http://bioconductor.org/
packages/release/bioc/html/Rsamtools.html. R package version
1.22.0.

Martin Morgan, Valerie Obenchain, Jim Hester, and Herv Pags.


SummarizedExperiment: SummarizedExperiment container, 2016. R
package version 1.0.2.

Ali Mortazavi, Brian A Williams, Kenneth McCue, Lorian Schaeffer,


and Barbara Wold. Mapping and quantifying mammalian transcrip-
tomes by rna-seq. Nat Meth, 5(7):621628, July 2008. ISSN 1548-7091.
URL http://dx.doi.org/10.1038/nmeth.1226.

Haroon Naeem, Ralf Zimmer, Pegah Tavakkolkhah, and Robert


Kffner. Rigorous assessment of gene set enrichment tests. Bioinfor-
matics, 28(11):14801486, 2012. doi: 10.1093/bioinformatics/bts164.
URL http://bioinformatics.oxfordjournals.org/content/28/11/
1480.abstract.

Richard M. Neve, Koei Chin, Jane Fridlyand, Jennifer Yeh, Frede-


rick L. Baehner, Tea Fevr, Laura Clark, Nora Bayani, J. e. a. n. . P. h.
i. l. i. p. p. e. Coppe, Frances Tong, Terry Speed, Paul T. Spellman,
Sandy DeVries, Anna Lapuk, Nick J. Wang, W. e. n. . L. i. n. Kuo,
Jackie L. Stilwell, Daniel Pinkel, Donna G. Albertson, Frederic M.
Waldman, Frank McCormick, Robert B. Dickson, Michael D. John-
son, Marc Lippman, Stephen Ethier, Adi Gazdar, and Joe W. Gray.
A collection of breast cancer cell lines for the study of functionally
distinct cancer subtypes. Cancer cell, 10(6):515 527, 2006. doi:
10.1016/j.ccr.2006.10.008.
668 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Michael A. Newton, Fernando A. Quintana, Johan A. den Boon, Sri-


kumar Sengupta, and Paul Ahlquist. Random-set methods identify
distinct aspects of the enrichment signal in gene-set analysis. Annals
of Appied Statistics, 1(1):85106, 2007. doi: 10.1214/07-AOAS104.
URL http://projecteuclid.org/euclid.aoas/1183143730.

Tobias Oetiker, Hubert Partl, Irene Hyna, and Elisabeth Schlegl. La


introduccin no-tan-corta a latex 2e, Febrero 2010.

Alicia Oshlack and Matthew J. Wakefield. Transcript length bias


in rna-seq data confounds systems biology. Biology Direct, 4(1):
110, 2009. ISSN 1745-6150. doi: 10.1186/1745-6150-4-14. URL
http://dx.doi.org/10.1186/1745-6150-4-14.

Alicia Oshlack, Mark Robinson, and Matthew Young. From rna-


seq reads to differential expression results. Genome Biology, 11(12):
220, 2010. ISSN 1465-6906. doi: 10.1186/gb-2010-11-12-220. URL
http://genomebiology.com/2010/11/12/220.

H. Pages, P. Aboyoun, R. Gentleman, and S. DebRoy. Biostrings:


String objects representing biological sequences, and matching algorithms,
2016a. R package version 2.38.4.

H. Pages, P. Aboyoun, and M. Lawrence. IRanges: Infrastructure for


manipulating intervals on sequences, 2016b. R package version 2.4.8.

Herve Pages. BSgenome: Infrastructure for Biostrings-based genome data


packages and support for efficient SNP representation, 2015. R package
version 1.38.0.

Herve Pages, Marc Carlson, Seth Falcon, and Nianhua Li. Anno-
tationDbi: Annotation Database Interface, 2015. R package version
1.32.3.

Herv Pags, Valerie Obenchain, and Martin Morgan. GenomicA-


lignments: Representation and manipulation of short genomic alignments,
2016. R package version 1.6.3.

Maciej Pajak and T. Ian Simpson. miRNAtap.db: Data for miRNAtap,


2015. R package version 0.99.7.

Leonor Palmeira, Laurent Guguen, and Jean R. Lobry. UV-


Targeted Dinucleotides Are Not Depleted in Light-Exposed
Prokaryotic Genomes. Molecular Biology and Evolution, 23(11):
22142219, 2006. doi: 10.1093/molbev/msl096. URL http:
//mbe.oxfordjournals.org/content/23/11/2214.abstract.

Yudi Pawitan and Alexander Ploner. OCplus: Operating characteris-


tics plus sample size and local fdr for microarray experiments, 2015. R
package version 1.44.0.
bibliografa 669

Manoj M Pillai, Austin Gillen, Tomomi M Yamamoto, Enos Kli-


ne, Joseph Brown, Kale Flory, Jay R Hesselberth, and Peter Kabos.
Hits-clip reveals key regulators of nuclear receptor signaling in
breast cancer. Breast cancer research and treatment, 146(1):8597, June
2014. ISSN 1573-7217. URL http://www.ncbi.nlm.nih.gov/pmc/
articles/PMC4115274/.

Katherine S. Pollard, Houston N. Gilbert, Yongchao Ge, Sandra


Taylor, and Sandrine Dudoit. multtest: Resampling-based multiple
hypothesis testing, 2015. R package version 2.26.0.

Bernard Prum, Francois Rodolphe, and Elisabeth de Turckheim.


Finding words with unexpected frequencies in deoxyribonucleic
acid sequences. Journal of the Royal Statistical Society. Series B
(Methodological), 57(1):pp. 205220, 1995. ISSN 00359246. URL
http://www.jstor.org/stable/2346095.

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.

R Core Team. R: A Language and Environment for Statistical Compu-


ting. R Foundation for Statistical Computing, Vienna, Austria, 2016.
URL https://www.R-project.org/.

C.R. Rao. Linear Statistical Inference and Its Applications. Wiley, 1967.

Armin Rauschenberger, Marianne A. Jonker, Mark A. van de Wiel,


and Rene X. Menezes. Testing for association between rna-seq and
high-dimensional data. BMC Bioinformatics, 17(1):18, 2016. ISSN
1471-2105. doi: 10.1186/s12859-016-0961-5. URL http://dx.doi.
org/10.1186/s12859-016-0961-5.

James F. Reid. mirbase.db: miRBase: the microRNA database, 2013. R


package version 1.2.0.

Anat Reiner, Daniel Yekutieli, and Yoav Benjamini. Identifying dif-


ferentially expressed genes using false discovery rate controlling
procedures. Bioinformatics, 19(3):368375, 2003. doi: 10.1093/bioin-
formatics/btf877. URL http://bioinformatics.oxfordjournals.
org/content/19/3/368.abstract.

Tyler Rinker and Dason Kurkiewicz. pacman: Package Management


Tool, 2016. URL https://CRAN.R-project.org/package=pacman. R
package version 0.4.1.

Mark Robinson and Alicia Oshlack. A scaling normalization met-


hod for differential expression analysis of rna-seq data. Genome
670 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Biology, 11(3):R25, 2010. ISSN 1465-6906. doi: 10.1186/gb-2010-11-3-


r25. URL http://genomebiology.com/2010/11/3/R25.

Mark D. Robinson and Gordon K. Smyth. Moderated statistical


tests for assessing differences in tag abundance. Bioinformatics, 23
(21):28812887, 2007. doi: 10.1093/bioinformatics/btm453. URL
http://bioinformatics.oxfordjournals.org/content/23/21/
2881.abstract.

Mark D. Robinson and Gordon K. Smyth. Small-sample estimation


of negative binomial dispersion, with applications to sage data.
Biostatistics, 9(2):321332, 2008. doi: 10.1093/biostatistics/kxm030.
URL http://biostatistics.oxfordjournals.org/content/9/2/
321.abstract.

Gabriele Sales, Enrica Calura, Paolo Martini, and Chiara Romualdi.


Graphite web: web tool for gene set analysis exploiting pathway
topology. Nucleic Acids Research, 2013. doi: 10.1093/nar/gkt386.
URL http://nar.oxfordjournals.org/content/early/2013/05/10/
nar.gkt386.abstract.

Fatemeh Seyednasrollah, Asta Laiho, and Laura L. Elo. Comparison


of software packages for detecting differential expression in rna-seq
studies. Briefings in Bioinformatics, 2013. doi: 10.1093/bib/bbt086.
URL http://bib.oxfordjournals.org/content/early/2013/12/02/
bib.bbt086.abstract.

P.P. Sinha. Bioinformatics with R Cookbook. Packt Publishing, 2014.

Martin Slawski and Anne-Laure Boulesteix. GeneSelector: Stability


and Aggregation of ranked gene lists, 2015. R package version 2.20.0.

Gordon Smyth, Matthew Ritchie, Jeremy Silver, James Wettenhall,


Natalie Thorne, Davis McCarthy, Di Wu, Yifang Hu, Wei Shi, Be-
linda Phipson, Alicia Oshlack, Carolyn de Graaf, Mette Langaas,
Egil Ferkingstad, Marcus Davy, Francois Pepin, Dongseok Choi, and
Aaron Lun. limma: Linear Models for Microarray Data, 2016. URL
http://bioinf.wehi.edu.au/limma. R package version 3.26.9.

Gordon K. Smyth. Linear models and empirical bayes methods


for assessing differential expression in microarray experiments.
Statistical Applications in Genetics and Molecular Biology, 1:3, 2004.

Peter H.A. Sneath and Rober R. Sokal. Numerical Taxonomy. The


principes and practice of numerical Classification. W.H. Freeman and
Company, San Francisco, USA, 1973.

Phillip Stafford, editor. Methods in Microarray Normalization. CRC


Press, 2008.
bibliografa 671

John D. Storey and Robert Tibshirani. Statistical significance for


genomewide studies. Proceedings of the National Academy of Sciences,
100(16):94409445, 2003. doi: 10.1073/pnas.1530509100. URL
http://www.pnas.org/content/100/16/9440.abstract.

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.

Aravind Subramanian, Pablo Tamayo, Vamsi K. Mootha, Sayan


Mukherjee, Benjamin L. Ebert, Michael A. Gillette, Amanda Pau-
lovich, Scott L. Pomeroy, Todd R. Golub, Eric S. Lander, and Jill P.
Mesirov. Gene set enrichment analysis: A knowledge-based ap-
proach for interpreting genome-wide expression profiles. Procee-
dings of the National Academy of Sciences of the United States of America,
102(43):1554515550, 2005. doi: 10.1073/pnas.0506580102. URL
http://www.pnas.org/content/102/43/15545.abstract.

Terry M Therneau. RNASeqPower: Sample size for RNAseq studies,


2015. R package version 1.10.0.

Lu Tian, Steven A. Greenberg, Sek Won Kong, Josiah Altschuler,


Isaac S. Kohane, and Peter J. Park. Discovering statistically sig-
nificant pathways in expression profiling studies. Proceedings
of the National Academy of Sciences of the United States of America,
102(38):1354413549, 2005. doi: 10.1073/pnas.0506577102. URL
http://www.pnas.org/content/102/38/13544.abstract.

R. Tibshirani, G. Chu, Balasubramanian Narasimhan, and Jun Li.


samr: SAM: Significance Analysis of Microarrays, 2011. URL https:
//CRAN.R-project.org/package=samr. R package version 2.0.

Robert Tibshirani, Jacob Bien, Jerome Friedman, Trevor Hastie,


Noah Simon, Jonathan Taylor, and Ryan J Tibshirani. Strong rules
for discarding predictors in lasso-type problems. Journal of the
Royal Statistical Society. Series B, Statistical methodology, 74(2):245266,
March 2012. ISSN 1369-7412. URL http://www.ncbi.nlm.nih.gov/
pmc/articles/PMC4262615/.

Shailesh Tripathi, Galina V. Glazko, and Frank Emmert-Streib. En-


suring the statistical soundness of competitive gene set approaches:
gene filtering and genome-scale coverage are essential. Nucleic
Acids Research, 41(7):e82, 2013. doi: 10.1093/nar/gkt054. URL
http://nar.oxfordjournals.org/content/41/7/e82.abstract.
672 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Olga Troyanskaya, Michael Cantor, Gavin Sherlock, Pat Brown, Tre-


vor Hastie, Robert Tibshirani, David Botstein, and Russ B. Altman.
Missing value estimation methods for dna microarrays. Bioinforma-
tics, 17(6):520525, 2001. doi: 10.1093/bioinformatics/17.6.520. URL
http://bioinformatics.oxfordjournals.org/content/17/6/520.
abstract.

Virginia Goss Tusher, Robert Tibshirani, and Gilbert Chu. Sig-


nificance analysis of microarrays applied to the ionizing radia-
tion response. Proceedings of the National Academy of Sciences,
98(9):51165121, 2001. doi: 10.1073/pnas.091062498. URL
http://www.pnas.org/content/98/9/5116.abstract. Gene set
analysis.

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.

Leif Varemo and Intawat Nookaew. piano: Platform for integrative


analysis of omics data, 2015. URL http://www.sysbio.se/piano. R
package version 1.10.2.

Marie Verbanck, Sebastien Le, and Jerome Pages. A new unsu-


pervised gene clustering algorithm based on the integration of
biological knowledge into expression data. BMC Bioinformatics, 14
(1):42, 2013. ISSN 1471-2105. doi: 10.1186/1471-2105-14-42. URL
http://www.biomedcentral.com/1471-2105/14/42.

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.

Hadley Wickham. reshape: Flexibly reshape data., 2014. URL https:


//CRAN.R-project.org/package=reshape. R package version 0.8.5.

Hadley Wickham and Winston Chang. ggplot2: An Implementation of


the Grammar of Graphics, 2016. URL https://CRAN.R-project.org/
package=ggplot2. R package version 2.1.0.
bibliografa 673

Rand R. Wilcox. Basic Statistics. Oxford University Press, 2009. URL


/home/gag/BIBLIOGRAFIA/MISLIBROS/Wilcox_Basic_Statistics_
Oxford_University_Press_2009.pdf.

E. Wit and J.D. McClure. Statistics for microarrays: design, analysis, and
inference. Wiley, 2004.

John D. Storey with contributions from Andrew J. Bass, Alan Dab-


ney, and David Robinson. qvalue: Q-value estimation for false discovery
rate control, 2015. URL http://github.com/jdstorey/qvalue. R
package version 2.2.2.

Justin Guinney with contributions from Robert Castelo. GSVA: Gene


Set Variation Analysis for microarray and RNA-seq data, 2015. URL
http://www.sagebase.org. R package version 1.18.0.

R. Gentleman with contributions from S. Falcon and D.Sarkar. Cate-


gory: Category Analysis, 2015. R package version 2.36.0.

Daniela M Witten and Robert Tibshirani. Scientific research in


the age of omics: the good, the bad, and the sloppy. Journal of the
American Medical Informatics Association, 20(1):125127, 2013. doi:
10.1136/amiajnl-2012-000972. URL http://jamia.bmj.com/content/
20/1/125.abstract.

Di Wu and Gordon K. Smyth. Camera: a competitive gene set


test accounting for inter-gene correlation. Nucleic Acids Research,
40(17):e133, 2012. doi: 10.1093/nar/gks461. URL http://nar.
oxfordjournals.org/content/40/17/e133.abstract.

Hao Wu. PROPER: PROspective Power Evaluation for RNAseq, 2015. R


package version 1.2.0.

Jean Wu and Rafael Irizarry with contributions from James Mac-


Donald Jeff Gentry. gcrma: Background Adjustment Using Sequence
Information, 2015. R package version 2.42.0.

Jianguo Xia, Erin E Gill, and Robert E W Hancock. Networka-


nalyst for statistical, visual and network-based meta-analysis of
gene expression data. Nat. Protocols, 10(6):823844, June 2015. ISSN
1754-2189. URL http://dx.doi.org/10.1038/nprot.2015.052.

Yihui Xie. knitr: A General-Purpose Package for Dynamic Report Genera-


tion in R, 2016. URL https://CRAN.R-project.org/package=knitr.
R package version 1.12.3.

Qing Xiong, Nicola Ancona, Elizabeth R. Hauser, Sayan Mukherjee,


and Terrence S. Furey. Integrating genetic and gene expression evi-
dence into genome-wide association analysis of gene sets. Genome
674 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Research, 22(2):386397, 2012. doi: 10.1101/gr.124370.111. URL


http://genome.cshlp.org/content/22/2/386.abstract.

Tengfei Yin, Michael Lawrence, and Dianne Cook. ggbio: Visualiza-


tion tools for genomic data., 2016. URL http://tengfei.github.com/
ggbio/. R package version 1.18.5.

Matthew Young. goseq: Gene Ontology analyser for RNA-seq and other
length biased data, 2015. R package version 1.22.0.

Matthew Young, Matthew Wakefield, Gordon Smyth, and Alicia


Oshlack. Gene ontology analysis for rna-seq: accounting for selec-
tion bias. Genome Biology, 11(2):R14, 2010. ISSN 1465-6906. doi:
10.1186/gb-2010-11-2-r14. URL http://genomebiology.com/2010/
11/2/R14.

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.

Yi-Hui Zhou, William T. Barry, and Fred A. Wright. Empiri-


cal pathway analysis, without permutation. Biostatistics, 2013.
doi: 10.1093/biostatistics/kxt004. URL http://biostatistics.
oxfordjournals.org/content/early/2013/02/20/biostatistics.
kxt004.abstract.

Jack Zhu and Sean Davis. SRAdb: A compilation of metadata from


NCBI SRA and tools, 2015. URL http://gbnci.abcc.ncifcrf.gov/
sra/. R package version 1.28.1.

Yuelin Zhu, Robert M. Stephens, Paul S. Meltzer, and Sean R. Davis.


Sradb: query and use public next-generation sequencing data from
within r. BMC Bioinformatics, 14(1):14, 2013. ISSN 1471-2105.
doi: 10.1186/1471-2105-14-19. URL http://dx.doi.org/10.1186/
1471-2105-14-19.

Chandler Zuo and Sunduz Keles. CSSP: ChIP-Seq Statistical Power,


2015. R package version 1.8.0.
ndice alfabtico

affy, 123 Datos kOverA, 174


Affymetrix GEO nsFilter, 176
Fichero CDF, 80 GSE21779, 123 rowFtests, 186
Fichero CEL, 80 gse1397, 374 rowttests, 182
Fichero DAT, 80 GSE37211, 158 geneplotter
hgu133a.db, 320 GSE64099, 157 multidensity, 119
Affymetrix GeneChip, 80 Distribucin binomial GeneSelector, 373, 374
ALL, 108, 325 Aproximacin Poisson, 489 AggregateSimple, 382
Anlisis cluster, 15 Distribucin binomial negativa, 490 GenerateBootMatrix, 380
Anlisis de la varianza, 184 Distribucin emprica, 478 RankingFC, 374
annotate, 253 Distribucin geomtrica, 489 RankingLimma, 375
annotation, 253 Distribucin Poisson, 488 RankingTstat, 183, 375
getSYMBOL, 253 Distribucin de los sucesos raros, RepeatRanking, 380
lookUp, 253 488 toplist, 376
ArrayExpress, 129 GenomicRanges
edgeR assay, 155
base binomTest, 234 coldata, 156
apply, 171 Ensembl, 253 rowRanges, 156
bdmy, 117 Error cuadrtico medio, 623 GEOquery, 127
Biobase Error estndar, 623 getGEOSuppFiles, 127
ExpressionSet, 109 Espacio paramtrico, 622 ggplot2, 119
sample.ExpressionSet, 103 Estimador, 623 colour, 31
Bioconductor, 27 Estimador mximo verosmil, 626 qplot, 29
ALL, 27 alpha, 36
biocLite, 27 FDR facets, 32
multtest False discovery rate, 192 globaltest, 431
golub, 28 Tasa de falsamente rechazados, 192 GO.db, 320
Biostrings, 385 Filtrado independiente, 170 golubEsets
DNA_ALPHABET, 385 Fold-change, 177 golub, 108
XString, 386 Fox-Dimmic, 375 GOstats, 319
XStringSet, 389 Funcin de distribucin emprica, 478 hyperGTest, 321
XStringViews, 388 FWER GSE1397, 124
Bootstrap, 379 Familywise error rate, 191 GSE20986, 127, 251, 252, 304, 322
tasa de error global, 191 gse20986, 322
Category, 319 GSE34764, 128
coldata, 156 Gene Ontology: GO, 253 GSE37211, 155
Comparaciones mltiples, 189 Gene set analysis, 15 GSE64099, 157
Control dbil del error, 193 Gene set enrichment analysis, 15 GSEABase
Control fuerte del error, 193 genefilter, 174 GeneSetCollection, 308
676 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

GSEAbase, 304 Normalizacin de cuantiles, 94 save, 123


details, 305 nsFilter, 322 setwd, 123
geneIds, 305 Short-refcard, 20
GeneSet, 305 org.Sc.sgd.db, 307 stats
GeneSetCollection, 306 hist, 26
GSVA, 365 p-valor ajustado, 194 R2HTML, 254
Paquete R HTML, 254
hgu133plus2.db, 253, 322 parathyroidSE, 155 ReCount
Paquetes R maqc.eset, 155
IDE Regin crtica, 628
ggplot2, 31
RStudio, 27 ReportingTools, 255
PGSEA, 365
TinnR, 26 finish, 256
piano
Intervalo de confianza, 630 HTMLReport, 256
GSAsummaryTable, 362
IRanges::DataFrame, 156 publish, 256
loadGSC, 360
networkPlot, 365 reshape
Jackknife, 379 melt, 84, 119
Prueba Bernoulli, 483
Robust multichip average (RMA), 93
leave-one-out, 379 rowRanges, 156
LibreOffice q-valor, 202
qvalue, 205 RStudio, 27
Calc, 22
Limma, 375
R SAM, 211
limma
as.matrix, 110 samr, 214
normalizeBetweenArrays, 101
base Seleccin no especfica, 170
Lista ordenada, 373
apply, 34 Sesgo, 623
Listas ordenadas
c, 22 SummarizedExperiment
estabilidad, 374
class, 29 RangedSummarizedExperiment,
Logverosimilitu, 621
colnames, 34 155
Mtodo de Benjamini y Hochberg, dim, 30
197 factor, 29 t-test, 181
Mtodo de Bonferroni, 195 help, 26 tami13
Mtodo de Hochberg, 197 help.start, 26 all.tami.R, 27
Mtodo de Holm, 196 mean, 34, 35 tamidata
Mtodo de Sdk, 195 ncol, 30 gse1397
MA plot, 86 nrow, 30 gse1397.gsc, 308
MAS5, 90 Operadores lgicos, 24 TCGA: The Cancer Genome Atlas,
Matriz de correlaciones muestral, 626 pdf, 26 647
Matriz de covarianzas muestral, 625 read.table, 21 Test de Fisher unilateral, 315
max T por pasos de bajada, 197 rownames, 34 fisher.test, 317
Median polish, 96 sort, 25 Test de Wald, 629
Meta-analisis class, 110 Test del cociente de verosimilitudes,
Mtodo de Fisher, 637 data.frame, 110 628
Mtodo de Stouffer, 638 function, 37 TinnR, 26
Microarray, 79 Instalacin, 19 Top-k list, 374
multtest matplot, 84 topGO, 365
golub, 105 Paquetes
mt.rawp2adjp, 198 ggplot2, 29 Variable aleatoria
mt.reject, 201 UsingR, 20 Bernoulli, 482
read.csv, 110 discreta
NCBI Gene Expression Omnibus read.table, 110 Poisson, 488
(GEO), 122 return, 37 Variable Bernoulli, 482
Nivel de confianza, 630 sapply, 114 Verosimilitud, 621
Glossary

Affymetrix http://www.affymetrix.com/. 49, 50

BAM Es la versin binaria del formato SAM. http://genome.sph.


umich.edu/wiki/SAM y la especificacin del formato la tenemos en
http://samtools.sourceforge.net/SAM1.pdf.. 150

BioMart http://www.biomart.org Es un sistema de almacenamiento


de datos orientado a las consultas. Ha sido desarrollado por el
European Bioinformatics Institute (EBI) y el Cold Spring Harbor
Laboratory (CSHL). . 70

Bowtie Alineador de secuencias. http://bowtie-bio.sourceforge.


net/index.shtml http://bowtie-bio.sourceforge.net/index.
shtml . 165

Bowtie2 Alineador de secuencias. http://bowtie-bio.sourceforge.


net/bowtie2/index.shtml . 151153, 163

CDS Es la regin codificante de un gen: Coding DNA Sequence.


Es la parte del gen (DNA o RNA) compuesta por los exones que
codifican protena. El CDS es la porcin de un transcrito que es
trasladado por un ribosoma. . 60, 63

Ensembl https://en.wikipedia.org/wiki/Ensembl. 42, 53, 72, 74, 75

Entrez https://en.wikipedia.org/wiki/Entrez. 42, 50, 52, 72, 74,


75, 186

FASTQ Es un formato para guardar datos de secuencias. Consiste


de cuatro lneas. La primera contiene el nombre de la secuencia.
La segunda lnea contiene a la propia secuencia. La tercera lnez
contiene informacin opcional sobre la secuencia. La cuarta lnea
cuantifica la confianza o calidad en la determinacin de cada base
recogida en la segunda lnea. . 139, 148, 149
678 bioinformtica estadstica anlisis estadstico de datos micos con r/bioconductor

Gene Ontology Abreviadamente GO. https://en.wikipedia.org/


wiki/Gene_ontology y en http://geneontology.org/.. 43, 53, 54,
75, 304, 312, 313, 320, 321, 323, 328330, 333, 334, 342, 348, 356, 357

GEO NCBI GEO (Gene Expression Omnibus) es una base de datos


de datos de expresin obtenidos con microarrays. Tambin tiene
algo de datos de secuenciacin. Su direccin es http://www.ncbi.
nlm.nih.gov/geo/. . 81, 122, 127, 129, 137, 157

GitHub Es un lugar web para desarrollo colaborativo de software.


http://bowtie-bio.sourceforge.net/bowtie2/index.shtml . 679

GTF/GFF Formato de fichero cuya descripcin detallada se puede


encontrar en http://www.ensembl.org/info/website/upload/gff.
html.. 150

KEGG http://www.genome.jp/kegg/ https://en.wikipedia.org/


wiki/KEGG Es una coleccin de bases de datos sobre genomas, ru-
tas biolgicas, enfermedades, medicamentos y sustancias qumicas.
. 304, 311313, 356

miRBase Base de datos de microRNA. http://www.mirbase.org/. Ver


AMBROS et al. [2003], ?. . 439

OrgDb Tipo de paquetes de anotacin centrados en el organismos a


que se refieren. Por ejemplo Carlson [2015f, org.Hs.eg.db].. 651

R R es un entorno de programacin estadstico. https://www.


r-project.org/ . 10, 105, 138

Reactome Es una base de datos de rutas. http://www.reactome.org/ .


365

RNA-Seq https://en.wikipedia.org/wiki/RNA-Seq. . 133

RPKM Reads per kilobase per million reads. C es el total de lecturas


alineadas sobre la caracterstica. El total de lecturas que podemos
alinear es N (o tamao de la librera), L la longitud de la caracte-
9
rstica de inters en bp. RPKM = 10NLC . . 163

SAM Sequence Alignment/Map https://samtools.github.io/


hts-specs/SAMv1.pdf . 151, 153

SAM http://genome.sph.umich.edu/wiki/SAM y la especificacin


del formato la tenemos en http://samtools.sourceforge.net/
SAM1.pdf.. 149, 150, 677
glossary 679

Samtools Es un conjunto de programas para trabajar con datos de


secuenciacin. Ver http://www.htslib.org/. En Debian/Ubuntu
se instala con apt-get install samtools. En R/Bioconductor tenemos
el paquete Morgan et al. [2015c, Rsamtools].. 150, 165

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

STAR Es un ejecutable que se baja desde GitHub https://github.


com/alexdobin/STAR/archive/master.zip. Con STAR aligner en
Google lo encontramos... 149

TopHat https://ccb.jhu.edu/software/tophat/index.shtml. En
Debian/Ubuntu instalamos con apt-get install tophat.. 165

También podría gustarte