### Tutorium 2 ### ## Aufgabe 2 ## #a) # Einlesen der Daten leukaemie<- read.table("leukaemie.txt") # Ueberblick ueber die Daten head(leukaemie) str(leukaemie) summary(leukaemie) # moegliche Klassenzugehoerigkeiten unique(leukaemie$y) # Definieren der verschiedenen Farben fuer die Klassen # Die Klassen sind hier "gesunde Versuchsperson" und "Leukaemiepatient" col.class <- ifelse(leukaemie$y==1,"green","red") col.class # Plotten der Daten plot(leukaemie$M92287.at, leukaemie$M11722.at, col=col.class) # Man sieht, dass sich die Daten anhand der # beiden betrachteten Variablen gut trennen lassen. # b) library(MASS) ?lda # Die Funktion lda() berechnet eine lineare Diskriminanzanalyse # LINEARE Diskriminanzanalyse # => Annahme gleicher Kovarianzen in den Klassen! # Die a-priori-Wahrscheinlichkeiten werden aus den Daten geschaetzt # (Bayes-Zuordnung) # Berechnung der LDA mit den Einflussgroessen M92287.at und M11722.at # Zielgroesse: Leukaemieerkrankung # Einflussgroessen: die beiden Genexpressionen M92287.at und M11722.at # => anhand der Genexpressionen soll festgestellt werden, # ob ein Patient gesund ist, oder an Leukaemie erkrankt ist lda.leukaemie <- lda(y~M92287.at+M11722.at,data=leukaemie) lda.leukaemie$prior # 1 2 # 0.6527778 0.3472222 # Priori Wahrscheinlichkeiten der Daten: # table(leukaemie$y)/nrow(leukaemie) lda.leukaemie$means # M92287.at M11722.at # 1 1.9796774 1.6623003 # 2 0.6443459 -0.7404875 ## Ein Mittelwertsvektor fuer die beiden Klassen #c) ############################################### ## Anwendung der geschaetzten Zuordnungsregel ## ############################################### # Definition eines Gitters fuer M92287.at und M11722.at new.gen1 <- rep(seq(min(leukaemie$M92287.at), max(leukaemie$M92287.at),length=100), 100) new.gen2 <- rep(seq(min(leukaemie$M11722.at), max(leukaemie$M11722.at),length=100), each=100) # Generierung neuer Daten new.gen <- data.frame(new.gen1,new.gen2) names(new.gen) <- c("M92287.at", "M11722.at") # enthaelt jede moegliche Kombination der jeweils 100 Gitterpunkte # => 10000 Kombinationen plot(new.gen) # Vorhersage fuer das Gitter auf Basis der durch die LDA # definierte Vorhersageregel ?predict.lda # Klassifiziert multivariate Beobachtungen nach # der Zuordnungsregel der LDA # Projeziert die Daten auf die linearen Diskriminanten lda.pred.class <- predict(lda.leukaemie,newdata=new.gen)$class lda.pred.class # Faktorvariable, die fuer jeden der 10000 Eintraege in new.gen angibt, # ob der Patient gesund ist, oder an Leukaemie erkrankt # Klassifizierung fuer new.gen (Trennlinie des Gitters) table(lda.pred.class) # 1 2 # 5684 4316 # wahre Klassenzugehoerigkeit vs. prognostizierte Klassenzugehoerigkeit table(original=leukaemie$y, predicted=predict(lda.leukaemie)$class) # predicted #original 1 2 # 1 44 3 # 2 1 24 # => von den 47 gesunden Personen, werden drei faelschlicherweise als # krank eingeordnet. # von den 25 kranken Personen, wird eine faelschlicherweise als # gesund eingeordnet #################### ## Visualisierung ## #################### lda.col.pred <- ifelse(lda.pred.class==1,"green","red") plot(new.gen$M92287.at,new.gen$M11722.at,col=lda.col.pred) points(leukaemie$M92287.at,leukaemie$M11722.at, col=col.class, pch=20) points(leukaemie$M92287.at,leukaemie$M11722.at) # wahre Daten # Man erkennt: Die Trennlinie ist eine Gerade (war zu erwarten, # da LINEARE Diskriminanzanalyse!). Die Klassifizierung funktioniert # insgesamt sehr gut! # d) ?qda # Die Funktion qda() berechnet eine Quadratische Diskriminanzanalyse # => Annahme unterschiedlicher Kovarianzen in den Klassen! # Berechnung der QDA mit den Einflussgroessen M92287.at und M11722.at # Zielgroesse: Leukaemieerkrankung # Einflussgroessen: die beiden Genexpressionen M92287.at und M11722.at # => anhand der Genexpressionen soll festgestellt werden, # ob ein Patient gesund ist, oder an Leukaemie erkrankt ist qda.leukaemie <- qda(y~M92287.at+M11722.at,data=leukaemie) # Vorhersage fuer das Gitter aus c) auf Basis der durch die QDA # definierte Vorhersageregel qda.pred.class <- predict(qda.leukaemie,newdata=new.gen)$class # # Klassifizierung fuer new.gen table(qda.pred.class) # 1 2 # 6561 3439 # wahre Klassenzugehoerigkeit vs. Prognostizierte Klassenzugehoerigkeit table(original=leukaemie$y, predicted=predict(qda.leukaemie)$class) # predicted #original 1 2 # 1 44 3 # 2 2 23 # => von den 47 gesunden Personen, werden drei faelschlicherweise # als krank eingeordnet # von den 25 kranken Personen, weden zwei faelschlicherweise # als gesund eingeordnet #################### ## Visualisierung ## #################### qda.col.pred <- ifelse(qda.pred.class==1,"green","red") plot(new.gen$M92287.at,new.gen$M11722.at,col=qda.col.pred) points(leukaemie$M92287.at,leukaemie$M11722.at, col=col.class, pch=20) points(leukaemie$M92287.at,leukaemie$M11722.at) # wahre Daten # Trennlinien sind jetzt KEINE Geraden mehr, # sondern quadratische Funktionen; # Die Klassifizierung funktioniert aehnlich gut! # => In diesem Fall ist sogar die lineare Diskriminanzanalyse besser! # => Quadratische Diskriminanzanalyse ist nicht automatisch # der linearen vorzuziehen!