运行statsmodels Markov回归时如何解决“参数没有兼容的形状”

时间:2019-07-04 19:46:05

标签: python statsmodels

我试图在具有statsmodels的Python中运行具有时变过渡概率的Markov回归。

到目前为止,我可以运行马尔可夫自回归,但是,由于出现错误“参数没有兼容的形状”,因此我无法计算马尔可夫回归。 感谢您的帮助!

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()

马尔可夫自回归工作完美(直到######为止),然后,我尝试运行马尔可夫回归并收到错误“参数没有兼容的形状”。我希望能在自回归估计中看到类似的摘要...

2 个答案:

答案 0 :(得分:0)

如果跟踪堆栈跟踪,最终将在predict_conditionalmarkov_regression.py文件夹中的markov_autoregression.pyregime_switching中的statsmodels.tsa方法中结束。

奇怪的是,this line生成大小为(k_regimes,k_regimes,nobs)的预测矩阵以填充conditional_likelihoods张量。

Markov回归和自回归都使用汉密尔顿过滤器,该过滤器执行以下完整性检查:

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)。因此,形状不对齐。似乎该类创建了一个矩阵,只有当您提供exog_tvtp矩阵时,该矩阵才能通过其超类的健全性检查(否则Regage_transition.shape [-1] = 1)。

这是问题的要点。我将与Chad Fulton(该模块的作者)联系以进行进一步的查询。

答案 1 :(得分:0)

感谢您提交此bug report。问题已经fixed in Github,将在我们的下一个版本(v0.10.1)中出现。