Презентация 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 }}}