Экзогенная переменная Python ARIMA вне образца

Я пытаюсь предсказать временные ряды в пакете ARIMA statsmodels для Python с включением экзогенной переменной, но не могу найти правильный путь для вставки экзогенной переменной в шаге предиката. УвидетьВот для документов.

import numpy as np
from scipy import stats
import pandas as pd

import statsmodels.api as sm

vals = np.random.rand(13)
ts = pd.TimeSeries(vals)
df = pd.DataFrame(ts, columns=["test"])
df.index = pd.Index(pd.date_range("2011/01/01", periods = len(vals), freq = 'Q'))

fit1 = sm.tsa.ARIMA(df, (1,0,0)).fit()
#this works fine:
pred1 = fit1.predict(start=12, end = 16)
print(pred1)

Out[32]: 
2014-03-31    0.589121
2014-06-30    0.747575
2014-09-30    0.631322
2014-12-31    0.654858
2015-03-31    0.650093
Freq: Q-DEC, dtype: float64

Теперь добавьте в тренд экзогенной переменной

exogx = np.array(range(1,14))
#to make this easy, let's look at the ols of the trend (arima(0,0,0))
fit2 = sm.tsa.ARIMA(df, (0,0,0),exog = exogx).fit()
print(fit2.params)

const    0.555226
x1       0.013132
dtype: float64

print(fit2.fittedvalues)

2011-03-31    0.568358
2011-06-30    0.581490
2011-09-30    0.594622
2011-12-31    0.607754
2012-03-31    0.620886
2012-06-30    0.634018
2012-09-30    0.647150
2012-12-31    0.660282
2013-03-31    0.673414
2013-06-30    0.686546
2013-09-30    0.699678
2013-12-31    0.712810
2014-03-31    0.725942
Freq: Q-DEC, dtype: float64

Обратите внимание, что, как и следовало ожидать, это линия тренда, увеличивающаяся на 0,013132 с каждым увеличением тика во времени (конечно, это случайные данные, поэтому, если вы запустите его, значения будут другими, но история положительного или отрицательного тренда будет так же). Итак, следующее значение (для времени = 14) должно быть 0,555226 + 0,013132 * 14 = 0,739074.

#out of sample exog should be (14,15,16)
pred2 = fit2.predict(start = 12, end = 16, exog = np.array(range(13,17)))
print(pred2)
2014-03-31    0.725942
2014-06-30    0.568358
2014-09-30    0.581490
2014-12-31    0.594622
2015-03-31    0.765338
Freq: Q-DEC, dtype: float64

Таким образом, 2014-03-31 правильно прогнозирует (последняя выборка), но 2014-06-30 начинается с начала (t = 1), но обратите внимание на 2015-03-31 (фактически всегда последнее наблюдение за прогнозом, независимо от горизонта) поднимается t = 16 (то есть (значение - перехват) / бета = (0,765338 - 0,555226) /0,013132).

Чтобы сделать это более понятным, обратите внимание, что происходит, когда я раздуваю значения x mat

fit2.predict(start = 12, end = 16, exog = np.array(range(13,17))*10000)
Out[41]: 
2014-03-31       0.725942
2014-06-30       0.568358
2014-09-30       0.581490
2014-12-31       0.594622
2015-03-31    2101.680532
Freq: Q-DEC, dtype: float64

Видите, что 2015-03-31 взорвалось, но ни одно из других значений xmat не рассматривалось? Что я здесь не так делаю ???

Я попытался поиграть со всеми способами, которые я знаю, как передать переменную exog (изменение измерения, создание exog матрицы, создание exog до тех пор, пока входные данные плюс горизонт, и т. Д., И т. Д.). Любые предложения будут очень признательны.

Я использую 2.7 из Anaconda2.1 numpy 1.8.1 scipy 0.14.0 pandas 0.14.0 statsmodels 0.5.0

и проверил проблему на Windows 7 64-битных и Centos 64-битных.

Также несколько вещей. Я использую ARIMA для функциональности ARIMA, и вышесказанное просто для иллюстрации (то есть я не могу «просто использовать OLS ...», как я предполагаю, будет предложено). Я также не могу «просто использовать R» из-за ограничений проекта (и в более общем смысле, из-за отсутствия поддержки R в базовой Spark).

Вот интересные части кода на случай, если вы захотите попробовать сами

import numpy as np
from scipy import stats
import pandas as pd
import statsmodels.api as sm

vals = np.random.rand(13)
ts = pd.TimeSeries(vals)
df = pd.DataFrame(ts, columns=["test"])
df.index = pd.Index(pd.date_range("2011/01/01", periods = len(vals), freq = 'Q'))

exogx = np.array(range(1,14))
fit2 = sm.tsa.ARIMA(df, (0,0,0),exog = exogx).fit()
print(fit2.fittedvalues)
pred2 = fit2.predict(start = 12, end = 16, exog = np.array(range(13,17))*10000)
print(pred2)

Ответы на вопрос(3)

Ваш ответ на вопрос