# -*- coding: utf-8 -*-
"""
Created on Fri Nov 04 10:51:39 2011
Author: Josef Perktold
License: BSD-3
"""
import numpy as np
from numpy.testing import assert_almost_equal, assert_equal
from statsmodels.sandbox.nonparametric import smoothers
from statsmodels.regression.linear_model import OLS, WLS
class CheckSmoother(object):
def test_predict(self):
assert_almost_equal(self.res_ps.predict(self.x),
self.res2.fittedvalues, decimal=13)
assert_almost_equal(self.res_ps.predict(self.x[:10]),
self.res2.fittedvalues[:10], decimal=13)
def test_coef(self):
#TODO: check dim of coef
assert_almost_equal(self.res_ps.coef.ravel(),
self.res2.params, decimal=14)
def test_df(self):
#TODO: make into attributes
assert_equal(self.res_ps.df_model(), self.res2.df_model+1) #with const
assert_equal(self.res_ps.df_fit(), self.res2.df_model+1) #alias
assert_equal(self.res_ps.df_resid(), self.res2.df_resid)
class BasePolySmoother(object):
@classmethod
def setup_class(cls):
#DGP: simple polynomial
order = 3
sigma_noise = 0.5
nobs = 100
lb, ub = -1, 2
cls.x = x = np.linspace(lb, ub, nobs)
cls.exog = exog = x[:,None]**np.arange(order+1)
y_true = exog.sum(1)
np.random.seed(987567)
cls.y = y = y_true + sigma_noise * np.random.randn(nobs)
class TestPolySmoother1(BasePolySmoother, CheckSmoother):
@classmethod
def setup_class(cls):
super(TestPolySmoother1, cls).setup_class() #initialize DGP
y, x, exog = cls.y, cls.x, cls.exog
#use order = 2 in regression
pmod = smoothers.PolySmoother(2, x)
pmod.fit(y) #no return
cls.res_ps = pmod
cls.res2 = OLS(y, exog[:,:2+1]).fit()
class TestPolySmoother2(BasePolySmoother, CheckSmoother):
@classmethod
def setup_class(cls):
super(TestPolySmoother2, cls).setup_class() #initialize DGP
y, x, exog = cls.y, cls.x, cls.exog
#use order = 3 in regression
pmod = smoothers.PolySmoother(3, x)
#pmod.fit(y) #no return
pmod.smooth(y) #no return, use alias for fit
cls.res_ps = pmod
cls.res2 = OLS(y, exog[:,:3+1]).fit()
class TestPolySmoother3(BasePolySmoother, CheckSmoother):
@classmethod
def setup_class(cls):
super(TestPolySmoother3, cls).setup_class() #initialize DGP
y, x, exog = cls.y, cls.x, cls.exog
nobs = y.shape[0]
weights = np.ones(nobs)
weights[:nobs//3] = 0.1
weights[-nobs//5:] = 2
#use order = 2 in regression
pmod = smoothers.PolySmoother(2, x)
pmod.fit(y, weights=weights) #no return
cls.res_ps = pmod
cls.res2 = WLS(y, exog[:,:2+1], weights=weights).fit()
if __name__ == '__main__':
t1 = TestPolySmoother1()
t1.test_predict()
t1.test_coef()
t1.test_df
t3 = TestPolySmoother3()
t3.test_predict()