Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 2014

Линейные модели часть2

Презентация тут: [лекция 7]

Сравнение моделей с помощью ANOVA

laptop=read.csv(file="laptop_price.csv", header=T)
fit2=lm(Price_RUR ~ Memory_Gb+HDD_Gb+HDD_type, data=laptop)
fit1=lm(Price_RUR ~ Memory_Gb, data=laptop)
anova(fit1, fit2)

Противоположный пример

fit1=lm(Price_RUR ~ Memory_Gb+HDD_Gb+HDD_type+Color,
          data=laptop)
fit2=lm(Price_RUR ~ Memory_Gb+HDD_Gb+HDD_type, data=laptop)
anova(fit1, fit2)

Предсказание с помощью модели

L3 = lm(formula = Price_RUR ~ HDD_Gb + HDD_type + HDD_Gb:HDD_type, data = laptop)
newlaptops=data.frame( HDD_Gb=c(200, 1000,                               500), HDD_type=c("SSD", "HDD", "HDD"))
predict( L3, newlaptops )

Кросс-валидация

library(DAAG)
cv.lm(laptop, L3, m=5) 

Дополнительный аргумент – функция cost, по умолчанию:

cost=function(y, ypred) { mean ( (y-ypred)^2 ) }

glm – обобщенные линейные модели

Регрессия Пуассона

Пример: растет ли посещаемость сайта со временем gaData.rda

load('gaData.rda')
gaData$julian<-julian(gaData$date)

plot(gaData$visits~gaData$julian, xlab="julian",      ylab="visits", pch=19, col="darkgrey")
lm1<-lm(gaData$visits~gaData$julian)
abline(lm1, col='red', lwd=3)
glm1<-glm(gaData$visits~gaData$julian, family='poisson')
lines(gaData$julian, glm1$fitted, col='blue', lwd=3)

Логистическая регрессия

Пример: таблица выигрышей команды. Хотим вычислять вероятность выигрыша в зависимости от количества очков ravensData.rda

load("ravensData.rda")

lmRav<-  lm(ravensData$ravenWinNum~ravensData$ravenScore)
plot(ravensData$ravenScore, lmRav$fitted, pch=19, col='red', ylab="Prob win")

logReg<-glm(  ravensData$ravenWinNum~ravensData$ravenScore,   family="binomial")
logReg

plot(ravensData$ravenScore, ravensData$ravenWinNum,      pch=19, col='blue')

points(ravensData$ravenScore, logReg$fitted, pch=19,        col='red')

Кросс-валидация для категориальной зависимой переменной

Предскажем наличие SSD в ноутбуке по его цене и объему диска

gl1=glm(HDD_type ~ Price_RUR + HDD_Gb,
          family=binomial, data=laptop)
gl1
plot(predict( gl1 ) ~ laptop$HDD_type)
plot(predict( gl1, type="response" ) ~ laptop$HDD_type)

cost=function( y, ypred ) {
  mean( abs(y-ypred)>0.5 )
}

library(boot)
cv1=cv.glm(laptop, gl1, cost, K=3)

Задача

Исходные данные. в аннотированных энхансерах и промоторах в геноме вычислены уровни различных эпигенетических модификаций: модификации гистонов 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)

gl2=glm(Type ~ H3k4me1 + H3k4me3, family=binomial, data=tab2)
anova(gl2, gl, 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 и другие классификаторы).