多元VAR模型:ValueError:x已经包含常数

时间:2018-10-23 18:08:11

标签: python time-series statsmodels

我已经阅读了this question和相关的答案。

我已按照答案中的建议删除了所有“全零”列。我还剩下3169列。

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

我该如何解决?

编辑:我想到问题是x包含一个常数,而不是x包含全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)

在/statsmodels/tsa/util.py中的get_endog_var函数中,在lags = 2下,y矩阵重新排列为以下一般概念:

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

在我的原始数据矩阵没有的地方,这个新矩阵可以有零列。实际上,这正是正在发生的事情。按照我的示例,get_endog_var中的np.array Z看起来像这样:

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)。 / p>

我选择了选项1,但现在我正在处理形状问题。

有没有更优雅的解决方案?

0 个答案:

没有答案