def test_compare_arma(): #this is a preliminary test to compare arma_kf, arma_cond_ls and arma_cond_mle #the results returned by the fit methods are incomplete #for now without random.seed #np.random.seed(9876565) x = fa.ArmaFft([1, -0.5], [1., 0.4], 40).generate_sample(size=200, burnin=1000) # this used kalman filter through descriptive # d = ARMA(x) # d.fit((1,1), trend='nc') # dres = d.res modkf = ARMA(x) ##rkf = mkf.fit((1,1)) ##rkf.params reskf = modkf.fit((1,1), trend='nc', disp=-1) dres = reskf modc = Arma(x) resls = modc.fit(order=(1,1)) rescm = modc.fit_mle(order=(1,1), start_params=[0.4,0.4, 1.], disp=0) #decimal 1 corresponds to threshold of 5% difference #still different sign corrcted #assert_almost_equal(np.abs(resls[0] / d.params), np.ones(d.params.shape), decimal=1) assert_almost_equal(resls[0] / dres.params, np.ones(dres.params.shape), decimal=1) #rescm also contains variance estimate as last element of params #assert_almost_equal(np.abs(rescm.params[:-1] / d.params), np.ones(d.params.shape), decimal=1) assert_almost_equal(rescm.params[:-1] / dres.params, np.ones(dres.params.shape), decimal=1)
def mcarma22(niter=10, nsample=1000, ar=None, ma=None, sig=0.5): '''run Monte Carlo for ARMA(2,2) DGP parameters currently hard coded also sample size `nsample` was not a self contained function, used instances from outer scope now corrected ''' #nsample = 1000 #ar = [1.0, 0, 0] if ar is None: ar = [1.0, -0.55, -0.1] #ma = [1.0, 0, 0] if ma is None: ma = [1.0, 0.3, 0.2] results = [] results_bse = [] for _ in range(niter): y2 = arma_generate_sample(ar,ma,nsample+1000, sig)[-nsample:] y2 -= y2.mean() arest2 = Arma(y2) rhohat2a, cov_x2a, infodict, mesg, ier = arest2.fit((2,2)) results.append(rhohat2a) err2a = arest2.geterrors(rhohat2a) sige2a = np.sqrt(np.dot(err2a,err2a)/nsample) #print 'sige2a', sige2a, #print 'cov_x2a.shape', cov_x2a.shape #results_bse.append(sige2a * np.sqrt(np.diag(cov_x2a))) if not cov_x2a is None: results_bse.append(sige2a * np.sqrt(np.diag(cov_x2a))) else: results_bse.append(np.nan + np.zeros_like(rhohat2a)) return np.r_[ar[1:], ma[1:]], np.array(results), np.array(results_bse)
def mcarma22(niter=10, nsample=1000, ar=None, ma=None, sig=0.5): '''run Monte Carlo for ARMA(2,2) DGP parameters currently hard coded also sample size `nsample` was not a self contained function, used instances from outer scope now corrected ''' #nsample = 1000 #ar = [1.0, 0, 0] if ar is None: ar = [1.0, -0.55, -0.1] #ma = [1.0, 0, 0] if ma is None: ma = [1.0, 0.3, 0.2] results = [] results_bse = [] for _ in range(niter): y2 = arma_generate_sample(ar, ma, nsample + 1000, sig)[-nsample:] y2 -= y2.mean() arest2 = Arma(y2) rhohat2a, cov_x2a, infodict, mesg, ier = arest2.fit((2, 2)) results.append(rhohat2a) err2a = arest2.geterrors(rhohat2a) sige2a = np.sqrt(np.dot(err2a, err2a) / nsample) #print 'sige2a', sige2a, #print 'cov_x2a.shape', cov_x2a.shape #results_bse.append(sige2a * np.sqrt(np.diag(cov_x2a))) if not cov_x2a is None: results_bse.append(sige2a * np.sqrt(np.diag(cov_x2a))) else: results_bse.append(np.nan + np.zeros_like(rhohat2a)) return np.r_[ar[1:], ma[1:]], np.array(results), np.array(results_bse)
print "Battle of the dueling ARMAs" from time import time from scikits.statsmodels.tsa.arma_mle import Arma from scikits.statsmodels.tsa.api import ARMA import numpy as np y_arma22 = np.loadtxt(r'C:\Josef\eclipsegworkspace\statsmodels-josef-experimental-gsoc\scikits\statsmodels\tsa\y_arma22.txt') arma1 = Arma(y_arma22) arma2 = ARMA(y_arma22) print "The actual results from gretl exact mle are" params_mle = np.array([.826990, -.333986, .0362419, -.792825]) sigma_mle = 1.094011 llf_mle = -1510.233 print "params: ", params_mle print "sigma: ", sigma_mle print "llf: ", llf_mle print "The actual results from gretl css are" params_css = np.array([.824810, -.337077, .0407222, -.789792]) sigma_css = 1.095688 llf_css = -1507.301 results = [] results += ["gretl exact mle", params_mle, sigma_mle, llf_mle] results += ["gretl css", params_css, sigma_css, llf_css] t0 = time() print "Exact MLE - Kalman filter version using l_bfgs_b" arma2.fit(order=(2,2), trend='nc')
import scikits.statsmodels.api as sm from scikits.statsmodels.sandbox import tsa from scikits.statsmodels.tsa.arma_mle import Arma # local import from scikits.statsmodels.tsa.arima_process import arma_generate_sample examples = ['arma'] if 'arma' in examples: print "\nExample 1" print '----------' ar = [1.0, -0.8] ma = [1.0, 0.5] y1 = arma_generate_sample(ar, ma, 1000, 0.1) y1 -= y1.mean() #no mean correction/constant in estimation so far arma1 = Arma(y1) arma1.nar = 1 arma1.nma = 1 arma1res = arma1.fit_mle(order=(1, 1), method='fmin') print arma1res.params #Warning need new instance otherwise results carry over arma2 = Arma(y1) arma2.nar = 1 arma2.nma = 1 res2 = arma2.fit(method='bfgs') print res2.params print res2.model.hessian(res2.params) print ndt.Hessian(arma1.loglike, stepMax=1e-2)(res2.params) arest = tsa.arima.ARIMA(y1) resls = arest.fit((1, 0, 1))
import scikits.statsmodels.api as sm from scikits.statsmodels.sandbox import tsa from scikits.statsmodels.tsa.arma_mle import Arma # local import from scikits.statsmodels.tsa.arima_process import arma_generate_sample examples = ['arma'] if 'arma' in examples: print "\nExample 1" print '----------' ar = [1.0, -0.8] ma = [1.0, 0.5] y1 = arma_generate_sample(ar,ma,1000,0.1) y1 -= y1.mean() #no mean correction/constant in estimation so far arma1 = Arma(y1) arma1.nar = 1 arma1.nma = 1 arma1res = arma1.fit_mle(order=(1,1), method='fmin') print arma1res.params #Warning need new instance otherwise results carry over arma2 = Arma(y1) arma2.nar = 1 arma2.nma = 1 res2 = arma2.fit(method='bfgs') print res2.params print res2.model.hessian(res2.params) print ndt.Hessian(arma1.loglike, stepMax=1e-2)(res2.params) arest = tsa.arima.ARIMA(y1) resls = arest.fit((1,0,1))
import numpy as np from numpy.testing import assert_almost_equal import matplotlib.pyplot as plt import scikits.statsmodels.sandbox.tsa.fftarma as fa from scikits.statsmodels.tsa.descriptivestats import TsaDescriptive from scikits.statsmodels.tsa.arma_mle import Arma x = fa.ArmaFft([1, -0.5], [1., 0.4], 40).generate_sample(size=200, burnin=1000) d = TsaDescriptive(x) d.plot4() #d.fit(order=(1,1)) d.fit((1,1), trend='nc') print d.res.params modc = Arma(x) resls = modc.fit(order=(1,1)) print resls[0] rescm = modc.fit_mle(order=(1,1), start_params=[-0.4,0.4, 1.]) print rescm.params #decimal 1 corresponds to threshold of 5% difference assert_almost_equal(resls[0] / d.res.params, 1, decimal=1) assert_almost_equal(rescm.params[:-1] / d.res.params, 1, decimal=1) #copied to tsa.tests plt.figure() plt.plot(x, 'b-o') plt.plot(modc.predicted(), 'r-') plt.figure() plt.plot(modc.error_estimate)
print 'truelhs', np.r_[ar[1:], ma[1:]] ###bug in current version, fixed in Skipper and 1 more ###arr[1:q,:] = params[p+k:p+k+q] # p to p+q short params are MA coeffs ###ValueError: array dimensions are not compatible for copy ##arma22 = ARMA_kf(y22, constant=False, order=(2,2)) ##res = arma22.fit(start_params=start_params) ##print res.params print '\nARIMA new' arest2 = Arma(y22) naryw = 4 #= 30 resyw = sm.regression.yule_walker(y22, order=naryw, inv=True) arest2.nar = naryw arest2.nma = 0 e = arest2.geterrors(np.r_[1, -resyw[0]]) x=sm.tsa.tsatools.lagmat2ds(np.column_stack((y22,e)),3,dropex=1, trim='both') yt = x[:,0] xt = x[:,1:] res_ols = sm.OLS(yt, xt).fit() print 'hannan_rissannen' print res_ols.params start_params = res_ols.params start_params_mle = np.r_[-res_ols.params[:2],