Исходные данные. в аннотированных энхансерах и промоторах в геноме вычислены уровни различных эпигенетических модификаций: модификации гистонов H3K27ac, H3K27me3, H3K36me3, H3K4me1, H3K4me3, H3K9me3, ChIP-seq на РНК-полимеразу II (Pol2) и CTCF.
В таблице http://makarich.fbb.msu.ru/artemov/R/enhancer_promoter.tab приведены уровни эпигенетических сигналов, а первый столбец Type указывает на то, является отрезок энхансером (1) или промотором (0).
Задача: научиться отличать по эпигенетическим модификациям промоторы от энхансеров.
tab2=read.table("http://makarich.fbb.msu.ru/artemov/R/enhancer_promoter.tab", header=T, stringsAsFactors=F)
Визуализация данных
library(gplots) #Корреляции между предикторами, а также между предикторами и outcome heatmap.2(cor( tab2 ), col="bluered", symbreaks=T)
heatmap: возьмем 100 случайных промоторов и 100 случайных энхансеров:
heatmap.2(data.matrix(tab2[c(sample(which(tab2$Type==0), 100), sample(which(tab2$Type==1), 100)),2:ncol(tab2)]), trace="none", col="bluered", scale="column", breaks= (-20:20)/10, Rowv=F, RowSideColors=c(rep("red", 100), rep("orange", 100))) #более детально: #вектор номеров строк, первые 100 указывают на строки с промоторами, последние 100 - на строки с энхансерами #c(sample(which(tab2$Type==0), 100), sample(which(tab2$Type==1), 100)) #Не перемешиваем по строкам (уже упорядочены так, как нам надо): Rowv=F, #Цвет сбоку от heatmap-а указывает, является элемент промотором (красный) или энхансером (оранжевый): #RowSideColors=c(rep("red", 100), rep("orange", 100))
Построение и сравнение обобщенных линейных моделей (логистическая регрессия)
Для начала, проведем логистическую регрессию от одной переменной, например, H3k4me3. По тем коэффициентам регрессии, которые получаются после обучения, модель строит линейную комбинацию предикторов - число от -Inf до Inf. Затем данное число нужно превратить в вероятность, что Type==1 (то есть объект - энхансер, а не промотер). Такие вероятности хранятся в векторе gl$fitted (для тех точек, на которых модель была обучена).
gl=glm(Type ~ H3k4me3, family=binomial, data=tab2) subsamp=sample(1:nrow(tab2), 200) plot(tab2[subsamp,]$H3k4me3, tab2[subsamp,]$Type, pch=19, col='blue', xlab="H3K4me3", ylab="Probability of being an enhancer") points(tab2[subsamp,]$H3k4me3, gl$fitted[subsamp], pch=19, col='red') legend("topright", legend=c("Real (0 or 1)", "Predicted by model"), fill=c("blue", "red"))
Модель с двумя предикторами (H3k4me1 + H3k4me3)
gl=glm(Type ~ H3k4me1 + H3k4me3, family=binomial, data=tab2) anova(gl2, gl1, test="Chisq")
Сравнение моделей
gl1=glm(Type ~ ., family=binomial, data=tab2) gl2=glm(Type ~ H3k4me1 + H3k4me3, family=binomial, data=tab2) anova(gl2, gl1) anova(gl2, gl1, test="Chisq")
Кросс-валидация.
cost=function( y, ypred ) { mean( abs(y-ypred)>0.5 ) } library(boot) cv1=cv.glm(tab2, gl, cost, K=5) cv1$delta
Примените кросс-валидацию к другим возможным моделям: например, к моделям с одним предиктором или к модели, учитывающей все предикторы (Type ~ .).
Можно ли без ущерба оставить только два предиктора?
(*) Автоматический выбор параметров
library(glmulti) gl=glmulti(Type ~ ., family=binomial, data=tab2, level=1)
To be continued (SVM и другие классификаторы).