GC-состав и нуклеотидная статистика

GC-состав — доля букв G и C в последовательности. Простое число, которое многое говорит о ДНК.

GC-состав (GC-content) — процент нуклеотидов G и C в последовательности от её общей длины.

Это первая «настоящая» характеристика, которую считают для любого фрагмента ДНК. За простой формулой стоит много биологии: GC-состав влияет на стабильность ДНК, связан с генами, помогает отличать организмы и находить интересные участки генома.

Зачем биологам GC-состав

  • Стабильность. Пара G≡C держится тремя водородными связями, A=T — двумя. Больше GC — прочнее ДНК, выше температура плавления. Бактерии горячих источников богаты GC.
  • Поиск генов. У многих организмов кодирующие участки и регуляторные «GC-острова» отличаются по составу от фона.
  • Идентификация. Разные виды имеют характерный GC-состав; резкий скачок может указывать на чужеродную (горизонтально перенесённую) ДНК.

Считаем GC-состав

def gc_content(seq):
    seq = seq.upper()
    gc = seq.count("G") + seq.count("C")
    return gc / len(seq) * 100

for s in ["ATATATAT", "GCGCGCGC", "ATGCATGC"]:
    print(f"{s}: {gc_content(s):.1f}% GC")

Вывод:

ATATATAT: 0.0% GC
GCGCGCGC: 100.0% GC
ATGCATGC: 50.0% GC

Скользящее окно вдоль последовательности

Один процент на всю последовательность скрывает детали. Биологам интереснее, где именно состав высокий — например, чтобы найти GC-острова. Для этого считают GC в скользящем окне фиксированной ширины.

def gc_window(seq, window):
    result = []
    for i in range(len(seq) - window + 1):
        chunk = seq[i:i + window]
        gc = (chunk.count("G") + chunk.count("C")) / window * 100
        result.append((i, round(gc)))
    return result

seq = "ATATGCGCGCATAT"
for pos, gc in gc_window(seq, 4):
    print(f"позиция {pos}: {gc}%")

Вывод:

позиция 0: 0%
позиция 1: 25%
позиция 2: 50%
позиция 3: 75%
позиция 4: 100%
позиция 5: 100%
позиция 6: 100%
позиция 7: 75%
позиция 8: 50%
позиция 9: 25%
позиция 10: 0%

Видно «горб» GC в середине — потенциальный GC-богатый участок. Это базовый приём геномного сканирования.

Полная нуклеотидная статистика

Часто нужен сразу весь состав. Используем collections.Counter.

from collections import Counter
seq = "ATGCGGATCGATCGTTAGC"
counts = Counter(seq)
total = len(seq)
for base in "ATGC":
    n = counts[base]
    print(f"{base}: {n} ({n / total * 100:.1f}%)")

Вывод:

A: 4 (21.1%)
T: 5 (26.3%)
G: 6 (31.6%)
C: 4 (21.1%)

Как работает под капотом: GC-skew

Есть тонкая мера — GC-skew = (G − C) / (G + C). Она меняет знак рядом с точкой начала репликации бактериального генома, поэтому по перегибу skew находят origin репликации. Это пример, как из простой статистики извлекают глубокую биологию — детально это выходит за рамки урока, но идею стоит знать.

Откуда вообще берётся асимметрия G и C, если в двунитевой ДНК их поровну (правило Чаргаффа)? Хитрость в том, что GC-skew считают для одной нити. Во время репликации две нити копируются по-разному (одна непрерывно, другая кусками), и из-за разной частоты мутаций на «ведущей» и «отстающей» нити накапливается небольшой перекос: на одной половине генома G чуть больше, на другой — чуть меньше. Кумулятивный GC-skew (нарастающая сумма по геному) рисует характерную «галочку» с минимумом в точке начала репликации и максимумом в точке её завершения. Так из подсчёта двух букв получается карта работы целого молекулярного механизма — наглядный пример, что в биоинформатике простая статистика, применённая с умом, заменяет дорогой эксперимент.

Важно держать в голове и ограничения GC-состава как признака. Это композиционная мера: она не знает порядка букв. Последовательности GGGGCCCC и GCGCGCGC имеют одинаковый GC-состав 100%, хотя биологически совершенно разные. Поэтому GC-состав хорош как быстрый грубый фильтр и индикатор, но для тонких задач (поиск конкретных мотивов, генов) его дополняют методами, учитывающими порядок, — к ним мы перейдём в следующих разделах.

Частые ошибки

  • Делить на неверную длину. Если в последовательности есть N, решите, считать ли их в знаменателе.
  • Забыть про регистр. 'g' не посчитается как 'G' без upper().
  • Окно шире последовательности. Тогда цикл не выполнится; проверяйте границы.

Итог

  • GC-состав — доля G и C; влияет на стабильность ДНК и помогает находить гены.
  • Скользящее окно показывает локальные колебания состава (GC-острова).
  • Полную статистику удобно считать через Counter.
  • Производные меры (GC-skew) применяют даже для поиска точки старта репликации.
Проверьте себя
1. Что такое GC-состав последовательности?
AЧисло генов в ней
BПроцент нуклеотидов G и C от общей длины
CДлина последовательности
DЧисло мутаций
2. Почему ДНК с высоким GC-составом более стабильна?
AG и C тяжелее
BПара G–C держится тремя водородными связями против двух у A–T
CGC встречается реже
DЭто миф, стабильность не зависит от состава
3. Зачем считать GC в скользящем окне, а не на всю последовательность?
AЭто быстрее
BЧтобы увидеть, где именно состав высокий — найти локальные GC-острова
CОкно даёт более точный общий процент
DТак требует формат FASTA