Demo: Analisi RNA-Seq con AI

Pipeline di Prompt per Copilot/ChatGPT

Introduzione al Demo

Questa guida vi accompagna attraverso un’analisi RNA-seq completa usando l’AI come “pair programmer”.

Dataset: Airway - Trattamento con desametasone (4 campioni paired-end)

Workflow:

  1. 🔍 QC e Trimming (fastp)
  2. 🧬 Quantificazione (Salmon)
  3. 📊 QC della matrice (in R)
  4. 🔬 Analisi Esplorativa (PCA, correlazione)
  5. 📈 Analisi Differenziale (DESeq2)
  6. 🎨 Visualizzazione

Demo Data

File disponibili in data/:

Cartella Contenuto
fastq_SUBSET/ 4 campioni paired-end (airway)
trascriptome_TINY/ GENCODE v43 (subset) + indice Salmon

Campioni: SRR1039508 (control), SRR1039509 (treatment), SRR1039512 (control), SRR1039513 (treatment)

Setup: VS Code e GitHub Copilot

Step -1: Installare VS Code

Visual Studio Code è l’editor gratuito di Microsoft in cui eseguiremo il demo.

Download: code.visualstudio.com

macOS

  1. Scarica il file .zip per Apple Silicon o Intel
  2. Estrai e trascina Visual Studio Code nella cartella Applicazioni
  3. Al primo avvio: tasto destro → Apri (per bypassare Gatekeeper)

Windows

  1. Scarica il file .exe (User Installer)
  2. Esegui il setup e segui la procedura guidata
  3. Opzione consigliata: spunta “Aggiungi al PATH” durante l’installazione

Verifica installazione

Apri VS Code: dovresti vedere la schermata di benvenuto Welcome.

Step -2: Creare un Account GitHub

GitHub è necessario per attivare GitHub Copilot (gratuito per studenti e privati).

  1. Vai su github.com → clicca Sign up
  2. Inserisci email, password e username
  3. Verifica l’email ricevuta
  4. Completa il setup del profilo

Piano gratuito (Copilot Free)

Dal 2025 GitHub offre Copilot Free per tutti gli account personali: - 2.000 completamenti di codice / mese - 50 messaggi in chat / mese - Nessuna carta di credito richiesta

Sei studente universitario?

Richiedi GitHub Education (gratuito) su education.github.com per avere Copilot Pro senza limiti.

Step -3: Installare l’Estensione GitHub Copilot

Con VS Code aperto:

  1. Clicca sull’icona Estensioni nella barra laterale sinistra (Ctrl+Shift+X / ⌘+Shift+X)
  2. Cerca “GitHub Copilot”
  3. Installa l’estensione di GitHub (include automaticamente Copilot Chat)
  4. Riavvia VS Code se richiesto

Login a GitHub

Dopo l’installazione, VS Code mostra in basso a sinistra un’icona account. Clicca → Sign in with GitHub → segui il browser.

Verifica attivazione

In basso a destra nella barra di stato compare l’icona di Copilot (due cerchi). Se è attiva, il colore è bianco/blu — non grigio.

Step -4: Aprire la Copilot Chat

Aprire la chat

  • Clicca sull’icona Copilot Chat nella barra laterale sinistra (fumetto con stellina)
  • Oppure usa la scorciatoia Ctrl+Alt+I (Windows) / ⌃⌘I (macOS)

Testare che funzioni

Scrivi nella chat:

Cosa è DESeq2 e per cosa si usa?

Se Copilot risponde → tutto pronto! ✅

Dove incollare i prompt di questo corso

Durante il demo, ogni slide mostra un riquadro blu “Copia questo prompt”.

  1. Copia il testo del prompt
  2. Incollalo nella Copilot Chat di VS Code
  3. Premi Invio e attendi la risposta
  4. Copia il codice generato nel tuo script R / nel terminale

Alternative a VS Code

I prompt funzionano anche su ChatGPT, Claude o Gemini — ma VS Code con Copilot permette di eseguire il codice direttamente nell’editor.

Setup: Dev Container

Perché il Dev Container?

I prompt di questo corso funzionano all’interno di un Dev Container: un ambiente pre-configurato che gira in Docker.

Vantaggi

  • ✅ Tutti i tool già installati: salmon, fastp, R, DESeq2
  • ✅ Stesso ambiente per tutti: niente “sul mio PC funziona”
  • ✅ Nessuna installazione manuale di dipendenze
  • ✅ Si azzera e riparte facilmente

Cosa include il container

  • Bioinformatica: salmon, fastp, multiqc, fastqc
  • R + Bioconductor: DESeq2, tximport, ComplexHeatmap
  • Quarto (per il materiale del corso)
  • GitHub Copilot (attivato separatamente)

Prerequisiti di sistema

Servono almeno 10 GB liberi su disco e una buona connessione Internet per il primo download (~3 GB).

Step A: Installare Docker Desktop

Docker è il motore che esegue il container.

macOS

  1. Scarica Docker Desktop per Mac
    • Scegli: Intel Chip oppure Apple Silicon (M1/M2/M3)
  2. Apri il .dmg → trascina Docker nelle Applicazioni
  3. Avvia Docker Desktop → segui la procedura guidata
  4. Attendi che l’icona nella menu bar mostri “Docker is running”

Windows

  1. Scarica Docker Desktop per Windows
    • ⚠️ WSL2 deve essere abilitato (Docker lo chiede durante l’installazione)
    • Se manca: apri PowerShell come Amministratore → wsl --install → riavvia
  2. Esegui il .exe → segui la procedura guidata
  3. Riavvia il PC se richiesto
  4. Avvia Docker Desktop → attendi “Docker is running”

Step B: Installare l’Estensione Dev Containers

Con VS Code aperto:

  1. Clicca sull’icona Estensioni nella barra laterale sinistra (Ctrl+Shift+X / ⌘+Shift+X)
  2. Cerca “Dev Containers”
  3. Installa l’estensione di Microsoft
  4. Nessun riavvio necessario

Verifica installazione

Premi Ctrl+Shift+P (Windows) o Cmd+Shift+P (Mac) e cerca “Dev Containers” — dovresti vedere le opzioni disponibili, tra cui “Reopen in Container”.

Nota

L’estensione Dev Containers è separata da GitHub Copilot. Entrambe sono necessarie per questo corso.

Step C: Scaricare il Materiale del Corso

Apri un terminale e clona il repository:

git clone https://github.com/Revelo-RNASeq/2025_RNASeq.git
cd 2025_RNASeq
code .

Alternativa senza git

Se non hai git installato, scarica lo ZIP dalla pagina GitHub del corso: Code → Download ZIP → estrai la cartella → aprila in VS Code con File → Open Folder

Step D: Aprire nel Container

Metodo 1 — Popup automatico

VS Code mostra in basso a destra:

“Reopen in Container” → clicca

Metodo 2 — Command Palette

  1. Ctrl+Shift+P (Windows) / Cmd+Shift+P (Mac)
  2. Cerca: “Dev Containers: Reopen in Container”
  3. Premi Invio

Prima apertura

  • Download image: ~3–5 minuti (~3 GB)
  • VS Code si riapre all’interno del container
  • Il terminale mostra un prompt diverso → sei nel container!

Aperture successive

  • Avvio in ~30 secondi
  • I file del corso sono persistenti

Step E: Verifica Installazione

Apri il terminale in VS Code (Ctrl+` / ⌃`) ed esegui:

# Verifica strumenti bioinformatici
salmon --version
fastqc --version
multiqc --version
quarto --version

# Verifica R e pacchetti Bioconductor
R -e "library(DESeq2); library(tximport); cat('✅ OK\n')"

Tutto pronto!

Se vedi le versioni senza errori, l’ambiente è configurato correttamente. Ora puoi proseguire con l’attivazione di GitHub Copilot.

Problemi Comuni

Problema Soluzione
Docker non parte Verifica che Docker Desktop sia in esecuzione (icona nella menu bar / system tray)
“Cannot connect to Docker daemon” Apri Docker Desktop, attendi “Docker is running”, riprova
Errore WSL2 (Windows) Apri PowerShell come Admin → wsl --install → riavvia
Spazio insufficiente Libera almeno 10 GB su disco
Download lento Normale la prima volta (~3 GB) — se interrotto, VS Code riprende automaticamente

Step 0: QC e Trimming

Prompt 0a: QC con fastp

Copia questo prompt in Copilot Chat

Ho file FASTQ paired-end da un esperimento RNA-seq Illumina nella cartella data/fastq_SUBSET/:
- SRR1039508_pass_1_SUBSET.fastq (forward reads)
- SRR1039508_pass_2_SUBSET.fastq (reverse reads)

Esegui il quality control e il trimming degli adattatori.
Voglio:
1. Rimuovere le basi di bassa qualità (Phred < 20)
2. Rimuovere automaticamente gli adattatori Illumina
3. Scartare i reads troppo corti dopo il trimming (< 36 bp)
4. Generare un report HTML per visualizzare i risultati
5. Salvare gli output in una cartella 'results/fastp/'

Genera il comando da eseguire nel terminale e spiega cosa fa ogni parametro.

💡 L’AI genererà il comando fastp appropriato

Prompt 0a-bis: Batch Processing

Copia questo prompt in Copilot Chat

Ho 4 campioni paired-end nella cartella data/fastq_SUBSET/:
- SRR1039508, SRR1039509, SRR1039512, SRR1039513
- Ogni campione ha _pass_1_SUBSET.fastq e _pass_2_SUBSET.fastq

Esegui fastp per tutti i 4 campioni in batch.
Per ogni campione:
1. Applica lo stesso filtraggio (Phred < 20, lunghezza min 36 bp)
2. Rimuovi adattatori automaticamente
3. Genera report HTML e JSON individuali
4. Salva output in results/fastp/{sample}_*

Genera uno script bash che processi tutti i campioni in loop.

Prompt 0b: Aggregare con MultiQC

Copia questo prompt in Copilot Chat

Ho eseguito fastp su 4 campioni e ogni campione ha generato:
- report HTML individuale
- report JSON in results/fastp/

Aggrega tutti i report fastp in un unico report MultiQC.
Voglio:
1. Creare un report combinato che mostri tutti i campioni insieme
2. Confrontare le statistiche QC tra i campioni
3. Identificare eventuali outliers
4. Salvare il report MultiQC in results/multiqc/

Genera il comando MultiQC e spiega:
- Come MultiQC trova automaticamente i file fastp?
- Quali metriche posso confrontare tra i campioni?

💡 Perché MultiQC?: Dashboard unica per confrontare tutti i campioni

Prompt 0c: Interpretazione MultiQC

Copia questo prompt in Copilot Chat

Ho eseguito MultiQC sui risultati fastp dei miei 4 campioni RNA-seq.
Ecco il report generato:

[INCOLLA QUI SCREENSHOT O STATISTICHE CHIAVE DAL REPORT MULTIQC]

Spiegami:
1. La qualità complessiva di tutti i miei campioni è buona?
2. Ci sono campioni con qualità significativamente diversa dagli altri?
3. Quali sono i 3 segnali di allarme (red flags) che dovrei cercare?
4. Tutti i campioni possono procedere all'allineamento o qualcuno va escluso?

Focalizzati su:
- Confronto Phred score tra campioni
- Contenuto di adattatori (% rimossa)
- Duplicazione e library size dopo trimming
- Identificazione di outliers

Concetto chiave: GIGO - Garbage In, Garbage Out

Step 0bis: Quantificazione Salmon

Prompt 0d: Creare l’indice Salmon (demo)

Copia questo prompt in Copilot Chat

Ho un file FASTA compresso con le sequenze dei trascritti:
- data/trascriptome_TINY/gencode.v43.transcripts_TINY.fa.gz

Voglio creare un indice Salmon da questo file per capire il processo.
Crea l'indice in 'data/trascriptome_TINY/my_salmon_index/'

Genera il comando Salmon appropriato e spiega:
1. Cos'è un indice e perché è necessario per la quantificazione?
2. Quanto tempo ci vuole tipicamente (per questo subset vs un genoma completo)?
3. L'indice può essere riutilizzato per altri esperimenti con lo stesso organismo?
4. Quali sono i parametri chiave del comando (es. -k per k-mer size)?

NOTA: Posso poi usare l'indice già pronto in gencode.v43_TINY.salmon/ per risparmiare tempo.

💡 Demo didattico: Questo step è educativo - mostra come si crea, ma poi useremo l’indice pre-costruito.

Prompt 0e: Quantificare con Salmon

Copia questo prompt in Copilot Chat

Ho file FASTQ paired-end (dopo QC con fastp):
- results/fastp/SRR1039508_pass_1_trimmed.fastq
- results/fastp/SRR1039508_pass_2_trimmed.fastq

E un indice Salmon pre-costruito:
- data/trascriptome_TINY/gencode.v43_TINY.salmon/

Quantifica l'espressione genica con Salmon.
Salva i risultati in 'results/salmon/SRR1039508/'

Genera il comando e spiega:
- Cosa sono i TPM e i counts che Salmon produce?
- Come si interpretano i file output (quant.sf)?

📊 Output: File quant.sf con TPM e counts per trascritto

Prompt 0f: Batch Quantification

Copia questo prompt in Copilot Chat

Ho 4 campioni paired-end da quantificare con Salmon:
- SRR1039508, SRR1039509, SRR1039512, SRR1039513

I file trimmed sono in results/fastp/ con pattern:
- {sample}_pass_1_trimmed.fastq e {sample}_pass_2_trimmed.fastq

L'indice Salmon è in: data/trascriptome_TINY/gencode.v43_TINY.salmon/

Genera uno script bash che:
1. Crei la cartella results/salmon/
2. Esegua Salmon quant per ogni campione
3. Salvi ogni output in results/salmon/{sample}/

Spiega come verificare che tutti i campioni sono stati processati correttamente.

Prompt 0g: Importare in R (tximport)

Copia questo prompt in Copilot Chat

Ho i risultati di Salmon per 4 campioni in:
- results/salmon/SRR1039508/quant.sf
- results/salmon/SRR1039509/quant.sf
- results/salmon/SRR1039512/quant.sf
- results/salmon/SRR1039513/quant.sf

Ho bisogno di una corrispondenza trascritto → gene (tx2gene).

Importa i risultati in R con tximport e:
1. Se non ho un file tx2gene, crealo dai nomi dei trascritti GENCODE (ENST → ENSG)
2. Aggrega i counts a livello di gene
3. Salva la matrice di conteggi come 'data/counts_matrix.csv'
4. Crea anche il file 'data/sample_metadata.csv' con le condizioni

Spiega:
- Perché aggregare a livello di gene invece che trascritto?
- Cosa fa tximport diversamente da un semplice merge?

Step 1: Setup e Caricamento Dati

Il Dataset Airway

Esperimento: Trattamento di cellule muscolari lisce delle vie aeree con desametasone (glucocorticoide)

Disegno sperimentale

  • 4 linee cellulari: N61311, N052611, N080611, N061011
  • 2 condizioni per linea: untrt (controllo) e trt (trattato)
  • 8 campioni totali (SRR1039508–SRR1039521)
  • Design multi-fattoriale: ~ cell + dex

Perché questo design?

Controllare l’effetto della linea cellulare (confondente) per isolare l’effetto del farmaco

Accesso ai dati

Il dataset è distribuito come pacchetto Bioconductor e include:

  • Matrice di conteggi: 63.677 geni × 8 campioni
  • Metadati: condizione, linea cellulare, informazioni sull’allineamento
  • Formato: RangedSummarizedExperiment
library("airway")
data("airway")
se <- airway

Nessun CSV necessario

A differenza dei workflow con file flat, il dataset airway è già integrato con le annotazioni genomiche nel formato SummarizedExperiment, pronto per DESeq2.

Prompt 1.1: Setup Ambiente + Caricamento

Copia questo prompt in Copilot Chat

Sto iniziando un'analisi RNA-seq con il dataset airway di Bioconductor.
Ho bisogno di:
1. Caricare le librerie: DESeq2, airway, ggplot2, pheatmap, RColorBrewer
2. Caricare il dataset airway come SummarizedExperiment
3. Esplorare la struttura: dimensioni, metadati dei campioni (colData), 
   nomi delle variabili disponibili
4. Mostrare le prime righe della matrice di conteggi (assay)
5. Creare una cartella 'results/' per i file di output

Al termine spiega:
- Cosa contiene un oggetto SummarizedExperiment rispetto a un semplice CSV?
- Quali variabili nel colData useremo per il disegno sperimentale?

Cosa verificare:

  • dim(se)[1] 63677 8
  • colData(se)$dex → 4 untrt, 4 trt
  • colData(se)$cell → 4 linee cellulari diverse

Prompt 1.2: Creare il DESeqDataSet

Copia questo prompt in Copilot Chat

Ho un oggetto SummarizedExperiment chiamato 'se' (dataset airway).
Voglio creare un DESeqDataSet per l'analisi differenziale con DESeq2.

Esegui questi passi:
1. Crea il DESeqDataSet con design formula: ~ cell + dex
2. Imposta 'untrt' como livello di riferimento per la variabile 'dex'
3. Mostra il summary dell'oggetto dds risultante
4. Salva un checkpoint: saveRDS(dds, "results/dds_raw.rds")
   (per ricaricare in future sessioni: dds <- readRDS("results/dds_raw.rds"))

Spiega in dettaglio la scelta della formula ~ cell + dex:
- Perché includere 'cell' nel modello?
- Cosa succederebbe se usassimo solo ~ dex?
- Cosa significa 'livello di riferimento' e perché è importante?
- Come DESeq2 usa internamente la design matrix?

Concetto chiave: Design multi-fattoriale → controlliamo la variabilità tra linee cellulari per aumentare la potenza statistica nel rilevare l’effetto del desametasone

Output Atteso - Step 1

> dim(se)
[1] 63677     8

> colData(se)[, c("cell", "dex")]
DataFrame with 8 rows and 2 columns
                  cell       dex
           <character>  <factor>
SRR1039508     N61311    untrt
SRR1039509     N61311    trt
SRR1039512     N052611   untrt
SRR1039513     N052611   trt
SRR1039516     N080611   untrt
SRR1039517     N080611   trt
SRR1039520     N061011   untrt
SRR1039521     N061011   trt

> dds
class: DESeqDataSet
dim: 63677 8
design: ~cell + dex

Oggetti R: sessione vs disco

In R gli oggetti (dds, vsd, res…) vivono solo in memoria. Se chiudi e riapri R, devi ricrearli da zero — oppure ricaricarli da file .rds.

Regola pratica: salva un checkpoint saveRDS() dopo ogni step computazionalmente costoso.

Step 2: Pre-filtering e QC della Matrice

Prompt 2.1: Pre-filtering

Copia questo prompt in Copilot Chat

Ho un DESeqDataSet 'dds' con 63.677 geni e 8 campioni (dataset airway).
Esegui il pre-filtering raccomandato dalla vignetta di DESeq2:

Se hai chiuso R dopo lo Step 1: dds <- readRDS("results/dds_raw.rds")

1. Applica il criterio: mantieni solo righe con almeno 10 conteggi
   in almeno 'smallestGroupSize' campioni (qui: 4, la dimensione del gruppo più piccolo)
2. Mostra quanti geni rimangono dopo il filtro
3. Crea un istogramma della distribuzione dei log2-conteggi (log2(count+1))
   prima e dopo il filtro, colorati diversamente
4. Salva il dds filtrato: saveRDS(dds, "results/dds_filtered.rds")

Spiega:
- Perché il numero minimo di campioni è legato alla dimensione del gruppo?
- Quali sono i due vantaggi principali del pre-filtering in DESeq2?
- Perché NON si usa 'nrow(counts(dds)) > 1' come unico criterio?

Razionale del filtro: Riduce memoria, aumenta velocità e migliora i plot diagnostici eliminando geni non informativi

Prompt 2.2: Statistiche QC della Matrice

Copia questo prompt in Copilot Chat

Sul DESeqDataSet filtrato 'dds', esegui una QC esplorativa:
1. Calcola e visualizza i library size (conteggi totali per campione) 
   con un barplot colorato per condizione 'dex'
2. Calcola la percentuale di geni con conteggi = 0 per ogni campione
3. Crea un boxplot della distribuzione log2(counts+1) per campione,
   con colori per condizione e annotazioni per linea cellulare
4. Salva i plot in 'results/'

Commenta i risultati:
- I library size sono bilanciati tra le condizioni?
- Una differenza di library size richiede normalizzazione manual prima di DESeq2?
- Perché DESeq2 usa conteggi grezzi (non normalizzati) come input?

DESeq2 vuole conteggi grezzi

DESeq2 normalizza internamente tramite il metodo median of ratios. Non pre-normalizzare i dati prima di passarli a DESeq2.

Output Atteso - Step 2

# Prima del pre-filtering
> nrow(dds)
[1] 63677

# Dopo il pre-filtering (>= 10 counts in >= 4 campioni)
> nrow(dds)
[1] ~25000  # circa il 40% dei geni passa il filtro

# Library size (conteggi totali per campione)
SRR1039508  SRR1039509  SRR1039512  SRR1039513
 20637971    18809481    25348649    15163415

SRR1039516  SRR1039517  SRR1039520  SRR1039521
 24448408    30818215    19126151    21164133

Step 3: Analisi Esplorativa

Prompt 3.1: Trasformazione VST

Copia questo prompt in Copilot Chat

Ho il DESeqDataSet filtrato 'dds'.
Se hai chiuso R: dds <- readRDS("results/dds_filtered.rds")

Applica la Variance Stabilizing Transformation (VST):

1. Applica vst(dds, blind=FALSE) — spiega perché blind=FALSE è appropriato qui
2. Confronta visivamente gli effetti della trasformazione con meanSdPlot 
   (dal pacchetto vsn) sui dati:
   - Grezzi: log2(counts(dds) + 1)
   - VST: assay(vsd)
3. Salva il confronto come 'results/vst_comparison.pdf'
4. Salva l'oggetto VST: saveRDS(vsd, "results/vsd.rds")

Spiega la differenza concettuale tra:
- Trasformazione log2 classica: log2(n + pseudocount)
- VST: come stabilizza la varianza in modo adattivo?
- rlog vs VST: quando usare uno piuttosto che l'altro?

Regola pratica: Per n < 30 campioni → si possono usare sia VST che rlog. Per n > 30 → preferire VST (più veloce)

Prompt 3.2: PCA Plot

Copia questo prompt in Copilot Chat

Ho l'oggetto VST 'vsd' dal dataset airway (8 campioni, 2 condizioni, 4 linee cellulari).
Crea due versioni del PCA plot:

1. Versione rapida con plotPCA(vsd, intgroup=c("dex","cell"))
2. Versione personalizzata con ggplot2:
   - Colora per 'dex' (untrt=grigio, trt=rosso)
   - Forma diversa per ogni linea cellulare ('cell')
   - Mostra % varianza su ogni asse
   - Aggiungi etichette ai punti con il nome del campione
   - Tema minimal, font size 12
   - Salva come 'results/pca_plot.pdf'

Interpreta il risultato:
- Su quale PC si separa l'effetto del desametasone?
- Su quale PC si vede l'effetto della linea cellulare?
- Cosa implica questo per la scelta del design formula ~ cell + dex?

Risultato atteso: PC1 separa per linea cellulare, PC2 separa per trattamento (dex)

Prompt 3.3: Heatmap Distanze Sample-to-Sample

Copia questo prompt in Copilot Chat

Usando i dati VST 'vsd' del dataset airway, crea una heatmap delle 
distanze euclidee sample-to-sample seguendo la vignetta ufficiale di DESeq2:

1. Calcola sampleDists = dist(t(assay(vsd)))
2. Converti in matrice: sampleDistMatrix = as.matrix(sampleDists)
3. Assegna ai nomi delle righe: paste(vsd$dex, vsd$cell, sep="-")
4. Usa pheatmap con:
   - clustering_distance_rows = sampleDists
   - clustering_distance_cols = sampleDists
   - Palette: rev(brewer.pal(9,"Blues")) da RColorBrewer
   - Nessuna annotazione colonna
5. Salva come 'results/sample_distances.pdf'

Spiega:
- Perché fornire la matrice di distanze al clustering invece di usare il default?
- Quali coppie di campioni dovrebbero avere distanza minima?
- Cosa indicherebbe un campione anomalo (outlier) in questo grafico?

Prompt 3.4: Heatmap Matrice di Conteggi

Copia questo prompt in Copilot Chat

Crea una heatmap dei top 20 geni più espressi (by mean normalized count) 
seguendo la vignetta di DESeq2:

1. Seleziona i 20 geni: order(rowMeans(counts(dds, normalized=TRUE)), 
   decreasing=TRUE)[1:20]
2. Crea df di annotazione: as.data.frame(colData(dds)[, c("dex","cell")])
3. Crea la heatmap con pheatmap:
   - cluster_rows=FALSE, cluster_cols=FALSE
   - show_rownames=FALSE
   - annotation_col=df
4. Prova anche con i dati VST e rlog per confronto
5. Salva come 'results/count_heatmap.pdf'

Spiega cosa rappresenta questa heatmap rispetto alla PCA:
- Cosa mostra la heatmap che la PCA non mostra?
- Perché i geni più espressi non sono necessariamente i più interessanti?

Output Atteso - Step 3

PCA Plot

  • PC1 (~50% varianza): separa le linee cellulari
  • PC2 (~25% varianza): separa trt vs untrt
  • 4 “cluster” di 2 campioni = 4 coppie per linea cellulare
  • I replicati biologici sono le coppie per linea

Sample Distance Heatmap

  • Le coppie untrt/trt della stessa linea cellulare si raggruppano insieme
  • Distanza intra-linea (diversa condizione) < distanza inter-linea
  • Nessun outlier atteso → tutti i campioni di buona qualità

Step 4: Analisi Differenziale

Prompt 4.1: DESeq2 — Analisi Completa

Copia questo prompt in Copilot Chat

Se hai chiuso R dopo lo Step 3:
  dds <- readRDS("results/dds_filtered.rds")
  vsd <- readRDS("results/vsd.rds")

Esegui l'analisi differenziale completa con DESeq2 sul dataset airway:

1. Esegui l'analisi DESeq2 sul mio oggetto dds e salvalo subito in "results/dds_deseq.rds" (l'analisi richiede qualche minuto)
2. Quali sono i nomi dei coefficienti disponibili nel modello adattato?
3. Estrai i risultati per il confronto tra cellule trattate (trt) e non trattate (untrt) e salvali in "results/res.rds"
4. Quanti geni risultano significativi con una soglia alpha di 0.05?
5. Mostrami i top 10 geni ordinati per p-value

Spiega ogni colonna dell'output results():
- baseMean: cosa rappresenta?
- log2FoldChange (MLE): perché è "MLE" e cosa significa?
- lfcSE: a cosa serve lo standard error del LFC?
- stat: cos'è la statistica di Wald?
- pvalue vs padj: qual è il metodo di correzione usato da DESeq2?

Nota: Il valore di default alpha=0.1 nel summary() è conservativo — usare alpha=0.05 per pratica standard

Prompt 4.2: LFC Shrinkage con apeglm

Copia questo prompt in Copilot Chat

Se hai chiuso R dopo il Prompt 4.1:
  dds <- readRDS("results/dds_deseq.rds")
  res  <- readRDS("results/res.rds")

Applica il log fold change shrinkage ai risultati DESeq2 del dataset airway:

1. Quale coefficiente devo usare per il confronto trt vs untrt?
2. Applica lo shrinkage con il metodo apeglm e salva il risultato in "results/resLFC.rds"
3. Crea due MA plot affiancati per confrontare i risultati prima e dopo lo shrinkage e salva come 'results/MA_comparison.pdf'

Spiega il concetto di shrinkage:
- Perché i geni a bassa espressione hanno LFC molto grandi senza shrinkage?
- Come mai lo shrinkage NON riduce i LFC per geni altamente espressi?
- Quando è preferibile apeglm rispetto a 'normal' o 'ashr'?

Usare sempre i valori shrinkati per classifiche e visualizzazioni

I log2FoldChange shrinkati (apeglm/ashr) sono preferibili per volcano plot, heatmap e ranking dei geni. Per il test statistico usa padj da res.

Prompt 4.3: Plot Diagnostici

Copia questo prompt in Copilot Chat

Crea i plot diagnostici standard di DESeq2 per il dataset airway:

1. Crea il dispersion plot e salvalo in 'results/dispersion_plot.pdf'
2. Crea un istogramma della distribuzione dei p-value, considerando solo i geni con espressione basale maggiore di 1, e salvalo in 'results/pvalue_hist.pdf'

Per ogni grafico spiega:
a) Dispersion plot:
   - Cosa sono i punti neri, la curva rossa, i punti blu cerchiati?
   - Cosa indica una curva decrescente da sinistra a destra?
   - Cosa segnalano i punti al di sopra della curva finale?

b) P-value histogram:
   - Forma attesa quando c'è segnale biologico reale?
   - Come si distingue un esperimento con segnale da uno senza?
   - Cosa indica un picco vicino a p=1?

Prompt 4.4: Filtraggio e Export

Copia questo prompt in Copilot Chat

Dai risultati DESeq2 del dataset airway:

1. Filtra i geni significativi usando come soglie: p-value aggiustato inferiore a 0.05 e variazione di espressione assoluta superiore a 2 volte. Usa il p-value aggiustato dai risultati MLE e il fold change dallo shrinkage apeglm
2. Separa i geni in up-regulated (aumentati nel trattato) e down-regulated (ridotti nel trattato)
3. Crea una tabella riassuntiva con: totale geni testati, numero di geni significativi, quanti UP e quanti DOWN
4. Ordina per p-value aggiustato e salva la tabella in 'results/DE_genes_airway.csv'
5. Mostrami i top 5 geni UP e i top 5 DOWN con nome del gene, espressione media, fold change shrinkato e p-value aggiustato

Spiega:
- Perché CRISPLD2 e DUSP1 sono tra i risultati più robustamente replicati
  in esperimenti con glucocorticoidi?
- Come fare un rapido 'sanity check' biologico sui risultati?

Output Atteso - Step 4

> resultsNames(dds)
[1] "Intercept"          "cell_N052611_vs_N061011"
[3] "cell_N080611_vs_N061011" "cell_N61311_vs_N061011"
[5] "dex_trt_vs_untrt"

> summary(res, alpha=0.05)
out of ~25000 with nonzero total read count
adjusted p-value < 0.05
LFC > 0 (up)   : 747, ~3%
LFC < 0 (down) : 566, ~2.3%
outliers [1]   :   0, 0%
low counts [2] :   0, 0%

# Top gene significativo atteso: CRISPLD2 (up), DUSP1 (up)

Step 5: Visualizzazione

Prompt 5.1: MA Plot con resLFC

Copia questo prompt in Copilot Chat

Se hai chiuso R dopo lo Step 4:
  dds    <- readRDS("results/dds_deseq.rds")
  res    <- readRDS("results/res.rds")
  resLFC <- readRDS("results/resLFC.rds")
  vsd    <- readRDS("results/vsd.rds")

Crea un MA plot dei risultati shrinkati (resLFC) del dataset airway:

1. Usa plotMA(resLFC, ylim=c(-2,2)) — versione base DESeq2
2. Crea anche una versione ggplot2 personalizzata:
   - Asse X: log10(baseMean + 1) 
   - Asse Y: log2FoldChange (shrinkato)
   - Colora: blu se padj < 0.05, grigio altrimenti
   - Aggiungi linea orizzontale a y=0
   - Etichetta i top 5 geni più significativi con ggrepel
   - Tema minimal
3. Salva come 'results/MA_plot.pdf'

Spiega perché il MA plot con LFC shrinkati è più informativo:
- Cosa succede ai geni con baseMean molto basso nel plot MLE?
- Come lo shrinkage "pulisce" il segnale vs il rumore?
- Cosa indica un gene con punto triangolare (out-of-window)?

Prompt 5.2: Plot Conteggi Gene Specifico

Copia questo prompt in Copilot Chat

Visualizza l'espressione del gene più significativo nel dataset airway:

1. Trova il gene con padj minimo: which.min(res$padj)
2. Usa plotCounts(dds, gene=which.min(res$padj), intgroup="dex")
   per la versione base
3. Crea una versione ggplot2 con returnData=TRUE:
   d <- plotCounts(dds, gene=which.min(res$padj), 
                   intgroup=c("dex","cell"), returnData=TRUE)
   ggplot(d, aes(x=dex, y=count, color=cell, group=cell)) +
     geom_point(size=3) + geom_line() + scale_y_log10()
4. Salva come 'results/top_gene_counts.pdf'

Spiega il grafico:
- Perché collegare i punti della stessa linea cellulare?
- Cosa mostra il plot sulla consistenza dell'effetto del desametasone 
  tra le diverse linee cellulari?
- Come si chiama il gene? (usa rownames(res)[which.min(res$padj)])

Risultato atteso: CRISPLD2 — gene codificante una proteina di legame al calcio, regolato dai glucocorticoidi

Prompt 5.3: Volcano Plot

Copia questo prompt in Copilot Chat

Crea un volcano plot publication-ready dei risultati DESeq2 (airway dataset):

Usa i risultati shrinkati resLFC combinati con padj da res:
- Asse X: log2FoldChange (da resLFC)
- Asse Y: -log10(padj) (da res)
- Colori:
  UP: padj < 0.05 E LFC > 1 → rosso
  DOWN: padj < 0.05 E LFC < -1 → blu
  NS: grigio semitrasparente (alpha=0.3)
- Linee trattegiate verticali a LFC = ±1
- Linea tratteggiata orizzontale a -log10(0.05)
- Etichetta i top 10 geni (5 UP + 5 DOWN per padj) con ggrepel
- Tema minimal, font 12, pannello senza griglia
- Salva come 'results/volcano_plot.pdf' (8x6 inches)

Nota: gestisci i valori NA in padj con na.rm=TRUE o filtraggio.

Prompt 5.4: Heatmap Top Geni DE

Copia questo prompt in Copilot Chat

Crea una heatmap dei top 30 geni differenzialmente espressi (airway):

1. Seleziona i 30 geni con padj più basso da res (rimuovi NA)
2. Estrai i valori VST: assay(vsd)[top_genes, ]
3. Scala per riga (z-score): t(scale(t(mat)))
4. Crea annotazione colonne da colData(dds)[, c("dex","cell")]
5. Usa pheatmap:
   - palette: colorRampPalette(c("navy","white","firebrick3"))(50)
   - cluster_rows=TRUE, cluster_cols=TRUE
   - show_rownames=TRUE (i geni sono pochi)
   - annotation_col=df
   - fontsize_row=8
6. Salva come 'results/heatmap_top30.pdf' (8x10 inches)

Spiega:
- Perché usare z-score per riga invece dei valori VST grezzi?
- Il clustering corrisponde alle condizioni attese (dex trt vs untrt)?
- Vedi i pattern di CO-espressione attesi per i glucocorticoidi?

Output Atteso - Step 5

I plot salvati in results/:

File Contenuto
MA_comparison.pdf MA plot MLE vs apeglm affiancati
MA_plot.pdf MA plot shrinkato personalizzato
top_gene_counts.pdf Conteggi CRISPLD2 per linea cellulare
volcano_plot.pdf Volcano con top geni etichettati
heatmap_top30.pdf Heatmap z-score geni DE
pca_plot.pdf PCA con colore dex + forma cell
sample_distances.pdf Heatmap distanze sample-to-sample

Step 6: Report Finale

Prompt 6.1: Summary Report

Copia questo prompt in Copilot Chat

Genera un report summary dell'analisi RNA-seq (dataset airway) in markdown:

1. Descrizione dataset:
   - 8 campioni, 4 linee cellulari, trattamento con desametasone
   - Design: ~ cell + dex

2. Pre-filtering:
   - Geni iniziali: 63.677; Geni dopo filtro: ~25.000
   - Critero: >= 10 counts in >= 4 campioni

3. QC esplorativa:
   - PCA: PC1 separa per linea cellulare, PC2 per trattamento
   - Sample distances: coppie untrt/trt raggruppate per linea

4. Risultati DE (padj < 0.05, |LFC| > 1):
   - UP-regulated: [numero]
   - DOWN-regulated: [numero]
   - Top 5 geni UP e DOWN con interpretazione biologica

5. Lista di tutti i file generati in results/

Formatta come report professionale in italiano.
Aggiungi una sezione 'Limitazioni' che discuta cosa NON si può concludere
da questo esperimento in vitro.

Checklist Finale ✅

Prima di concludere, verifica:

Tips per Prompt Efficaci

Struttura di un Buon Prompt

[CONTESTO] - Cosa stai facendo
[INPUT] - Quali dati/variabili hai
[OUTPUT] - Cosa vuoi ottenere
[SPECIFICHE] - Dettagli (colori, dimensioni, file)

Esempio: > “Ho un dataframe res con colonne log2FoldChange e padj. > Voglio un volcano plot con geni significativi (padj<0.05, |LFC|>1) in rosso, > salvato come PDF 8x6.”

Quando l’AI Sbaglia

  1. Codice non funziona: Copia l’errore e chiedi “Correggi questo errore: [errore]”

  2. Plot brutto: Specifica meglio estetica: “Usa tema_minimal, font size 12, no legenda”

  3. Risultato sbagliato: Verifica con head(), dim(), summary() e chiedi correzioni

  4. Non capisce il contesto: Dai più contesto: “Sto usando DESeq2 in R, ho un oggetto dds…”

Esercizio Finale

Usando le stesse tecniche sul dataset airway, prova a:

  1. Testare un design ridotto ~ dex (senza cell) e confrontare il numero di geni DE — quanti si perdono senza controllare per la linea cellulare?
  2. Creare un heatmap dei pathway usando clusterProfiler per arricchimento GO dei geni UP vs DOWN
  3. Esportare una tabella Excel annotata con simbolo genico e descrizione usando org.Hs.eg.db

💡 Ricorda: L’AI è un tool, tu sei l’esperto che valuta i risultati biologici!

Domande?

Domande?