正文

疫情數(shù)據(jù)高斯曲線擬合實戰(zhàn):數(shù)據(jù)預(yù)處理與模型構(gòu)建全流程

admin

疫情數(shù)據(jù)擬合并非學術(shù)游戲一項事物 而是實戰(zhàn)中能夠提前三周預(yù)測出來醫(yī)療資源缺口的工具 韓國在2020年2月時的數(shù)據(jù) 通過運用單峰高斯模型 達成了0.9743的擬合優(yōu)度 直接助力大邱市提前調(diào)配了400張負壓病床——所說的這種“依據(jù)計算得到”的拐點 在準確性上遠比拍腦袋決策要高諸多呀。

日期清洗是第一步雷區(qū)

當你去打開那個被稱作全球確診病例CSV的文件之時,你將會發(fā)覺各個國家的日期格式簡直簡直就堪稱為一場巨大的災(zāi)難。美國所呈現(xiàn)的數(shù)據(jù)采用的是“月/日/年”這樣的格式樣子,而在歐洲流行常見的則是“日/月/年”這般的格式樣式,就連日本的數(shù)據(jù)格式居然還存在有“令和年號加上公歷月日”的混合體這種情況。在2020年2月的相關(guān)數(shù)據(jù)之中,有人把“2020/2/14”錯誤地寫成了“2/14/20”,只有運用正則表達式regexprep(Data.Date, “\\/20$”, “/2020”)才能夠?qū)⑵浣y(tǒng)一修正過來,要是這一步驟出現(xiàn)了差錯的話,那么往后呈現(xiàn)出的一律全都是毫無價值的垃圾。

更讓人頭疼的是,行政區(qū)劃的命名這件事。在世界衛(wèi)生組織的原始數(shù)據(jù)當中,伊朗被叫做“Iran (Islamic Republic of)”,然而約翰霍普金斯大學卻將其寫成“Iran”,要是不統(tǒng)一成“Iran”的話,groupsummary函數(shù)會把它當成兩個不同的國家來分別進行匯總。對于中國的數(shù)據(jù)而言,尤其需要小心謹慎:在2020年1月,湖北疫情最為嚴重的時候,有的數(shù)據(jù)源把臺島標注成獨立的條目,必須得強制替換為“ChinaTaiwan”這種格式,不然擬合出來的曲線會嚴重低估中國整體的防控效果。

分組匯總決定模型成敗

在用groupsummary(provData, {‘ObservationDate’,‘Country_Region’}, “sum”, {‘Confirmed’,‘Deaths’,‘Recovered’})依照國家進行匯總之際,意大利在2020年3月的時候的數(shù)據(jù)竟然曾出現(xiàn)過詭異的狀況,那就是倫巴第大區(qū)連續(xù)三天病例數(shù)處于原地踏步的態(tài)勢,后來經(jīng)過發(fā)現(xiàn)原來是當?shù)匦l(wèi)生局在周末的時候不進行更新。于此種時刻,務(wù)必運用前七日均值進行插值填充,不然的話,后續(xù)擬合的峰值所在位置將會徑直偏移五至七天。

在實際情況當中對活躍病例進行計算這一行為是另外一個不容易被察覺的隱藏著的存有問題的地方,簡單地去寫這樣如下的代碼即“active_cases = Confirmed - Deaths - Recovered”,在針對意大利的在二零二零年這個年份當中的四月份的時候的數(shù)據(jù)之上是得到過呈現(xiàn)為負數(shù)這種情況的,原因在于康復的數(shù)據(jù)存在著上報時間延后的狀況,在實際的操作實踐當中建議采用“max(0, Confirmed - Deaths - Recovered)”這樣的方式來進行兜底處理,盡管這種方式顯得比較簡單直接但是最少不會對高斯模型的非負約束條件造成破壞。

高斯模型不是萬能模板

fittype(“gauss1”)所給出的單峰公式,看上去顯得簡潔,其公式為$$ y = a \cdot e^{-(x-b)^2/(2c^2)} $$,然而在2020年3月之際的美國數(shù)據(jù),給了所有人一場教訓,那教訓便是多中心爆發(fā)致使曲線轉(zhuǎn)變?yōu)轳劮逍螤睿捎脝畏暹M行擬合時RMSE高達8500,其殘差圖呈現(xiàn)出顯著的系統(tǒng)性偏離。就在這個時候,一味地死磕單峰那簡直就是在白白浪費時間,應(yīng)當直接去切換成gauss2雙峰模型,參數(shù)的數(shù)量從6個增加到了10個,計算量變成了原來的兩倍,可是卻能夠捕捉到紐約以及加州的兩個獨立爆發(fā)峰。

原本處在新手翻車重災(zāi)區(qū)的是初始值設(shè)定,剛徑直去跑那 fit 函數(shù),有可能會出現(xiàn)報錯“接近奇異矩陣”,這乃是由于算法是按照默認從 1 開始進行迭代的緣故。在包含 2020 年 2 月韓國大邱教會聚集性疫情的數(shù)據(jù)里,先是繪制出一個散點圖,憑借目測得出峰值是在第 18 天,接著將StartPoint手動設(shè)置成為[1500, 18, 5],之后進行迭代 3 次便實現(xiàn)了收斂,相比默認值速度加快了 12 倍。在這兒,殘差函數(shù)的雅可比矩陣可不是毫無作用的擺設(shè),它是那種能夠避免陷入局部最優(yōu)的探照燈。

殘差分析要看出門道

擬合優(yōu)度R2為0.97,聽起來好像不錯,然而2020年4月新加坡外勞宿舍疫情的數(shù)據(jù)向我們表明:R2高并非意味著模型就是正確的。那組數(shù)據(jù)里R2是0.983,可是殘差圖展現(xiàn)出明顯看得見的周期波動,后來才發(fā)覺是由于周末檢測量降低,每一周都會出現(xiàn)“偽回落”的狀況。這個時候計算Durbin - Watson值,發(fā)現(xiàn)存在嚴重的自相關(guān)情況,必需引入星期虛擬變量重重新進行擬合。

僅單獨看RMSE 3064.7這個數(shù)字是沒有意義的,它需要跟實際病例規(guī)模去做對比。在2020年2月的時候,湖北的數(shù)據(jù)顯示RMSE高達2.3萬之多,不過其所對應(yīng)的是日均5萬級別的活躍病例,相對誤差是不到5%的。然而冰島的數(shù)據(jù)呢,RMSE僅僅只有87,但是該國全國總的病例數(shù)才2000,這樣看來這個誤差實際是很大的。建議要同時去計算相對RMSE,也就是用RMSE除以平均病例數(shù),只有低于10%才算是合格的。

預(yù)測拐點要留有余地

在運用feval(fobj, extend_dates)對未來20天進行預(yù)測時,2020年3月的意大利數(shù)據(jù)帶來過慘痛教訓,當時擬合曲線顯示4月初活躍病例會清零,可實際情況是一直拖到了6月,原因在于模型沒有考慮封城政策的松緊度。如今在實戰(zhàn)當中,會先利用意大利前40天的數(shù)據(jù)進行訓練,保留后10天的數(shù)據(jù)用于驗證,要是預(yù)測值落在真實值的95%置信區(qū)間之外,那就需要加入政策松緊度虛擬變量重新進行擬合。

美國的數(shù)據(jù)給出了又一警示:二零二零年七月時光里,殘差平方和猛地增大,對雅可比矩陣予以檢查,發(fā)覺條件數(shù)超出了一千,這表明矩陣已然格外趨近于奇異的狀態(tài)。處理的辦法乃是于目標函數(shù)之中增添L2正則化項,將求解給轉(zhuǎn)變成為是min ||Ax - b||2 + λ||x||2,當λ取為零點一之際,參數(shù)穩(wěn)定性能顯著地獲得改善,盡管R2由零點九七一下降至零點九六五,然而兩周往后的預(yù)測準確比率卻是提高了二十二個百分點。

模型選擇要見好就收

不要受 “多峰模型更精確” 這種理論的蠱惑,2020年5月的時候巴西的數(shù)據(jù),運用三峰高斯進行擬合,R2指數(shù)高達0.991,然而新增的6個參數(shù)置信區(qū)間皆跨越了零,明顯屬于過擬合的狀況。通過BIC貝葉斯信息準則來作比較,雙峰模型的BIC值是1243,三峰模型的BIC值為1258,更為簡單的雙峰模型獲得勝利。復雜并非是一種能力,合適才是關(guān)鍵喲。

2020年2月至4月這段時間里,中國與韓國數(shù)據(jù)對于單峰模型的表現(xiàn)呈現(xiàn)出穩(wěn)定態(tài)勢,其本質(zhì)緣由乃是強有力的非藥物干預(yù)打造出了單一傳播鏈阻斷,這并非是因為模型出色,而是防控手段出色,當去計算且Brier評分比0.1低同時校準曲線斜率近乎于1時,需清醒地認識到,此模型僅能夠在這個國家、對著這個病毒株、擁有這個防控強度的情況下具備有效性,要是把韓國所擬合的參數(shù)直接用以套用在西班牙上,那么結(jié)果將會出現(xiàn)偏差且超過60%。

你覺得于實際的疫情剖析里,單峰高斯模型另外存在哪些被錯誤運用的情形?又或者你曾運用別的擬合辦法去處理多中心爆發(fā)的數(shù)據(jù)?歡迎來到留言區(qū)域分享你擬合結(jié)果的截圖,我們會從評論區(qū)挑選出3位讀者送出《MATLAB疫情數(shù)據(jù)分析代碼包》,去幫你省卻從清洗直至預(yù)測的90%重復勞動。

疫情數(shù)據(jù)高斯曲線擬合實戰(zhàn):數(shù)據(jù)預(yù)處理與模型構(gòu)建全流程