V prvej casti cvicenia si kratko vyskusate zhlukovanie dat v R a jednoduche zobrazenie najdenych zhlukov. Posluzi nam priklad z prednasky: set1 <- matrix(cbind(rnorm(100,0,2),rnorm(100,0,2)),100,2) set2 <- matrix(cbind(rnorm(100,0,2),rnorm(100,8,2)),100,2) set3 <- matrix(cbind(rnorm(100,8,2),rnorm(100,0,2)),100,2) set4 <- matrix(cbind(rnorm(100,8,2),rnorm(100,8,2)),100,2) dati <- list(values=rbind(set1,set2,set3,set4),classes=c(rep(1,100),rep(2,100),rep(3,100),rep(4,100))) # clustering - common methods op <- par(mfcol = c(2, 2)) par(las =1) plot(dati$values, col = as.integer(dati$classes), xlim=c(-6,14), ylim = c(-6,14), xlab="", ylab="", main = "True Groups") party <- kmeans(dati$values,4) plot(dati$values, col = party$cluster, xlab = "", ylab = "", main = "kmeans") hc = hclust(dist(dati$values), method = "ward") memb <- cutree(hc, k = 4) plot(dati$values, col = memb, xlab = "", ylab = "", main = "hclust Euclidean ward") hc = hclust(dist(dati$values), method = "complete") memb <- cutree(hc, k = 4) plot(dati$values, col = memb, xlab = "", ylab = "", main = "hclust Euclidean complete") par(op) Cielom zvysnej casti cvicenia je zoznamit sa s pracou s grafmi v R a vytvorit funkciu, ktora zobrazi ako graf okolie lubovolneho vrcholu grafu. Nasledovne tuto funkciu vylepsime o graficke znazornenie vlastnosti vrcholov. Ako priklad pouzijeme sadu dat z kvasiniek. Obsahuje zoznam proteinov "yeast_proteins.txt", ich sekvencie "yeastProteins.fasta", interakcie "yeast_interactions.txt" a vlastnosti "yestProteins.Rdata". Budeme pouzivat balik "igraph" library(igraph) Nacitame si data do premennych v R. edge <- read.table("yeast_interactions.txt") vert <- read.table("yeast_proteins.txt") orfs <- vert[,2] # nazvy genov vert <- vert[,1] # budeme pouzivat len cisla vrcholov a vytvorime prislusny graf (datovy objekt) g <- graph.data.frame(edge,vertices=vert,directed=FALSE) Vykreslit podgraf pre prvych 10 hran je jednoduche plot(subgraph(g,1:10)) Vsimnite si, ze zobrazenie pri opakovanom volani funkcie vyzera vzdy trochu inak. Aby obrazky boli informativne uniestnime do nich oznacenie z premennej "orfs" a upravime velkost pisma a niekolko dalsich parametrov plot(subgraph(g,1:10),vertex.label=orfs[1:10],vertex.label.cex=0.8,vertex.label.dist=1,vertex.label.degree=-pi/2) Umiestnenie uzlov je v tejto chvili nahodne, nechame ich rozmiestnit do kruhu plot(subgraph(g,1:10),vertex.label=orfs[1:10],vertex.label.cex=0.8,vertex.label.dist=1,vertex.label.degree=-pi/2,layout=layout.circle) Takto vytvoreny graf nam posluzi ako podklad pre vizualizaciu. Pokusime sa najprv zobrazit na grafe nejake zaujimave vlastnosti proteinov z kvasiniek. Jednou z takych vlastnosti moze byt molekulova hmotnost. Hypotezou by mohlo byt, ze vacsie proteiny maju viac partnerov. Pozrime sa najprv na datovy subor (pochadza z baliku ppiData; ppi = protein/protein interaction) load("yeast_proteins.Rdata") names(proteinProperty) # nazvy stlpcov (premennych) v tabulke head(proteinProperty) # prvych 6 riadkov v tabulke Dalej nas bude zaujimat head(proteinProperty$FEATURE) # identifikator head(proteinProperty$MOL) # molekulova hmotnost head(proteinProperty$GRAVY) # hydrofobicita Vyuzijeme tieto tri udaje na konstrukciu jednoduchych funkcii zistujucich mol.hmotnost lubovolneho proteinu zadaneho pomocou identifikatora alebo jeho hydrofobicitu # mw <- function (id) { as.numeric(as.vector(proteinProperty$MOL[which(proteinProperty$FEATURE == id)])) } # hf <- function (id) { as.numeric(as.vector(proteinProperty$GRAVY[which(proteinProperty$FEATURE == id)])) } Overte si, ze mw("YAL005C") hf("YAL005C") je 69767 a -0.426013. Teraz vytvorime vektor s velkostami pre uzly grafu odvodenymi z mol.hmotnosti a farbou podla hydrofobicity size <- as.numeric(as.vector(mapply(mw,as.vector(orfs)))) colr <- as.numeric(as.vector(mapply(hf,as.vector(orfs)))) a priradime preskalovane vlastnostiam vrcholov grafu V(g)$size <- size/10000 V(g)$color <- floor((colr+2.5)*2) a teraz spojime vsetky vylepsenia plot(subgraph(g,1:10),vertex.label=orfs[1:10],vertex.label.cex=0.8,vertex.label.dist=1,vertex.label.degree=-pi/2,layout=layout.circle) Vytvorte funkciu, ktorej argument bude identifikator a graf, a ktora Vam vrati zoznam uzlov, ktore s danym uzlom susedia. Vyuzit mozete funkciu neighbor(). Vylepsite tuto funkciu aby rovno vytvorila prislusny podgraf, ktory sa da zobrazit prikazom plot().