63 lines
2.6 KiB
Python
63 lines
2.6 KiB
Python
|
import numpy as np
|
||
|
from numpy.testing import assert_allclose
|
||
|
import pytest
|
||
|
|
||
|
from statsmodels.regression.linear_model import WLS
|
||
|
from statsmodels.regression._tools import _MinimalWLS
|
||
|
|
||
|
|
||
|
class TestMinimalWLS:
|
||
|
@classmethod
|
||
|
def setup_class(cls):
|
||
|
rs = np.random.RandomState(1234)
|
||
|
cls.exog1 = rs.randn(200, 5)
|
||
|
cls.endog1 = cls.exog1.sum(1) + rs.randn(200)
|
||
|
cls.weights1 = 1.0 + np.sin(np.arange(200.0) / 100.0 * np.pi)
|
||
|
cls.exog2 = rs.randn(50, 1)
|
||
|
cls.endog2 = 0.3 * cls.exog2.ravel() + rs.randn(50)
|
||
|
cls.weights2 = 1.0 + np.log(np.arange(1.0, 51.0))
|
||
|
|
||
|
@pytest.mark.parametrize('check', [True, False])
|
||
|
def test_equivalence_with_wls(self, check):
|
||
|
res = WLS(self.endog1, self.exog1).fit()
|
||
|
minres = _MinimalWLS(self.endog1, self.exog1,
|
||
|
check_endog=check, check_weights=check).fit()
|
||
|
assert_allclose(res.params, minres.params)
|
||
|
assert_allclose(res.resid, minres.resid)
|
||
|
|
||
|
res = WLS(self.endog2, self.exog2).fit()
|
||
|
minres = _MinimalWLS(self.endog2, self.exog2,
|
||
|
check_endog=check, check_weights=check).fit()
|
||
|
assert_allclose(res.params, minres.params)
|
||
|
assert_allclose(res.resid, minres.resid)
|
||
|
|
||
|
res = WLS(self.endog1, self.exog1, weights=self.weights1).fit()
|
||
|
minres = _MinimalWLS(self.endog1, self.exog1, weights=self.weights1,
|
||
|
check_endog=check, check_weights=check).fit()
|
||
|
assert_allclose(res.params, minres.params)
|
||
|
assert_allclose(res.resid, minres.resid)
|
||
|
|
||
|
res = WLS(self.endog2, self.exog2, weights=self.weights2).fit()
|
||
|
minres = _MinimalWLS(self.endog2, self.exog2, weights=self.weights2,
|
||
|
check_endog=check, check_weights=check).fit()
|
||
|
assert_allclose(res.params, minres.params)
|
||
|
assert_allclose(res.resid, minres.resid)
|
||
|
|
||
|
@pytest.mark.parametrize('bad_value', [np.nan, np.inf])
|
||
|
def test_inf_nan(self, bad_value):
|
||
|
with pytest.raises(
|
||
|
ValueError,
|
||
|
match=r'detected in endog, estimation infeasible'):
|
||
|
endog = self.endog1.copy()
|
||
|
endog[0] = bad_value
|
||
|
_MinimalWLS(endog, self.exog1, self.weights1,
|
||
|
check_endog=True, check_weights=True).fit()
|
||
|
|
||
|
with pytest.raises(
|
||
|
ValueError,
|
||
|
match=r'detected in weights, estimation infeasible'):
|
||
|
weights = self.weights1.copy()
|
||
|
weights[-1] = bad_value
|
||
|
_MinimalWLS(self.endog1, self.exog1, weights,
|
||
|
check_endog=True, check_weights=True).fit()
|