Dự án Python tin sinh học

Khoảng 4 năm trước, tôi đã có một số hiểu biết sâu sắc về vai trò của khoa học dữ liệu về bộ gen trong tương lai của chúng ta và đã đăng ký một khóa học về tin sinh học cho người mới bắt đầu. 4 năm sau, tôi cuối cùng đã bắt đầu thực hiện nó một cách nghiêm túc. Trong blog này, tôi cố gắng trình bày chi tiết các vấn đề được giải quyết trong khóa học và loại mã tôi đã viết

Tất cả các mã có thể được tìm thấy ở đây

Nếu bạn chưa đọc Phần 1, tôi khuyên bạn nên bắt đầu từ đó

Trong phần này của blog, tôi đề cập đến các chương trình được phát triển như một phần của tuần 1 của khóa học. Hầu hết chúng đều rất đơn giản và sự phức tạp thực sự chỉ bắt đầu trong vài tuần qua. Tuy nhiên, nó chắc chắn đã mở rộng tầm mắt của tôi về sinh học theo một cách mới. Tôi nhận ra rằng cơ thể chúng ta có hàng tỷ điểm dữ liệu ở dạng gen, và có nhiều phân tích chưa biết và cần được thực hiện nhiều hơn trong cấu trúc di truyền của chúng ta so với nhiều ngành cộng lại.

Đây là một mẫu của lý thuyết và loại vấn đề chúng tôi đã giải quyết

Tìm nguồn gốc bản sao hoặc Ori

Phần đầu tiên của khóa học tập trung vào việc tìm ra nguồn gốc sao chép, hay ori. Ori là nơi bắt đầu sao chép DNA. Đây là điều quan trọng cần biết vì lý do y sinh. Thông tin này cũng rất quan trọng khi thực hiện liệu pháp gen, đây là thứ thường được sử dụng trong nông nghiệp và cũng đã được sử dụng để chữa một số bệnh tự miễn dịch ở người.

Khi liệu pháp gen xảy ra, các vec tơ virut (vi rút mang bản sao của gen tốt) được tiêm vào tế bào. Những gen này đi vào bên trong tế bào và bắt đầu sao chép, do đó cung cấp protein quan trọng còn thiếu ở bệnh nhân. Trong khi tiêm vec tơ virus, điều quan trọng là phải biết ori ở đâu để thao tác không ảnh hưởng đến chức năng của ori.

Sự lặp lại của các mẫu

Đối với một số quá trình sinh học như sao chép, các chuỗi nucleotide cụ thể xảy ra thường xuyên trong các vùng nhỏ của bộ gen. Điều này là do một số protein chỉ có thể liên kết với DNA nếu có một chuỗi nucleotide nhất định và nếu có nhiều bản sao của chuỗi này, cơ hội liên kết tăng lên và cơ hội đột biến phá vỡ quá trình liên kết giảm xuống.

vấn đề 1. Đếm mẫu

Chúng tôi bắt đầu với một bài tập khởi động rất đơn giản. Vấn đề đầu tiên chúng tôi phải giải quyết trong khóa học là đếm mẫu - viết một chương trình đếm số lần xuất hiện của một mẫu nhất định trong một văn bản nhất định. Ví dụ: trong “CACCGTCACAC”, mẫu “CAC” xảy ra 3 lần

Điều này là để giải quyết vấn đề tìm kiếm các tổ hợp nucleotide thường xuyên xảy ra trong DNA và do đó phân biệt xem chúng có vai trò gì trong quá trình sao chép hay không.

Đây là một vấn đề kiểu cuộc thi lập trình cấp 1 và giải pháp bắt buộc bằng văn bản chỉ là một công việc trong vài phút. Tuy nhiên, tôi muốn viết một phong cách chức năng hơn với các biến bất biến

Tôi muốn sử dụng cú pháp ngắn gọn và chức năng để giải quyết vấn đề, vì vậy tôi đã nghĩ ra hai cách triển khai sau đây, cả hai cách tôi đều không hoàn toàn hài lòng. Nhưng tôi thấy ổn với điều đó vì sự ngắn gọn và phong cách chức năng là ưu tiên của tôi hơn bất kỳ thứ gì khác. Tôi thích cái sau hơn vì nó có phong cách Pythonic hơn

Cái đầu tiên -

def count_occurence(text, pattern):
return len(list(filter(lambda i: text[i:i + len(pattern)] == pattern, range(len(text) - len(pattern) + 1))))

Và cái này, mang phong cách Pythonic hơn —

def count_occurence(text, pattern):
return sum(1 for i in range(len(text) - len(pattern) + 1) if text[i:i+len(pattern)] == pattern)

vấn đề 2. Những từ thông dụng nhất có độ dài K

Xâu con độ dài k trong văn bản cho trước được gọi là k-mer của văn bản

Cho trước một văn bản và một số k, trong bài toán này, chúng ta phải lọc ra những từ xuất hiện thường xuyên nhất (hoặc kmer hoặc chuỗi con) có độ dài k cho trước. Đây là đầu vào và đầu ra mẫu

Input
Text: ACGTTGCATGTCGCATGATGCATGAGAGCT
Length: 4
Output
CATG GCAT

Khóa học đã chia bài tập này thành 2 bài tập, tạo bản đồ tần số chuỗi con, sau đó sử dụng bản đồ đó để tìm những từ xuất hiện phổ biến nhất

Đây lại là một vấn đề dễ giải quyết bằng lập trình mệnh lệnh, như bạn có thể thấy bên dưới

def FrequencyMap(Text, k):
freq = {}
n = len(Text)
for i in range(n-k+1):
Pattern = Text[i:i+k]
freq[Pattern] = 0
for i in range(n-k+1):
Pattern = Text[i:i+k]
freq[Pattern]+=1
return freq
def FrequentWords(Text, k):
words = []
freq = FrequencyMap(Text, k)
m = max(freq.values())
for key in freq:
if(freq[key]==m):
words.append(key)
return words

Mã tiếp tục dài hơn và dài hơn với lập trình bắt buộc. Chúng ta có thể làm điều gì đó thiết thực hơn theo phong cách không?

Một giải pháp lập trình chức năng chất lượng tốt hóa ra lại là một thách thức trong vấn đề này, có lẽ do tôi thiếu kinh nghiệm. Tôi đã bị cám dỗ bởi nhiều cách tiếp cận khác nhau. Sau đó tôi nghĩ lại 3 tiêu chí mà tôi đã đưa ra ban đầu

- Không đột biến
- Mã tối giản
- Sử dụng các tính năng thú vị từ Python

Đây là giải pháp


def combine_dictionary_counts(a, b):
return dict(list(a.items()) + list(b.items()) + [(k, a[k] + b[k]) for k in set(b) & set(a)])

def frequency_map_for_kmers(text, length):
return reduce(combine_dictionary_counts, [{text[i:i + length]: 1} for i in range(len(text) - length + 1)])
def most_frequent_substrings(text, length):
frequency_map = frequency_map_for_kmers(text, length)
max_frequency = max(frequency for kmer, frequency in frequency_map.items())
return [kmer for kmer, frequency in frequency_map.items() if frequency == max_frequency]

Vì phương tiện không phải là một nền tảng tuyệt vời để chia sẻ mã, nên không rõ phương pháp tìm chuỗi con thường xuyên nhất trở nên ngắn gọn như thế nào. Đây là một ảnh chụp màn hình mã để cho thấy nó đã trở nên nhỏ như thế nào —

Mã này không phải là mã dễ hiểu nhất và tôi thấy ổn với nó. Mục tiêu của tôi trong toàn bộ thử nghiệm này không phải là tối ưu hóa khả năng đọc. Sự ngắn gọn hơn khả năng đọc

vấn đề 3. bổ sung đảo ngược

Các nucleotide A và T là bổ sung của nhau, C và G cũng vậy. Do đó, một nucleotide A sẽ bắt cặp với T và G sẽ bắt cặp với C

Nếu chúng ta có một sợi dây, chẳng hạn như AG, thì phần bù của nó sẽ là gì? . Nó không phải là TC như bạn mong đợi. Đó là CT nguyên vẹn. Điều này là do chuỗi và bổ sung được ghép nối của nó chạy theo hướng ngược lại. Để tìm phần bù của một sợi, chúng ta cần tìm phần bù của từng chữ cái, sau đó đảo ngược hướng

AG -> TC -> CT
GACGTAT -> CTGCATA -> ATACGTC

Đây là chương trình dành cho nó —

def ReverseComplement(Pattern):
return reverse(dna_complement(Pattern))

def dna_complement(pattern):
return ''.join(map(character_dna_complement, pattern))

def reverse(s):
return s if len(s) == 0 else reverse(s[1:]) + s[0]

def character_dna_complement(character):
return {"A": "T", "T": "A", "G": "C", "C": "G"}[character]

Đây chỉ là một bước nhỏ để giải các câu đố chi phối DNA của chúng ta. Trong những tuần còn lại của khóa học, các vấn đề trở nên phức tạp hơn và các câu đố về DNA của chúng ta cụ thể hơn

Thực hiện cho đến nay

  1. Sinh học thú vị hơn rất nhiều khi nó đòi hỏi người học phải suy nghĩ về nó, hình thành ý kiến ​​và giải quyết vấn đề
  2. Thật vui khi thấy các vấn đề về loại DS và A xảy ra trong sinh học một cách thường xuyên như vậy. Chứng minh rằng có những vấn đề lập trình khó giải quyết ở khắp mọi nơi, bạn chỉ cần tìm kiếm chúng
  3. Nhìn thấy mã ngắn gọn như vậy trong Python là một thay đổi thú vị so với Java, nơi rất khó để giảm số lượng mã vượt quá một điểm nhất định
  4. Phương pháp thử nghiệm đầu tiên hữu ích, ngay cả khi một người không thực hiện TDD. Điều này đúng ngay cả đối với những vấn đề nhỏ mà chúng tôi đã giải quyết. Các thử nghiệm cho phép tôi khám phá các mô hình và giải pháp khác nhau

Tiếp theo là gì?

May mắn thay, các vấn đề trở nên khó khăn hơn trong Tuần 2. Nó khó hơn Tuần 1 và Tuần 3 thậm chí còn tốt hơn

Để tìm Ori, việc tìm các k-mer xuất hiện thường xuyên nhất hoặc phần bù ngược lại là chưa đủ. Có nhiều mô hình khác về cách các nucleotide xảy ra trong nguồn gốc. Blog tiếp theo sẽ đưa chúng ta qua các phép biến đổi dữ liệu phức tạp hơn để giải quyết những vấn đề này. Về phía tôi, tôi sẽ đăng thêm các ví dụ về những gì tôi đã học được khi cố gắng triển khai python chức năng và cách kiểm tra đơn vị trông như thế nào đối với các phương pháp không xác định xử lý tối ưu hóa

Python có tốt cho tin sinh học không?

Python là ngôn ngữ lập trình cấp cao, có mục đích chung được sử dụng rộng rãi trong lĩnh vực tin sinh học . Triết lý thiết kế của nó nhấn mạnh khả năng đọc mã và cú pháp của nó cho phép các lập trình viên diễn đạt các khái niệm bằng ít dòng mã hơn so với khả năng có thể có trong các ngôn ngữ như C++ hoặc Java.

Python được sử dụng như thế nào trong tin sinh học?

Python được sử dụng cho một số tác vụ trong tin sinh học bao gồm nghiên cứu học thuật, thao tác dữ liệu, giải trình tự protein, phân tích dữ liệu, trực quan hóa dữ liệu, truy cập cơ sở dữ liệu và học thống kê. It is also used for macromolecular structure analysis, DNA sequence analysis, and microarray data analysis.

Những dự án nào có thể được thực hiện trong tin sinh học?

5 Dự án máy học trong tin sinh học để thực hành .
Dự đoán hiệu quả của thuốc chống ung thư. .
Phát hiện đột biến tự kỷ. .
Thuốc điều trị ung thư được cá nhân hóa. .
Xác định cơ sở di truyền bệnh ở người. .
Xây dựng bộ phân loại trình tự DNA

R hay Python tốt hơn cho tin sinh học?

Mặc dù cả R và Python đều có thể sử dụng và xử lý nhiều dữ liệu, nhưng Lợi thế phải được trao cho Python . R có thể tiêu thụ một lượng lớn thông tin, nhưng với sự ra đời của xử lý Single Cell, các gói R đã giảm so với các đối tác Python của chúng trong việc giữ mức tiêu thụ RAM thấp.