Skip to content

Commit

Permalink
REF: raise instead of warn if k_constant > 0
Browse files Browse the repository at this point in the history
  • Loading branch information
josef-pkt committed Sep 21, 2020
1 parent eeb1eb2 commit 72709ba
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 56 deletions.
13 changes: 3 additions & 10 deletions statsmodels/miscmodels/ordinal_model.py
Expand Up @@ -107,6 +107,9 @@ def __init__(self, endog, exog, offset=None, distr='probit', **kwds):
# Note: Doing the following here would break from_formula
# self.endog = self.endog.argmax(1)

if self.k_constant > 0:
raise ValueError("there should not be a constant in the model")

self._initialize_labels(labels)

self.results_class = OrderedResults
Expand Down Expand Up @@ -173,16 +176,6 @@ def from_formula(cls, formula, data, subset=None, drop_cols=None,

# we want an explicit Intercept in the model that we can remove
# Removing constant with "0 +" or "- 1" does not work for categ. exog
# copied from PHReg
import re
terms = re.split(r"[+\-~]", formula)
for term in terms:
term = term.strip()
if term in ("0", "1"):
import warnings
msg = ("OrderedModel formulas should not include any '0' or "
"'1' terms if those create an implicit constant.")
warnings.warn(msg, SpecificationWarning)

endog_name = formula.split("~")[0].strip()
original_endog = data[endog_name]
Expand Down
86 changes: 40 additions & 46 deletions statsmodels/miscmodels/tests/test_ordinal_model.py
Expand Up @@ -136,15 +136,13 @@ def setup_class(cls):
distr='logit')
resp = modp.fit(method='bfgs', disp=False)
# fit with formula
with warnings.catch_warnings():
warnings.simplefilter("ignore", SpecificationWarning)
modf = OrderedModel.from_formula(
"apply ~ pared + public + gpa - 1",
data={"apply": data['apply'].values.codes,
"pared": data['pared'],
"public": data['public'],
"gpa": data['gpa']},
distr='logit')
modf = OrderedModel.from_formula(
"apply ~ pared + public + gpa - 1",
data={"apply": data['apply'].values.codes,
"pared": data['pared'],
"public": data['public'],
"gpa": data['gpa']},
distr='logit')
resf = modf.fit(method='bfgs', disp=False)
# fit on data with ordered=False
modu = OrderedModel(
Expand Down Expand Up @@ -178,15 +176,13 @@ def setup_class(cls):
distr='probit')
resp = modp.fit(method='bfgs', disp=False)

with warnings.catch_warnings():
warnings.simplefilter("ignore", SpecificationWarning)
modf = OrderedModel.from_formula(
"apply ~ pared + public + gpa - 1",
data={"apply": data['apply'].values.codes,
"pared": data['pared'],
"public": data['public'],
"gpa": data['gpa']},
distr='probit')
modf = OrderedModel.from_formula(
"apply ~ pared + public + gpa - 1",
data={"apply": data['apply'].values.codes,
"pared": data['pared'],
"public": data['public'],
"gpa": data['gpa']},
distr='probit')
resf = modf.fit(method='bfgs', disp=False)

modu = OrderedModel(
Expand Down Expand Up @@ -234,11 +230,9 @@ def test_formula_categorical(self):
resp = self.resp
data = ds.df

with warnings.catch_warnings():
warnings.simplefilter("ignore", SpecificationWarning)
formula = "apply ~ pared + public + gpa - 1"
modf2 = OrderedModel.from_formula(formula,
data, distr='probit')
formula = "apply ~ pared + public + gpa - 1"
modf2 = OrderedModel.from_formula(formula,
data, distr='probit')
resf2 = modf2.fit(method='bfgs', disp=False)
assert_allclose(resf2.params, resp.params, atol=1e-8)
assert modf2.exog_names == resp.model.exog_names
Expand All @@ -247,15 +241,13 @@ def test_formula_categorical(self):
assert not hasattr(modf2, "frame")

with pytest.raises(ValueError):
with warnings.catch_warnings():
warnings.simplefilter("ignore", SpecificationWarning)
OrderedModel.from_formula(
"apply ~ pared + public + gpa - 1",
data={"apply": np.asarray(data['apply']),
"pared": data['pared'],
"public": data['public'],
"gpa": data['gpa']},
distr='probit')
OrderedModel.from_formula(
"apply ~ pared + public + gpa - 1",
data={"apply": np.asarray(data['apply']),
"pared": data['pared'],
"public": data['public'],
"gpa": data['gpa']},
distr='probit')


class TestLogitModelFormula():
Expand Down Expand Up @@ -301,16 +293,18 @@ def test_setup(self):
assert_allclose(resf1.predict(data[:5]), fittedvalues[:5])

# test over parameterized model with implicit constant
# warns but doesn't raise
formula = "apply ~ 0 + pared + public + gpa + C(dummy)"

with pytest.warns(SpecificationWarning):
modf2 = OrderedModel.from_formula(formula, data, distr='logit')
with pytest.raises(ValueError):
OrderedModel.from_formula(formula, data, distr='logit')

with pytest.warns(HessianInversionWarning):
# ignore constant, so we get results without exception
modf2 = OrderedModel.from_formula(formula, data, distr='logit',
hasconst=False)
# we get a warning in some environments
with warnings.catch_warnings():
warnings.simplefilter("ignore", HessianInversionWarning)
resf2 = modf2.fit(method='bfgs')
assert resf2.converged is False
# assert np.isnan(resf2.bse).all()

assert_allclose(resf2.predict(data[:5]), fittedvalues[:5], rtol=1e-4)

Expand Down Expand Up @@ -342,14 +336,14 @@ def _cdf(self, x):
distr=cloglog)
resp = modp.fit(method='bfgs', disp=False)

with pytest.warns(UserWarning):
modf = OrderedModel.from_formula(
"apply ~ pared + public + gpa - 1",
data={"apply": data['apply'].values.codes,
"pared": data['pared'],
"public": data['public'],
"gpa": data['gpa']},
distr=cloglog)
# with pytest.warns(UserWarning):
modf = OrderedModel.from_formula(
"apply ~ pared + public + gpa - 1",
data={"apply": data['apply'].values.codes,
"pared": data['pared'],
"public": data['public'],
"gpa": data['gpa']},
distr=cloglog)
resf = modf.fit(method='bfgs', disp=False)

modu = OrderedModel(
Expand Down

0 comments on commit 72709ba

Please sign in to comment.