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) применяют даже для поиска точки старта репликации.