2017-07-19 56 views
1

每當我運行使用相同預測數據的BSTS模型的預測函數多次,我得到不同的答案。所以我的問題是,有沒有辦法返回一致的答案,因爲我保持我的預測數據集相同?[R BSTS的預測並不一致

例如使用虹膜數據集(我知道這是不是時間序列,但它說明我的觀點)

iris_train <- iris[1:100,1:3] 
iris_test <- iris[101:150,1:3] 

ss <- AddLocalLinearTrend(list(), y = iris_train$Sepal.Length) 

iris_bsts <- bsts(formula = Sepal.Length ~ ., data = iris_train, 

state.specification = ss, 
        family = 'gaussian', seed = 1, niter = 500) 
burn <- SuggestBurn(0.1,iris_bsts) 

現在,如果我跑這以下行說,10次,每次的結果是不同的:

iris_predict <- predict(iris_bsts, newdata = iris_test, burn = burn) 
iris_predict$mean 

據我所知,它正在運行MCMC模擬,但我需要一致的結果,因此曾嘗試:

  1. 在bsts中設置種子並預測之前
  2. 將狀態空間標準差設置爲接近0,這隻會產生不穩定的結果。

而且既不似乎工作。任何幫助,將不勝感激!

回答

0

你可以做一個函數來指定seed每次(set.seed是不必要的...):

reproducible_predict <- function(S) { 
    iris_bsts <- bsts(formula = Sepal.Length ~ ., data = iris_train, state.specification = ss, seed = S, family = 'gaussian', niter = 500) 
    burn <- SuggestBurn(0.1,iris_bsts) 
    iris_predict <- predict(iris_bsts, newdata = iris_test, burn = burn) 
    return(iris_predict$mean) 
} 

reproducible_predict(1) 
[1] 7.043592 6.212780 6.789205 6.563942 6.746156 
reproducible_predict(1) 
[1] 7.043592 6.212780 6.789205 6.563942 6.746156 

reproducible_predict(200) 
[1] 7.013679 6.173846 6.763944 6.567651 6.715257 
reproducible_predict(200) 
[1] 7.013679 6.173846 6.763944 6.567651 6.715257 
+0

我運行了原代碼並添加了set.seed,正如你所建議的那樣,但是我仍然得到了不同的iris_predict $ mean的結果... – Sharma

+0

我忘記提及我必須能夠多次運行預測函數並始終如一地獲取同樣的結果,設置種子這不會發生。 – Sharma

+0

我編輯了我的答案......'set.seed'是不必要的。對於可重複的行爲,您需要每次在'bsts'中指定'seed' – CPak

0

我遇到同樣的問題。要修復它,你需要在嵌入的C代碼中設置隨機種子。我分叉包裝,並在這裏進行修改:BSTS

對於軟件包安裝只,下載bsts_0.7.1.1.tar.gz build文件夾中。如果您已經安裝了BSTS,通過這個版本來替換它:

remove.packages("bsts") 
# assumes working directory is whre file is located 
install.packages("bsts_0.7.1.1.tar.gz", repos=NULL, tyype="source") 

如果您沒有安裝BSTS做,請先安裝,以確保所有的依賴都在那裏。 (這可能需要安裝Rtools,繁榮和BoomSpikeSlab獨立。)

此套件版本僅修改從BSTS的預測功能,所有的代碼將正常運行是。每次調用預測時,它會自動將隨機種子設置爲1。如果你想預測變化,你需要每次明確設置預測參數。