2013-06-08 2 views
7

См. Править ниже Используя R, я хотел бы отфильтровать матрицу (данных генной экспрессии) и сохранить только строки (гены/зонды), которые имеют значения с высоким дисперсия. Например, я хотел бы сохранить только строки, которые имеют значения в нижнем и верхнем процентилях (например, ниже 20% и выше 80%). Я хочу ограничить свое исследование только генами с высокой дисперсией для анализа в нисходящем направлении. Существуют ли общие способы фильтрации генов в R?R, матрица фильтра на основе отклонений дисперсии

Моя матрица имеет 18 образцов (столбцов) и 47000 зондов (строк) со значениями, которые преобразуются и нормализуются log2. Я знаю, что функция quantile() может идентифицировать отсечки 20% и 80% в каждом столбце образца. Я не могу понять, как найти эти значения для всей матрицы, а затем подмножить исходную матрицу, чтобы удалить все «неизменяемые» строки.

Пример матрицы со средним значением 5,97, таким образом, последние три строки должны быть удалены, поскольку они содержат значения между 20% и 80% обрезаний:

> m 

       sample1 sample2 sample3 sample4 sample5 sample6 
ILMN_1762337 7.86 5.05 4.89 5.74 6.78 6.41 
ILMN_2055271 5.72 4.29 4.64 5.00 6.30 8.02 
ILMN_1736007 3.82 6.48 6.06 7.13 8.20 4.06 
ILMN_2383229 6.34 4.34 6.12 6.83 4.82 5.57 
ILMN_1806310 6.15 6.37 5.54 5.22 4.59 6.28 
ILMN_1653355 7.01 4.73 6.62 6.27 4.77 6.12 
ILMN_1705025 6.09 6.68 6.80 6.85 8.35 4.15 
ILMN_1814316 5.77 5.17 5.94 6.51 7.12 7.20 
ILMN_1814317 5.97 5.97 5.97 5.97 5.97 5.97 
ILMN_1814318 5.97 5.97 5.97 5.97 5.97 5.97 
ILMN_1814319 5.97 5.97 5.97 5.97 5.97 5.97 

Я оценил бы любые предложения или функции, которые Я должен заглянуть. Спасибо!

EDIT

К сожалению, я не очень ясно, в ОП. (1) Я хотел бы знать значения отсечки 20% и 80% для всей матрицы (не только для каждой отдельной выборки). (2) Затем, если какая-либо строка содержит значение в верхнем или нижнем процентилях, R будет хранить эти строки. Если строка содержит значения (для всех выборок), которые приближаются к среднему значению, эти строки выбрасываются.

+0

Спасибо за разъяснение. Я также обновил свой ответ, чтобы отразить то, что вы надеялись достичь. Быстрый вопрос - есть ли у вас матрица или кадр данных (т. Е. Является ли столбец идентификатора именем вашей матрицы или первым столбцом вашего фрейма данных?). Быстрый способ проверить будет «class (m)». –

+0

Это должна быть матрица (только данные выражения), а столбец ID - это имена для моей матрицы (я должен был оставить имя «ID» из моего примера). – Todd

+0

Отлично! Вот что я подумал с моим примером. –

ответ

6

Хорошо, предполагая, что у вас есть матрица (поэтому я предполагаю, что ваш столбец идентификатора фактически является именами ростов), тогда это очень просто сделать.

# First find the desired quantile breaks for the entire matrix 
qt <- quantile(m , probs = c(0.2,0.8)) 
# 20% 80% 
#5.17 6.62 
# Next get a logical vector of the rows that have any values outside these breaks 
rows <- apply(m , 1 , function(x) any(x < qt[1] | x > qt[2])) 
# Subset on this vector 
m[ rows , ] 
#   sample1 sample2 sample3 sample4 sample5 sample6 
#ILMN_1762337 7.86 5.05 4.89 5.74 6.78 6.41 
#ILMN_2055271 5.72 4.29 4.64 5.00 6.30 8.02 
#ILMN_1736007 3.82 6.48 6.06 7.13 8.20 4.06 
#ILMN_2383229 6.34 4.34 6.12 6.83 4.82 5.57 
#ILMN_1806310 6.15 6.37 5.54 5.22 4.59 6.28 
#ILMN_1653355 7.01 4.73 6.62 6.27 4.77 6.12 
#ILMN_1705025 6.09 6.68 6.80 6.85 8.35 4.15 
#ILMN_1814316 5.77 5.17 5.94 6.51 7.12 7.20 

any(x < qt[1] | x > qt[2]) часть функции apply (которая предназначена для применения функции по краям матрицы) возвращает TRUE если любого значения в этой строке находится за пределами 20% и 80% квантилей вашего матрица выборки. По определению, если значение не находится за пределами этих границ, оно возвращает FALSE, указывая, что мы опустим эту строку в следующей строке.

+0

Спасибо за ваше редактирование! Ваше решение кажется очень прямым. – Todd

+1

@Todd Отлично! Если какое-либо из трех представленных решений адекватно решит вашу проблему, вы можете захотеть отметить один из них в качестве принятого ответа, чтобы этот вопрос больше не оставался без ответа (конечно, если вам нужно что-то еще, пожалуйста, сообщите нам). Вот страница [** about **] (http://stackoverflow.com/about), если вам нужна дополнительная информация о том, как работает SO. Ура! –

+0

Это решение делает именно то, что я просил в моем OP! Тем не менее, я также изучаю пакет Bioconductor genefilter для альтернативных методов, которые могут быть очень полезными. Спасибо всем за вашу большую поддержку и терпение благодаря моим ограниченным знаниям R и stackoverflow. – Todd

1

Я не специалист по статистике, поэтому я не знаю, существует ли общий метод для решения этой проблемы. Для меня проблема будет проще, если вы измените свои данные в длинном формате.

library(reshape2) 
dat.m <- melt(dat) 
dat.m$value <- as.numeric(dat.m$value) 
head(dat.m) 
      ID variable value 
1 ILMN_1762337 sample1 7.86 
2 ILMN_2055271 sample1 5.72 
3 ILMN_1736007 sample1 3.82 
4 ILMN_2383229 sample1 6.34 
5 ILMN_1806310 sample1 6.15 
6 ILMN_1653355 sample1 7.01 

Тогда для каждой переменной сделать следующее:

  1. пределы Compute с использованием квантиль
  2. удалить гены, которые не удовлетворяют условию.

Вы можете сделать это, например, с помощью ddply из plyr:

res <- ddply(dat.m,.(variable),function(x){ 
    ## compute limits for each sample 
    z <- x$value 
    qq <- quantile(z, probs = c(0.2,0.8)) 
    ## keep only genes with high or low variance 
    dd <- x[z < qq[1] | z > qq[2],] 
}) 
## return to the wide format 
acast(res,ID~variable) 

      sample1 sample2 sample3 sample4 sample5 sample6 
ILMN_1653355 7.01  NA 6.62  NA 4.77  NA 
ILMN_1705025  NA 6.68 6.80 6.85 8.35 4.15 
ILMN_1736007 3.82 6.48  NA 7.13 8.20 4.06 
ILMN_1762337 7.86  NA 4.89  NA  NA  NA 
ILMN_1806310  NA  NA  NA 5.22 4.59  NA 
ILMN_1814316  NA  NA  NA  NA  NA 7.20 
ILMN_2055271 5.72 4.29 4.64 5.00  NA 8.02 
ILMN_2383229  NA 4.34  NA  NA  NA  NA 

EDIT после О.П. разъяснений, если вы хотите, чтобы значения отсечки 20% и 80% для всей матрицы не только для каждый отдельный образец, вы вычисляете QQ вне ddply

qq <- quantile(dat.m$value, probs = c(0.2,0.8)) 

Тогда вы прокомментируете соответствующую строку, например:

res <- ddply(dat.m,.(variable),function(x){ 
    z <- x$value 
    ## keep only genes with high or low variance 
    dd <- x[z < qq[1] | z > qq[2],] 
}) 

PS здесь Дат является:

dat <- read.table(text='   ID sample1 sample2 sample3 sample4 sample5 sample6 
ILMN_1762337 7.86 5.05 4.89 5.74 6.78 6.41 
ILMN_2055271 5.72 4.29 4.64 5.00 6.30 8.02 
ILMN_1736007 3.82 6.48 6.06 7.13 8.20 4.06 
ILMN_2383229 6.34 4.34 6.12 6.83 4.82 5.57 
ILMN_1806310 6.15 6.37 5.54 5.22 4.59 6.28 
ILMN_1653355 7.01 4.73 6.62 6.27 4.77 6.12 
ILMN_1705025 6.09 6.68 6.80 6.85 8.35 4.15 
ILMN_1814316 5.77 5.17 5.94 6.51 7.12 7.20 
ILMN_1814317 5.97 5.97 5.97 5.97 5.97 5.97 
ILMN_1814318 5.97 5.97 5.97 5.97 5.97 5.97 
ILMN_1814319 5.97 5.97 5.97 5.97 5.97 5.97',header=TRUE) 
+0

+1 Я думаю, что мы оба оба неправильно поняли OP. Я думаю, что они хотят рассчитать 20 и 80% отсечки всей матрицы, а затем подмножество этих значений. –

+1

Да, это * «Я не могу понять, как найти эти значения для всей матрицы» *, а затем * «последние три строки должны быть удалены, поскольку они содержат значения между отсечениями 20% и 80%» * что заставляет меня сомневаться в нашем первоначальном предположении. Возможно, ОП может уточнить? –

+0

Извините, я не был очень ясен в OP. (1) Я хотел бы знать значения отсечки 20% и 80% для всей матрицы (не только для каждой отдельной выборки). Затем, если какая-либо строка содержит значение в верхнем или нижнем процентилях, R будет хранить эти строки. Если строка содержит значения (для всех выборок), которые приближаются к среднему значению, эти строки выбрасываются. Это помогает? Большое спасибо за ваши предложения - я довольно новичок в R. – Todd

3

Пакет Biocondcutorgenefilter обеспечивает общие фильтры, имеющие отношение к анализу микрочипов. Типичный фильтр на основе строчной изменчивости будет

m = matrix(rnorm(47000 * 6), 47000) 
varFilter(m) 

В пакете ссылку целевой страницы виньетки, иллюстрирующие основные операции и обеспечение диагностического руководства для фильтрации.

Основным принципом анализа микрочипов является то, что значения в строке сопоставимы, но не значения между строками. Это связано с тем, что зонды, связанные с каждой строкой, имеют разные характеристики, которые приводят к смещению по строкам - значение в первой строке может разумно указывать больше, меньше или равномерное выражение гена по сравнению со значением для одного и того же образца во второй строке. Это означает, что желание @ Тодда нормализовать на основе сравнения между строками (самые большие и наименьшие значения во всей матрице) не рекомендуется. Вместо этого varFilter вычисляет меру вариабельности каждой строки (интервал между рядами строк) и выбирает фракцию (аргумент var.cutoff) с большей изменчивостью.

Быстрый пик при определении varFilter показывает, что в целом это не сложнее, чем для какой-то мере строчном изменчивости var.func и а (сингл) квантильному var.cutoff

vars <- apply(m, 1, var.func) 
m[vars > quantile(vars, var.cutoff), ] 
+0

+1! выглядит хорошо. Я сделал следующее: 'mm <- as.matrix (dat [, - 1]); rownames (mm) <- dat [, 1]; rr <- varFilter (mm, var.cutoff = c (0.2.0.8)) ', но я получаю предупреждения, я что-то пропускаю? – agstudy

+0

Спасибо за подсказку - я сразу посмотрю на это, так как могут быть стандартные способы сделать это. – Todd

+0

Спасибо @Martin за ваше объяснение «лучших практик» для фильтрации генных массивов. Я планирую использовать ваше решение для своего набора данных. – Todd

Смежные вопросы