聚集分析模型選擇與數(shù)據(jù)準備指南)
簡介SaTScan 中文說明書面向公共衛(wèi)生、流行病學(xué)與空間統(tǒng)計方向的研究人員和學(xué)生解決英文文檔閱讀門檻高、軟件上手困難的問題。SaTScan 是一款自由軟件通過空間、時間及時空掃描統(tǒng)計用于地理疾病監(jiān)測、疾病集群檢測與統(tǒng)計顯著性評估也可應(yīng)用于考古、生態(tài)、犯罪學(xué)等領(lǐng)域的聚集性分析。說明書系統(tǒng)梳理了離散與連續(xù)掃描數(shù)據(jù)的處理方式涵蓋泊松模型、伯努利模型、時空置換模型、多項式與序模型、指數(shù)模型及空間變化時間趨勢模型并說明如何調(diào)整背景人口、納入?yún)f(xié)變量與處理數(shù)據(jù)缺失。資源包為1個doc文檔約485KB內(nèi)容緊湊便于檢索與打印。目前已有2805人學(xué)習(xí)下載讀者可借此快速理解軟件原理、模型選擇依據(jù)與參數(shù)含義為疾病早期發(fā)現(xiàn)和異常聚集預(yù)警提供方法支撐。1. 空間流行病學(xué)里的“顯微鏡”SaTScan 中文說明書能幫你解決什么如果你手頭有一份縣級或鄉(xiāng)鎮(zhèn)級的疾病發(fā)病數(shù)據(jù)領(lǐng)導(dǎo)問你“這幾個高發(fā)區(qū)域到底是不是巧合”你大概率需要 SaTScan。它做的事情很具體用空間掃描統(tǒng)計、時間掃描統(tǒng)計或時空掃描統(tǒng)計判斷疾病在空間、時間或時空維度上是否存在統(tǒng)計學(xué)顯著的聚集。換句話說它把“看起來多”變成“顯著地多”。這份中文說明書的價值在于它把原本散落在英文幫助文檔、示例數(shù)據(jù)集和統(tǒng)計論文里的操作邏輯整理成了能照著走的流程。適合公共衛(wèi)生監(jiān)測人員、流行病學(xué)研究者、生態(tài)與犯罪學(xué)等跨領(lǐng)域分析者以及需要復(fù)現(xiàn)空間聚集分析的學(xué)生。你不需要先成為統(tǒng)計學(xué)家但需要知道自己的數(shù)據(jù)長什么樣、該選哪個概率模型。2. 概率模型怎么選從數(shù)據(jù)類型反推掃描統(tǒng)計模型SaTScan 的模型選擇不是拍腦袋而是由你的數(shù)據(jù)形態(tài)決定的。說明書里把離散掃描和連續(xù)掃描分開講又把離散掃描細分成泊松、伯努利、時空置換、多項式、序、指數(shù)、正態(tài)等模型。選錯模型結(jié)果不是“不準”而是根本不可解釋。2.1 離散掃描與連續(xù)掃描的分界線離散掃描統(tǒng)計假設(shè)觀測位置是固定的、非隨機的。比如你手里有各縣的病例數(shù)和人口數(shù)縣的地理位置就是固定的格點你關(guān)心的是病例數(shù)在格點上的分布是否隨機。連續(xù)掃描統(tǒng)計則假設(shè)觀測位置本身是隨機的可能出現(xiàn)在研究區(qū)域內(nèi)的任何地方。比如你在一個方形森林樣地里記錄鳥巢坐標鳥巢可能出現(xiàn)在任何位置你關(guān)心的是這些點是否獨立隨機分布。判斷標準很簡單如果你的數(shù)據(jù)已經(jīng)聚合到行政區(qū)劃、普查區(qū)、郵編區(qū)用離散掃描如果你有的是個體級別的精確坐標且研究區(qū)域是一個連續(xù)的地理范圍用連續(xù)掃描。說明書里提到的連續(xù)泊松模型就是為后者準備的。2.2 泊松、伯努利與時空置換模型的適用場景泊松模型適合“病例數(shù) 背景人口”的數(shù)據(jù)結(jié)構(gòu)。比如某縣某年某年齡組的發(fā)病人數(shù)和對應(yīng)人口數(shù)。零假設(shè)下每個區(qū)域的預(yù)期病例數(shù)與該區(qū)域人口成正比。說明書里的新墨西哥腦腫瘤數(shù)據(jù)集就是典型病例文件記錄各縣各年齡組各性別的病例數(shù)人口文件記錄對應(yīng)的人口數(shù)坐標文件記錄各縣的直角坐標。伯努利模型適合 0/1 數(shù)據(jù)也就是每個觀測要么是病例要么是對照。比如兒童白血病研究中病例是確診兒童對照是隨機選取的出生登記兒童。說明書里的亨伯賽德數(shù)據(jù)集就是純空間伯努利模型病例文件和對照文件分開坐標文件記錄每個位置標識的坐標。時空置換模型只需要病例數(shù)據(jù)不需要對照或背景人口。它通過置換病例的時空位置來評估聚集顯著性。說明書里的紐約市發(fā)熱急診數(shù)據(jù)集就是時空置換模型記錄郵編、病例數(shù)、日期坐標文件記錄郵編對應(yīng)的經(jīng)緯度。這個模型會自動調(diào)整純空間和純時間聚集所以沒有純時間或純空間版本。2.3 多項式、序、指數(shù)與正態(tài)模型的特殊要求多項式模型用于分類數(shù)據(jù)每個病例屬于多個類別之一。比如腦膜炎病例按五個不同克隆物分類掃描統(tǒng)計同時尋找任何類別或類別組合的聚集。序模型用于有序分類數(shù)據(jù)比如乳腺癌早期、中期、晚期。如果只有兩個類別序模型等價于伯努利模型。序模型可以搜索高值聚集、低值聚集或同時搜索兩者。指數(shù)模型用于生存時間數(shù)據(jù)。每個病例有一個連續(xù)變量診斷到死亡或刪失的時間和一個 0/1 刪失指示變量。說明書特別提醒時空指數(shù)模型里有兩個時間變量一個是診斷時間掃描窗口掃描的維度另一個是生存時間病例的屬性不參與掃描。正態(tài)模型用于連續(xù)數(shù)據(jù)比如出生體重。如果每個區(qū)域的觀測值是基于不同樣本量的均值需要用加權(quán)正態(tài)模型權(quán)重可以是樣本量或方差的倒數(shù)。提示模型選擇錯誤是新手最常見的翻車點。拿到數(shù)據(jù)先問自己三個問題位置是固定的還是隨機的有沒有背景人口結(jié)果是計數(shù)、0/1、分類、有序、生存時間還是連續(xù)值答案會直接鎖定模型。3. 數(shù)據(jù)文件準備cas、pop、geo、ctl 四類文件的格式與生成SaTScan 的數(shù)據(jù)輸入靠幾個純文本文件病例文件.cas、人口文件.pop、坐標文件.geo、對照文件.ctl。說明書里給出了每個示例數(shù)據(jù)集的格式但實際項目中你往往需要自己從 Excel 或數(shù)據(jù)庫導(dǎo)出。這一章把格式規(guī)則拆開并給出可復(fù)用的 Python 轉(zhuǎn)換腳本。3.1 病例文件與人口文件的列順序病例文件的格式取決于模型。以離散泊松模型為例說明書里的 nm.cas 格式是縣 病例數(shù)1 年齡組 性別。注意這里的病例數(shù)如果是 1表示該行代表一個病例如果是聚合數(shù)據(jù)則寫實際病例數(shù)。人口文件 nm.pop 格式是縣 年 人口 年齡組 性別。年份、年齡組、性別這些變量必須與病例文件中的變量一一對應(yīng)。伯努利模型的病例文件和對照文件分開。nhumberside.cas 格式是位置編號 病例數(shù)nhumberside.ctl 格式是位置標識 對照數(shù)。坐標文件 nhumberside.geo 格式是位置標識 x y。時空置換模型的 nycfever.cas 格式是郵編 病例數(shù)1 日期坐標文件格式是郵編 緯度 經(jīng)度。注意這里沒有人口文件因為模型不需要背景人口。3.2 坐標文件的坐標系與精度坐標文件支持直角坐標和經(jīng)緯度。說明書里的新墨西哥數(shù)據(jù)集用直角坐標紐約發(fā)熱數(shù)據(jù)集用經(jīng)緯度。經(jīng)緯度坐標要注意SaTScan 內(nèi)部會把經(jīng)緯度轉(zhuǎn)換為球面距離所以不要自己先投影成平面坐標再輸入除非你明確知道自己在做什么。直角坐標則要求 x 和 y 的單位一致比如都是米或都是千米。坐標精度方面說明書里的示例數(shù)據(jù)精確到縣、郵編或具體地點。實際項目中如果你用的是個體坐標注意不要引入隱私泄露風(fēng)險。常見做法是聚合到普查區(qū)或郵編區(qū)或者對坐標加隨機偏移。3.3 用 Python 把 Excel 轉(zhuǎn)成 SaTScan 輸入文件下面這個腳本把一份包含縣、年、年齡組、性別、病例數(shù)、人口數(shù)的 Excel 表拆成 nm.cas、nm.pop、nm.geo 三個文件。假設(shè) Excel 里有county、year、age_group、sex、cases、population、x、y這些列。import pandas as pd # 讀取原始數(shù)據(jù) df pd.read_excel(raw_data.xlsx) # 病例文件縣、病例數(shù)、年齡組、性別 cas df[[county, cases, age_group, sex]].copy() cas.columns [county, cases, age_group, sex] cas.to_csv(nm.cas, sep , indexFalse, headerFalse) # 人口文件縣、年、人口、年齡組、性別 pop df[[county, year, population, age_group, sex]].copy() pop.columns [county, year, population, age_group, sex] pop.to_csv(nm.pop, sep , indexFalse, headerFalse) # 坐標文件縣、x、y每個縣只保留一行 geo df[[county, x, y]].drop_duplicates(subset[county]) geo.columns [county, x, y] geo.to_csv(nm.geo, sep , indexFalse, headerFalse) print(文件已生成nm.cas, nm.pop, nm.geo)邏輯說明病例文件保留每個縣、每個年齡組、每個性別的病例數(shù)人口文件保留對應(yīng)的人口數(shù)坐標文件按縣去重因為每個縣只有一個地理坐標。參數(shù)方面sep 表示用空格分隔headerFalse表示不寫列名這是 SaTScan 要求的純文本格式。如果你的數(shù)據(jù)里病例數(shù)是聚合的cases列直接寫總數(shù)如果是個體數(shù)據(jù)每行寫 1。注意SaTScan 對空格和制表符敏感。如果生成的文件用逗號分隔導(dǎo)入時會報錯。建議用sep 或sep\t并在文本編輯器里確認列對齊。4. 避坑與排查參數(shù)文件、時間精度和模型誤用的血淚經(jīng)驗這一章記錄的是實際跑 SaTScan 時最容易翻車的幾個點。說明書里不會把這些寫成“常見問題”但每個做過空間聚集分析的人大概都踩過。4.1 參數(shù)文件選錯導(dǎo)致結(jié)果完全不可解釋現(xiàn)象打開保存的會話后選了一個參數(shù)文件跑出來的聚集區(qū)域和預(yù)期完全不符。原因參數(shù)文件里綁定了模型類型、時間精度、掃描窗口大小等關(guān)鍵設(shè)置。如果你用泊松模型的參數(shù)文件去跑伯努利數(shù)據(jù)軟件可能不報錯但結(jié)果沒有意義。解決每次新建分析時從“新建會話”開始逐步選擇模型、導(dǎo)入數(shù)據(jù)、設(shè)置參數(shù)不要直接套用別人的參數(shù)文件。如果要用現(xiàn)成的先檢查參數(shù)文件里的模型類型和你的數(shù)據(jù)是否匹配。4.2 時間精度設(shè)置不當(dāng)導(dǎo)致掃描窗口錯位現(xiàn)象時空分析中聚集的時間范圍看起來不對或者軟件提示時間單位錯誤。原因SaTScan 要求指定時間精度比如年、月、日。說明書里的新墨西哥數(shù)據(jù)集用“年”作為病例時間精度紐約發(fā)熱數(shù)據(jù)集用“天”。如果你把日度數(shù)據(jù)設(shè)成年精度軟件會把同一天的數(shù)據(jù)合并掃描窗口也會按年滑動。解決導(dǎo)入數(shù)據(jù)后在時間精度設(shè)置里選擇與數(shù)據(jù)實際粒度一致的單位。如果不確定先看病例文件里的日期列格式是1973還是2001/11/01。4.3 坐標文件與病例文件的位置標識不匹配現(xiàn)象軟件提示“位置標識在坐標文件中找不到”或類似錯誤。原因病例文件里的位置標識如縣名、郵編和坐標文件里的標識不一致可能是大小寫、空格、編碼問題。解決用腳本檢查兩個文件的標識集合是否完全一致。下面這段代碼可以快速比對。import pandas as pd cas pd.read_csv(nm.cas, sep , headerNone, names[county, cases, age, sex]) geo pd.read_csv(nm.geo, sep , headerNone, names[county, x, y]) cas_ids set(cas[county].astype(str).str.strip()) geo_ids set(geo[county].astype(str).str.strip()) print(病例文件有但坐標文件沒有, cas_ids - geo_ids) print(坐標文件有但病例文件沒有, geo_ids - cas_ids)邏輯說明str.strip()去掉首尾空格astype(str)統(tǒng)一轉(zhuǎn)成字符串再比較。如果輸出非空就需要手動修正標識。4.4 時空置換模型用于多年數(shù)據(jù)導(dǎo)致 P 值有偏現(xiàn)象用時空置換模型分析跨越好幾年的數(shù)據(jù)結(jié)果出現(xiàn)大量顯著聚集但仔細看是人口增長導(dǎo)致的。原因說明書里明確警告時空置換模型只使用病例數(shù)據(jù)如果研究期間不同地區(qū)的人口增長速率不同病例數(shù)的增加可能僅僅是因為人口增加而不是疾病風(fēng)險增加。解決如果研究期間超過一年盡量用泊松模型并提供逐年人口數(shù)據(jù)。如果必須用時空置換模型把研究期間限制在一年以內(nèi)或者在結(jié)果解釋時格外謹慎。4.5 正態(tài)模型未加權(quán)導(dǎo)致小樣本區(qū)域被過度放大現(xiàn)象用正態(tài)模型分析各區(qū)域的平均出生體重小樣本區(qū)域出現(xiàn)極端值導(dǎo)致假聚集。原因標準正態(tài)模型假設(shè)每個觀測的方差相同但小樣本區(qū)域的均值方差更大。說明書里建議用加權(quán)正態(tài)模型權(quán)重設(shè)為樣本量或方差倒數(shù)。解決在輸入文件里增加一列權(quán)重權(quán)重與樣本量成正比。如果所有觀測權(quán)重相同加權(quán)模型退化為標準模型。5. 從跑通示例到產(chǎn)出可解釋結(jié)果一個完整的驗證習(xí)慣跑通說明書里的示例數(shù)據(jù)集只是第一步。真正要交付的是可解釋、可復(fù)現(xiàn)的分析結(jié)果。我一般會按下面的順序走一遍確保每一步都有據(jù)可查。5.1 用示例數(shù)據(jù)驗證軟件安裝與參數(shù)理解安裝完 SaTScan 后先打開軟件點擊“打開保存的會話”選擇說明書里提到的參數(shù)文件比如納米帶寶對應(yīng)的泊松模型參數(shù)文件。跑完后看輸出窗口里的聚集列表、對數(shù)似然比、P 值。如果這些數(shù)字和說明書里的示例結(jié)果一致說明軟件安裝和參數(shù)理解沒問題。如果結(jié)果不一致檢查數(shù)據(jù)文件是否被修改過或者參數(shù)文件里的路徑是否指向了錯誤的數(shù)據(jù)文件。5.2 用敏感性分析確認聚集不是參數(shù)偶然確定主分析參數(shù)后做幾組敏感性分析。比如把最大掃描窗口從 50% 人口改成 30% 或 10%看聚集區(qū)域是否穩(wěn)定。如果聚集區(qū)域隨窗口大小劇烈變化說明結(jié)果不穩(wěn)健。另一個敏感性分析是換模型泊松模型和時空置換模型都跑一遍看哪些聚集在兩個模型下都顯著。說明書里提到時空置換模型會自動調(diào)整純空間和純時間聚集所以它可以作為泊松模型的補充驗證。5.3 輸出結(jié)果的解讀與報告寫法SaTScan 的輸出包括聚集區(qū)域的位置標識、半徑、病例數(shù)、預(yù)期病例數(shù)、相對風(fēng)險、對數(shù)似然比和 P 值。報告時不要只寫“發(fā)現(xiàn)了顯著聚集”要寫清楚在哪個時間范圍內(nèi)、哪個地理區(qū)域、聚集了多少病例、預(yù)期多少、相對風(fēng)險多少、P 值多少。如果用了多個模型說明哪個模型是主分析哪個是敏感性分析。如果聚集區(qū)域跨越多個行政區(qū)用地圖可視化會更直觀但注意不要泄露個體隱私。5.4 我每次跑 SaTScan 都會強制走一遍的檢查清單從那以后我每次跑 SaTScan 都強制走一遍這個清單第一確認病例文件、人口文件、坐標文件的位置標識完全一致第二確認時間精度與數(shù)據(jù)粒度匹配第三確認模型類型與數(shù)據(jù)類型匹配第四跑一遍示例數(shù)據(jù)驗證軟件狀態(tài)第五做至少兩組敏感性分析第六輸出結(jié)果里同時保留對數(shù)似然比和 P 值不只看 P 值。這套習(xí)慣幫我省掉了至少三次返工。希望幫到你。本文還有配套的精品資源點擊獲取