多主體建模的一般流程
在理解計算機建模的基本邏輯之後,就很容易勾劃出在社會科學中套用計算機建模研究的一般流程(參見「1])。第一步:問題的提出。研究所希望解答什麼樣的一個未知問題,比如我們對公元二900一1300年在墨西哥形成的Puebloan沉降模式的原因感到好奇(參見[2」)。這樣就可以定義模型要仿真的實相(梅薩維德(MesaVerde)地區的沉降動力學)。通常需要對實相要進行一些觀察,從而為模型提供一些初始參數。對於 Kohler的研究來說,這些觀察工作由 Van West在 1994年的細緻考古研究所完成(參見[3])。下一步可以提出一些假設,並依據這個假設來設計出概念模型。然後就是模型的實現,也稱為模型的架構,選擇合適的計算機語言或開發工具,把概念模型轉化為電腦程式。
到這一步為止,所有必需的研究步驟都是相當顯明的,然而剩下的工作就不那么顯而易見,但非常關鍵。還必須保證這個模型實現的正確性,確保它依照預先的構想運行,這一步被稱為正確性校驗,在軟體開發中相當於調試。對於複雜的模型,這一步通常會很困難,特別是人們很難確定是否已經消除了所有的錯誤(程式臭蟲,BUG)。此外,由於社會科學建模研究多用隨機數的方式模擬那些隨機的效應或沒有測量的變數(參見 [4]),用多次運行來產生不同的結果,這更增加程式調試的難度——沒有一個確定的結果輸出,很難通過運行
模型的架構與實現
這一步最常犯的錯誤是過多考慮不必要的細節。若過多關注細節,研究者就不得不為此收集大量的數據,這樣會大大增加對數據可靠性控制和處理的難度,從而給模型的正確性校驗和有效性驗證帶來巨大的困難。換句話說,這也意味著很難從研究中得出有效的結論。正如與真實世界最相吻合的是真實世界本身一樣,但這種逼真對科學認識來說毫無意義。
一旦一個模型被設計出來,那么就可以著手去架構它。這一步可能需要自己動手編寫一些程式,或利用一些方便開發建模軟體開發工具庫或“模型工具機”(已開發的方便模型架構的軟體),甚至僅僅是在別人做好的測試框架中填充些自己的數據。使用一些第三方提供的開發工具通常比自己動手從零開始設計要容易得多,因為許多在開發工具中已經被考慮的問題都需要自己重新考慮。比如,數據統計和圖表顯示的功能,自己開發是一件很費時間的工作,而在大多數工具包中都已經提供了這些接口以方便變數的輸出顯示。至少這其中的一些可能錯誤在很多人的共同使用中被發現和更正(儘管我們無論什麼時候都不應假定這裡不再存在任何錯誤)。使用工具包不好的方面在於,每一種工具包都有自己內在的框架假設,這限制了它的功能特性,從而也限制了程式設計的自由度和它適用的範圍。這裡有不同的軟體,每一種有各自適合的套用條件,但沒有哪一種可以包容或完全取代其他工具的,本書的第四章將對不同的軟體工具及其特性進行比較詳細的介紹。
正確性校驗
效用檢驗
當正確性驗證通過後,剩下來的工作就是效用檢驗。
效用檢驗即模型的有效性檢驗,這一步所關心的問題是,在研究者關注的輸入輸出行為關係表現上,這個模型是否與實相吻合。如果一個模型能夠反映出實相的行為,那么就可被認為是可靠的、有效的。效用檢驗可通過比較計算機的輸出和實際調查研究的統計結果來進行。
在形成一個可運行的仿真後,下一步就是檢驗模型是否真的按照我們的期望在運行(參見「11])。對複雜的模型來說,剛開始能運行的模型,輸出的更可能是一個錯誤的結果。因此需要準備很多測試案例,進行各種各樣的邊界測試。模型中隨機數的套用增加了排錯和正確性驗證的難度。比如,在一個人工社會的仿真研究中,如果有一個參數控制社會的規模(比如人口數),那么可以從最小規模的社會人手開始檢驗;如果還有一個參數控制的是社會的複雜度(比如年齡差異、種族類別等),可以先從最小的複雜度開始調試。在一個多參數的仿真中,用逐級構建的方式調試是一個不錯的選擇。所謂逐級構建,就是分步驟地增加假設條件和模型的複雜度,在有多個變數都是隨機數的情況下,可通過先固定別的參數,單獨調試一種參數隨機變化的情況,然後再從兩個組合開始直到完整模型所需要的假設條件全部正確運行,在後面的具體實例介紹中我們將根據實例具體說明。
然而有以下幾點需要特別注意。
(1)模型和真實現象在統計分布上都是有隨機噪聲的(如部分依靠隨機參數),不可能期望完全相關。模擬與實驗數據之間的偏差是否大得令人懷疑部分取決於輸出測量值的期望統計分布。不幸的是,對於仿真來說,很難確定和估計這個偏差。
(2)許多仿真都是路徑依賴的,輸出依賴於初始條件的精確選擇,每次仿真的歷史對輸出都有影響。換句話說,輸出對這個模型的某些假設輸入參數非常敏感。
(3)即便仿真的運行結果與實際數據很匹配,還存在另外一種可能,就是實際現象中的另外一些特徵仿真並不能重現。比如,曾經有一個世界人口模型,儘管對世界人口未來50年的預測看上去是可信的,但在試圖用這個模型重現過去20年人口變化時卻失敗了,儘管用的是同樣的模型,設定的是同樣的參數。
(4)必須考慮另外一種可能,即模型正確,而蒐集的真實數據卻可能不可靠,或者研究者的假設和估計有誤。如一個為理解法國兩萬年前社會複雜度上升的計算模型,該模型採用的數據都來自乾考古學的線索,這些經過很多次解釋的數據本身是否有效是很值得懷疑的。
(5)版本控制的重要性。不同參數或假設的細微調整可能會帶來運行結果上的極大不同,但並非只有最符合建模者期望的才是有價值的,一些表面上背離常識的運行結果也許蘊藏著更深層次的發現,且每一次參數的調整與假設的修正都應該給出理由,並給出調整或修正前後仿真運行變化的合理解釋。這樣每一次對模型進行細微的調整或者只改變一些參數的多次重複運行的中間狀態或最終結果都被稱為仿真的一個版本,在研究中應該完整地記錄下來。一些專門的建模平台和軟體已經很好地為研究者考慮了這點,可以很方便地保存不同的仿真版本(例如,在Starlogo中就有另外保存時自動增加版本序號的功能,參見附錄B)。
當模型設計得過於抽象時會導致另外一種困難,即很難把模型中得出的結論與某個具體的實相數據進行比較和對照。如 sob,lling在1971年做的一個解釋人種居住自動隔離過程的模型(參見[121),由於模型非常抽象簡單,很難直接用現實的數據去驗證它的效用。這個問題在人工社會研究中同樣存在,實相或者與模型相差甚遠,或者壓根就不存在,對於這樣的模型來說,就很難說正確性驗證和效用驗證之間有什麼區別。
一旦有了一個效用模型,至少在一些特殊的初始條件和參數輸入下模型可以運行了。研究者們接下來很可能希望考慮的問題就是敏感性分析。
敏感性分析
敏感性分析就是分析模型的行為對假設的敏感程度。比如在一個稅收和福利系統的模型中,政府的福利財政總支出對社會福利率的細微調整是否敏感?很可能存在這樣一種情況:當福利率降低時,一些對貧窮人口的扶助支撐項目必須得啟動,於是這個政策對政府的支出縮減的影響將會因此比預計中少許多。另外,敏感性分析的使用通常還與考察模型程式的健壯性(Robustness,魯棒性)有關。如果模型的行為對某兩個參數的微小變化十分敏感,我們必須懷疑模型是否只能適合某些特例情況,而仿真結果的吻合僅僅是一種偶然的巧合,或者這些參數的特別限制是否符合實際情形。
敏感性分析的基本原則就是細小調整初始參數、重複運行模型、觀察輸出的變化。這個參數調整的過程應該有系統地組織和安排,考慮不同參數可能變化的排列組合,有時雖然只有幾個參數,但參數之間變化組合的數目也會非常大(例如,3個參數,每個參數有5種變化,那么需要重複的仿真安排就達5X5X5—125次),這意味著需要重複運行的次數非常大,這也導致對所有運行結果進行分析的工作量加大。在實踐中,模型建立者一般有自己的直覺,從而能夠選擇部分最重要的參數組合去檢驗仿真。
接下來介紹進行敏感性分析的一種具體的方法,即用隨機數作為參數輸入模型,可以限定隨機數作為一個輸入向量空間,通過在輸入向量空間內多次運行模型,得到相應的輸出指標的分布,然後分析輸入向量空間與輸出指標分布之間的關係,從而判斷一個小的輸入參數的調整是否會帶來較大的輸出變化。從效果上來說,在一個輸入參數的樣本空間內重複運行模型相當於改變模型運行的條件,得到模型在不同條件下的行為全景圖像。
獲得隨機樣本空間只是隨機數套用的一種方式,在建模中,還可在下列幾種情形下套用隨機數。
(1)引入建模中來自外部環境而沒有考慮的過程因素(外部因素),比如,在家庭收人模型中工作市場的影響等。這裡隨機數代替了一些沒有測量的參數(也可能根本就無法測量),等價於建模者對不能精確獲得的信息的估計。
(2)作為主體某些特性的隨機分配,比如,個人的偏好、情感、地理分布等。
(3)在一些元胞自動機或多主體建模中作為一種仿真的伎倆。比如,同樣條件下主體動作規則執行的秩序的輸出不同,這樣隨機安排動作秩序,可避免得到依賴於特定動作規則秩序的結果。
無論因為什麼樣的原因採用隨機數,重複運行模型、觀察不同條件下的輸出都是必須的。仿真的結果可能用一個輸出的分布函式,或用多次運行的結果平均值的方式來表示。一旦引入了隨機因素,就必須套用在實驗研究中所用到的統計方法進行分析處理(可參考社會科學統計課程的相關教材或統計軟體手冊)。通過對變化幅度的分析來評價定性的改變(比如是否已經形成一個群體),用回歸分析評價定量的數值變數。
因為多數模型都運用了隨機數因素,因此,孤立的一次仿真運行結果並不可靠,必須確定模型在任何一種預定的隨機範圍內都是穩定的。此外,嚴格意義上計算機提供的僅僅是偽隨機數,而不是真實的隨機數,但如果使用一個好的隨機數生成器,這二者之間並沒有明顯的區別,由於大多數仿真都採用了大量的隨機數並且依賴這些隨機數的分布,因此檢查採用的計算機系統是否有一個比較好的隨機數生成器是很有必要的。總之,對於計算機建模研究來說,做敏感度分析是非常重要的,這有助於考察模型是否對一些假設的初始條件和參數敏感。
模型的疊代與重構
在為社會經濟系統建立多主體模型時,除遵循前面介紹的一般流程外,還應當注意上述流程中的選代性。實際研究中,很難做到完成一次流程就達到了研究的目標,許多時候我們都需要在原始模型的基礎上反覆重構,不斷修正,才能設計出一個好的模型。因此,在設計模型的各階段中,我們可以遵循以下原則。
(1)儘可能簡化真實世界的問題,只保留那些對解答問題必不可少的內容。
(2)設計主體時,重點放在主體行為與互動作用的規則上,其次考慮可能需要的各種隨機因素。
(3)套用隨機數時,應嘗試著換用不同的隨機數產生方式或隨機數種子,多次運行模型,並從各個運行中收集數據進行統計。
(4)模型結果出來後,要嘗試去理解主體的行為簡單的規則是如何導致觀測到的系統總體的行為現象,特別是模型運行結果反常時,這一點更為重要。
(5)調節系統的參數,確定影響系統行為的關鍵因素以及不同參數的變化對系統整體行為影響的程度與方式。
(6)如果可能的話,進一步簡化模型,或必要時添加新的考慮因素。
(7)如果在研究過程中發現嚴重的假設錯誤,則需要對模型全部重構。
成果發布
任何研究的最後一步就是公開發布研究的結論,對於套用計算機建模方法的研究來說,撰寫公開發布的材料有些特殊的困難和要求。因為,發布的目的是與大家分享發現,最理想的效果是讀者能夠從發布中抓住其中與社會科學研究相關的要點,而不被模型的技術細節所牽累;同時,有興趣的讀者或同行又能根據發布的文檔,對模型進行重複驗證,這樣既可以更精確地理解模型工作的細節,也可以在此基礎上進行拓展研究。這兩個目標之間存在著非此即彼的矛盾。因為要讓讀者能夠重複仿真,必須描述模型的細節,而傳統的刊物一般都不能提供足夠的篇幅空間。解決這個問題的辦法是,另外在網際網路上公布模型的程式代碼和相關的使用指導和說明書,或者乾脆通過電子期刊發布,因為電子期刊並不限制紙張和空間,不僅可以包括傳統的論文格式,還可以包括代碼、樣本運行的其他材料,結果輸出的大量統計圖片,甚至動畫和別的多媒體資料等。
國外有些電子期刊鼓勵研究者發布論文時,把有關的計算機模型作為附屬檔案一起發布。中國人民大學經濟科學實驗室為了積極推動計算機仿真在社會科學中的套用,建立了一個開放式協作研究平台,方便研究者們集中發布模型的程式代碼,以期望解決這個問題,同時能最大限度地鼓勵這一類研究者們形成一個共同的研究規範,以及一個有利的協同研究的場所。