Vai al contenuto

Calcoli scientifici con Julia/Analisi del proprio genoma

Wikibooks, manuali e libri di testo liberi.
Indice del libro

La società californiana 23andMe fornisce a pagamento in tutto il mondo un dataset contenente i dati relativi al proprio genotipo, ottenuti analizzando un campione di saliva inviato dal cliente per posta. Questi dati possono essere utilizzati per scopi di ricerca, educativi ed informativi ma non per uso medico. Ciascuna riga del dataset corrisponde ad un singolo SNP contenente 4 colonne :

  • l'identificatore univoco rsid dell'SNP
  • il cromosoma contenente l'SNP
  • la posizione numerica all'interno del DNA nel cromosoma
  • il genotipo formato da 2 lettere tra le seguenti: adenina (A), citosina (C), guanina (G), e timina (T).


Un signore ha reso pubblico il proprio dataset di SNP fornito da 23andME, assieme a quello di tutta la sua famiglia (figli e genitori) ed è possibile scaricarlo da qui : https://www.kaggle.com/zusmani/mygenome

E' possibile scaricare il dataset GWAS di links a pubblicazioni scientifiche relative ad SNP contenenti l' allele di rischio collegato ad una certa malattia o predisposizione da qui : https://www.ebi.ac.uk/gwas/downloads . Ad esempio nell'SNP rs533123 l'allele di rischio potrebbe essere A per cui bisogna indagare se il proprio genotipo relativo a quell'SNP lo contiene. Quindi unendo i 2 datasets si potrà sapere se il proprio genotipo contiene quel particolare allele di rischio relativo ad uno specifico tratto o malattia, ma il dataset GWAS è da pulire per cui in questo studio si considera il seguente dataset pulito gwas_health_clean.csv relativo alle principali malattie e dipendenze con gli SNP che ci interessano:

rsid,trait,category,risk_allele,odds_ratio,pvalue
rs429358,Alzheimer,Neurologico,A,3.2,1e-50
rs7412,Alzheimer,Neurologico,T,0.6,1e-20
rs6733839,Alzheimer,Neurologico,T,1.2,1e-15
rs7903146,Diabete tipo 2,Metabolico,T,1.4,1e-30
rs12255372,Diabete tipo 2,Metabolico,T,1.3,1e-25
rs5219,Diabete tipo 2,Metabolico,T,1.2,1e-12
rs1333049,Malattia coronarica,Cardiovascolare,C,1.2,1e-40
rs10757278,Malattia coronarica,Cardiovascolare,G,1.2,1e-38
rs17465637,Malattia coronarica,Cardiovascolare,C,1.15,1e-20
rs6025,Trombofilia,Cardiovascolare,T,5.0,1e-200
rs1799963,Trombofilia,Cardiovascolare,A,2.5,1e-100
rs9939609,Obesità,Metabolico,A,1.3,1e-35
rs1421085,Obesità,Metabolico,C,1.25,1e-30
rs3751812,Obesità,Metabolico,T,1.2,1e-25
rs1801133,Omocisteina,Sangue,T,1.3,1e-12
rs1801131,Omocisteina,Sangue,C,1.2,1e-10
rs855791,Ferro (livelli),Sangue,T,1.3,1e-50
rs1799945,Ferritina,Sangue,G,1.2,1e-20
rs738409,Steatosi epatica,Fegato,G,1.5,1e-40
rs58542926,Steatosi epatica,Fegato,T,1.4,1e-35
rs671,Metabolismo alcol,Dipendenze,A,2.5,1e-60
rs1229984,Metabolismo alcol,Dipendenze,A,0.3,1e-50
rs1799971,Dipendenza oppioidi,Dipendenze,G,1.2,1e-10
rs4680,Dopamina (COMT),Neurotrasmettitori,A,1.2,1e-15
rs1800497,Dopamina (DRD2),Neurotrasmettitori,T,1.3,1e-20
rs6265,BDNF (plasticità cerebrale),Neurotrasmettitori,A,1.2,1e-25
rs6311,Serotonina (HTR2A),Psichiatrico,A,1.2,1e-12
rs7997012,Depressione,Psichiatrico,A,1.15,1e-10
rs1006737,Disturbo bipolare,Psichiatrico,A,1.2,1e-20
rs1344706,Schizofrenia,Psichiatrico,A,1.2,1e-30
rs165599,Schizofrenia,Psichiatrico,G,1.15,1e-15
rs762551,Caffeina metabolismo,Dipendenze,A,1.3,1e-25
rs2472297,Caffeina consumo,Dipendenze,T,1.2,1e-20
rs4988235,Intolleranza lattosio,Metabolico,G,0.2,1e-100
rs1815739,Fibre muscolari,Performance,C,1.3,1e-30

In ogni caso è possibile cercare nel sito https://www.snpedia.com/ gli SNP relativi ad una certa malattia o tratto e cercarli nel genoma del signore .

Nel dataset gwas pulito si considera l'odds_ratio relativo all'SNP che misura quanto cambia il rischio di una malattia se si ha una certa variante genetica. In pratica confronta chi ha lo SNP verso chi non lo ha.

| OR     | Significato          |
| ------ | ------------------   |
| OR = 1 | nessun effetto       |
| OR > 1 | aumenta il rischio   |
| OR < 1 | effetto protettivo   |

Quindi per i seguenti odds ratio si ha per il rischio:

  • 1.0 → neutro
  • 1.2 → piccolo aumento
  • 2.0 → forte aumento
  • 0.7 → protettivo

Tramite l'odds_ratio si misura il PRS (Polygenic Risk Score) che è una misura numerica che riassume l’effetto combinato di molti SNP sul rischio di una malattia. In pratica ogni SNP ha un effetto piccolo, tanti SNP un effetto combinato significativo. Il PRS è la somma degli effetti genetici ottenuta sommando i logaritmi degli odds_ratio dei vari SNP moltiplicati per il numero di volte (0,1,2) in cui è presente l'allele nel genotipo relativo alla malattia, per cui vale la seguente tabella :

| PRS           | Significato            |
| --------      | ---------------------- |
| negativo      | rischio sotto la media |
| ~0            | rischio medio          |
| positivo      | rischio sopra la media |

Implementazione in Julia

[modifica | modifica sorgente]

Innanzitutto installiamo le librerie necessarie:

using Pkg
Pkg.add([ "CSV", "DataFrames", "Statistics", "StatsBase"])

Carichiamo il dna del signore:

using CSV, DataFrames, Statistics, StatsBase

function load_23andme(file)
    df = CSV.read(file, DataFrame)
    rename!(df, [:rsid, :chromosome, :position, :genotype])
    return df
end

dna = load_23andme("genome_zeeshan_usmani.csv")

Si uniscono i 2 datasets: quello relativo agli SNP del signore e il gwas pulito:

gwas = CSV.read("gwas_health_clean.csv", DataFrame)
merged = innerjoin(dna, gwas, on=:rsid)

Si calcola il PRS relativo a tutte le malattie e dipendenze considerate nel gwas e nel dna della persona:

# conta alleli
function allele_count(genotype, allele)
    genotype == "--" && return 0
    return count(c -> string(c) == allele, genotype)
end

# calcolo PRS
function prs(df)
    sum(
        log(row.odds_ratio) * allele_count(row.genotype, row.risk_allele)
        for row in eachrow(df)
    )
end

prs_scores = combine(groupby(merged, :trait)) do df
    (PRS = prs(df),
     SNP_count = nrow(df))
end

println(prs_scores)
22×3 DataFrame
 Row │ trait                        PRS        SNP_count
     │ String31                     Float64    Int64
─────┼───────────────────────────────────────────────────
   1 │ Omocisteina                  0.0               2
   2 │ Trombofilia                  0.0               1
   3 │ Malattia coronarica          0.644167          3
   4 │ Intolleranza lattosio        -1.60944          1
   5 │ Schizofrenia                 0.504405          2
   6 │ Metabolismo alcol            0.0               2
   7 │ Ferritina                    0.0               1
   8 │ Dipendenza oppioidi          0.182322          1
   9 │ Diabete tipo 2               0.598837          3
  10 │ BDNF (plasticità cerebrale)  0.0               1
  11 │ Fibre muscolari              0.262364          1
  12 │ Dopamina (DRD2)              0.0               1
  13 │ Disturbo bipolare            0.364643          1
  14 │ Depressione                  0.0               1
  15 │ Serotonina (HTR2A)           0.0               1
  16 │ Caffeina consumo             0.0               1
  17 │ Caffeina metabolismo         0.262364          1
  18 │ Obesità                      0.667829          3
  19 │ Alzheimer                    0.0               2
  20 │ Dopamina (COMT)              0.182322          1
  21 │ Ferro (livelli)              0.0               1
  22 │ Steatosi epatica             0.0               1

Si calcola il PRS relativo a tutte le categorie di malattie e dipendenze considerate nel gwas e nel dna della persona:

combine(groupby(merged, :category)) do df
    (PRS = prs(df),
     SNP_count = nrow(df))
end
9×3 DataFrame
Row	category	             PRS	    SNP_count
	    String31	             Float64	Int64
1	Sangue	                    0.0	            4
2	Cardiovascolare	            0.644167	    4
3	Metabolico	             -0.342772      7
4	Psichiatrico	            0.869048        5
5	Dipendenze	             0.444686       5
6	Neurotrasmettitori	     0.182322       3
7	Performance	             0.262364       1
8	Neurologico	             0.0            2
9	Fegato	                    0.0	            1

Moduli correlati

[modifica | modifica sorgente]