Skip to content

Commit

Permalink
fixed issues leading to failing tests
Browse files Browse the repository at this point in the history
  • Loading branch information
s-scherrer committed Nov 10, 2020
1 parent 9bb82aa commit 95163a7
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 26 deletions.
33 changes: 15 additions & 18 deletions statsmodels/tsa/base/mlemodel.py
Expand Up @@ -52,7 +52,7 @@ def __init__(
self._fixed_params_index = None
self._free_params_index = None

def prepare_data(data):
def prepare_data(self, data):
raise NotImplementedError

def clone(self, endog, exog=None, **kwargs):
Expand Down Expand Up @@ -118,7 +118,7 @@ def fix_params(self, params):
self._params_index[key] for key in self._fixed_params.keys()
]
self._free_params_index = list(
set(np.arange(self.k_params)).difference(self._fixed_params_index)
set(np.arange(k_params)).difference(self._fixed_params_index)
)

try:
Expand Down Expand Up @@ -183,15 +183,6 @@ def param_names(self):
names = []
return names

@classmethod
def from_formula(
cls, formula, data, subset=None, drop_cols=None, *args, **kwargs
):
"""
Not implemented for state space models
"""
raise NotImplementedError

def _wrap_data(self, data, start_idx, end_idx, names=None):
# squeezing data: data may be:
# - m x n: m dates, n simulations -> squeeze does nothing
Expand Down Expand Up @@ -267,7 +258,11 @@ def _hessian_finite_difference(self, params, approx_centered=False,
epsilon=epsilon, kwargs=kwargs,
centered=approx_centered)

return hessian / (self.nobs_effective)
if hasattr(self, "ssm"):
nobs_effective = self.nobs - self.ssm.loglikelihood_burn
else:
nobs_effective = self.nobs
return hessian / nobs_effective

def _hessian_complex_step(self, params, **kwargs):
"""
Expand All @@ -281,7 +276,11 @@ def _hessian_complex_step(self, params, **kwargs):
hessian = approx_hess_cs(
params, self.loglike, epsilon=epsilon, kwargs=kwargs)

return hessian / (self.nobs_effective)
if hasattr(self, "ssm"):
nobs_effective = self.nobs - self.ssm.loglikelihood_burn
else:
nobs_effective = self.nobs
return hessian / nobs_effective


class StateSpaceMLEResults(tsbase.TimeSeriesModelResults):
Expand Down Expand Up @@ -330,17 +329,15 @@ def __init__(self, model, params, normalized_cov_params=None, scale=1.0):

# Dimensions
self.nobs = self.model.nobs
self.k_params = self.model.k_params
if hasattr(model, "k_params"):
self.k_params = self.model.k_params

self._rank = None

@cache_readonly
def nobs_effective(self):
raise NotImplementedError

@cache_readonly
def df_resid(self):
return self.nobs_effective - self.df_model

@cache_readonly
def aic(self):
Expand Down Expand Up @@ -530,7 +527,7 @@ def test_normality(self, method):
d = 0
output = []
for i in range(self.model.k_endog):
if hasattr(self, "fiter_results"):
if hasattr(self, "filter_results"):
resid = self.filter_results.standardized_forecasts_error[
i, d:
]
Expand Down
2 changes: 2 additions & 0 deletions statsmodels/tsa/exponential_smoothing/ets.py
Expand Up @@ -1396,6 +1396,8 @@ def __init__(self, model, params, results):
# degrees of freedom of model
k_free_params = self.k_params - len(self.fixed_params)
self.df_model = k_free_params + 1
self.df_resid = self.nobs_effective - self.df_model


# standardized forecasting error
self.mean_resid = np.mean(self.resid)
Expand Down
13 changes: 9 additions & 4 deletions statsmodels/tsa/statespace/mlemodel.py
Expand Up @@ -24,9 +24,9 @@
import statsmodels.tsa.base.prediction as pred

from statsmodels.base.data import PandasData
import statsmodels.tsa.base.tsa_model as tsbase
from statsmodels.tsa.base.mlemodel import (StateSpaceMLEModel,
StateSpaceMLEResults)
import statsmodels.tsa.base.tsa_model as tsbase

from .news import NewsResults
from .simulation_smoother import SimulationSmoother
Expand Down Expand Up @@ -183,9 +183,6 @@ def initialize_statespace(self, **kwargs):
# Other dimensions, now that `ssm` is available
self.k_endog = self.ssm.k_endog

# Effective number of observations
self.nobs_effective = self.nobs - self.ssm.loglikelihood_burn

def _get_index_with_final_state(self):
# The index we inherit from `TimeSeriesModel` will only cover the
# data sample itself, but we will also need an index value for the
Expand Down Expand Up @@ -1981,6 +1978,13 @@ def impulse_responses(self, params, steps=1, impulse=0,
irfs = pd.DataFrame(irfs, columns=self.endog_names)
return irfs

@classmethod
def from_formula(cls, formula, data, subset=None):
"""
Not implemented for state space models
"""
raise NotImplementedError


class MLEResults(StateSpaceMLEResults):
r"""
Expand Down Expand Up @@ -2045,6 +2049,7 @@ def __init__(self, model, params, results, cov_type=None, cov_kwds=None,
k_free_params = self.params.size - len(self.fixed_params)
self.df_model = (k_free_params + self.k_diffuse_states
+ self.filter_results.filter_concentrated)
self.df_resid = self.nobs_effective - self.df_model

# Setup covariance matrix notes dictionary
if not hasattr(self, 'cov_kwds'):
Expand Down
6 changes: 2 additions & 4 deletions statsmodels/tsa/statespace/sarimax.py
Expand Up @@ -1801,6 +1801,8 @@ def __init__(self, model, params, filter_results, cov_type=None,
super(SARIMAXResults, self).__init__(model, params, filter_results,
cov_type, **kwargs)

self.df_resid = np.inf # attribute required for wald tests

# Save _init_kwds
self._init_kwds = self.model._get_init_kwds()

Expand Down Expand Up @@ -1876,10 +1878,6 @@ def __init__(self, model, params, filter_results, cov_type=None,
# Handle removing data
self._data_attr_model.extend(['orig_endog', 'orig_exog'])

@cache_readonly
def df_resid(self):
return np.inf # attribute required for wald tests

def extend(self, endog, exog=None, **kwargs):
kwargs.setdefault('trend_offset', self.nobs + 1)
return super(SARIMAXResults, self).extend(endog, exog=exog, **kwargs)
Expand Down

0 comments on commit 95163a7

Please sign in to comment.