使用Python對城市中的冠狀病毒流行進行建模

城市為流行病做好準備了嗎?

最近在中國發生的2019-nCoV武漢冠狀病毒爆發,在金融市場和整個經濟體中造成了震驚,並適當地引發了全球普通民眾的恐慌。 2020年1月30日,2019-nCoV甚至被世界衛生組織(WHO)指定為全球緊急衛生事件。在撰寫本文時,尚未發現經過醫學研究標準驗證的特定治療方法。此外,一些關鍵的流行病學指標,例如基本繁殖數(患病個體感染的平均人數)仍然未知。在我們前所未有的全球聯繫和機動性時代,由於世界網絡的影響小,這種流行病是全球範圍的主要威脅。可以猜想,以2020年發生的全球災難性事件(寬鬆定義為造成1億多人員傷亡)為條件,最有可能的原因恰恰是某種大流行病-不是核災難,不是氣候災難等。全球範圍的迅速發展進一步加劇了這一情況。城市化,人口稠密的充滿活力的城市變成了疾病傳播網絡中的傳播節點,因此變得極為脆弱和脆弱。

在這篇文章中,我們將討論流行病襲擊城市時會發生什麼,應立即採取什麼措施,以及這對城市規劃,政策制定和管理有何影響。 我們將以埃裡溫市為例進行研究,並對城市中冠狀病毒的傳播進行數學建模和仿真,研究城市流動性模式如何影響該疾病的傳播。

城市交通

有效,高效和可持續的城市交通對於現代城市的運轉至關重要。 它已經顯示出直接影響城市的宜居性和經濟產出(GDP)。 但是,一旦發生流行病,它將火上澆油,放大並傳播疾病。

因此,讓我們開始研究埃裡溫(Yerevan)統一的笛卡爾網格上的聚合原點(OD)流網絡,以瞭解城市流動模式的空間結構:

使用Python對城市中的冠狀病毒流行進行建模

此外,如果我們查看到網格單元的總流入量,我們會發現一個或多或少的單中心空間組織,其中一些單元格的每日大量流入位於中心位置:

使用Python對城市中的冠狀病毒流行進行建模

現在,假設流行病在城市中的任意位置爆發。 它將如何傳播? 可以採取什麼措施來遏制它?

流行病建模

為了回答這些問題,我們將建立一個簡單的隔間模型來模擬城市中傳染病的傳播。 隨著疫情的爆發,其傳播動態會發生很大變化,這取決於最初感染的地理位置及其與城市其他地區的連通性。 這是從最近的數據驅動的城市人口流行病研究中獲得的最重要的見解之一。 但是,正如我們將在下面進一步看到的,各種結果要求採取類似措施來遏制該流行病,並考慮到規劃和管理城市中的這種可能性。

由於運行基於個人的流行病模型具有挑戰性,並且由於我們的目標是展示城市流行病的一般原理,而不是建立精細的校準和準確的流行病模型,因此,我們將按照《自然》雜誌中所述的方法,修改描述了我們需要的經典SIR模型。

該模型將總體分為三個部分。 對於時間t的每個位置i,三個隔室如下:

· Si,t:尚未感染或不易感染該疾病的人數。

· Ii,t:感染該疾病並能夠將疾病傳播給易感人群的人數。

· Ri,t:由於恢復或死亡而被感染,然後從感染組中撤出的人數。 該組中的個體無法再次感染該疾病或將感染傳播給他人。

在我們的仿真中,時間將是離散變量,因為系統狀態每天都在建模。 在時間t的位置j處完全易感的種群中,爆發的可能性為:

使用Python對城市中的冠狀病毒流行進行建模

其中βt是第t天的傳輸速率; mj,k反映了從位置k到位置j的遷移率,xk,t和yk,t分別表示第t天在位置k和位置j處感染和易感人群的比例,由xk,t = Ik,t / Nk和yj,t = Sj,t / Nj,其中Nk和Nj是位置k和j的人口規模。 然後,我們繼續模擬一個隨機過程,將疾病引入具有完全易感種群的位置,其中Ij,t + 1是概率為h(t,j)的伯努利隨機變量。

一旦在隨機位置引入感染,該疾病就會在那些位置傳播,並由旅行個體在其他位置傳播和傳播。 在這裡,以OD流矩陣為特徵的城市交通模式發揮了至關重要的作用。

此外,為了使感染者如何傳播疾病,我們需要基本的繁殖編號R0。 它的定義為R0 =βt/γ,其中γ是恢復率,可以認為是受感染個體與易感人群接觸後繼發感染的預期數量。 在撰寫本文時,武漢冠狀病毒的基本繁殖數估計在1.4到4之間。讓我們以最壞的情況假設為4。但是,我們應該注意,它實際上是一個隨機變量,報告的數字 只是預期的數字。 為了使事情變得更有趣,我們將使用良好的候選分佈Gamma(平均值為4)在每個位置使用不同的R0進行模擬:

使用Python對城市中的冠狀病毒流行進行建模

現在,我們可以進行模型動力學:

使用Python對城市中的冠狀病毒流行進行建模

其中βk,t是第t天在位置k處的(隨機)傳輸率,α是表示城市中公共交通與私家車出行方式的比重或強度的係數。

上面等式中描述的模型動力學非常簡單:在第j天的t + 1天,我們需要從易感人群Sj,t中減去在第j個位置(第一個等式中的第二項)感染的人群比例。 以及從城市其他地區到達的感染人群所佔的比例,由他們各自的傳播率βk,t加權(第一個方程式中的第三項)。 由於總人口Nj = Sj + Ij + Rj,我們需要將減去的部分移至受感染的組,同時也將已恢復的部分移至Rj,t + 1(第二和第三個方程)。

模擬設置

在此分析中,我們將使用從當地乘車共享公司gg提供的GPS數據獲得的典型一天的彙總OD流矩陣,作為埃裡溫市交通方式的代理。 接下來,我們需要每個250×250m網格單元中的人口計數,我們通過按比例縮放提取的流量計數來近似估算,以使不同位置的總流入量總計約等於埃裡溫110萬人口的一半。 這實際上是一個大膽的假設,但是由於更改此部分會產生非常相似的結果,因此我們會堅持下去。

減少公共交通工具?

對於我們的第一個模擬,我們將想象一個可持續的以公共交通為主導的未來城市交通,α= 0.9:

使用Python對城市中的冠狀病毒流行進行建模

我們看到人口中被感染的部分迅速上升的速度,並在8-10天左右達到流行高峰,幾乎70%的人口受到感染,而只有一小部分(〜10%)已康復 從疾病。 在流行病消退的第100天,我們看到已康復個體的比例達到了驚人的90%! 現在,讓我們看看將公共交通出行的強度降低到α= 0.2左右是否對減輕疫情傳播有任何影響。 這可以解釋為採取嚴厲措施以減少城市交通(例如,通過實施宵禁),也可以解釋為增加私家車出行的比例以減少出行期間的感染機會。

使用Python對城市中的冠狀病毒流行進行建模

我們看到這種流行病的高峰是如何在第16天到第20天之間出現的,受感染的人群要小得多(〜45%),而康復的人數要多一倍(〜20%)。 在流行病快要結束時,易感人群的比例也增加了一倍(〜24%vs.〜12%),這意味著有更多人逃脫了這種疾病。 不出所料,我們發現採取了一系列措施來暫時降低城市流動性,對疾病傳播動態產生了重大影響。

隔離熱門地點?

現在,讓我們看看完全切斷一些關鍵的熱門地點的另一個直觀想法是否具有預期的效果。 為此,我們選擇與流動流量的上1%相關的位置,

使用Python對城市中的冠狀病毒流行進行建模

並完全阻止進出這些位置的所有流量,從而有效地建立了隔離區。 從圖中可以看出,在埃裡溫,這些地點大多位於市中心,另外兩個地點是兩個最大的購物中心。 選擇一箇中等α= 0.5,我們得到:

使用Python對城市中的冠狀病毒流行進行建模

我們發現,在流行高峰時,感染者的比例甚至更低(約35%),而且最重要的是,我們看到,在流行結束時,大約一半的人口仍然易感,有效地避免了感染!

這是一個小動畫,可視化了高公共交通份額場景的動態:

使用Python對城市中的冠狀病毒流行進行建模

結論

絕不聲稱要進行準確的流行病建模(甚至不要求流行病學方面的任何基礎知識),本文的目的是對傳染病爆發期間網絡效應在城市環境中如何發揮作用有一個初步的瞭解。 隨著人口密度,流動性和動態的不斷增長,我們的城市變得更容易受到"黑天鵝"的攻擊,變得更加脆弱。 而且,如果死了就無法獲取咖啡,沒有有效的危機處理能力和機制,智慧和可持續的城市將毫無意義。 例如,我們發現,在這樣的健康危機期間,在關鍵地區引入隔離制度或採取嚴厲措施遏制流動性可能是有幫助的。 但是,另一個重要的問題將是如何實施此類措施,同時最大程度地減少對城市及其經濟運作的損害和損失?

此外,確切的傳染病流行機制仍是研究的一個活躍領域,必須將這一領域的進展傳達給城市規劃,政策制定和管理部門,並納入城市規劃,政策制定和管理中,以確保我們的城市安全和抵抗脆弱。

附言 在這裡閱讀原始文章。

以上模擬的代碼:

<code>import numpy as np  # initialize the population vector from the origin-destination flow matrix  N_k = np.abs(np.diagonal(OD) + OD.sum(axis=0) - OD.sum(axis=1))  locs_len = len(N_k)                 # number of locations  SIR = np.zeros(shape=(locs_len, 3)) # make a numpy array with 3 columns for keeping track of the S, I, R groups  SIR[:,0] = N_k                      # initialize the S group with the respective populations    first_infections = np.where(SIR[:, 0]<=thresh, SIR[:, 0]//20, 0)   # for demo purposes, randomly introduce infections  SIR[:, 0] = SIR[:, 0] - first_infections  SIR[:, 1] = SIR[:, 1] + first_infections                           # move infections to the I group    # row normalize the SIR matrix for keeping track of group proportions  row_sums = SIR.sum(axis=1)  SIR_n = SIR / row_sums[:, np.newaxis]    # initialize parameters  beta = 1.6  gamma = 0.04  public_trans = 0.5                                 # alpha  R0 = beta/gamma  beta_vec = np.random.gamma(1.6, 2, locs_len)  gamma_vec = np.full(locs_len, gamma)  public_trans_vec = np.full(locs_len, public_trans)    # make copy of the SIR matrices   SIR_sim = SIR.copy()  SIR_nsim = SIR_n.copy()    # run model  print(SIR_sim.sum(axis=0).sum() == N_k.sum())  from tqdm import tqdm_notebook  infected_pop_norm = []  susceptible_pop_norm = []  recovered_pop_norm = []  for time_step in tqdm_notebook(range(100)):      infected_mat = np.array([SIR_nsim[:,1],]*locs_len).transpose()      OD_infected = np.round(OD*infected_mat)      inflow_infected = OD_infected.sum(axis=0)      inflow_infected = np.round(inflow_infected*public_trans_vec)      print('total infected inflow: ', inflow_infected.sum())      new_infect = beta_vec*SIR_sim[:, 0]*inflow_infected/(N_k + OD.sum(axis=0))      new_recovered = gamma_vec*SIR_sim[:, 1]      new_infect = np.where(new_infect>SIR_sim[:, 0], SIR_sim[:, 0], new_infect)      SIR_sim[:, 0] = SIR_sim[:, 0] - new_infect      SIR_sim[:, 1] = SIR_sim[:, 1] + new_infect - new_recovered      SIR_sim[:, 2] = SIR_sim[:, 2] + new_recovered      SIR_sim = np.where(SIR_sim<0,0,SIR_sim)      # recompute the normalized SIR matrix      row_sums = SIR_sim.sum(axis=1)      SIR_nsim = SIR_sim / row_sums[:, np.newaxis]      S = SIR_sim[:,0].sum()/N_k.sum()      I = SIR_sim[:,1].sum()/N_k.sum()      R = SIR_sim[:,2].sum()/N_k.sum()      print(S, I, R, (S+I+R)*N_k.sum(), N_k.sum())      print('\\n')      infected_pop_norm.append(I)      susceptible_pop_norm.append(S)      recovered_pop_norm.append(R)/<code>


(本文翻譯自Gevorg Yeghikyan的文章《Modelling the coronavirus epidemic in a city with Python》,參考:https://towardsdatascience.com/modelling-the-coronavirus-epidemic-spreading-in-a-city-with-python-babd14d82fa2)


分享到:


相關文章: