Я уже прочитал этот вопрос и связанный с ним ответ.
Я удалил все «все нули» столбцы, как рекомендовано в ответе.У меня осталось 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, но теперь я имею дело с проблемами формы в дальнейшем.
Есть ли более элегантное решение?