Pipeline di Prompt per Copilot/ChatGPT
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:
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)
Visual Studio Code è l’editor gratuito di Microsoft in cui eseguiremo il demo.
Download: code.visualstudio.com
macOS
.zip per Apple Silicon o IntelWindows
.exe (User Installer)Verifica installazione
Apri VS Code: dovresti vedere la schermata di benvenuto Welcome.
GitHub è necessario per attivare GitHub Copilot (gratuito per studenti e privati).
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.
Con VS Code aperto:
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.
Aprire la chat
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”.
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.
I prompt di questo corso funzionano all’interno di un Dev Container: un ambiente pre-configurato che gira in Docker.
Vantaggi
salmon, fastp, R, DESeq2…Cosa include il container
salmon, fastp, multiqc, fastqcDESeq2, tximport, ComplexHeatmapPrerequisiti di sistema
Servono almeno 10 GB liberi su disco e una buona connessione Internet per il primo download (~3 GB).
Docker è il motore che esegue il container.
macOS
.dmg → trascina Docker nelle ApplicazioniWindows
wsl --install → riavvia.exe → segui la procedura guidataCon VS Code aperto:
Ctrl+Shift+X / ⌘+Shift+X)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.
Apri un terminale e clona il repository:
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
Metodo 1 — Popup automatico
VS Code mostra in basso a destra:
“Reopen in Container” → clicca
Metodo 2 — Command Palette
Ctrl+Shift+P (Windows) / Cmd+Shift+P (Mac)Prima apertura
Aperture successive
Apri il terminale in VS Code (Ctrl+` / ⌃`) ed esegui:
Tutto pronto!
Se vedi le versioni senza errori, l’ambiente è configurato correttamente. Ora puoi proseguire con l’attivazione di GitHub Copilot.
| 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 |
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
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.
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
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
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.
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
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.
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?
Esperimento: Trattamento di cellule muscolari lisce delle vie aeree con desametasone (glucocorticoide)
Disegno sperimentale
untrt (controllo) e trt (trattato)~ cell + dexPerché questo design?
Controllare l’effetto della linea cellulare (confondente) per isolare l’effetto del farmaco
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.
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 8colData(se)$dex → 4 untrt, 4 trtcolData(se)$cell → 4 linee cellulari diverseCopia 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
> 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 + dexOggetti 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.
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
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.
# 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 21164133Copia 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)
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)
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?
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?
PCA Plot
Sample Distance Heatmap
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
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.
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?
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?
> 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)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)?
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
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.
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?
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 |
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.
Prima di concludere, verifica:
[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.”
Codice non funziona: Copia l’errore e chiedi “Correggi questo errore: [errore]”
Plot brutto: Specifica meglio estetica: “Usa tema_minimal, font size 12, no legenda”
Risultato sbagliato: Verifica con head(), dim(), summary() e chiedi correzioni
Non capisce il contesto: Dai più contesto: “Sto usando DESeq2 in R, ho un oggetto dds…”
Usando le stesse tecniche sul dataset airway, prova a:
~ dex (senza cell) e confrontare il numero di geni DE — quanti si perdono senza controllare per la linea cellulare?org.Hs.eg.db💡 Ricorda: L’AI è un tool, tu sei l’esperto che valuta i risultati biologici!
Domande?