Презентация http://makarich.fbb.msu.ru/artemov/R/R_3_2015.pdf

= Тесты ассоциации и циклы =
== Исходные данные ==
Количество людей - носителей и не носителей альтернативных аллелей для различных полиморфных позиций: таблица variant_counts.csv http://makarich.fbb.msu.ru/artemov/R/variant_counts.csv

Аргумент row.names=1 сообщает, что первый столбец таблицы хранит названия (номера) рядов.
{{{
varcounts=read.csv("http://makarich.fbb.msu.ru/artemov/R/variant_counts.csv", header=T, row.names=1)
}}}

Соответствие полиморфных позиций в геноме и генов
http://makarich.fbb.msu.ru/artemov/R/variant_genes.csv
{{{
vargenes=read.csv("http://makarich.fbb.msu.ru/artemov/R/variant_genes.csv", row.names=1, header=T)
}}}

== Тесты ассоциации ==
Создадим вручную таблицу (матрицу) сопряженности:
{{{
gwas=matrix(c(3324,1896,2676,2104), nrow=2, ncol=2)
colnames(gwas)=c("reference", "mutant")
rownames(gwas)=c("Healthy", "Diseased")
gwas
}}}

Применим тест ассоциации:
{{{
fisher.test(gwas)
chisq.test(gwas)
}}}

Как вытащить p-value (число):
{{{
y=fisher.test(gwas)
y$p.value
}}}

== Циклы ==
Посчитаем для каждой мутации частоту в европейской популяции. Для программ длиннее 1 строчки удобнее сохранять их исходный ход в файле: File -> New file -> R script

С символа # начинается комментарий - то, что игнорируется интерпретатором
{{{
#создадим пустой вектор, куда будем класть результаты
freq=c()
#1:nrow(varcounts) - вектор от 1 до кол-ва строк в varcounts. 
#Переменная i пробегает все значения этого вектора по очереди, для каждого выполняется то, что написано в фигурных скобках
for(i in 1:nrow(varcounts)){
    frequency_i=varcounts[i, "EA_alt"] / (varcounts[i, "EA_ref"] + varcounts[i, "EA_alt"])
    #добавляем вычисленное число в вектор результатов:
    freq=c(freq, frequency_i)
}
}}}

== Функции и apply ==
Возьмем "числовую" часть dataframe-а и превратим его в матрицу:
{{{
mvarcounts=as.matrix(varcounts[,3:6])
typeof(mvarcounts)
}}}

Определим функцию, которая, получая на вход строку таблицы (вектор из 4 чисел), выполняет тест ассоциации и возвращает p-value: 
{{{
association.test <- function(v){
	m=matrix(v, nrow=2, ncol=2) #создаем матрицу
	res=fisher.test(m)
	return(res$p.value)
}
}}}
Что такое "возвращает":
{{{
association.test(c(3,1,1,3))
}}}
Применим данную функцию к каждой строке матрицы - получим вектор p-value:

Второй аргумент - измерение таблицы (1 - строки, 2 - столбцы)
{{{
pv=apply(mvarcounts, 1, association.test)
varcounts$pvalue=pv
}}}


== Merge и aggregate ==
Исходные таблицы

http://makarich.fbb.msu.ru/artemov/R/example_agg/grades.csv

http://makarich.fbb.msu.ru/artemov/R/example_agg/metadata.csv

Задачи:

(1) Вычислите средние оценки для мальчиков и девочек.

(*) "Расплавьте" таблицу (melt) и нарисуйте ggplot боксплот оценкок по разным предметам

(*) Повторите пример (1) c использованием dplyr


=== reahape2 + dplyr ===
reshape2:
{{{
#df1 - некоторый dataframe
library(reshape2)
df2 = melt(df1, id.vars=c(var1, var2))
#var1, var2 останутся как колонки в новом dataframe
}}}

dplyr
{{{
#df1 - некоторый dataframe
#с колонками var1, var2, var3

library(dplyr)

#Традиционная запись
df2 = group_by(df1, var1)
df_aggregated = summarize(df2, mean_var3=mean(var3))
#или
df_aggregated = summarize(group_by(df1, var1), mean_var3=mean(var3))


#"Синтаксический сахар" - pipe - более удобная запись
df_aggregated = df1 %>% group_by(var1) %>% summarize(mean_var3=mean(var3))

#Можно группировать по нескольким переменным
df_aggregated = df1 %>% group_by(var1, var2) %>% summarize(mean_var3=mean(var3))

#Можно агрегировать по многим колонкам - summarize_each
}}}