Musterlösung zum Projekt 3: Splice Sites

Größe: px
Ab Seite anzeigen:

Download "Musterlösung zum Projekt 3: Splice Sites"

Transkript

1 Statistik für Bioinformatiker SoSe 2003 Rainer Spang Musterlösung zum Projekt 3: Splice Sites Aufgabe 1. In Vorlesung 5 wurde die Donor Frequency Matrix behandelt. Konstruiere eine solche mit Hilfe der Daten von z.b. Konstruiere außerdem ein Nullmodell, in dem alle Basen gleich wahrscheinlich und voneinander unabhängig sind. Hier war es im wesenlichen egal, ob man nur die Trainingsdaten genommen hat oder noch die Testdaten dazu. Natürlich sind mehr Daten besser (geringere Varianz) und wir wollten ja auch nichts testen, deshalb war es durchaus sinnvoll beide Datensätze zusammenzufügen. #-- einlesen der daten # tmp <- scan("donor.train.real.txt", what=character())[c(false,true)] tmp <- unlist(strsplit(tmp,null)) data.train <- matrix(tmp, ncol=15, byrow=1) ; rm(tmp) #-- funktion zum berechnen der donor frequency matrix # dof <- function(m){ res <- matrix(0,4,15) nuc <- c("a","c","g","t") for (i in 1:4){ res[i,] = colsums(m==nuc[i])} return(res/dim(m)[1]) } #-- anwenden der funktion # mod <- dof(data.train) Für das Nullmodell brauchte man keine Matrix anzugeben; man sollte nur erwähnen, dass überall 1/4 steht.

2 Aufgabe 2. a) Würfle eine gleichverteilte Nukleotidsequenz sinnvoller Länge aus und berechne für alle in Frage kommenden Sequenzteile den Score (Log Likelihood Ratio) wie ebenfalls in Vorlesung 5 besprochen. Zeichne ein Histogramm. #-- funktion zum auswuerfeln der sequenz # makeseq <- function(length){ data <- sample(c("a","c","g","t"),length,replace=true) data <- paste (data,collapse="" ) tmp <- unlist(strsplit(gsub("gt","xt",data),null) ) ind <- grep ("X",tmp) ; rm(tmp) data <- unlist(strsplit(data,null) ) return(list(sqnz=data,i=ind) ) } len < data <- makeseq(len) #-- funktionen zum ausrechnen der scores # calcscr <- function(bases,mod){ im <- cbind(factor(bases,levels=c("a","c","g","t")),1:dim(mod)[2]) p.mod <- sum(log(mod[im]) ) return(p.mod - 15*log(.25) ) } calcscrs <- function(ind,sqnz){ #-- appfu <- function(i,sqnz){ ind <- (i-7):(i+7) scr <- calcscr(sqnz[ind],mod) return(scr)} #-- ind <- ind[(ind > 7) & (ind < length(sqnz) - 8) ] return(sapply(ind,function(x){appfu(x,sqnz)})) } #-- socres ausrechnen # scrs <- calcscrs(data$i,data$sqnz) hist (scrs) Hier modellieren wir jede Base in der Sequenz als unabhängige ZV, die mit gleicher Wahrscheinlichkeit die Werte A,C,G und T annehmen kann. Eine Realisierung n solcher ZVen liefert uns dann eine Sequenz der Länge n. Die Scores werden dann wie in der Vorlesung besprochen berechnet.

3 b) Die in a) erhaltenen Scores stellen Realisierungen einer Zufallsvariablen dar. Bedenkt man, wie die einzelnen Scores berechnet werden und mit Vorlesung 8 im Hinterkopf, welche Verteilung ist für diese Zufallsvariable zu erwarten? Wie gut ist diese Erwartung erfüllt? (verwende geeignete graphische Darstellungen). Schätze die Parameter dieser Verteilung. #-- parameter schaetzen und plotten # qqnorm((scors-mean(scors))/sd(scors)) qqline((scors-mean(scors))/sd(scors),lw=2) Modelliert man eine Sequenz S als 13 unabhängige gleichverteilte ZVen X i mit Wertebereich {A,C,G,T} und dem Paar GT in der Mitte (X 8 = G, X 9 = T ), so ist der assoziierte Score die Summe transformierter ZVen X i = D Xi,i log(1/4), wenn D der (elementweise) Logarithmus der Donor Frequency Matrix ist. Als Summe von ZVen kann man dann für die Scores eine Normalverteilung erwarten. Abweichungen kommen daher, dass die Summe nicht sehr groß ist (es sind nur 15 ZVen, die ja nicht normalverteilt sind) und dass die einzelnen Realisierungen nicht alle unabhängig sind (was das kleinere Problem ist). Man sieht im qq-plot, dass die erwartete Normalverteilung recht gut erfüllt ist. Wie schon aus dem Quellcode zu ersehen, läßt sich der Erwartungswert durch den Mittelwert schätzen und die Varianz eben durch 1/(n 1) n 1 (x i x) 2, die empirische Varianz.

4 c) Da man i.a. nur an Sequenzen interessiert ist, die mit hoher Wahrscheinlichkeit eine Splice Site darstellen, betrachte nun nur diejenigen Sequenzteile, deren Score einen bestimmten Threshold t übersteigt. Die Anzahl dieser Sequenzteile kann man wiederum als eine Zufallsvariable auffassen. Wie diese ZV empirisch verteilt ist, hängt im konkreten Fall hauptsächlich von der Länge der Ausgangssequenz und vom gewählten Threshold t ab. Variiere diese beiden Parameter und betrachte die resultierenden empirischen Verteilungen. Bei vernünftiger Wahl von Ausgangssequenzlänge und t ist annähernd eine Poissonverteilung zu beobachten. Illustriere das und gebe einen Schätzwert für λ an. Betrachtet man die einzelnen Scores als Realisierungen einer binomialverteilten Zufallsvariablen, welchen Parameter verändert man mit der Sequenzlänge und welchen mit dem Threshold? #-- funktion zum zaehlen von scores ueber einem threshold # abthrsh <- function(length, thresh){ data <- makeseq(length) return(sum(calcscrs(data$i,data$sqnz)>thresh))} #-- ziehen aus der verteilung der scores ueber dem threshold # samp <- sapply(1:500,function(x){abthrsh(1000,2.2)}) #-- plotten der ergebnisse # par (mfcol=c(2,1) ) hist (samp,freq=f,nclass=20,main="histogramm" ) lines (dpois(1:max(samp),mean(samp)),col=2 ) qqplot(rpois(5000,mean(samp)),samp,main="qq-plot" ) lines (c(0,max(samp)),c(0,max(samp)),col=2 )

5 In b) hatten wir ja gesehen, dass der Score ζ durch eine ZV beschrieben werden kann. Der Wertebereich W dieser ZV ist diskret und endlich. Wie groß er ist und wie er genau aussieht, hängt von D (Donor Frequency Matrix) ab. Legt man nun einen Threshold t fest, so erfüllt nur ein bestimmter Teil V des Wertebereiches die Bedingung, dass die darin enthaltenen Elemente größer oder gleich t sind. Die Wahrscheinlichkeit P (ζ = z z V ) = p kann man dann als die Erfolgswahrscheinlichkeit einer bernoulliverteilten ZV auffassen. Berechnet man dann viele Scores (n Stück) und zählt wie viele über dem Threshold t liegen, so ist das Ergebnis binomial verteilt mit Parametern n und p. Es ist auch klar, dass mit größerem t der Parameter p kleiner wird (in obiger Überlegung wird V kleiner und damit p). Für immer längere Sequenzen (d.h. mehr berechnete Scores, also größere n) und höhere Thresholds (d.h. kleinere p) geht unter der Bedingung np = λ die Binomialverteilung gegen eine Poissonverteilung (siehe Vorlesung). Einen Schätzer für den Parameter λ kann man entweder der Vorlesung 12 entnehmen oder z.b. den Maximum Likelihood Schätzer selbst berechnen: λ log n i λ x i x i! e λ = λ { n log(λ x i /(x i!)) nλ } = i n x i /λ n. i Nullsetzen liefert als Schätzer für λ den Mittelwert.

6 d) In c) haben wir die Anzahl von Sequenzteilen mit Scores größer als ein Threshold t betrachtet. Betrachtet man nun nur das Maximum der berechneten Scores, so kann man vermuten, dass es extremwertverteilt ist (vgl. Vorlesung 10). Parametrisiert man die Verteilungsfunktion folgendermaßen: F (x) = exp{ exp{ x a }}, b so kann man für die Parameter a und b Schätzer aus den folgenden Gleichungen für die Momente ableiten (der Mittelwert wird auch als erstes und die Varianz zweites zentrales Moment einer Verteilung bezeichnet): µ = a + bγ a b, σ 2 = b 2 π 2 / b 2, wobei γ die Eulersche Konstante darstellt und π bekannt sein dürfte. Berechne nun eine empirische Verteilungsfunktion der Score Maxima und schätze die Parameter a und b. Ist die Vermutung einer annähernden Extremwertverteilung erfüllt? #-- nuetzliche funktionen fuer die gumbel verteilung # dgumbel <- function(x,a,b){ if(b>=0) return( exp( -exp(-(x-a)/b) -(x-a)/b ) *1/b )} rgumbel <- function(n,a,b){ if(b>=0) return(a-b*log(-log(runif(n))))} getpars <- function(x){ b <- sqrt(6*var(x)/pi^2) a <- mean(x)-b* return(list(a=a,b=b))} #-- ziehen aus der verteilung der score-maxima # maxscr <- function(length){ data <- makeseq(length) return(max(calcscrs(data$i,data$sqnz)))} samp <- sapply(1:500,function(x){maxscr(1000)}) #-- plotten der ergebnisse # par (mfcol=c(2,1)) hist (samp, freq=f, nclass=20, main="histogramm") x <- seq(min(samp), max(samp),.1) lines (x, dgumbel(x, mean(samp)), col=2) qqplot (rgumbel(5000,getpars(samp)$a, getpars(samp)$b), samp, main="qq-plot") lines (c(0,max(samp)), c(0,max(samp)),col=2)

7 Hier sieht man, dass das Maximum der Scores nur langsam gegen eine Extremwertverteilung konvergiert; deshalb die schlechten qq-plots. Über die Momenten und ML Schätzer wurde in Vorlesung 12 berichtet.

8 Aufgabe 3. Wende das Modell aus Aufgabe 1 auf das Chromosom 21 an und finde potentielle Splice Sites. Eine natürliche Wahl des Thresholds auf t = t legt folgende Überlegung nahe: Sei P (splice S) die Wahrscheinlichkeit für das Modell der Donor Frequency Matrix D gegeben eine Sequenz S, während P (null S) die Wahrscheinlichkeit für das Nullmodell gegeben die gleiche Sequenz S bezeichne. Man ist nun interssiert an Sequenzen, für die das Nullmodell unwahrscheinlicher ist als D, d.h. an Sequenzen S für die gilt: P (splice S) P (null S) > 1 log P (splice S) P (null S) > 0 (1) Der Term auf den linken Seiten wird auch log posterior odds genannt. Umschreiben liefert: log P (splice S) P (null S) = log P (S splice) P (S null) + log P (splice) P (null) Zeige dies durch Anwenden der Rechenregeln bedingter und gemeinsamer Verteilungen. Der erste Term auf der rechten Seite entspricht unserem berechneten Score und wird auch log odds genannt. Der zweite Term auf der rechten Seite heißt auch log prior odds. Zeige: Für einen Threshold t ergibt sich nun aus (??): t = log P (splice) P (null). Um t ausrechnen zu können schätzen wir: und P (null) = 1 P (splice). P (splice) = # Splice Sites in Chr. 21 # betrachtete Sequenzen S Wieviele falsch positive Splice Sites sind für einen so errechneten Threshold t zu erwarten?

9 #-- genom 21 einlesen # data <- scan(file="hs_chr21all.fna", what=character(),skip=1) data <- paste (data,collapse="") tmp <- unlist(strsplit(gsub("gt","xt",data, perl=t),null)) ind <- grep ("X",tmp, perl=t) ; rm(tmp ) data <- unlist(strsplit(data,null)) #-- scores berechnen # scrs <- calcscrs(ind,data) #-- threshold und anzahl kandidaten-splice-sites berchnen # ps <- 440*7.8/length(scrs) pn <- 1-ps ; t <- -log(ps/pn) ncand <- sum(scrs[!is.na(scrs)]>t) # NA s kommen vom repeat masking #-- erwatete anz. scores > t im nullmodell # lamb lamb <- mean(sapply(1:500,function(x){abthrsh(10000,t)})) <- length(data)/10000*lamb cat(paste("\n number of candidate splice sites\t",ncand,"\n",sep="")) cat(paste("\n expected false positives \t",lamb,"\n",sep="")) Das Berechnen der Scores funktioniert so wie vorher auch. Allerdings ist das Chromosom 21 (man findet die gesamte Sequenz bei GenBank) relativ groß (ca 35 MBasen) und R eigentlich nicht das richtige Werkzeug für so eine Aufgabe. Deshalb muss man ein bißchen warten. Falls nicht genug Speicher für die obige Version des Quelltextes zur Verfügung steht, kann man auch die perl=t Parameter weglassen. Dauert dann aber (noch) länger. Ausserdem kann man durch eine effektivere Berechnung der Scores und der ausgewürfelten Sequenzen noch Zeit sparen. Im zweiten Teil sollte man erstmal die Formeln nachvollziehen. Benötigt wurde: P (A B) = P (A, B) P (B) = P (B A) P (A) P (B) Daraus folgt dann: P (splice S) = P (S splice) P (null S) = P (S null) P (splice S) = P (S splice) P (null S) P (S null) P (splice) P (S) P (null) P (S) P (splice) P (null)

10 und durch Logarithmieren die Formel aus dem Aufgabenzettel. Um den Threshold nachzurechnen, kann man die Formel (1) benutzen und einsetzen: log P (splice S) P (null s) = log P (S splice) P (S null) + log P (splice) P (null) 0 oder äquivalent log P (S splice) P (S null) log P (splice) P (null) Für das Gleichheitszeichen folgt dann der Threshold t. Um t dann auch wirklich zu bestimmen brauchte man P (splice). Die Anzahl der Gene auf Chromosom 21 ist 440 (NCBI) und der Mensch hat im Schnitt 7.8 Exons pro Gen (Venter et al. (2001) Science 291: ), von denen wir hier mal annehmen, dass sie eine 5 Splice Site haben. Mit der Sequenz des gesamten Chromosoml liefert das ein t von ca Als Letztes sollte man die Anzahl der erwarteten falsch positiven Kandidaten Splice Sites schätzen. Gemeint war, dass man das Nullmodell nimmt und schaut, wieviele Scores unter dieser Nullhypothese mit Werten über t erwartet werden. Wir wissen schon dass diese Scores annähernd poissonverteilt sind, es fehlt nur noch der entsprechende Parameter λ, der dann ja auch gleich der Erwartungswert ist (den wir suchen).. Diesen könnte man jetzt wie in Aufgabe 2 schätzen, allerdings dauert das dann sehr lange (wir haben ja auch eine sehr lange Sequenz). Alternativ schätzt man für eine kürzere Sequenz ein λ k und extrapoliert dann linear. Das funktioniert recht gut, wie man links sehen kann. Also benutzt man: λ k = pn k und λ = n/n k λ k Ganz konsequent ist das nicht, aber man hofft, dass in dem Bereich, den man mit der Extrapolation abdeckt, die Poissonapproximation gut ist. Läßt man das obige Programm laufen, so bekommt man ca Kandidaten Splice Sites und erwartet unter dem Nullmodell ca