5. Statistické testy
Klíčové Statistické Metriky¶
Log Likelihood (Logaritmická Věrohodnost)¶
- Co to je: Míra pravděpodobnosti daná modelem.
- Kde Najít: Uvedeno přímo v tabulce jako
Log Likelihood. - Jak Interpretovat: Vyšší hodnoty značí lepší shodu modelu s daty.
Informační Kritéria: AIC, BIC a HQIC¶
- Co to jsou: Kritéria hodnotící kvalitu modelu.
- Kde Najít: V horní části tabulky, uvedeno jako
AIC,BICaHQIC. - Jak Interpretovat: Nižší hodnoty naznačují lepší model.
Koeficienty Modelu a P>|z| {Coefficients and P>|z|}¶
- Co to je: Hodnoty parametrů modelu a jejich statistická významnost.
- Kde Najít: V části tabulky s koeficienty, pod názvy
coefaP>|z|. - Jak Interpretovat: Koeficienty s nízkými p-hodnotami jsou statisticky významné.
Interval Spolehlivosti¶
- Co to je: Rozsah hodnot pro koeficienty modelu.
- Kde Najít: U koeficientů, pod sloupci
[0.025a0.975]. - Jak Interpretovat: Pokud interval nezahrnuje nulu, koeficient je významný. Jistě, mohu upravit popisy statistických testů tak, aby zahrnovaly hypotézy H₀ (nulovou hypotézu) a Hₐ (alternativní hypotézu). Zde jsou upravené verze:
Ljung-Box (Q) Test¶
- Co to je: Test nezávislosti reziduálních chyb.
- Hypotézy:
- H_0: Rezidua jsou nezávislá.
- H_a: Rezidua nejsou nezávislá.
- Kde Najít: V dolní části tabulky, pod
Ljung-Box (Q)aProb(Q). - Jak Interpretovat: Vysoká p-hodnota naznačuje, že nelze zamítnout H₀, tedy že rezidua jsou nezávislá.
- Běžná Chyba: P-hodnota Ljung-Box testu je uvedena v tabulce pod
Prob(Q), nikoli pod hodnotouLjung-Box (Q), která představuje skóre testu.
Jarque-Bera (JB) Test¶
- Co to je: Test normálnosti reziduálních chyb.
- Hypotézy:
- H_0: Rezidua mají normální rozdělení.
- H_a: Rezidua nemají normální rozdělení.
- Kde Najít: V dolní části tabulky, pod
Jarque-Bera (JB)aProb(JB). - Jak Interpretovat: Vysoká p-hodnota naznačuje, že nelze zamítnout H₀, tedy že rezidua mají normální rozdělení.
- Běžná Chyba: P-hodnota Jarque-Bera testu je uvedena v tabulce pod
Prob(JB), nikoli pod hodnotouJarque-Bera (JB), která představuje skóre testu.
Heteroskedasticita (H)¶
- Co to je: Test konzistence rozptylu reziduálních chyb.
- Hypotézy:
- H_0: Rozptyl reziduálních chyb je konzistentní (homoskedasticita).
- H_a: Rozptyl reziduálních chyb je nekonzistentní (heteroskedasticita).
- Kde Najít: V dolní části tabulky, pod
Heteroskedasticity (H)aProb(H). - Jak Interpretovat: Nízká p-hodnota naznačuje, že nelze zamítnout H_a, tedy že existuje heteroskedasticita.
Šikmost a Kurtóza¶
- Co to jsou: Míry tvaru rozdělení reziduí.
- Kde Najít: Často uvedeno v dolní části tabulky pod
SkewaKurtosis. - Jak Interpretovat: Hodnoty blízké očekávaným naznačují normální rozdělení.
- Kurtóza blízká hodnotě 3 naznačuje, že rozdělení je podobné normálnímu rozdělení.
- Šikmost blízká 0 značí, že rezidua jsou symetrická. Pro normální rozdělení by šikmost měla být právě nula.
Směrodatná Odchylka a Variance¶
- Co to jsou: Míry rozptylu dat nebo reziduí.
- Kde Najít:
sigma2v části tabulky s koeficienty. - Jak Interpretovat: Vyšší hodnoty značí větší rozptyl.
- Běžná Chyba: Nedorozumění mezi variancí (sigma2) a směrodatnou odchylkou. Pro získání směrodatné odchylky se musí odmocnit hodnota variance.
Sezónní Diference a Periodicita¶
- Co to je: Způsob, jakým model zahrnuje sezónní efekty.
- Kde Najít: V popisu modelu, například jako
SARIMAX(0, 1, 1)x(0, 1, 1, 12). - Jak Interpretovat:
- První trojice čísel v
SARIMAX(0, 1, 1)reprezentuje nesezónní část modelu, kde:- První číslo (
0) označuje řád autoregresní složky (AR). - Druhé číslo (
1) označuje řád diferencování. - Třetí číslo (
1) označuje řád klouzavých průměrů (MA).
- První číslo (
- Druhá trojice čísel v
(0, 1, 1, 12)reprezentuje sezónní část modelu, kde:- První číslo (
0) označuje řád sezónní autoregresní složky. - Druhé číslo (
1) označuje řád sezónního diferencování. - Třetí číslo (
1) označuje řád sezónních klouzavých průměrů. - Čtvrté číslo (
12) označuje periodicitu sezónnosti (například měsíční data s roční sezónností).
- První číslo (
- První trojice čísel v
- Běžná Chyba: Častým nedorozuměním je interpretace čísla uvedeného v sezónní části modelu (např.
12vSARIMAX(0, 1, 1)x(0, 1, 1, 12)) jako řádu sezónní diference. Ve skutečnosti toto číslo označuje periodicitu sezónní složky, což znamená interval, po kterém se sezónní vzory opakují. Například12v tomto kontextu obvykle značí měsíční data s roční sezónností. Jinými slovy, číslo12neznamená, že se používá 12. řád diferencování, ale že model zahrnuje sezónní efekty, které se opakují každých 12 časových jednotek (například každý měsíc v ročních datech).
Příklad tabulek¶
SARIMAX Results
==============================================================================
Dep. Variable: y No. Observations: 1000
Model: ARIMA(1, 0, 1) Log Likelihood -1457.867
Date: Tue, 11 Feb 2025 AIC 2921.734
Time: 23:37:49 BIC 2936.457
Sample: 0 HQIC 2927.329
- 1000
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ar.L1 0.3066 0.475 0.645 0.519 -0.625 1.238
ma.L1 -0.3616 0.469 -0.771 0.440 -1.280 0.557
sigma2 1.0810 0.050 21.832 0.000 0.984 1.178
===================================================================================
Ljung-Box (L1) (Q): 0.01 Jarque-Bera (JB): 1.64
Prob(Q): 0.92 Prob(JB): 0.44
Heteroskedasticity (H): 1.16 Skew: 0.09
Prob(H) (two-sided): 0.18 Kurtosis: 2.93
===================================================================================
from scipy.stats import norm
import statsmodels.api as sm
ndat = 1000
x = norm.rvs(size=ndat)
model = sm.tsa.arima.ARIMA(x, order=(1,0,1), trend='n').fit()
# Get the summary as a string
summary_str = model.summary().as_text()
# Remove the line containing the warning
filtered_summary = '\n'.join([line for line in summary_str.split('\n')
if not line.startswith('Warnings:') and
not line.startswith('[1]')])
# Print the modified summary
print(f"```\n{filtered_summary}\n```")
AutoReg Model Results
==============================================================================
Dep. Variable: y No. Observations: 500
Model: AutoReg(2) Log Likelihood -352.004
Method: Conditional MLE S.D. of innovations 0.491
Date: Tue, 11 Feb 2025 AIC 712.007
Time: 23:37:49 BIC 728.849
Sample: 2 HQIC 718.617
500
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0805 0.023 3.572 0.000 0.036 0.125
y.L1 -0.6023 0.043 -13.958 0.000 -0.687 -0.518
y.L2 0.2846 0.043 6.589 0.000 0.200 0.369
Roots
=============================================================================
Real Imaginary Modulus Frequency
-----------------------------------------------------------------------------
AR.1 -1.0943 +0.0000j 1.0943 0.5000
AR.2 3.2105 +0.0000j 3.2105 0.0000
-----------------------------------------------------------------------------
from scipy.stats.distributions import norm
from config.base_python_functions import tsplot
import numpy as np
from statsmodels.tsa.ar_model import AutoReg
# Model definition for AR(2)
ndat = 500
x = np.zeros(ndat)
x[0] = 0.1
x[1] = -0.1
sigma = .5
c = 0.1
phi = [-.6, .3]
c_phi = np.insert(phi, 0, c)
for i in range(1, ndat):
x[i] = np.dot(c_phi, [1, x[i-1], x[i-2]]) + norm.rvs(scale=sigma)
# Creation of AutoReg model for AR(2)
res = AutoReg(x, lags = 2, trend='c').fit()
print(f"```\n{res.summary()}\n```")
SARIMAX Results
================================================================================================
Dep. Variable: y No. Observations: 1000
Model: ARIMA(1, 1, 2)x(0, 1, [1, 2, 3], 12) Log Likelihood -1420.753
Date: Tue, 11 Feb 2025 AIC 2855.506
Time: 23:38:10 BIC 2889.769
Sample: 0 HQIC 2868.537
- 1000
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ar.L1 -0.1863 0.508 -0.366 0.714 -1.183 0.810
ma.L1 -0.8743 0.512 -1.707 0.088 -1.878 0.130
ma.L2 -0.1248 0.513 -0.243 0.808 -1.131 0.881
ma.S.L12 -0.9818 0.620 -1.585 0.113 -2.196 0.232
ma.S.L24 -0.0502 0.046 -1.088 0.276 -0.141 0.040
ma.S.L36 0.0327 0.033 0.982 0.326 -0.033 0.098
sigma2 0.9762 0.611 1.598 0.110 -0.221 2.174
===================================================================================
Ljung-Box (L1) (Q): 0.00 Jarque-Bera (JB): 1.28
Prob(Q): 1.00 Prob(JB): 0.53
Heteroskedasticity (H): 0.90 Skew: 0.08
Prob(H) (two-sided): 0.34 Kurtosis: 2.95
===================================================================================
from scipy.stats import norm
import statsmodels.api as sm
ndat = 1000
x = norm.rvs(size=ndat)
model = sm.tsa.arima.ARIMA(x, order=(1,1,2), seasonal_order=(0,1,3,12), trend='n').fit()
# Get the summary as a string
summary_str = model.summary().as_text()
# Remove the line containing the warning
filtered_summary = '\n'.join([line for line in summary_str.split('\n')
if not line.startswith('Warnings:') and
not line.startswith('[1]')])
# Print the modified summary
print(f"```\n{filtered_summary}\n```")