Многофакторная модель VAR: ValueError: x уже содержит константу - PullRequest
0 голосов
/ 23 октября 2018

Я уже прочитал этот вопрос и связанный с ним ответ.

Я удалил все «все нули» столбцы, как рекомендовано в ответе.У меня осталось 3 169 столбцов.

datavals_no_con = datavals.loc[:, (datavals != datavals.iloc[0]).any()]

Я проверил, были ли пропущены какие-либо из них, по какой-то причудливой причине:

varcon = np.asarray([np.var(datavals_no_con[datavals_no_con.columns[i]]) for i in range(len(datavals_no_con.columns))])
print np.where(varcon==0.) #empty array.

Также проверил минимальное значение отклонения столбца, которое в итоге составило 4,306x10.^ (- 7)

Это было сгенерировано столбцом, который не имеет нулевых записей.

Когда я запускаю это:

model = VAR(datavals_no_con)

results = model.fit(2)

Я все еще получаю:

Traceback (most recent call last):
  File "vector_autoregression.py", line 163, in <module>
    results = model.fit(2)
  File "/user/anaconda2/lib/python2.7/site-packages/statsmodels/tsa/vector_ar/var_model.py", line 438, in fit
    return self._estimate_var(lags, trend=trend)
  File "/user/anaconda2/lib/python2.7/site-packages/statsmodels/tsa/vector_ar/var_model.py", line 457, in _estimate_var
    z = util.get_var_endog(y, lags, trend=trend, has_constant='raise')
  File "/user/anaconda2/lib/python2.7/site-packages/statsmodels/tsa/vector_ar/util.py", line 32, in get_var_endog
    has_constant=has_constant)
  File "/user/anaconda2/lib/python2.7/site-packages/statsmodels/tsa/tsatools.py", line 102, in add_trend
    raise ValueError("x already contains a constant")
ValueError: x already contains a constant

Как мне решить эту проблему?

РЕДАКТИРОВАТЬ: Мне пришло в голову, что проблема заключается в том, что х содержит константу, а не то, что х содержит все 0.Поэтому первоначального ответа, предложенного в предыдущем вопросе, было недостаточно.

Чтобы проверить, содержит ли какой-либо из моих столбцов «все одно и то же значение» (например, столбец со всеми 0,5), я попытался это сделать:

ptplist = []
for i in range(len(datavals_no_con.columns)):
    ptplist.append(np.ptp(datavals_no_con[datavals_no_con.columns[i]], axis=0))

ptparray = np.asarray(ptplist)
print any(ptparray==0.) #FALSE

Так что ни один из моих столбцов не является константой, если я до сих пор что-то упускаю.

РЕДАКТИРОВАТЬ 2: Я нашел основную причину проблемы.

Предположим, что моя входная матрица (то есть мой набор эндогенных переменных) представляет собой единичную матрицу 5x5, ради аргумента, и что мое значение лага равно 2 (то есть я ищу AR(2) модель: y_ {t + 1} = A + B_1y_ {t} + B_2y_ {t-1} + ошибка):

y = np.eye(5)

1 0 0 0 0 (row 1)
0 1 0 0 0 (row 2)
0 0 1 0 0 (row 3)
0 0 0 1 0 (row 4)
0 0 0 0 1 (row 5)

В функции get_endog_var в / statsmodels / tsa / util.py, при лагах = 2, матрица y переставляется в соответствии с этой общей идеей:

[row 2, row 1] (i.e. concatenate these two)
[row 3, row 2]
[row 4, row 3]

И эта новая матрица может иметь нулевые столбцы в местах, где моя исходная матрица данных не имела.На самом деле это именно то, что происходило.Следуя моему примеру, np.array Z в get_endog_var выглядит следующим образом:

0 1 0 0 0 1 0 0 0 0
0 0 1 0 0 0 1 0 0 0
0 0 0 1 0 0 0 1 0 0

Так что теперь столбцы 0, 4, 8 и 9 полностью равны 0, что вызывает ошибку ValueError.

На ум приходят два возможных подхода:

1) Удалите нулевые столбцы из Z-матрицы.2) Отредактируйте исходный набор данных таким образом, чтобы эти нулевые столбцы никогда не встречались в первую очередь (гораздо сложнее, потому что тогда бы здесь не было Z-матрицы, поэтому как узнать, какие столбцы удалить ... поймать 22).

Я выбрал вариант 1, но теперь я имею дело с проблемами формы в дальнейшем.

Есть ли более элегантное решение?

...