Як шукати долини в графі?


10

Я вивчаю деякі дані геномного покриття, які в основному є довгим списком (кілька мільйонів значень) цілих чисел, кожне говорить про те, наскільки добре (або "глибоко") ця позиція в геномі охоплена.

Я хотів би шукати "долини" в цих даних, тобто регіони, які значно "нижчі", ніж їх навколишнє середовище.

Зауважте, що розмір долин, які я шукаю, може становити від 50 баз до кількох тисяч.

Які парадигми ви б рекомендували використовувати для пошуку цих долин?

ОНОВЛЕННЯ

Деякі графічні приклади даних: alt текст alt текст

ОНОВЛЕННЯ 2

Визначення, що таке долина, - це, звичайно, одне із питань, з якими я стикаюся. Це для мене очевидні: alt текст alt текст

але є кілька складніших ситуацій. Загалом, я вважаю 3 критерії: 1. (середнє? Максимальне?) Покриття у вікні щодо середнього показника в усьому світі. 2. Покриття у вікні (...) щодо його безпосереднього оточення. 3. Наскільки велике вікно: якщо я бачу дуже низьке покриття для короткого прольоту, це цікаво, якщо я бачу дуже низьке покриття для тривалого періоду, це також цікаво, якщо я бачу м'яке низьке покриття для короткого прольоту, це не дуже цікаво , але якщо я бачу м'яке низьке покриття на тривалий проміжок - це .. Так це поєднання довжини сапна і його покриття. Чим довше воно, тим вище я дозволяю бути покриттям і досі вважаю його долиною.

Дякую,

Дейв


Чи можете ви надати невеликий зразок даних?
Шейн

@Shane дивіться оновлення
David B

@David Дякую Як випливає з обох відповідей, тут можна застосувати аналіз часових рядів, оскільки ви замовили спостереження.
Шейн

На це важко відповісти, не знаючи, що саме ви шукаєте. Чи можете ви обвести точки на ділянках, які ви хочете зробити? Що ви вважаєте "долиною"? як низько це має йти і що ви хочете повернути? Важко сформулювати рішення, не знаючи питання, тобто порогів та іншого.
Фальмарі

@ Shane ♦ Дякую. Оскільки я не маю досвіду з аналізом часових рядів, чи можете ви залишити кілька покажчиків, з чого я повинен почати?
Девід Б

Відповіді:


5

Ви можете використовувати якийсь метод Монте-Карло, використовуючи, наприклад, ковзну середню кількість своїх даних.

Візьміть ковзну середню кількість даних, використовуючи вікно розумного розміру (я думаю, саме ви вирішите, наскільки широко).

Через ваші дані (звичайно) буде характеризуватися нижчий середній показник, тому тепер вам потрібно знайти якийсь "поріг", щоб визначити "низький".

Для цього ви можете випадково поміняти sample()місцями значення своїх даних (наприклад, використовуючи ) та перерахувати ковзну середню для своїх обмінних даних.

Повторіть цей останній уривок досить високу кількість разів (> 5000) і збережіть усі середні значення цих випробувань. Тож по суті у вас буде матриця з 5000 рядками, по одному на випробування, кожен з яких містить ковзну середню для цього випробування.

У цей момент для кожного стовпця ви вибираєте 5% (або 1% або все, що завгодно), тобто значення, під яким лежить лише 5% засобів рандомізованих даних.

Тепер у вас є "межа довіри" (я не впевнений, чи це правильний статистичний термін) для порівняння своїх вихідних даних. Якщо ви знайдете частину своїх даних, яка нижча за цю межу, ви можете викликати це через.

Звичайно, маючи на увазі, що ні цей, ні будь-який інший математичний метод ніколи не міг би дати вам жодних ознак біологічного значення, хоча я впевнений, що ви це добре знаєте.

EDIT - приклад

require(ares) # for the ma (moving average) function

# Some data with peaks and throughs 
values <- cos(0.12 * 1:100) + 0.3 * rnorm(100) 
plot(values, t="l")

# Calculate the moving average with a window of 10 points 
mov.avg <- ma(values, 1, 10, FALSE)

numSwaps <- 1000    
mov.avg.swp <- matrix(0, nrow=numSwaps, ncol=length(mov.avg))

# The swapping may take a while, so we display a progress bar 
prog <- txtProgressBar(0, numSwaps, style=3)

for (i in 1:numSwaps)
{
# Swap the data
val.swp <- sample(values)
# Calculate the moving average
mov.avg.swp[i,] <- ma(val.swp, 1, 10, FALSE)
setTxtProgressBar(prog, i)
}

# Now find the 1% and 5% quantiles for each column
limits.1 <- apply(mov.avg.swp, 2, quantile, 0.01, na.rm=T)
limits.5 <- apply(mov.avg.swp, 2, quantile, 0.05, na.rm=T)

# Plot the limits
points(limits.5, t="l", col="orange", lwd=2)
points(limits.1, t="l", col="red", lwd=2)

Це дозволить вам графічно знаходити регіони, але ви можете легко знайти їх, використовуючи щось на лінії which(values>limits.5).


Очевидно, що ви можете застосувати той самий підхід, використовуючи щось інше, ніж ковзну середню, це було лише для того, щоб дати ідею.
nico

+1 Дякую, Ніко. Дозвольте мені побачити, чи правильно я зрозумів: наприкінці це в основному як встановлення деякого глобального порогу та визначення будь-якої точки зі значенням <порог як частини долини. Вибірка тощо застосовується лише для отримання значущої міри (квантиля) для встановлення порогу. Чому ми не можемо використовувати єдиний поріг для цілих точок, я маю на увазі, якщо ми зробили достатньо симуляцій, ми отримаємо прямі (зчитувані та жовті) лінії. Також виправте мене, якщо я помиляюся, але це не враховує навколишнє середовище, а вивчає абсолютне значення кожної точки.
Девід Б

@David B: звичайно, ви можете використовувати глобальний поріг, і це, ймовірно, заощадить певний час розрахунку. Я думаю, що вибір чогось, як 1/3 глобальної середньої, може стати початком. Цей процес заміни, мабуть, корисніший, якщо ви використовуєте якусь іншу статистику, ніж ковзний середній показник, здебільшого це було для того, щоб дати уявлення. У будь-якому випадку ковзаюча середня врахує навколишні, у прикладі вона врахує вікно з 10 балів.
nico

4

Я цілком не знаю цих даних, але припускаючи, що дані впорядковані (не вчасно, а за позицією?), Має сенс використовувати методи часових рядів. Існує маса методів ідентифікації тимчасових кластерів у даних. Як правило, вони використовуються для пошуку високих значень, але можуть використовуватися для низьких значень, згрупованих разом. Я маю на увазі статистику сканування, статистику накопичувальної суми (та інші), що використовуються для виявлення спалахів захворювань у підрахунку даних. Приклади цих методів є у пакеті спостереження та пакеті DCluster.


@cxr Дякуємо за вашу відповідь. Я повинен дивитися на surveillanceі DCluster , але НЕ могли б ви бути трохи більш конкретно? Вони обидва відносно великі пакети, і їх мета здається досить специфічною. Я не впевнений, з чого почати.
Девід Б

2

Варіантів для цього існує багато, але один хороший: ви можете використовувати msExtremaфункцію в msProcessпакеті .

Редагувати:

У аналізі фінансових результатів подібний аналіз часто проводиться з використанням концепції "просадки". У PerformanceAnalyticsпакеті є кілька корисних функцій для пошуку цих долин . Ви можете використовувати той самий алгоритм і тут, якщо трактуєте свої спостереження як часовий ряд.

Ось кілька прикладів того, як ви могли б застосувати це до своїх даних (де "дати" не мають значення, але використовуються лише для замовлення), але першими елементами в zooоб'єкті будуть ваші дані:

library(PerformanceAnalytics)
x <- zoo(cumsum(rnorm(50)), as.Date(1:50))
findDrawdowns(x)
table.Drawdowns(x)
chart.Drawdown(x)

Дякую, Шейн, але це, здається, знаходить місцеві мінімуми (або максимуми) - тобто єдину точку в регіоні. Мої дані (як і будь-які біологічні дані) ШУМНІ> Мені не дуже цікаво як мінімуми точок, а про більш низькі регіони.
Девід Б

Якщо у вас є локальні максимальні та мінімальні бали, ви можете легко підрахувати різниці. Отже, ви хочете знати випадки, коли різниці великі і за величиною, і за тривалістю? Дані цього часового ряду?
Шейн

@david Можливо, ви можете ітераційно використовувати цю функцію. Використовуйте функцію для виявлення мінімумів. Відкиньте цю точку та навколишні точки (скажімо, x точки в межах певного рівня допуску). Ви можете вибрати рівень допуску (наприклад, + - 10 підрахунків), який би визначав рівну область для вашої програми. Знайдіть нові мінімуми на новому наборі даних. Це буде працювати?

@shane Аналогія, яка спадає на думку, - це долини в гірському регіоні. Я думаю, що мета полягає в тому, щоб визначити всі долини, і проблема полягає в тому, що деякі долини "глибші", а деякі "мілководні" відносно гір.

@Shane Це не часовий ряд, це координати вздовж геному (хромосоми).
Девід Б

2

Деякі пакети біокондуктора (наприклад, ShortRead , Biostrings , BSgenome , IRanges , genomeIntervals ) пропонують засоби для роботи з положеннями геномів або векторами покриття, наприклад для ChIP-seq та визначення збагачених областей. Щодо інших відповідей, я погоджуюся, що будь-який метод, що спирається на впорядковані спостереження з деяким пороговим фільтром, дозволив би виділити низький сигнал у межах конкретної смуги частот.

Можливо, ви також можете подивитися на методи, які використовуються для виявлення так званих "островів"

Zang, C, Schones, DE, Zeng, C, Cui, K, Zhao, K, and Peng, W (2009). Кластерний підхід для ідентифікації збагачених доменів із даних модифікації ChIP-Seq з модифікацією гістону . Біоінформатика, 25 (15) , 1952-1958.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.