Изучение позиции пересечения и условного удаления строки на основе 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.

Другие вопросы по тегам