我已经阅读了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,但现在我正在处理形状问题。
有没有更优雅的解决方案?