pyFTS/benchmarks/ResidualAnalysis.py
Petrônio Cândido de Lima e Silva 9af879e195 - Bugfixes and improvements on benchmarks
2017-05-24 00:31:05 -03:00

131 lines
3.4 KiB
Python

#!/usr/bin/python
# -*- coding: utf8 -*-
"""Residual Analysis methods"""
import numpy as np
import pandas as pd
import matplotlib as plt
import matplotlib.pyplot as plt
from pyFTS.common import Transformations,Util
from pyFTS.benchmarks import Measures
from scipy import stats
def residuals(targets, forecasts, order=1):
"""First order residuals"""
return np.array(targets[order:]) - np.array(forecasts[:-1])
def ChiSquared(q,h):
"""
Chi-Squared value
:param q:
:param h:
:return:
"""
p = stats.chi2.sf(q, h)
return p
def compareResiduals(data, models):
"""
Compare residual's statistics of several models
:param data:
:param models:
:return:
"""
ret = "Model & Order & Mean & STD & Box-Pierce & Box-Ljung & P-value \\\\ \n"
for mfts in models:
forecasts = mfts.forecast(data)
res = residuals(data, forecasts, mfts.order)
mu = np.mean(res)
sig = np.std(res)
ret += mfts.shortname + " & "
ret += str(mfts.order) + " & "
ret += str(round(mu,2)) + " & "
ret += str(round(sig,2)) + " & "
q1 = Measures.BoxPierceStatistic(res, 10)
ret += str(round(q1,2)) + " & "
q2 = Measures.BoxLjungStatistic(res, 10)
ret += str(round(q2,2)) + " & "
ret += str(ChiSquared(q2, 10))
ret += " \\\\ \n"
return ret
def plotResiduals(targets, models, tam=[8, 8], save=False, file=None):
"""
Plot residuals and statistics
:param targets:
:param models:
:param tam:
:param save:
:param file:
:return:
"""
fig, axes = plt.subplots(nrows=len(models), ncols=3, figsize=tam)
for c, mfts in enumerate(models):
if len(models) > 1:
ax = axes[c]
else:
ax = axes
forecasts = mfts.forecast(targets)
res = residuals(targets,forecasts,mfts.order)
mu = np.mean(res)
sig = np.std(res)
ax[0].set_title("Residuals Mean=" + str(mu) + " STD = " + str(sig))
ax[0].set_ylabel('E')
ax[0].set_xlabel('T')
ax[0].plot(res)
ax[1].set_title("Residuals Autocorrelation")
ax[1].set_ylabel('ACS')
ax[1].set_xlabel('Lag')
ax[1].acorr(res)
ax[2].set_title("Residuals Histogram")
ax[2].set_ylabel('Freq')
ax[2].set_xlabel('Bins')
ax[2].hist(res)
c += 1
plt.tight_layout()
Util.showAndSaveImage(fig, file, save)
def plot_residuals(targets, models, tam=[8, 8], save=False, file=None):
fig, axes = plt.subplots(nrows=len(models), ncols=3, figsize=tam)
for c, mfts in enumerate(models, start=0):
if len(models) > 1:
ax = axes[c]
else:
ax = axes
forecasts = mfts.forecast(targets)
res = residuals(targets, forecasts, mfts.order)
mu = np.mean(res)
sig = np.std(res)
if c == 0: ax[0].set_title("Residuals", size='large')
ax[0].set_ylabel(mfts.shortname, size='large')
ax[0].set_xlabel(' ')
ax[0].plot(res)
if c == 0: ax[1].set_title("Residuals Autocorrelation", size='large')
ax[1].set_ylabel('ACS')
ax[1].set_xlabel('Lag')
ax[1].acorr(res)
if c == 0: ax[2].set_title("Residuals Histogram", size='large')
ax[2].set_ylabel('Freq')
ax[2].set_xlabel('Bins')
ax[2].hist(res)
plt.tight_layout()
Util.showAndSaveImage(fig, file, save)