R bsts预测不一致

时间:2017-07-19 21:00:19

标签: r time-series bayesian

每当我使用相同的预测数据在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,这只会产生不稳定的结果。
  3. 似乎都不起作用。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。要修复它,您需要在嵌入式C代码中设置随机种子。我分叉了打包并在此处进行了修改:BSTS

仅对于软件包安装,请在构建文件夹中下载bsts_0.7.1.1.tar.gz。如果您已经安装了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,Boom和BoomSpikeSlab。)

此软件包版本仅修改bsts中的预测函数,所有代码都应按原样运行。每次调用预测时,它会自动将随机种子设置为1。如果您希望预测发生变化,则每次都需要明确设置预测参数。

答案 1 :(得分:0)

您可以创建一个函数,每次都指定set.seedreproducible_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 是不必要的......):

Sub finddata()
    Dim nursenumber As String
    Dim finalrow As Integer
    Dim i As Integer
    Dim course As Integer
    Dim nurserow As Integer

    nursenumber = InputBox("please enter nurse number")
    nurserow = InputBox("please enter nurse row")
    finalrow = Sheets("S1").Range("A10000").End(xlUp).Row
    course = ADORIE

    'fire update
    For i = 2 To finalrow
        Worksheets("S1").Activate
        If Cells(i, 1) = nursenumber & Cells(i, 7) = "FIRE" Then
            Cells(i, 9).Copy
            Worksheets("database").Activate
            Cells(nurserow, 2).PasteSpecial
        End If

        'cpr
        If Cells(i, 1) = nursenumber & Cells(i, 7) = "CPRNURL4" Or _
           Cells(i, 7) = "BUCPRBYS" Or Cells(i, 7) = "BUCPREMS" Or _
           Cells(i, 7) = "CPRACLSR" Or Cells(i, 7) = "CPRADULT" Or _
           Cells(i, 7) = "CPRALIED" Or Cells(i, 7) = "CPRBASIC" Or _
           Cells(i, 7) = "CPRBYST" Or Cells(i, 7) = "CPRCO567" Or _
           Cells(i, 7) = "CPRMANHA" Or Cells(i, 7) = "CPRMCORP" Or _
           Cells(i, 7) = "CPRNURL4" Then

            Cells(i, 9).Copy
            Worksheets("database").Activate
            Cells(nurserow, 3).PasteSpecial

    Next i 
End Sub

答案 2 :(得分:0)

我遇到了同样的问题。 问题出在仅在模型定义内设置种子。

要解决您的问题,您必须在诸如以下的预测函数中设置一个种子:

iris_predict <-预测(iris_bsts,newdata = iris_test,burn = burn,seed = X)

希望这会有所帮助。