我正在尝试在python上使用此函数来模拟我已构建的SARIMAX模型,
statsmodels.tsa.statespace.sarimax.SARIMAX.simulate
目的是使用该模型进行蒙特卡洛模拟
当我尝试使用已有的数据将initial_state放在函数上时,就会发生问题
我已经尝试过不使用initial_state,并且模拟结果似乎很好,但是初始点不是我期望的。当我尝试设置initial_state时,模拟结果呈指数增长。
我使用2017-2019年的每日降水量数据
#Define the test model using another set of data, but the same order.
testMdl = smt.SARIMAX(rain_df_daily.y, order = (5, 3, 0), seasonal_order=(1,1,2,12),enforce_stationarity=False,
enforce_invertibility=False)
#Set initial state
#testMdl.initialize_known(rain_df_daily[:'2018-01-01'].y.mean,rain_df_daily[:'2018-01-01'].y.std)
testMdl.initialize_known(sarima_results.predicted_state[:,-2],
sarima_results.predicted_state_cov[:,:,-2])
#Initialize the test model with the coefficients from the fit model:
testMdl = testMdl.filter(sarima_results.params)
#Seems you can also use .smooth() to initialize coefficients, but have not looked into the difference
#exoCopy = exoCopy.smooth(fitMdl.params)
samples = pd.DataFrame(columns = range(0,50)) #initialize obs. sample df
for sample in range(0, 50): #For each sample
#samples[sample] = testMdl.simulate(24, initial_state=mdlExo.predicted_state[:,-1])
samples[sample] = testMdl.simulate(40, initial_state = rain_df_daily['2018-02-21':].y)
我希望结果将接近预期的平均值
答案 0 :(得分:0)
我认为您的模型存在的问题是指定的顺序参数,而不是模拟的初始值。
例如拟合降雨数据的简单模型
model = SARIMAX(df,
order=(1, 0, 1),
trend='n',
seasonal_order=(1, 2, 1, 5),
enforce_stationarity=False,
enforce_invertibility=False).fit()
model.forecast(60).plot()
产生结果
模拟
samples = []
for sample in range(50):
samples.append(model.simulate(30, initial_state=model.predicted_state[:, -1]))
sns.lineplot(data=samples)
结果
这肯定不是一个很好的模型,但结果与预测平均值相差不远。