Unter den Zustandsraummodellen gab es nur wenige Websites, auf denen benutzerdefinierte Modelle auf Japanisch erklärt wurden (ich konnte sie nicht finden). Daher werde ich die Ergebnisse meiner eigenen Forschung veröffentlichen.
Für Statistikmodelle (insbesondere benutzerdefinierte Zustandsraummodelle) war es schwierig, das Modell zu definieren, daher hatte ich Schwierigkeiten damit.
Ich würde mich freuen, wenn Sie auf falsche Beschreibungen hinweisen könnten.
Die Struktur des Modells besteht aus einer Beobachtungsgleichung (es gibt auch ein Dokument, das es als Beobachtungsmodell beschreibt) und einer Zustandsgleichung (es gibt auch ein Dokument, das es als Systemmodell beschreibt).
Beobachtungsgleichung: $ y_t = Z_t (x_ {t}) + d_t + \ epsilon_t $ Zustandsgleichung: $ x_ {t + 1} = T_t (x_ {t}) + c_t + R_t \ eta_ {t} $
Obwohl eine detaillierte Erklärung weggelassen wird, nimmt das Zustandsraummodell die folgenden Schätzungen für die Vergangenheit, Gegenwart und Zukunft vor.
Unter den Zustandsraummodellen ist die Bedeutung des benutzerdefinierten Modells wie folgt.
Beobachtungsgleichung:
Der Unterschied zur obigen Formel besteht darin, dass $ Z_t $ in der Beobachtungsgleichung festgelegt ist, $ d_t $ im konstanten Term weggelassen wird und $ c_t $ im konstanten Term in der Zustandsgleichung $ A \ cdot \ ist. Ersetzt durch exp \ left (\ frac {B} {z} \ right) $.
Eine Konstante
B: Konstante
z: exogene Variable
Was ist eine exogene Variable? Im Allgemeinen wird eine Variable (erklärende Variable), die aus früheren Daten eines zukünftigen numerischen Werts (objektive Variable) erstellt wurde, die Sie in der Zeitreihenanalyse vorhersagen möchten, als endogene Variable bezeichnet, aber anders als diese. Variablen werden als exogene Variablen bezeichnet.
Hier ist der Python-Code.
import numpy as np
import pandas as pd
import datetime
import statsmodels.api as sm
import matplotlib.pyplot as plt
%matplotlib inline
plt.rc("figure", figsize=(16,8))
plt.rc("font", size=15)
Erstellen Sie Daten zum Testen. (Wenn Sie es tatsächlich verwenden, ist eine solche Arbeit nicht erforderlich, sodass eine ausführliche Erklärung entfällt.)
def gen_data_for_model1():
nobs = 1000
rs = np.random.RandomState(seed=93572)
Ht = 5
Tt = 1.001
A = 0.1
B = -0.007
Qt = 0.01
var_z = 0.1
et = rs.normal(scale=Ht**0.5, size=nobs)
z = np.cumsum(rs.normal(size=nobs, scale=var_z**0.05))
Et = rs.normal(scale=Qt**0.5, size=nobs)
xt_1 = 50
x = []
for i in range(nobs):
xt = Tt * xt_1
x.append(xt)
xt_1 = xt
xt = np.array(x)
xt = xt + A * np.exp(B/z) + Et
yt = xt + et
return yt, xt, z
yt, xt, z = gen_data_for_model1()
_ = plt.plot(yt,color = "r")
_ = plt.plot(xt, color="b")
df = pd.DataFrame()
df['y'] = yt
df['x'] = xt
df['z'] = z
st = datetime.datetime.strptime("2001/1/1 0:00", '%Y/%m/%d %H:%M')
date = []
for i in range(1000):
if i == 0:
d = st
dt = d.strftime('%Y/%m/%d %H:%M')
date.append(dt)
d += datetime.timedelta(days=1)
df['date'] = date
df['date'] = pd.to_datetime(df['date'] )
df = df.set_index("date")
df
class custom(sm.tsa.statespace.MLEModel):
param_names = ['T', 'A', 'B', 'Ht', 'Qt'] #Geben Sie die zu schätzenden Parameter an
start_params = [1., 1., 0., 1., 1] #Anfangswert des zu schätzenden Parameters
def __init__(self, endog, exog):
exog = np.squeeze(exog)
super().__init__(endog, exog=exog, k_states=1, initialization='diffuse')
self.k_exog = 1
# Z = I,Der Teil, der Zt in der obigen Gleichung entspricht, wird diesmal zur Einheitsmatrix.
self['design', 0, 0] = 1.
# R = I,Der Teil, der Rt in der obigen Gleichung entspricht, wird diesmal zur Einheitsmatrix.
self['selection', 0, 0] = 1.
# c_Stellen Sie t auf Zeit ein
self['state_intercept'] = np.zeros((1, self.nobs))
def clone(self, endog, exog, **kwargs):
return self._clone_from_init_kwds(endog, exog=exog, **kwargs)
def transform_params(self, params):
#Die Varianz muss eine positive Zahl sein, also quadrieren Sie sie einmal
params[3:] = params[3:]**2
return params
def untransform_params(self, params):
#Quadrat 1/Quadrat, um zur ursprünglichen Größe zurückzukehren (Quadratwurzel)
params[3:] = params[3:]**0.5
return params
def update(self, params, **kwargs):
#Es ist eine zu aktualisierende Spezifikation
params = super().update(params, **kwargs)
# T = T
self['transition', 0, 0] = params[0]
# c_t = A * exp(B / z_t)
self['state_intercept', 0, :] = params[1] * np.exp(params[2] / self.exog)
# Ht
self['obs_cov', 0, 0] = params[3]
# Qt
self['state_cov', 0, 0] = params[4]
df_test = df.iloc[:800,:]
df_train = df.iloc[800:,:]
mod = custom(df_test['y'], df_test['z'])
res = mod.fit()
print(res.summary())
Der Coef-Teil ist der geschätzte Wert, liegt jedoch nahe am numerischen Wert der zu Beginn erstellten Daten.
ss = pd.DataFrame(res.smoothed_state.T, columns=['x'], index=df_test.index)
predict = res.get_prediction()
forecast = res.get_forecast(df.index[-1], exog = df_train['z'].values)
Bei der Vorhersage müssen Sie angeben, bis zu welchem Punkt Sie eine Vorhersage treffen möchten. (Diesmal angegeben durch df.index [-1]) Wenn exogene Variablen im Modell verwendet werden, müssen die Daten zum Zeitpunkt der Vorhersage mit dem Argument "exog =" angegeben werden. Dieses Mal sind alles Dummy-Daten, aber wenn Sie sie tatsächlich für die Vorhersage verwenden möchten, müssen Sie Dummy-Daten aus früheren Daten erstellen. Daten mit ungleichmäßigem Datenabstand können nicht zur Vorhersage verwendet werden. (Gleiches gilt für SARIMAX, das auch exogene Variablen verwendet.)
fig, ax = plt.subplots()
y = df['y']
y.plot(ax=ax,label='y')
predict.predicted_mean.plot(label='x')
predict_ci = predict.conf_int(alpha=0.05)
predict_index = predict_ci.index
ax.fill_between(predict_index[2:], predict_ci.iloc[2:, 0], predict_ci.iloc[2:, 1], alpha=0.1)
forecast.predicted_mean.plot(ax=ax, style='r', label='forecast')
forecast_ci = forecast.conf_int()
forecast_index = forecast_ci.index
ax.fill_between(forecast_index, forecast_ci.iloc[:, 0], forecast_ci.iloc[:, 1], alpha=0.1)
legend = ax.legend(loc='best');
fig.savefig('custom_statespace.png')
Der hellblaue Teil ist das geschätzte 95% -Konfidenzintervall und der rosa Teil ist das vorhergesagte 95% -Konfidenzintervall.
Dieser Artikel wurde unter Bezugnahme auf die folgenden Informationen verfasst.
Vielen Dank an Chad Fulton, den Entwickler von Statistikmodellen!
Wir werden auch andere empfohlene Bücher als die oben aufgeführten vorstellen. Sie sind in der Reihenfolge ihrer relativen Lesbarkeit aufgeführt.
Auf der Suche nach dem Unsichtbaren - das ist die praktische Bayes-Statistik mit dem Bayes-Tool Dieses Buch ist wahrscheinlich das einfachste Buch, um ein Zustandsraummodell in Japan zu beschreiben, und ich denke, es ist der beste Weg, um loszulegen und zu sehen, wie es aussieht.
Grundlagen der statistischen Modellierung zur Vorhersage von der Einführung bis zur Anwendung der Basisstatistik Dieses Buch wurde von Professor Tomoyuki Higuchi, dem derzeitigen Direktor des Instituts für Statistische Mathematik, verfasst. Es ist schwer vorherzusagen, dass es eine Beschreibung des Zustandsraummodells aus dem Titel des Buches gibt, aber das Zustandsraummodell wird sorgfältig beschrieben.
Grundlagen der Zeitreihenanalyse und der Theorie und Implementierung des Zustandsraummodells, gelernt von R und Tan Dies ist Mr. Babas Buch, das in diesem Beitrag viele Male erschienen ist. Es ist ein sehr leicht verständliches gutes Buch. Empfohlen für diejenigen, die lernen möchten, indem sie ihre Hände bewegen (Codierung).
[Zeitreihenanalyse-Selbstrückgabemodell / Zustandsraummodell / Anomalieerkennung-] (https://www.kyoritsu-pub.co.jp/bookdetail/9784320125018) Vielleicht ist dies das einzige Buch in Japan, das das Zustandsraummodell in Python beschreibt. Sie werden in der Lage sein zu codieren, aber es ist ein wenig schlampig und schwer zu verstehen. Ich habe jedoch noch kein benutzerdefiniertes Modell wie diesen Beitrag angesprochen.
Recommended Posts