是否應該在 MCMC 中預測收益?
假設我們正在使用馬爾可夫鏈蒙特卡羅技術(例如吉布斯採樣器)估計一個線性模型,該模型來自貝氏框架中的後驗。假設我們擁有的完整數據樣本來自時間 $ t = 1, \dots,\tau\dots, T $ ,並且我們希望使用從 time 開始的遞歸視窗來預測提前一個時期的回報 $ t = \tau $ 直到時間 $ t = T $ . 我們已經訓練了模型 $ t=1 $ 到時間 $ t=\tau $ ,那麼我們要預測某個時間的樣本外收益 $ t=\tau+1 $ :
$$ \begin{equation} y_{\tau +1} = \beta’ \mathbf{x}\tau + \sigma \varepsilon{\tau + 1}, ; ; \varepsilon_{\tau + 1} \sim \mathcal{N}(0,1) \end{equation} $$
當我在每個週期都沒有設置種子的情況下嘗試這個時,錯誤項 $ \varepsilon_{\tau+1} $ 在整個過程中是如此隨機 $ I $ MCMC 算法的迭代 $ y_{\tau+1} $ 本質上是隨機遊走。當我在每個時期設置種子時 $ I $ Gibbs 採樣器中的迭代使用相同的 $ \varepsilon_{\tau+1} $ 我在 RMSFE 方面發現了更好的結果。
我們是否應該在每個週期的隨機數生成器中設置種子 $ \tau $ , 這樣所有 $ I $ 評估的迭代 $ y_{\tau+1} $ 使用相同的誤差項 $ \varepsilon_{\tau+1} $ 在計算這個預測時?
我的理解是,標準建議是隨機選擇一個種子值,然後保留該種子用於整個分析。這允許相同的電腦程式碼每次都給出相同的結果。
例如,參見Stata 手冊:
Stata 的隨機數生成函式,例如 runiform() 和 rnormal(),實際上並不產生隨機數。這些函式是確定性算法,可以生成可以隨機傳遞的數字。runiform() 產生的數字可以通過 [0,1) 上的矩形分佈進行獨立繪製;rnormal() 產生的數字可以通過 N(0,1) 進行獨立抽籤。Stata 的隨機數函式正式稱為偽隨機數函式。這些函式產生的序列由種子決定,種子只是一個數字,每次啟動 Stata 時都設置為 123456789。…如果您記錄您設置的種子,則可以稍後重現偽隨機結果,例如模擬結果或 mi impute 的估算值。 無論你在設置種子後做什麼,如果你將種子設置為相同的值並重複你所做的,你將獲得相同的結果……你如何設置種子並不重要,只要沒有明顯的在您設置的種子中設置模式,只要您在會話期間不經常設置種子
但是,如果您使用並行化進行許多單獨的模擬,那麼您需要確保不在每個節點上使用相同的種子或基於時間的種子:
正確播種您的發電機。即使是最先進的 Mersenne Twister 也很早就遇到了問題,因為作者忽略了正確播種的問題……如果你要在 Beowulf 集群上執行並行模擬,這條規則是至關重要的。播種 RNG 的最簡單方法是獲取目前時間,例如使用 Unix 和大多數 C 庫中的 time() 函式,它返回一個 32 位整數,給出自 1970 年 1 月 1 日以來的秒數。 …數百不同節點上的作業將在幾乎完全相同的時間開始 - 因此您的許多作業將以完全相同的種子開始,因此具有相同種子的作業將產生完全相同的結果(假設您的程式碼在它)。