如何在 运行 statsmodels 马尔可夫回归时修复 "Arguments do not have compatible shapes"

How to fix "Arguments do not have compatible shapes" when running statsmodels Markov Regression

我正在尝试 运行 在 Python 中使用 statsmodels 进行具有时变转移概率的马尔可夫回归。

到目前为止,我可以得到运行的马尔可夫自回归,但是,我无法计算马尔可夫回归,因为出现错误"Arguments do not have compatible shapes"。 感谢任何帮助!

df_source = 'http://econ.korea.ac.kr/~cjkim/MARKOV/data/filardo.prn'
dta_filardo = pd.read_table(df_source, delim_whitespace=True, names=('month', 'ip', 'leading'),nrows=520)
dta_filardo.index = pd.date_range('1948-01-01', '1991-04-01', freq='MS')
dta_filardo['dlip'] = np.log(dta_filardo['ip']).diff()*100
std_ratio = dta_filardo['dlip']['1960-01-01':].std() / dta_filardo['dlip'][:'1959-12-01'].std()
dta_filardo['dlip'][:'1959-12-01'] = dta_filardo['dlip'][:'1959-12-01'] * std_ratio
dta_filardo['dlleading'] = np.log(dta_filardo['leading']).diff()*100
dta_filardo['dmdlleading'] = dta_filardo['dlleading'] - dta_filardo['dlleading'].mean()


mod_filardo = sm.tsa.MarkovAutoregression(
    dta_filardo.ix[2:, 'dlip'], k_regimes=2, order=4, switching_ar=False,
    exog_tvtp=sm.add_constant(dta_filardo.ix[1:-1, 'dmdlleading']))

res_filardo = mod_filardo.fit(search_reps=20)
res_filardo.summary()

########

mod_filardo = sm.tsa.MarkovRegression(
     dta_filardo.ix[2:, 'ip'], k_regimes=2,
     exog_tvtp=sm.add_constant(dta_filardo.ix[1:-1, 'leading']))

res_filardo = mod_filardo.fit(search_reps=20)
res_filardo.summary()

马尔可夫自回归完美运行(直到 ######),之后我尝试 运行 马尔可夫回归并收到错误 "Arguments do not have compatible shapes"。我希望看到像自回归估计中那样的摘要...

如果您跟踪 stack-trace,您将在 markov_regression.py 内的 predict_conditional 方法和 statsmodels.tsa 内的 regime_switching 文件夹中的 markov_autoregression.py 中结束.

奇怪的是this line生成了一个大小为(k_regimes,k_regimes,nobs)的预测矩阵来填充conditional_likelihoods 张量.

马尔可夫回归和自回归都使用执行以下完整性检查的哈密尔顿过滤器:

k_regimes = len(initial_probabilities)
nobs = conditional_likelihoods.shape[-1]
order = conditional_likelihoods.ndim - 2
dtype = conditional_likelihoods.dtype

# Check for compatible shapes.
incompatible_shapes = (
    regime_transition.shape[-1] not in (1, nobs + order)
    or regime_transition.shape[:2] != (k_regimes, k_regimes)
    or conditional_likelihoods.shape[0] != k_regimes)

因为regime_transition.shape[-1] = nobs = conditional_likelihoods.shape[-1]regime_transition.shape[-1]不能等于(nobs+order)。因此,形状未对齐。似乎这个 class 创建的矩阵只有在您提供 exog_tvtp 矩阵时才能通过其超级 class' 完整性检查(否则 regime_transition.shape[-1] = 1).

这就是问题的要点。我会联系 Chad Fulton(本模块的作者)进一步询问。

感谢您提交此 bug report. The issue has been fixed in Github 并将在我们的下一个版本 (v0.10.1) 中提供。