8. Analysis of Biological Networks

Αναλυση Βιολογικών Δικτύων

Εισαγωγή

Στην άσκηση αυτή θα δούμε πως μπορούμε να αναλύσουμε τις στατιστικές ιδιότητες ενός βιολογικού δικτύου και να τις συγκρίνουμε με αυτές ενός τυχαίου δικτύου στο οποίο δεν θα υπάρχει κάποια προφανής προτίμηση διασύνδεσης κόμβων μεταξύ τους. Στη συγκεκριμένη άσκηση αρχικά θα δούμε πώς οπτικοποιούμε και αποθηκεύουμε πληροφορίες για δίκτυα πρωτεϊνικών αλληλεπιδράσεων από τη βάση δεδομένων STRING και στη συνέχεια πώς μπορούμε να αναλύσουμε τα δεδομένα με την R.

Η βάση δεδομένων STRING DB

H STRING DB (http://string-db.org/) είναι μια βάση δεδομένων που καταγράφει πειραματικά επιβεβαιωμένες αλλά και θεωρητικά προβλεπόμενες αλληλεπιδράσεις μεταξύ πρωτεϊνών σε διάφορα είδη. Στην τρέχουσα εκδοχή της περιέχει αλληλεπιδράσεις για πάνω από 9.5 εκατομμύρια πρωτεϊνες για πάνω από 2000 είδη. Οργανώνει δε αυτήν την πληροφορία σε μορφή δικτύων αλληλεπιδράσεων με κάθε πρωτεϊνη να αποτελεί έναν κόμβο σε δίκτυα των οποίων οι ακμές έχουν διαφορετική αξιολόγηση με βάση την πληροφορία από την οποία έχει προέλθει η καταγραφή τους.

Αναζήτηση πληροφοριών στην STRING

Αφού πλοηγηθείτε στον παραπάνω σύνδεσμο αναζητήστε στο πεδίο αναζήτησης το δίκτυο της πρωτεϊνης TNF (protein name) του ανθρώπου (Homo sapiens στο πεδιο organism). Θα μεταβείτε σε μια εικόνα που θα αναπαριστά τον ΤΝF στο κέντρο ενός δικτύου μικρού αριθμού πρωτεϊνών.

Μεγεθυνση δικτύου αλληλεπιδράσεων και αποθήκευση δεδομένων από την STRING

Από τις επιλογές που υπάρχουν κάτω από το δίκτυο μπορούμε να μεγαλώσουμε ή να μικρύνουμε το δίκτυο (Data Settings -> 1st/2nd shell). Στη συγκεκριμένη απεικόνιση για τον ανθρώπινο ΤNF, δοκιμάστε να ορίσετε custom values στα 1st/2nd shells = 50. Μπορούμε επίσης να αποκομίσουμε αλληλεπιδράσεις με μεγαλύτερη ή μικρότερη αξιοπιστία (Data Settings -> minimum required interaction score), να αλλάξουμε τον τρόπο αναπαράστασης (View Settings) και τέλος να πάρουμε τα δεδομένα του δικτύου σε μορφή αρχείων (Τables/Exports)

Επιλέγοντας πεδίο Tables/Exports μπορείτε να δείτε τις επιλογές που έχετε για να αποθηκεύσετε την πληροφορία ενός δικτύου σε εικόνα ή σε αρχείο κειμένου με όλες τις αλληλεπιδράσεις καταγραμμένες σε ξεχωριστές γραμμές. Ένα τέτοιο αρχείο βρίσκεται στο τέλος αυτής της σελίδας και θα πρέπει να το αποθηκεύσετε στον υπολογιστή σας προκειμένου να το αναλύσετε στατιστικά όπως θα δείτε παρακάτω.

Ανάλυση δεδομένων βιολογικών δικτύων

Σκοπός της άσκησης είναι η ανάλυση των στατιστικών ιδιοτήτων ενός βιολογικού δικτύου και η σύγκρισή τους με ένα τυχαίο δίκτυο. Συγκεκριμένα θα χρησιμοποιήσουμε την R για να:

α) διαβάσουμε ένα δίκτυο σε έναν πίνακα αλληλεπιδράσεων (adjacency matrix)

β) θα μετρήσουμε το βαθμό των κόμβων του δικτύου και

γ) θα αναπαραστήσουμε γραφικά τον βαθμό αυτό κατατάσσοντας τους κόμβους από αυτόν με τον μεγαλύτερο προς αυτόν με τον μικρότερο για να δούμε κατά πόσο το δίκτυο αυτό είναι ανεξάρτητο κλίμακας (scale free).

Aς δούμε πως θα το κάνουμε.

Αρχικά εκκινούμε την R όπως έχουμε δει σε παλαιότερες ασκήσεις, μπαίνουμε στο φάκελο εργασίας και φορτώνουμε τη βιβλιοθήκη network με τις εξής εντολές:

install.packages("network")
library("network")

H συγκεκριμένη βιβλιοθήκη θα μας χρειαστεί μόνο για μια γραφική παράσταση οπότε μην ανησυχήσετε αν αντιμετωπίσετε πρόβλημα στη φόρτωσή της. Μπορείτε να περάσετε στο επόμενο στάδιο κατευθείαν.

Στο πρώτο στάδιο θα διαβάσουμε το αρχείο αλληλεπιδράσεων σε ένα data.frame ως εξής:

data<-read.delim("TNFnetwork.txt", header=T, sep="\t") 

Στο path θα πρέπει να βάλετε το αντίστοιχο path στο οποίο έχετε αποθηκεύσει το αρχείο. Οι παρακάτω εντολές ισχύουν για την περίπτωση που θα διαλέξετε να φορτώσετε ένα παλιότερο αρχείο δικτύου για τον TNF που θα βρείτε εδώ. Αν αντιμετωπίζετε δυσκολία με τις εντολές μπορείτε να χρησιμοποιήσετε αυτό το αρχείο αντί για αυτό που κατεβάσατε.

Στη συνέχεια θα δημιουργήσουμε έναν πίνακα αλληλεπιδράσεων με τη χρήση της συνάρτησης table:

interactions<-table(data[2:length(data[,1]),1:2]) 

o πίνακας interactions είναι ένας adjacency matrix ο οποίος μπορεί να οπτικοποιηθεί αφού μετασχηματιστεί σε δίκτυο με τη χρήση της βιβλιοθήκης network και τις εντολές:

net<-network(interactions)
plot.network(net, displaylabels=T, edge.col="blue", vertex.col="red")

Η εικόνα που βλέπετε είναι ανάλογη της εικόνας που θα βλέπαμε στην STRING. Η πληροφορία είναι τόσο πυκνή που δύσκολα μπορούμε να πούμε πράγματα για τη δομή του δικτύου. Για το λόγο αυτό θα προχωρήσουμε στην στατιστική του επεξεργασία. Πρώτα θα απαριθμήσουμε το βαθμό του κάθε κόμβου αθροίζοντας γραμμές και στήλες αντίστοιχα:

nodes<-colSums(table(data[,c(1,2)]))+colSums(table(data[,c(1,2)]))

και στη συνέχεια θα κατατάξουμε τους κόμβους με βάση τον βαθμό τους από το μεγαλύτερο στο μικρότερο:

sort(nodes, decreasing=T)->nodes

Ελέγξτε τον πίνακα nodes. Ποια πρωτεϊνη στο δίκτυο είναι η πιο πυκνά διασυνδεδεμένη; Τι βαθμό έχει ο TNF από τον οποίο ξεκίνησε το δίκτυό σας;

Μπορούμε τώρα να αναπαραστήσουμε γραφικά την κατανομή των κόμβων σε διπλή λογαριθμική κλίμακα:

plot(log10(seq(1:length(nodes))), log10(nodes), col="blue", pch=19, 
xlab="log(Node Rank)", ylab="log(Node Degree)", las=1, cex.lab=1.5, cex.axis=1.2)

Παρατηρείτε μια γραμμικότητα σε κάποιο τμήμα της καμπύλης; Αν ναι αυτό είναι έμμεση αλλά σαφής ένδειξης της ύπαρξης στοιχείων δικτύου ανεξάρτητου κλίμακας (scale free). Η κατανομή δηλαδή των βαθμών των κόμβων είναι κατανομή νόμου-δύναμης (power-law) με τον βαθμό των κόμβων να μειώνεται με ρυθμό μικρότερο από αυτόν της εκθετικής κατανομής.

Δημιουργία τυχαίου δικτύου ίσου μεγέθους

Πώς θα δούμε όμως αν το δίκτυο του TNF είναι πραγματικά διαφορετικό σε ό,τι αφορά τις στατιστικές του ιδιότητες από ένα τυχαίο δίκτυο;

Aρχικά θα πρέπει να βρούμε πόσες είναι οι συνδέσεις (ακμες) που περιέχει το δίκτυό μας. Δεν έχουμε παρά να μετρήσουμε τις γραμμές του αρχείου που περιέχει το δίκτυο (data):

number_of_edges<-length(data[,1])

Aπ' όπου προκύπτει ότι οι ακμές είναι 545. Πόσες θα μπορούσαν να είναι όμως συνολικά οι ακμές; Αυτό μας ενδιαφέρει να το ξέρουμε για να έχουμε μια εικόνα της πυκνότητας του δικτύου πριν προσπαθήσουμε να το προσομοιώσουμε με ένα τυχαίο δίκτυο. Από τη θεωρία ξέρουμε ότι για ένα δίκτυο στο οποίο δεν επιτρέπονται αυτο-συνδέσεις (δηλαδή ακμές που ενώνουν κάτι με τον εαυτό του) ο μέγιστος αριθμός των ακμών είναι ίσος με Ν(Ν-1)/2 Στην περίπτωσή μας ο αριθμός των κόμβων είναι:

number_of_nodes<-length(unique(c(as.character(data[,1]), as.character(data[,2]))))

ίσος δηλαδή με 56 και άρα ο μέγιστος αριθμός συνδέσεων είναι 56*55=3080. Για την ακρίβεια, επειδή κάποιες από τις ακμές δεν παρατηρούνται καθόλου (λόγω μη ύπαρξης κόμβων που αλληλεπιδρούν με τους εαυτούς τους κλπ) οι ακμες είναι 54*52=2808 και αυτός θα είναι ο αριθμός που θα προσπαθήσουμε να προσομοιώσουμε.

Για να προσομοιώσουμε τώρα το δίκτυό μας με τυχαίο τρόπο παραγάγοντας ένα τυχαίο δίκτυο ίσης πυκνότητας θα χρησιμοποιήσουμε τη διωνυμική κατανομή για να επιλέξουμε 545 τυχαίες συνδέσεις από το σύνολο 2808. Στη συνέχεια θα δημιουργήσουμε ένα τυχαίο δίκτυο με αυτές τις συνδέσεις όπως περιγράφεται παρακάτω:

rbinom(2808, 1, p=545/3080)->rands 
list(rownames(interactions),colnames(interactions))->dims
matrix(rands, nrow=54, ncol=52, byrow=T, dimnames=dims)->randinteractions
randdata<-0
for(i in 1:54){for (j in 1:52) {if (randinteractions[i,j]==1) {randdata<-rbind(randdata,c(rownames(randinteractions)[i],colnames(randinteractions)[j]))}}} 
as.data.frame(randdata, row.names<-"")->randdata 
colSums(table(randdata[,c(1,2)]))+colSums(table(randdata[,c(1,2)]))->randnodes 
sort(randnodes, decreasing=T)->randnodes

Ο πίνακας randnodes τώρα περιέχει καταταγμένους τους βαθμούς του τυχαίου αυτού δικτύου. Μπορούμε να αναπαραστήσουμε γραφικά τις δύο κατανομές δίπλα-δίπλα με τις παρακάτω εντολές:

par(mfrow=c(1,2))
plot(log10(seq(1:52)), log10(nodes[1:52]), col="blue", pch=19, ylab="log(degree)", xlab="log(node rank)", main="TNF net", ylim=c(0.3, 2))
plot(log10(seq(1:52)), log10(randnodes[1:52]), type="p", col="red", pch=19, ylab="log(degree)", xlab="log(node rank)", main="Random Net",  ylim=c(0.3, 2))

Τι παρατηρείτε; Ποια είναι η βασική ποιοτική διαφορά των δύο δικτύων;

Συγκρίνετε τον τρόπο με τον οποίο φθίνει ο βαθμός των κόμβων όσο προχωράμε από τον κόμβο με το μεγαλύτερο βαθμό σε αυτόν με το μικρότερο.

Άσκηση

Σας ζητείται να επαναλάβετε την παραπάνω διαδικασία για την πρωτεϊνη NFKB1 του ανθρώπου (Homo Sapiens). Τη συγκεκριμένη θα επιλέξετε βάζοντας στο πεδίο Protein Name: NFKB1 και στο πεδίο Organism: Homo Sapiens. Στην επόμενη σελίδα, εφόσον είναι προεπιλεγμένη η σωστή πρωτεϊνη επιλέγετε "CONTINUE". Ακολούθως και ενώ είστε ακόμα στη STRING θα πρέπει να:

1. Μεγεθύνετε το αρχικό δίκτυο επιλέγοντας Data Settings και μετά στα πεδία 1st shell και 2nd shell επιλέγετε ΚΑΙ στα δύο το "no more than 50 interactors".

2. Αποθηκεύσετε το μεγεθυμένο δίκτυο από το πεδίο Τables/Exports και διαλέγοντας το αρχείο (as simple tabular text output: download TSV: tab separated values - can be opened in Excel)

Στη συνέχεια και ακολουθώντας ακριβώς τα ίδια βήματα με αυτά που κάναμε για τον TNF θα πρέπει να φτάσετε μέχρι τη δημιουργία των εικόνων που αναπαριστούν α) το δίκτυο αλληλεπιδράσεων του NFKB1 και β) την κατανομή των βαθμών κόμβων του πραγματικού δικτύου (όχι του τυχαιοποιημένου).

Να ανεβάσετε την αναφορά σας στο παρακάτω link:

https://www.dropbox.com/request/C1dAj6hZAzpLvDcKgCRJ

μέχρι την Παρασκευή 31/5/2019.