Изучение позиции пересечения и условного удаления строки на основе P-значений
Я работаю над пост-анализом GWAS, где я определил список независимых SNP, связанных с моей чертой. Я пытаюсь сгруппировать свой indep. SNP в локусах +- 500 КБ. Есть несколько независимых SNP, локус которых будет перекрывать друг друга, и я пытаюсь написать код, который будет отбрасывать SNP с более высоким P-значением, если два локуса перекрываются.
SNP bp p
1: rs1 8537289 1.33785e-08
2: rs2 12263919 5.03939e-11
3: rs3 19771438 1.83669e-20
4: rs4 19845279 3.60144e-18
После добавления двух столбцов с позицией +- 500kb, где становится очевидным, что строки 3 и 4 имеют перекрывающиеся геномные позиции.
SNP bp p start stop
1: rs1 8537289 1.33785e-08 8037289 9037289
2: rs2 12263919 5.03939e-11 11763919 12763919
3: rs3 19771438 1.83669e-20 19271438 20271438
4: rs4 19845279 3.60144e-18 19345279 20345279
Отсюда я пытаюсь перейти к условному коду, который сохранит SNP с наименьшим P-значением (в этом примере rs3), а затем отбросит четвертую строку, содержащую rs4.
Так что я получу следующий результат:
SNP bp p start stop
1: rs1 8537289 1.33785e-08 8037289 9037289
2: rs2 12263919 5.03939e-11 11763919 12763919
3: rs3 19771438 1.83669e-20 19271438 20271438
Мне хорошо известно, что группирование plink является обычной процедурой для определения локусов, но я пробую это как альтернативный и надежный способ установления ассоциаций с признаком. Я надеюсь, что кто-то захочет поделиться частичкой своего блестящего мастерства, и я обещаю взамен лучшую карму. Ваше здоровье
РЕДАКТИРОВАТЬ
Просматривая результаты, я заметил непреднамеренную ошибку, вызванную отличным решением, предоставленным @Axeman. Прошу прощения, если я не совсем корректно выразился. Я запустил следующий код, чтобы напечатать «g-столбец» без удаления SNP.
d1 <- d %>% group_by(Chr,p, locus = cumsum(minus > lag(plus, default=1)))
%>% slice_min(p)
И заметили, что при изменении хромосомы с n на n2 непересекающиеся области генома сливаются в один локус. Таким образом, последний локус на хромосоме n и первый локус на n2 «сливаются» (или отбрасываются). Вы бы знали, как обойти это?
1 ответ
Вы можете определить группы для перекрывающихся секций, а затем отфильтровать по наименьшему p-значению. Например:
library(dplyr)
d %>%
group_by(g = cumsum(start > lag(stop, default = 1))) %>%
slice_min(p)
# A tibble: 3 × 6 # Groups: g [3] SNP bp p start stop g <chr> <int> <dbl> <int> <int> <int> 1 rs1 8537289 1.34e- 8 8037289 9037289 1 2 rs2 12263919 5.04e-11 11763919 12763919 2 3 rs3 19771438 1.84e-20 19271438 20271438 3
Это является жадным в том смысле, что он будет группировать SNP, которые не перекрываются, если между ними есть SNP, который перекрывается с обоими. Не уверен, что вы хотите делать в случае последовательностей частично перекрывающихся SNP.