Processing math: 100%
+ - 0:00:00
Notes for current slide
Notes for next slide

Minicurso

Ana BVA, Rodolfo LCD

15 April 2021

1 / 124

Agradecimientos

2 / 124

Agradecimientos

También está basado en el curso de "Next generation sequencing bioiformatics" (Santiago, Chile 2019).

4 / 124

Agradecimientos

5 / 124

1: Introducción al RNA-seq

6 / 124

Transcriptómica

Estudio de la expresión genética

  • ¿Cuánto RNA hay?

7 / 124

Tecnologías

8 / 124

RNA-seq

9 / 124

Aplicaciones

10 / 124

Bases de datos

11 / 124

2: Organización de un proyecto bioinformático

12 / 124

Organización del proyecto

Almacenar el proyecto en GitHub para el control de versiones

13 / 124

Organización del proyecto

  • La función del README es explicar la organización del proyecto y que otros entiendan su contenido
14 / 124

Organización del proyecto

  • La función del README es explicar la organización del proyecto y que otros entiendan su contenido
  • Los datos deben de almacenarse en un directorio especial (considerar espacio en disco):
14 / 124

Organización del proyecto

  • La función del README es explicar la organización del proyecto y que otros entiendan su contenido
  • Los datos deben de almacenarse en un directorio especial (considerar espacio en disco):
  • Considerar almacenar los datos en un repositorio como respaldo OSF
14 / 124

Organización del proyecto

  • La función del README es explicar la organización del proyecto y que otros entiendan su contenido
  • Los datos deben de almacenarse en un directorio especial (considerar espacio en disco):
  • Considerar almacenar los datos en un repositorio como respaldo OSF
  • El código es una de las partes más importantes del proyecto
14 / 124

Organización del proyecto

Código

  • Enumerar los scripts de acuerdo al orden en que serán ejecutados

    +-- 1.QualityControl.sh
    +-- 2.Trimming.sh
    +-- 3.ReadAlignment.sh
    +-- 4.DifferentialExpression.R
  • Utilizar rutas relativas hacia los archivos input

    fastqc ../Data/*.fastqc -o ../Results/
  • Comentar el script -> facilita que sea entendido por humanos
    #Change the location of bam files
    mv ../Data/*.bam ../Results/

**Checa el paquete here desarrollado por Jenny B.

  • ¡Mejorar el código! -> Less is more
15 / 124

cat

16 / 124

Organización del proyecto

17 / 124

Experimento

Número de acceso GEO: GSE152699

18 / 124

3: Flujo de trabajo para el análisis de RNA-seq

19 / 124

Flujo general de trabajo

Imagen tomada de aquí

20 / 124

Primeros pasos

21 / 124

Alineamiento y Quantificación

22 / 124

Expresión Diferencial y análisis funcionales

23 / 124

Flujo general de trabajo

Imagen tomada de aquí

24 / 124

4: Tipos de archivos

25 / 124

FastQ

26 / 124

FastQ

  • Derivado del formato FASTA
26 / 124

FastQ

  • Derivado del formato FASTA

  • Id secuencia + Calidad

26 / 124

FastQ

  • Derivado del formato FASTA

  • Id secuencia + Calidad

  • Generalmente no está comprimido (.fastq) > comprimir (.fastq.gz)

26 / 124

FastQ

  • Derivado del formato FASTA

  • Id secuencia + Calidad

  • Generalmente no está comprimido (.fastq) > comprimir (.fastq.gz)

  • Comprende 4 líneas por secuencia:

    • @ ID del read + información de la corrida
    • Secuencia
    • Símbolo "+"
    • Calidad (Escala Phred y código ASCII)
26 / 124

FastQ

Identificador

27 / 124

FastQ

Identificador

  • El identificador de la secuencia es la primera línea del archivo .fastq
27 / 124

FastQ

Identificador

  • El identificador de la secuencia es la primera línea del archivo .fastq

  • Plataformas de Illumina superiores a 1.8 contienen la siguiente información:

27 / 124

FastQ

Identificador

  • El identificador de la secuencia es la primera línea del archivo .fastq

  • Plataformas de Illumina superiores a 1.8 contienen la siguiente información:

@machneID:run number:flowCell ID:lane:tile:read:control number:index

## gzcat: can't stat: ../Data/s1_R1.fastq.gz (../Data/s1_R1.fastq.gz.gz): No such file or directory
27 / 124

FastQ

Calidad

La calidad de cada base secuenciada, en la escala Phred, se calcula de acuerdo la siguiente ecuación:

Q=10log10(p)

28 / 124

FastQ

Calidad

La calidad de cada base secuenciada, en la escala Phred, se calcula de acuerdo la siguiente ecuación:

Q=10log10(p) Q = Calidad

28 / 124

FastQ

Calidad

La calidad de cada base secuenciada, en la escala Phred, se calcula de acuerdo la siguiente ecuación:

Q=10log10(p) Q = Calidad

p = Probabilidad de que el base call sea incorrecto

28 / 124

FastQ

Calidad

La calidad de cada base secuenciada, en la escala Phred, se calcula de acuerdo la siguiente ecuación:

Q=10log10(p) Q = Calidad

p = Probabilidad de que el base call sea incorrecto

Valores de p cercanos a cero -> Alta calidad

28 / 124

FastQ

Calidad

29 / 124

FastQ

Calidad

30 / 124

FastQ

Calidad

  • Para evitar colocar los valores numéricos de la calidad en el archivo .fastq y saturarlo de información -> ASCII
30 / 124

FastQ

Calidad

  • Para evitar colocar los valores numéricos de la calidad en el archivo .fastq y saturarlo de información -> ASCII

  • Phred + 33 -> Plataformas de Illumina a partir de 1.8 (símbolos especiales + alfanuméricos)

30 / 124

FastQ

Calidad

  • Para evitar colocar los valores numéricos de la calidad en el archivo .fastq y saturarlo de información -> ASCII

  • Phred + 33 -> Plataformas de Illumina a partir de 1.8 (símbolos especiales + alfanuméricos)

  • Phred + 64 -> Plataformas de Illumina anteriores a 1.8

30 / 124

FastQ

32 / 124

5: Control de calidad de los datos

33 / 124

¿Porqué es importante revisar los datos crudos?

34 / 124

¿Porqué es importante revisar los datos crudos?

Para verificar la calidad de los datos (QC: quality control)

34 / 124

¿Porqué es importante revisar los datos crudos?

Para verificar la calidad de los datos (QC: quality control)

  • Los datos influencian los análisis posteriores
34 / 124

¿Porqué es importante revisar los datos crudos?

Para verificar la calidad de los datos (QC: quality control)

  • Los datos influencian los análisis posteriores

34 / 124

FastQC

Usaremos el programa de fastQC para checar la calidad de los datos.

35 / 124

FastQC

Usaremos el programa de fastQC para checar la calidad de los datos.

Podemos usar la interfaz gráfica o la línea de comandos, en este caso usaremos la línea de comandos.

35 / 124

Handson

36 / 124

Pasos para installar FastQC:

1- Descargar el programa de su página web fastQC

2- Hacer el archivo ejecutable

# chmod 755 /Applications/FastQC.app/Contents/MacOS/fastqc
ls -l /Applications/FastQC.app/Contents/MacOS/fastqc

3- Crear una liga simbolica para ejecutar fastqc desde cualquier ubicación

ln -s /Applications/FastQC.app/Contents/MacOS/fastqc /usr/local/bin/fastqc

4- Correr fastqc

##Imprimir el manual del programa usando el flag help
fastqc --help
37 / 124

Pasos para correr FastQC:

1- Checar los datos fastq

pwd
ls ../data/Archivos_fastq

2- Crear un directorio para guardar el output

mkdir ../output/QC

3- Correr FastQC

# la opción -o es para elegir el directorio de salida
fastqc ../data/Archivos_fastq/*.fastq.gz -o ../output/QC/

4- Checar los archivos generados

#Buscar los archivos generados por fastqc en el directorio de resultados
ls ../output/QC
38 / 124

Buena calidad

El eje x = longitud de la read, y = calidad (phred score)

Los datos a continuación muestran reads de buena calidad (Verde = buena, amarilla = aceptable, roja = baja).

39 / 124

Mala calidad

¿Hasta donde los datos son de buena calidad? ¿Estos datos los usarías?

40 / 124

Ejercicio

¿Cómo se ven nuestros datos?

41 / 124

MultiQC

MultiQC te permite juntar los output en un solo archivo y poder visualizarlos mejor.

*Esta parte es opcional, pero si trabajas con RNA-seq te puede intersar.

  1. La instalación se hace con conda, así que primero activamos un ambiente conda
conda activate base
pip install multiqc
  1. Correr MultiQC
cd ../output/.
multiQC .
  1. Checar el output.html
42 / 124

6: Alineamiento

43 / 124

44 / 124

Alineamiento

Buscar la región del genoma/transcriptoma a partir de la cual se originaron los reads

45 / 124

Alineamiento

  • Indexar genoma/transcriptoma (FASTA, GTF3/GFF3)
46 / 124

Alineamiento

  • Indexar genoma/transcriptoma (FASTA, GTF3/GFF3)
  • Alinear los reads (Fastq) al genoma/transcriptoma indexado Imágenes tomadas de aquí y aquí
46 / 124

Splice aware

  • TopHat 2
48 / 124

Splice aware

  • TopHat 2
  • HISAT
48 / 124

Splice aware

  • TopHat 2
  • HISAT
  • STAR

Imágenes tomadas de aqui

48 / 124

Alineamiento

Pseudo-alineadores

Pseudo-alineadores (quasi-alineadores):

  • Kallisto

  • Sailfish

  • Salmon

49 / 124

Alineamiento

Pseudo-alineadores

51 / 124

Alineamiento

Pseudo-alineadores

51 / 124

Alineamiento

Pseudo-alineadores

Near-optimal probabilistic RNA-seq quantification

52 / 124

Handson

53 / 124

Generar índice del transcriptoma

Para ello vamos a requerir:

  • Archivo Fasta del transcriptoma de referencia del humano.

Descargado del sitio de GeneCode

Lo pueden encontrar en el folder de Transcriptome/

  • Código para genear el índice
salmon index -t --genecode path_to_transcriptome.fa.gz -i path_to_save_index

-t: Ubicación al archivo Fasta del transcriptoma

-i: Ubicación para salvar el índice

--genecode: El Fasta del transcriptoma de referencia está en formato de GENECODE

54 / 124

Cuantificar la abundancia de los transcritos

Requerimientos:

  • Archivos Fastq de las lecturas -> Paired end R1 y R2

Ubicados en el folder de data

  • Índice generado en el paso anterior

  • Código para producir cuantificar los transcritos

salmon quant -i path_to_index
-l A -1 path_to_R1 -2 path_to_R2
-o path_to_store_results

-i: Ubicación del índice

-l: Tipo de librería

-1 y -2: Ubicación a las lecturas R1 y R2

-o: Ubicación para almacenar los resultados

##Crear un directorio para almacenar los datos de los conteos
mkdir -p ../salmon_quant
##Llamar salmon para realizar el conteo
salmon quant -i ../transcriptome/genecode.v37.salmon141 \
-l A \
-1 ../Data/s1_R1.fastq.gz -2 ../Data/s1_R2.fastq.gz \
-p 6 --validateMappings \
-o ../salmon_quant/s1_quant
55 / 124

7: Tximeta y Tximport

56 / 124

Recordatorio

¿Dónde estamos?

Imagen tomada de aquí

57 / 124

Recordatorio

¿Dónde estamos?

Imagen tomada de aquí

58 / 124

Importar datos

Utilizamos tximeta para importar los datos.

Nota: tximeta espera dos columnas:

  • files: con la rut a quant.sf

  • names: con los nombres de las muestras

60 / 124

Handson

61 / 124

Importar datos

Importamos la información de cada muestra

##Leemos los datos
coldata <- read.delim(here::here("output/salmon_quants/metadata.txt"))
##Generamos la columna "names"
coldata <- coldata %>% dplyr::rename(names = unique_id)
coldata
## Sample Cell Treatment Replicate names
## 1 s1 A Control 1 A_Control_1
## 2 s2 A Control 2 A_Control_2
## 3 s3 A Control 3 A_Control_3
## 4 s4 M Control 1 M_Control_1
## 5 s5 M Control 2 M_Control_2
## 6 s6 M Control 3 M_Control_3
## 7 s7 A Verafinib 1 A_Verafinib_1
## 8 s8 A Verafinib 2 A_Verafinib_2
## 9 s9 A Verafinib 3 A_Verafinib_3
## 10 s10 M Verafinib 1 M_Verafinib_1
## 11 s11 M Verafinib 2 M_Verafinib_2
## 12 s12 M Verafinib 3 M_Verafinib_3
##Ahora las cuentas generadas por `Salmon`, para ello
##Ubicamos el dir de trabajo
dir <- file.path(here::here("output/salmon_quants"))
##Verificar que estén los directorios
list.files(dir)
## [1] "Icon\r" "metadata.txt" "s1_quant" "s10_quant" "s11_quant"
## [6] "s12_quant" "s2_quant" "s3_quant" "s4_quant" "s5_quant"
## [11] "s6_quant" "s7_quant" "s8_quant" "s9_quant"
##¿¿Que hacemos aqui?? Verificar que el path se generó correctamente
#file.path(dir,paste0(info$Sample,"_quant"),"quant.sf")
coldata$files <- file.path(dir,paste0(coldata$Sample,"_quant"),"quant.sf")
##Corroboramos que los archivos existan
data.frame(coldata$Sample, file.exists(coldata$files))
## coldata.Sample file.exists.coldata.files.
## 1 s1 TRUE
## 2 s2 TRUE
## 3 s3 TRUE
## 4 s4 TRUE
## 5 s5 TRUE
## 6 s6 TRUE
## 7 s7 TRUE
## 8 s8 TRUE
## 9 s9 TRUE
## 10 s10 TRUE
## 11 s11 TRUE
## 12 s12 TRUE

Importar los datos usando tximeta

#BiocManager::install("tximeta")
library("tximeta")
se <- tximeta(coldata)
62 / 124

8: Objeto Summarized Experiment

63 / 124

64 / 124

Summarized Experiment

65 / 124

Summarized Experiment

66 / 124

Summarized Experiment

ColData

  • El cajón o slot correspondiente a ColData contiene la tabla de metadatos coldata creada para importar las cuentas con tximeta
  • Para acceder a ColData usar el siguiente comando:
colData(se)
## DataFrame with 12 rows and 6 columns
## Sample Cell Treatment Replicate names
## <character> <character> <character> <integer> <character>
## A_Control_1 s1 A Control 1 A_Control_1
## A_Control_2 s2 A Control 2 A_Control_2
## A_Control_3 s3 A Control 3 A_Control_3
## M_Control_1 s4 M Control 1 M_Control_1
## M_Control_2 s5 M Control 2 M_Control_2
## ... ... ... ... ... ...
## A_Verafinib_2 s8 A Verafinib 2 A_Verafinib_2
## A_Verafinib_3 s9 A Verafinib 3 A_Verafinib_3
## M_Verafinib_1 s10 M Verafinib 1 M_Verafinib_1
## M_Verafinib_2 s11 M Verafinib 2 M_Verafinib_2
## M_Verafinib_3 s12 M Verafinib 3 M_Verafinib_3
## Condition
## <factor>
## A_Control_1 Control
## A_Control_2 Control
## A_Control_3 Control
## M_Control_1 Control
## M_Control_2 Control
## ... ...
## A_Verafinib_2 Verafinib
## A_Verafinib_3 Verafinib
## M_Verafinib_1 Verafinib
## M_Verafinib_2 Verafinib
## M_Verafinib_3 Verafinib
67 / 124

Summarized Experiment

ColData

  • El slot ColData es un objeto con clase de DataFrame
    class(colData(se))
    ## [1] "DFrame"
    ## attr(,"package")
    ## [1] "S4Vectors"
68 / 124

Summarized Experiment

ColData

  • El slot ColData es un objeto con clase de DataFrame
    class(colData(se))
    ## [1] "DFrame"
    ## attr(,"package")
    ## [1] "S4Vectors"
  • Rownames de ColData corresponden a los Colnames en el slot Assay- Importante para análisis con DESeq2
    rownames(colData(se))
    ## [1] "A_Control_1" "A_Control_2" "A_Control_3" "M_Control_1"
    ## [5] "M_Control_2" "M_Control_3" "A_Verafinib_1" "A_Verafinib_2"
    ## [9] "A_Verafinib_3" "M_Verafinib_1" "M_Verafinib_2" "M_Verafinib_3"
68 / 124

Summarized experiment

69 / 124

Summarized experiment

rowRanges

  • El cajón de rowRanges hace referencia a las coordenadas de cada transcrito
  • Para acceder al rowRanges usar:
rowRanges(se)
## GRanges object with 172103 ranges and 6 metadata columns:
## seqnames ranges strand | tx_id
## <Rle> <IRanges> <Rle> | <character>
## ENST00000415118 14 22438547-22438554 + | ENST00000415118
## ENST00000434970 14 22439007-22439015 + | ENST00000434970
## ENST00000448914 14 22449113-22449125 + | ENST00000448914
## ENST00000604642 15 20003840-20003862 - | ENST00000604642
## ENST00000603326 15 20004797-20004815 - | ENST00000603326
## ... ... ... ... . ...
## ENST00000444456 1 247974741-247975653 + | ENST00000444456
## ENST00000416377 1 248003129-248004068 + | ENST00000416377
## ENST00000318104 1 248121932-248122882 + | ENST00000318104
## ENST00000606902 1 248498308-248498649 + | ENST00000606902
## ENST00000427827 1 248549444-248549762 - | ENST00000427827
## tx_biotype tx_cds_seq_start tx_cds_seq_end
## <character> <integer> <integer>
## ENST00000415118 TR_D_gene 22438547 22438554
## ENST00000434970 TR_D_gene 22439007 22439015
## ENST00000448914 TR_D_gene 22449113 22449125
## ENST00000604642 IG_D_gene 20003840 20003862
## ENST00000603326 IG_D_gene 20004797 20004815
## ... ... ... ...
## ENST00000444456 unprocessed_pseudogene <NA> <NA>
## ENST00000416377 unprocessed_pseudogene <NA> <NA>
## ENST00000318104 unprocessed_pseudogene <NA> <NA>
## ENST00000606902 unprocessed_pseudogene <NA> <NA>
## ENST00000427827 unprocessed_pseudogene <NA> <NA>
## gene_id tx_name
## <character> <character>
## ENST00000415118 ENSG00000223997 ENST00000415118
## ENST00000434970 ENSG00000237235 ENST00000434970
## ENST00000448914 ENSG00000228985 ENST00000448914
## ENST00000604642 ENSG00000270961 ENST00000604642
## ENST00000603326 ENSG00000271317 ENST00000603326
## ... ... ...
## ENST00000444456 ENSG00000237492 ENST00000444456
## ENST00000416377 ENSG00000232215 ENST00000416377
## ENST00000318104 ENSG00000177233 ENST00000318104
## ENST00000606902 ENSG00000271934 ENST00000606902
## ENST00000427827 ENSG00000227102 ENST00000427827
## -------
## seqinfo: 47 sequences from GRCh38 genome
70 / 124

Summarized experiment

71 / 124

Summarized experiment

Assay

  • El slot assay almacena la información de las cuentas para cada transcrito dividida en tres niveles:
assayNames(se)
## [1] "counts" "abundance" "length"
  • Para acceder a la matriz de cuentas estimadas por Salmon, correr:
head(assay(se), 5)
## A_Control_1 A_Control_2 A_Control_3 M_Control_1 M_Control_2
## ENST00000415118 0 0 0 0 0
## ENST00000434970 0 0 0 0 0
## ENST00000448914 0 0 0 0 0
## ENST00000604642 0 0 0 0 0
## ENST00000603326 0 0 0 0 0
## M_Control_3 A_Verafinib_1 A_Verafinib_2 A_Verafinib_3
## ENST00000415118 0 0 0 0
## ENST00000434970 0 0 0 0
## ENST00000448914 0 0 0 0
## ENST00000604642 0 0 0 0
## ENST00000603326 0 0 0 0
## M_Verafinib_1 M_Verafinib_2 M_Verafinib_3
## ENST00000415118 0 0 0
## ENST00000434970 0 0 0
## ENST00000448914 0 0 0
## ENST00000604642 0 0 0
## ENST00000603326 0 0 0
72 / 124

Summarized experiment

Assay

  • Las matriz de abundancia (TPM) puede obtenerse:
## Obtener matriz de TPM
head(se@assays@data$abundance, 5)
## A_Control_1 A_Control_2 A_Control_3 M_Control_1 M_Control_2
## ENST00000415118 0 0 0 0 0
## ENST00000434970 0 0 0 0 0
## ENST00000448914 0 0 0 0 0
## ENST00000604642 0 0 0 0 0
## ENST00000603326 0 0 0 0 0
## M_Control_3 A_Verafinib_1 A_Verafinib_2 A_Verafinib_3
## ENST00000415118 0 0 0 0
## ENST00000434970 0 0 0 0
## ENST00000448914 0 0 0 0
## ENST00000604642 0 0 0 0
## ENST00000603326 0 0 0 0
## M_Verafinib_1 M_Verafinib_2 M_Verafinib_3
## ENST00000415118 0 0 0
## ENST00000434970 0 0 0
## ENST00000448914 0 0 0
## ENST00000604642 0 0 0
## ENST00000603326 0 0 0
73 / 124

Summarized experiment

¿Recuerdan a qué tiene que ser igual Rownames del slot colData?

rownames(colData(se))
## [1] "A_Control_1" "A_Control_2" "A_Control_3" "M_Control_1"
## [5] "M_Control_2" "M_Control_3" "A_Verafinib_1" "A_Verafinib_2"
## [9] "A_Verafinib_3" "M_Verafinib_1" "M_Verafinib_2" "M_Verafinib_3"
colnames(assay(se))
## [1] "A_Control_1" "A_Control_2" "A_Control_3" "M_Control_1"
## [5] "M_Control_2" "M_Control_3" "A_Verafinib_1" "A_Verafinib_2"
## [9] "A_Verafinib_3" "M_Verafinib_1" "M_Verafinib_2" "M_Verafinib_3"
## Comprobar que rownames de colData es igual a colnames de assay
row.names(colData(se)) == colnames(assay(se))
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
74 / 124

9: Normalización de los datos

75 / 124

Normalización

Es el primer paso del análisis de expresión diferencial y es necesario para hacer comparaciones acertadas entre muestras.

76 / 124

Normalización

Es el primer paso del análisis de expresión diferencial y es necesario para hacer comparaciones acertadas entre muestras.

Las cuentas crudas están conformadas por un componente "interesante" (la expresión de RNA) y componentes "no interesantes" (como los batch effects, ruido de la plataforma, etc.).

76 / 124

Normalización

Es el primer paso del análisis de expresión diferencial y es necesario para hacer comparaciones acertadas entre muestras.

Las cuentas crudas están conformadas por un componente "interesante" (la expresión de RNA) y componentes "no interesantes" (como los batch effects, ruido de la plataforma, etc.).

La normalzación escala las cuentas para tratar de reducir los componentes "no interesantes" y poder comparar las muestras entre si.

76 / 124

Criteríos para normalizar

Se puede normalizar considerando:

  • La profundidad (tamaño de librería)

77 / 124

Criteríos para normalizar

Se puede normalizar considerando:

  • El tamaño del gen

78 / 124

Criteríos para normalizar

Se puede normalizar considerando:

  • Composición de RNA

Imagen tomada de aquí

79 / 124

Métodos comunes

Método de normalización Descripción Factores de evaluación Recomendaciones de uso
CPM (cuentas por millón): cuentas escalados por el número total de lecturas profundidad de secuenciación comparaciones de cuentas de genes entre réplicas del mismo grupo de muestras NO para comparaciones dentro de la muestra o análisis de DE.
TPM (transcritos por kilobase por millón de lecturas): cuentas por longitud de transcripción (kb) por millón de lecturas mapeadas profundidad de secuenciación y longitud de genes comparaciones de cuentas de genes dentro de una muestra o entre muestras del mismo grupo de muestras NO para análisis de DE.
RPKM/FPKM (lecturas/fragmentos por kilobase de exón por millón de lecturas/fragmentos mapeados similar a TPM, profundidad de secuenciación y longitud del gen comparaciones de cuentas entre genes dentro de una muestra NO para comparaciones entre muestras o análisis de DE.
Mediana de ratios de DESeq2 cuentas divididas por factores de tamaño específicos de la muestra determinados por la mediana del ratio de cuentas de genes en relación con la media geométrica por gen profundidad de secuenciación y composición del RNA comparaciones de cuentas de genes entre muestras y para el análisis de DE; NO para comparaciones dentro de la muestra
La media cortada de los valores M de EdgeR (TMM) utiliza una media recortada ponderada de los ratios de expresión logarítmica entre las muestras profundidad de secuenciación composición de RNA y longitud de los genes.
80 / 124

DESeq2

  • Normalización para análisis de expresión diferencial:

    • Factor de normalización de DESeq2
  • Normalización para visualización u otras aplicaciones:

    • Variance stabilizing transformation (VST)

    • Regularized-logarithm transformation (rlog)

81 / 124

DESeq2

DESeq2ajusta a un modelo lineal generalizado (GLM) de la familia binomial negativa (NB).

## # A tibble: 2 x 3
## gene muestraA muestraB
## <chr> <dbl> <dbl>
## 1 gene1 1749 943
## 2 gene2 35 29
  1. Crea una pseudo-referencia por muestra (promedio geometrico por fila) sqrt(muestraA * muestra B)
## # A tibble: 2 x 4
## # Rowwise:
## gene muestraA muestraB prom_geom
## <chr> <dbl> <dbl> <dbl>
## 1 gene1 1749 943 1284.
## 2 gene2 35 29 31.9
  1. Se calcula la fración muestra/pseudo-referencia
## # A tibble: 2 x 6
## # Rowwise:
## gene muestraA muestraB prom_geom muestraA_pseudo_ref muestraB_pseudo_ref
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 gene1 1749 943 1284. 1.36 0.734
## 2 gene2 35 29 31.9 1.10 0.910
  1. Se calcula un factor de normalización (size factor) utilizando la mediana por columnas.
## [1] 1.230235
## [1] 0.8222689
  1. Se dividen las cuentas crudas/size factor para calcular las cuentas normalizadas.
## # A tibble: 2 x 3
## # Rowwise:
## gene muestraA muestraB
## <chr> <dbl> <dbl>
## 1 gene1 1749 943
## 2 gene2 35 29
## # A tibble: 2 x 2
## # Rowwise:
## norm_muestraA norm_muestraB
## <dbl> <dbl>
## 1 1422. 1147.
## 2 28.4 35.3
82 / 124

Image

83 / 124

Ejercicio

Se pueden ocupar otras transformaciones en la paquetería de DESeq2 pero no son las mas recomendadas para DE.

Para normalizar, primero construimos el objeto DESeqDataSet, para ello necesitamos definir el modelo de DE (Quienes son Controles y quienes tratamiento).

# Importamos las librerías que necesitemos
library("DESeq2")
library("dplyr")
library("ggplot2")
library("vsn")
# Definir los grupos que se desean comparar
se$Condition <- factor(se$Condition)
# Checar cantidad de muestras
table(se$Condition)
# Generar el objeto de DESeq
dds <- DESeqDataSet(se, design = ~ Condition)
# Prefiltrado para quitar genes con cuentas bajas
keep <- rowSums(counts(dds)) >= 6
dds <- dds[keep, ]
# Funcion que normaliza los datos y realiza el analisis de expresión differencial
dds <- DESeq(dds)
84 / 124

Otras transformaciones

Puedes realizar otras transformaciones en DESeq2 para estabilizar la varianza a través de los differentes valores promedio de expresión.

# variance stabilizing transformation (VST), (Anders and Huber 2010)
vsd <- vst(dds, blind = FALSE)
head(assay(vsd), 3)
## A_Control_1 A_Control_2 A_Control_3 M_Control_1 M_Control_2
## ENST00000641506 5.243738 5.022432 5.236241 5.121340 5.055195
## ENST00000611116 5.058149 5.063223 4.758866 4.737813 4.871766
## ENST00000390289 4.900795 5.154803 5.002771 4.909267 4.423150
## M_Control_3 A_Verafinib_1 A_Verafinib_2 A_Verafinib_3
## ENST00000641506 5.176386 5.508017 5.293662 5.474252
## ENST00000611116 5.289621 4.874653 4.423150 4.423150
## ENST00000390289 5.040044 5.058810 4.423150 5.039269
## M_Verafinib_1 M_Verafinib_2 M_Verafinib_3
## ENST00000641506 5.716058 5.895262 5.482647
## ENST00000611116 5.185938 5.045729 5.180529
## ENST00000390289 5.571450 5.182835 5.294481
# regularized-logarithm transformation (rlog), (Love, Huber, and Anders 2014)
rld <- rlog(dds, blind = FALSE)
head(assay(rld), 3)
## A_Control_1 A_Control_2 A_Control_3 M_Control_1 M_Control_2
## ENST00000641506 2.905283 2.239445 2.8848975 2.5548691 2.4040501
## ENST00000611116 1.829812 1.846142 0.6284644 0.5186003 1.1642110
## ENST00000390289 1.416904 2.289820 1.8015912 1.4496085 0.1791245
## M_Control_3 A_Verafinib_1 A_Verafinib_2 A_Verafinib_3
## ENST00000641506 2.739348 3.526028 3.03947595 3.45477910
## ENST00000611116 2.444677 1.174766 -0.05979834 -0.07010645
## ENST00000390289 1.918379 1.975739 0.15929486 1.91598057
## M_Verafinib_1 M_Verafinib_2 M_Verafinib_3
## ENST00000641506 3.938412 4.256634 3.472666
## ENST00000611116 2.166800 1.752071 2.152501
## ENST00000390289 3.267274 2.339360 2.635467
# Normalización con el factor de normalizacion
dds <- estimateSizeFactors(dds)
## using 'avgTxLength' from assays(dds), correcting for library size
# Juntar los datos de las tres normalizaciones
df <- bind_rows(
as_data_frame(log2(counts(dds, normalized=TRUE)[, 1:2]+1)) %>%
mutate(transformation = "log2(x + 1)"),
as_data_frame(assay(vsd)[, 1:2]) %>% mutate(transformation = "vst"),
as_data_frame(assay(rld)[, 1:2]) %>% mutate(transformation = "rlog"))
## Warning: `as_data_frame()` was deprecated in tibble 2.0.0.
## Please use `as_tibble()` instead.
## The signature and semantics have changed, see `?as_tibble`.
# Renombrar columnas
colnames(df)[1:2] <- c("x", "y")
# Nombre de las graficas
lvls <- c("log2(x + 1)", "vst", "rlog")
# Agrupar los tres tipos de normalizacion en grupos como factores
df$transformation <- factor(df$transformation, levels=lvls)
# Plotear los datos
ggplot(df, aes(x = x, y = y)) + geom_hex(bins = 80) +
coord_fixed() + facet_grid( . ~ transformation)

85 / 124

10: Exploración de los datos

86 / 124

87 / 124

Exploración de datos

¿Por qué es importante explorar los datos?

88 / 124

Exploración de datos

¿Por qué es importante explorar los datos?

  • Paso previo al análisis de expresión diferencial
88 / 124

Exploración de datos

¿Por qué es importante explorar los datos?

  • Paso previo al análisis de expresión diferencial

  • Análisis de calidad de los datos

88 / 124

Exploración de datos

¿Por qué es importante explorar los datos?

  • Paso previo al análisis de expresión diferencial

  • Análisis de calidad de los datos

  • Permite conocer la congurencian entre individuos o réplicas

88 / 124

Exploración de datos

¿Por qué es importante explorar los datos?

  • Paso previo al análisis de expresión diferencial

  • Análisis de calidad de los datos

  • Permite conocer la congurencian entre individuos o réplicas

  • Mediante gráficos, visualizar comportamiento de los datos -> Outliers

88 / 124

Exploración de datos

89 / 124

Exploración de datos

89 / 124

Exploración de datos

PCA

Heatmap

90 / 124

PCA

91 / 124

PCA

  • Análisis de componentes principales
91 / 124

PCA

  • Análisis de componentes principales

  • Método algebraico para reducir la dimensionalidad de sets de datos complejos (múltiples variables)

91 / 124

PCA

  • Análisis de componentes principales

  • Método algebraico para reducir la dimensionalidad de sets de datos complejos (múltiples variables)

  • Reducción de dimensionalidad o variables permite un análisis exploratorio más intuitivo

91 / 124

PCA

  • Análisis de componentes principales

  • Método algebraico para reducir la dimensionalidad de sets de datos complejos (múltiples variables)

  • Reducción de dimensionalidad o variables permite un análisis exploratorio más intuitivo

Reducción de variables implica preservar y captar la mayor información sobre los datos

91 / 124

PCA

Normalización de los datos

92 / 124

PCA

Normalización de los datos

Escalación de los datos -> Normalización para hacerlos más comparables

92 / 124

PCA

Normalización de los datos

Escalación de los datos -> Normalización para hacerlos más comparables

Busqueda de correlación entre las variables -> correlación positiva o negativa

92 / 124

PCA

PCA

93 / 124

PCA

PCA

Los componentes principales son los nuevos ejes que maximizan la distancia de los datos al origen

93 / 124

PCA

Componentes principales

94 / 124

PCA

Componentes principales

  • El primer componente es aquel en el que los datos presentan la mayor separación (variación)
94 / 124

PCA

Componentes principales

  • El primer componente es aquel en el que los datos presentan la mayor separación (variación)

  • El segundo componente es el que tiene la segunda mayor separación entre los datos y es perpendicular al primer componente

94 / 124

PCA

Componentes principales

  • El primer componente es aquel en el que los datos presentan la mayor separación (variación)

  • El segundo componente es el que tiene la segunda mayor separación entre los datos y es perpendicular al primer componente

  • ¿Cuantos componentes existen? -> tantas variables en el set de datos

94 / 124

PCA

Componentes principales

  • Cada componente principal tiene asociado un eigenvector (vector unitario) y un eigenvalue (cantidad escalar)
95 / 124

PCA

Componentes principales

  • Cada componente principal tiene asociado un eigenvector (vector unitario) y un eigenvalue (cantidad escalar)

  • Los eigenvalues son la suma del cuadrado de las distancias de los puntos proyectados sobre dicho componente principal

95 / 124

PCA

Componentes principales

  • Cada componente principal tiene asociado un eigenvector (vector unitario) y un eigenvalue (cantidad escalar)

  • Los eigenvalues son la suma del cuadrado de las distancias de los puntos proyectados sobre dicho componente principal

  • Los eigenvalues permiten seleccionar cuál es el componente principal que explica la mayor variación en los datos

95 / 124

PCA

Screeplot

96 / 124

PCA

  • En sets de datos de RNAseq, el PCA permite visualizar la distancia o congruencia de los datos
97 / 124

PCA

  • En sets de datos de RNAseq, el PCA permite visualizar la distancia o congruencia de los datos

  • Generalmente son gráficas de puntos (muestras) en dos dimensiones (dos componentes) que resumen las principales fuentes de varianza

97 / 124

PCA

  • En sets de datos de RNAseq, el PCA permite visualizar la distancia o congruencia de los datos

  • Generalmente son gráficas de puntos (muestras) en dos dimensiones (dos componentes) que resumen las principales fuentes de varianza

97 / 124

¿Cómo crear nuestro propio PCA?

Primero instalen las siguientes librerías:

library(DESeq2)
library(PCAtools)

Usemos la siguiente normalización logarítmica de las cuentas (toma en cuenta el tamaño de la librería)

## Transformación recomendada para sets de con menos de 30 muestras
rld <- rlog(dds, blind = F)

Si tuvieramos un número mayor de muestras (n > 30) entonces conviene:

vsd <- vst(dds, blind = T)
98 / 124

PCA

  • Usemos la función interna de DESeq2 para graficar nuestro PCA:
## El argumento intgroup permite especificar mediante cuál variable colorear los datos
plotPCA(rld, intgroup = "Treatment")

DESeq2 evalúa los 500 genes con mayor varianza del set de datos

  • Con la librería de PCAtools:
## Crear un objeto que contenga los datos del PCA
PCA <- pca(assay(rld), scale = T, metadata = colData(rld))
## Graficar en 2D los resultados
biplot(PCA, colby = "Treatment")
## Generar un screeplot para visualizar la varianza asociada a cada componente
screeplot(PCA)
99 / 124

Image

100 / 124

PCA

¿Cómo ven los resultados?

101 / 124

PCA

¿Cómo ven los resultados?

DESeq2

101 / 124

PCA

¿Cómo ven los resultados?

DESeq2

PCA tools

101 / 124

PCA

¿Cuánta varianza es explicada por cada componente?

102 / 124

PCA y MDS

Generemos un MDS plot interactivo con los datos. Para ello usemos la librería de Glimma y la función de GlimmaMDS

glimmaMDS(dds)
103 / 124

13: Análisis de expresión diferencial

104 / 124

Análisis de expresión diferencial (DE)

Paso para obtener cuáles son los genes que varían entre las condiciones

105 / 124

Pasos en el DE

106 / 124

Dispersión

La dispersión es una medida de la variabilidad de los datos como (varianza, sd, etc.). En DESeq2 se utiliza α:

α1/mean αvariance

Así que La dispersión es mayor para cuentas más bajas y menor para cuenas más altas.

Y la dispersión refleja la varianza.

DESeq2 asume que los genes con similar expresión tienen similar dispersión

107 / 124

Ajustando la dispersión

108 / 124

Reduciendo la dispersión

109 / 124

Image

110 / 124

Ejercicio

La librería de DESeq2 normaliza y realiza el análisis de expresión diferencial en una sola función. Así que ya realizamos el análisis, vamos a verlo:

library("DESeq2")
library("dplyr")
library("ggplot2")

Para ver los resultados podemos usar la función results

# Obtener los resultados del DE
res <- results(dds)
res
## log2 fold change (MLE): Condition Verafinib vs Control
## Wald test p-value: Condition Verafinib vs Control
## DataFrame with 35483 rows and 6 columns
## baseMean log2FoldChange lfcSE stat pvalue
## <numeric> <numeric> <numeric> <numeric> <numeric>
## ENST00000641506 10.05792 1.3610503 0.360096 3.7796900 1.57024e-04
## ENST00000611116 3.26143 -0.0421221 0.808389 -0.0521062 9.58444e-01
## ENST00000390289 4.55373 0.9128357 0.601744 1.5169831 1.29271e-01
## ENST00000361390 3379.18027 2.1135181 0.379169 5.5740792 2.48843e-08
## ENST00000361453 6522.68449 1.5906491 0.385459 4.1266327 3.68114e-05
## ... ... ... ... ... ...
## ENST00000622095 7.43638 0.769911 0.620186 1.241418 2.14451e-01
## ENST00000605551 40.04273 -0.846855 0.397376 -2.131115 3.30797e-02
## ENST00000579209 9.61591 1.597767 0.386827 4.130447 3.62059e-05
## ENST00000500626 3.46026 0.798818 0.733797 1.088610 2.76326e-01
## ENST00000314835 17.48904 0.166453 0.674825 0.246661 8.05171e-01
## padj
## <numeric>
## ENST00000641506 1.62737e-03
## ENST00000611116 9.82689e-01
## ENST00000390289 3.24642e-01
## ENST00000361390 7.31775e-07
## ENST00000361453 4.68935e-04
## ... ...
## ENST00000622095 0.451633725
## ENST00000605551 0.124474321
## ENST00000579209 0.000463051
## ENST00000500626 0.525737614
## ENST00000314835 0.915847174
summary(res)
##
## out of 35483 with nonzero total read count
## adjusted p-value < 0.1
## LFC > 0 (up) : 4420, 12%
## LFC < 0 (down) : 4315, 12%
## outliers [1] : 18, 0.051%
## low counts [2] : 0, 0%
## (mean count < 1)
## [1] see 'cooksCutoff' argument of ?results
## [2] see 'independentFiltering' argument of ?results

Para ver que hay en cada columna:

mcols(res, use.names = TRUE)
## DataFrame with 6 rows and 2 columns
## type description
## <character> <character>
## baseMean intermediate mean of normalized c..
## log2FoldChange results log2 fold change (ML..
## lfcSE results standard error: Cond..
## stat results Wald statistic: Cond..
## pvalue results Wald test p-value: C..
## padj results BH adjusted p-values

Podemos hacer cortes:

resLFC1 <- results(dds, lfcThreshold=1)
table(resLFC1$padj < 0.1)
##
## FALSE TRUE
## 34309 1156
111 / 124

14: Visualización de los resultados

112 / 124

¿Cuántos tipos de gráficos conoces para visualizar resultados del análisis DE?

113 / 124

¿Cuántos tipos de gráficos conoces para visualizar resultados del análisis DE?

MAplot

Volcano plot

114 / 124

MAplot

Gráfico que representa la distribución de los genes o transcritos en las comparaciones de interés

M eje y de minus:

logTxlogCT=logTx/CT

A eje x de average -> Promedio de las cuentas normalizadas para cada gen en todas las muestras

Para generar el MAplot usemos el siguiente comando:

##Es importante que recuerden que la hipótesis nula que se probó fue
##"El lfc del gen n es igual a 0" por lo tanto los genes coloreados son...
plotMA(res)
115 / 124

MAplot

116 / 124

MAplot

Para tener una mejor estimación del LFC de genes que:

  • Son poco abundantes

  • Tienen alta dispersión

Usemos la función lfcShrink de la librería apeglm

##En el argumento coef indicar el contraste entre los grupos experimentales
res_lfc <- lfcShrink(dds, coef = "Treatment_Verafinib_vs_Control", type = "apeglm")
##Si desconocemos el nombre del contraste, usar:
resultsNames(dds)
117 / 124

MAplot

Sin lfcshrink

Con lfcshrink

118 / 124

MAplot

También pueden generar un MAplot interactivo con la librería de Glimma

##Para los objetos creados con DESeq2 es importante que incluyas un nivel llamado group
group <- info$Treatment
dds$group <- group
glimmaMA(dds)
119 / 124

Volcano plot

De manera similar al MAplot con el volcano plot visualizamos los genes que muestran expresión diferencial en nuestra condición de interés

  • En el eje y se grafica el -log10 de padj

  • En el eje x se grafica el lfc o log2foldchange

##Para crear un volcano plot necesitas convertir los resultados de DESeq a un data frame
DEG <- as.data.frame(res)
##En el script de funciones encontrarás la función de volcanoplotR para generar tu gráfico
#los valores de los argumentos logfc y p.adj deben ser iguales al threshold utilizado para generar los resultados
#en type debes indicar que los resultados provienen de DESeq
volcanoplotR(DEG, logfc = 0, p.adj = 0.1, type = "DESeq")
120 / 124

Volcano plot

121 / 124

Heatmap

El heatmap nos permite visualizar la expresión de los genes diferencialmente expresados en terminos de las cuentas normalizadas

Consideraciones:

  • Usar los valores de las cuentas normalizadas para una mejor comparación entre muestras

  • Escalar los valores de las cuentas (renglones) para visualizar las diferencias en la expresión

Usaremos la librería de pheatmap

122 / 124

Heatmap

##Guardar la lista de transcritos que mostraron expresión diferencial significativa
significant <- DEG %>% filter(log2FoldChange > 0 & padj < 0.1 |
log2FoldChange < 0 & padj < 0.1)
##Generar la matriz de cuentas normalizadas
norm_counts <- counts(dds, normalized = T)
##Cortar la matriz de cuentas normalizadas con los id de los transcritos diferencialmente expresados
norm_counts <- norm_counts[rownames(significant), ]
##Generar una tabla de anotaciones preservando el tratamiento y el tipo de células
annotation_col <- coldata[, c(2, 3)]
##Generar el heatmap empleando clustering jerarquico
pheatmap(norm_counts,
border_color = NA,
scale = "row",
clustering_distance_rows = "euclidean",
clustering_distance_cols = "euclidean",
clustering_method = "average",
show_colnames = F,
show_rownames = F,
annotation_col = annotation_col)
123 / 124

Heatmap

124 / 124

Agradecimientos

2 / 124
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow