paint-brush
Mô phỏng sự lây lan của bệnh truyền nhiễm bằng Python: Mô hình SIR và SEIRtừ tác giả@olaoluwa
2,282 lượt đọc
2,282 lượt đọc

Mô phỏng sự lây lan của bệnh truyền nhiễm bằng Python: Mô hình SIR và SEIR

từ tác giả Olaoluwa Afolabi7m2023/10/13
Read on Terminal Reader

dài quá đọc không nổi

Đi sâu vào mô hình hóa bệnh truyền nhiễm bằng Python. Khám phá sức mạnh của các mô hình SIR và SEIR, khám phá các tình huống trong thế giới thực bằng mã Python và tìm hiểu cách mở rộng kỹ năng của bạn để hiểu biết sâu sắc về dịch tễ học. Một cuốn sách phải đọc để nắm vững mô hình bệnh tật trong y tế công cộng.
featured image - Mô phỏng sự lây lan của bệnh truyền nhiễm bằng Python: Mô hình SIR và SEIR
Olaoluwa Afolabi HackerNoon profile picture
0-item


Tuyên bố miễn trừ trách nhiệm : Bài viết này nhằm mục đích làm rõ rằng mã được cung cấp không phải là giải pháp chung cho tất cả các khía cạnh của mô hình toán học. Thay vào đó, nó đóng vai trò như một công cụ giáo dục, nêu bật một bước cụ thể trong quy trình lập mô hình toán học và sử dụng Python cho mục đích minh họa, với mục tiêu chính là nâng cao nhận thức trong lĩnh vực này.


Điều quan trọng cần nhớ là có những biện pháp cụ thể bạn phải thực hiện khi gửi/đề xuất một dự án mô hình toán học, chẳng hạn như dự án liên quan đến lĩnh vực toán sinh học.


Các bước này bao gồm nhưng không giới hạn ở: xác định vấn đề, chọn cách tiếp cận mô hình (hai mô hình sẽ được thảo luận trong bài viết này), xây dựng phương trình, ước lượng tham số—thường dựa trên dữ liệu lịch sử, thực hiện mô phỏng số bằng cách giải phương trình vi phân bằng phương pháp phân tích hoặc sử dụng các công cụ tính toán như Python và MATLAB, xác thực và phân tích độ nhạy, kiểm tra kịch bản, giải thích kết quả, v.v.


Như tôi đã nói trước đó, điều này chỉ nêu bật một bước cụ thể trong quy trình lập mô hình toán học và sử dụng Python cho mục đích minh họa.


Tổng quan về nội dung

  1. Giới thiệu
    • Mục đích của mô phỏng
  2. Mô hình SIR
    • Nó làm gì / Ví dụ mô phỏng mã Python SIR
    • Bạn có thể học được gì
      • Hiểu sự lây lan của bệnh tật
      • Khám phá độ nhạy tham số
      • Đánh giá các can thiệp
  3. Mô hình SEIR
    • Nó làm gì/Ví dụ mô phỏng mã Python SEIR
    • Bạn có thể học được gì
      • Mẫu thời kỳ tiềm ẩn
      • Đánh giá các can thiệp sớm
      • Nghiên cứu các đợt bùng phát phức tạp
  4. Phần kết luận



1. Giới thiệu

Hiểu biết các bệnh truyền nhiễm lây lan như thế nào là điều cần thiết để duy trì sức khỏe cộng đồng vì chúng đã tồn tại trong suốt lịch sử loài người trong nhiều thế kỷ. Một công cụ hữu hiệu để mô phỏng và tìm hiểu động lực lây lan của bệnh tật là các mô hình toán học. Các mô hình SIR (Susceptible-Infectious-Recovered) và SEIR (Susceptible-Expose-Infectious-Recovered) sẽ được thảo luận trong bài viết này, cùng với cách mô phỏng chúng bằng Python.


Mô phỏng dùng để làm gì

Đối với các chuyên gia y tế công cộng và các nhà dịch tễ học, mô phỏng giống như một quả cầu pha lê. Nó cho phép chúng ta thấy trước khả năng lây lan của bệnh tật trong nhiều trường hợp và lựa chọn điều trị khác nhau. Những mô hình này hỗ trợ việc ra quyết định, phân bổ nguồn lực hiệu quả và hiểu rõ tác động tiềm ẩn của các kỹ thuật khác nhau. Hãy xem xét hai mô hình cơ bản là; Mô hình SIR và Mô hình SEIR.


2. Mô hình SIR

Nó làm gì / Ví dụ mô phỏng mã Python SIR

Mô hình Dễ mắc bệnh, Truyền nhiễm và Phục hồi (SIR) chia dân số thành ba loại này. Dựa trên các biến số như tốc độ truyền ( β ) và tốc độ phục hồi ( γ ), nó mô phỏng cách các ngăn này thay đổi theo thời gian.


Trước khi chúng ta minh họa một mô phỏng bằng Python, cần phải đưa ra “các giả định về mô hình” khi làm việc trên các mô hình toán học.


Theo giả định của chúng tôi, chúng tôi sẽ tạo mô hình bằng cách sử dụng công thức hoặc mã LaTeX:


 \begin{align*} \frac{dS}{dt} &= -\beta \cdot S \cdot I \\ \frac{dI}{dt} &= \beta \cdot S \cdot I - \gamma \cdot I \\ \frac{dR}{dt} &= \gamma \cdot I \end{align*}


Lưu ý: Bạn có thể latex hóa công thức này bằng Python. Bạn có thể tìm thấy một ví dụ trên https://github.com/google/latexify_py/blob/main/examples/examples.ipynb .


Bài viết này sẽ không buồn viết mã Python đó để chuyển đổi LaTeX thành ký hiệu/phương trình toán học thích hợp, nhưng tôi đã sử dụng trình soạn thảo trực tuyến như https://latexeditor.lagrida.com/ để bạn có thể thấy rõ các giả định về công thức/phương trình bên dưới :



Hình 1: Phương trình mẫu


ở đâu :


  • S đại diện cho những cá nhân dễ bị tổn thương,
  • Tôi đại diện cho những cá nhân bị nhiễm bệnh,
  • R đại diện cho các cá nhân đã hồi phục.


Các tham số β và γ tương ứng chi phối tốc độ truyền và tốc độ phục hồi. Dấu âm (tức là −β) chỉ ra rằng số lượng cá thể nhạy cảm (S) giảm theo thời gian. Ký hiệu dấu chấm biểu thị “phép nhân”.


Tóm lại, các phương trình này mô tả tính năng động của mô hình SIR, trong đó số người dễ mắc bệnh giảm khi họ mắc bệnh (tức là dS/dt), số người lây nhiễm tăng do các ca nhiễm mới và giảm khi họ hồi phục ( tức là dI/dt), và số người khỏi bệnh tăng lên khi bệnh được điều trị (tức là dR/dt). Vì sự thay đổi trong mỗi ngăn phụ thuộc vào phép nhân của các thành phần thích hợp nên dấu chấm (.) được dùng để biểu thị phép nhân.


Vì tất cả các giả định đã được đặt, nên chúng tôi có thể chạy mô phỏng bằng Python cho Mô hình SIR và sau đó trực quan hóa động lực học:


 import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # SIR model equations def SIR_model(y, t, beta, gamma): S, I, R = y dSdt = -beta * S * I dIdt = beta * S * I - gamma * I dRdt = gamma * I return [dSdt, dIdt, dRdt] """ Initial conditions (such as S0, I0, and R0) are not to be random but I hardcoded them with specific values. These choices are typically made based on the characteristics of the disease being modeled and the context of the simulation. Initial condition are set such that S0 = 99%, which indicates the proportion of susceptible individuals when the simulation starts. I0 is set to 1%, which indicates proportion of infected individuals to be 1% when the simulation starts. R0 is set to 0% which is expected that there are are no recovered individuals when the simulations start. """ S0 = 0.99 I0 = 0.01 R0 = 0.00 y0 = [S0, I0, R0] # Parameters # β (beta) is transmission rate and I chose 30%. γ (gamma) is set to 1% beta = 0.3 gamma = 0.1 # Time vector t = np.linspace(0, 200, 200) # Simulate for 200 days # Solve the SIR model equations using odeint() solution = odeint(SIR_model, y0, t, args=(beta, gamma)) # Extract results S, I, R = solution.T # Plot the results plt.figure(figsize=(10, 6)) plt.plot(t, S, label='Susceptible') plt.plot(t, I, label='Infected') plt.plot(t, R, label='Recovered') plt.xlabel('Time (days)') plt.ylabel('Proportion of Population') plt.title('SIR Model Simulation') plt.legend() plt.grid(True) plt.show()


Đối với sự khác biệt giữa scipy.integrate.odescipy.integrate.odeint , tôi muốn chỉ cho bạn odeintode để bạn hiểu rõ hơn về nó.


Những gì bạn có thể khám phá


Chạy mô hình SIR bằng Python cho phép bạn:

  • Hiểu sự lây lan của bệnh tật : Quan sát đường cong dịch bệnh và hình dung cách một căn bệnh lây lan trong cộng đồng. Chạy Mô hình SIR Python ở trên, bạn có thể thấy kết quả/kết quả trong biểu đồ bên dưới:



Kết quả mô phỏng của chúng tôi cho thấy độ nhạy cảm và tỷ lệ lây nhiễm giảm với tỷ lệ phục hồi cao.



  • Khám phá độ nhạy tham số: Hãy thử kiểm tra các giá trị beta và gamma khác nhau để quan sát xem chúng ảnh hưởng như thế nào đến thời gian và đỉnh điểm của đợt bùng phát.


  • Đánh giá các biện pháp can thiệp: Bằng cách thay đổi các tham số, bạn có thể mô phỏng hậu quả của các biện pháp can thiệp như

    cách ly xã hội hoặc tiêm chủng.


3. Mô hình SEIR

Nó làm gì/Ví dụ mô phỏng mã Python SEIR

Bằng cách thêm ngăn "Tiếp xúc", mô hình SEIR sẽ mở rộng mô hình SIR. Nó tính đến thời gian ủ bệnh mà mọi người đã bị phơi nhiễm nhưng chưa lây nhiễm. Cách mô phỏng nó bằng Python được hiển thị ở đây.


 import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # SEIR model equations def SEIR_model(y, t, beta, sigma, gamma): S, E, I, R = y dSdt = -beta * S * I dEdt = beta * S * I - sigma * E dIdt = sigma * E - gamma * I dRdt = gamma * I return [dSdt, dEdt, dIdt, dRdt] # Initial conditions S0 = 0.99 E0 = 0.01 I0 = 0.00 R0 = 0.00 y0 = [S0, E0, I0, R0] # Parameters beta = 0.3 sigma = 0.1 gamma = 0.05 # Time vector t = np.linspace(0, 200, 200) # Solve the SEIR model equations solution = odeint(SEIR_model, y0, t, args=(beta, sigma, gamma)) # Extract results S, E, I, R = solution.T # Plot the results plt.figure(figsize=(10, 6)) plt.plot(t, S, label='Susceptible') plt.plot(t, E, label='Exposed') plt.plot(t, I, label='Infected') plt.plot(t, R, label='Recovered') plt.xlabel('Time (days)') plt.ylabel('Proportion of Population') plt.title('SEIR Model Simulation') plt.legend() plt.grid(True) plt.show()


Sự khác biệt duy nhất trong trường hợp này là việc đưa ra latent period rate (σ) để khám phá các kịch bản khác nhau và hiểu được động thái của các bệnh truyền nhiễm với thời kỳ “phơi nhiễm”. Nó chứng tỏ nó tính đến thời gian ủ bệnh như thế nào trước khi các cá nhân có khả năng lây nhiễm.


Bạn có thể học được gì


Khi sử dụng Python để chạy mô hình SEIR, bạn có thể:


  • Mẫu thời kỳ tiềm ẩn

    Nhận biết sự khác biệt giữa hành vi của bệnh truyền nhiễm ngay lập tức và bệnh có thời gian ủ bệnh.


  • Đánh giá các can thiệp sớm

    Phân tích tác động của chiến lược cách ly và phát hiện sớm.


  • Nghiên cứu các đợt bùng phát phức tạp

    Đối với những căn bệnh như COVID-19 mà những người phơi nhiễm là yếu tố lây truyền chính, hãy sử dụng SEIR.



4. Kết luận

Các thư viện mạnh mẽ và đơn giản của Python, như SciPy, khiến nó trở thành ngôn ngữ hoàn hảo để mô hình hóa các bệnh tật. Và bằng cách thực hiện những mô phỏng này với nó, bạn sẽ tìm hiểu thêm về động lực của các bệnh truyền nhiễm. Điều này có thể trang bị cho bạn những phán đoán và năng lực giúp bạn đưa ra những quyết định sáng suốt cũng như cải thiện khả năng đánh giá dịch bệnh trong thế giới thực của chính bạn.


Còn nhiều điều nữa sẽ xảy ra sau các mô hình SIR và SEIR. Có các mô hình phức tạp khác như Mô hình SEIRS (Mô hình nhạy cảm-Tiếp xúc-Lây nhiễm-Loại bỏ-Nhạy cảm), Mô hình không gian, Mô hình mạng, v.v. Điều tra các mô hình phức tạp, cũng như dữ liệu trong thế giới thực, chẳng hạn như dữ liệu không gian địa lý, dữ liệu dịch tễ học, dữ liệu hành vi , v.v. và kiểm tra cẩn thận tác động của các biện pháp can thiệp, chẳng hạn như chiến lược tiêm chủng, khả năng điều trị sẵn có, các biện pháp giãn cách xã hội, bạn sẽ phát triển khả năng mô hình hóa của mình hơn nữa.


Kiến thức của bạn về các công cụ mô hình hóa này có thể tác động đáng kể đến việc bảo vệ sức khỏe cộng đồng trong tương lai, nơi hiểu biết về sự lây truyền bệnh truyền nhiễm là rất quan trọng.


Đã quá dài rồi nhưng tôi hy vọng có thể chỉ cho bạn cách mô phỏng Mô hình SIR và SEIR trong mô hình toán học bằng Python.