AIM-PIbd-32-Kurbanova-A-A/aimenv/Lib/site-packages/statsmodels/regression/tests/test_tools.py
2024-10-02 22:15:59 +04:00

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