Arma (arima)

Neue Frage »

Koboldus Auf diesen Beitrag antworten »
Arma (arima)
Hallo, nun hab ich auch in der Stochastik eine Frage bzgl. Zeitreihenanalyse.

in einem coolen Excel-Addin kann ich eine Zeitreihe mir ARMA modellieren/fitten. Die verwendeten Parameter werden ebenfalls ausgespuckt, also:

ARMA:


ich habe zum ARMA - Modell die Parameter ai und auch die bk gegeben. (alles reelle zahlen)

Das heißt doch, ich kann jetzt diese Parameter in das ARMA - Modell reinstopfen und dann bekomme ich eine angenäherte Zeitreihe. (muss das in c++ implementieren und dann plotten)

Wer ARMA kennt, kennt vielleicht mein Problem:
der MA - Teil enthält ja zufallsvariablen e(t).

wenn ich das konkret implementiere bekomme ich in der durch ARMA erzeugten Zeitreihe nur werte zwischen 0 und 1. Meine Originalwerte schwanken aber zwischen 0 und 60. Das Excel-Tool spuckt auch schön eine annähernd gleiche Kurve aus, aber mein tool eben nicht unglücklich

mache ich da einen Typischen Anfängerfehler, den jemand auch schon gemacht hat? Wie wählt man die e(t) - Werte? Oder kann man das weiße rauschen weglassen?

oder besser... gibt es sowas wie "arma für dummies" ?

Vielen Dank... hab da seit 2 Wochen ein brett vorm kopf...
Zahlenschubser Auf diesen Beitrag antworten »
RE: Arma (arima)
Hallo!

Was meinst du mit "konkret implementieren"? Deine Programmierung in C++?

Die verzögerten Zufallsvariablen erhalten konkrete Realisationen für Zeitpunkte vor , diese Realisationen musst du unbedingt in den MA-Teil einfließen lassen, sonst hast du eine rein deterministische Fortschreibung deiner Zeitreihe, die aber immer noch nicht die Abweichung erklärt.

Vielleicht wäre es hilfreich, wenn du den Code zur Verfügung stellst oder dein Problem konkretisierst? Ich könnte mir auch vorstellen, dass du die Integration deiner Zeitreihe vernachlässigt (Schwankung von 0 bis 60 mit Trend?) oder den Startwert unterschlagen hast?
Koboldus Auf diesen Beitrag antworten »

Okay, hier also die komplette Funktion:
im vektor ab stecken die ai's und bi's drin, direkt hintereinander, also erst die ai's dann die bi's.



code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
vector<System::Double>* SetControl::create_artificial_arma(vector<System::Double>* ab, double mean, int p, int q,  int length )
 {
	// create a artificial time series which is an realization of an arma model
	vector<System::Double>* result = new vector<System::Double>;
	vector<System::Double>* random = new vector<System::Double>;
	int i,j,k;
	double val, zufall, rho;
        srand(GetTickCount());

	// initialize length of artificial time series:
	i = 0;
	while (i < length) {
		result->push_back(0);
		random->push_back(0);
		i++;
	}
		// initialize random variables
		i = 0;
		while (i < length) {
			zufall = (rand()%101)-50;
			val = (double)zufall/50; 
			//val = 0;
			random->at(i) = val;
			i++;
		}

		// set additional rho
                rho = 0;
		int n = 0;
		while (n < p) {
			rho += ab->at(n);
			n++;
		}
		rho = (1-rho)*mean;

		// simulate the arma model here:
		int l = 0;
		while (l < length) {
			result->at(l) = rho;

			// build MA - Part:
			int j = 0;
			while (j < q) {
				if (l-j >= 0) {result->at(l) -= ab->at(p+j-1)*random->at(l-j);};
				j++;
			}

			// build AR - Part:
			int m = 0;
			while (m < p) {
				if (l-m >= 0) {
					result->at(l) += ab->at(m)*result->at(l-m);
				//} else if (l-m == -1) {
				//	result->at(l) += ab->at(m);
				}
				m++;
			}
			l++;
		}
	return result;
}



die zufallsvariablen schwanken (siehe code) zwischen -1 und +1. (mit ganz leichtem hang ins Negative, bei 20000 Wiederholungen ist der mittelwert um etwa 0.01 ins negative gerutscht)

Zu den Fragen: Startwert X. ist das mit dem rho (siehe code) nicht schon gegessen?
Trend ist so eine Sache smile Trend ist nicht zu sehen.. Zeitreihe kann also als Detrended angesehen werden.

Gruß,
Koboldus
Zahlenschubser Auf diesen Beitrag antworten »
RE: Arma (arima)
Hallo!

Also mit meinen C++-Kenntnissen ist es nicht allzuweit her, aber VB ist doch relativ ähnlich...

Du initialisiert die Variable mean als Double, weist ihr aber keinen Wert zu und multiplizierst dann rho damit, das Ergebnis ist demnach null. Check das mal bitte.
Koboldus Auf diesen Beitrag antworten »

hi,

also mean wird an die funktion übergeben, siehe:

code:
1:
vector<System::Double>* create_artificial_arma(vector<System::Double>* ab, double mean, int p, int q,  int length )


das ist der mittelwert der orginalzeitreihe. In mean steht schon was drin.. p und q sind - glaube ich - klar (anzahl der parameter) und length ist nur die Länge der zu erzeugenden ARMA - Reihe. Und vector/array ab sieht so aus:
a1|a2|..|ap|b1|b2|...|bq|.

also demnach mache ich da keinen fehler.. ? Wenn du vermutest, dass mean = 0 war (was es ja nicht ist)

oder muss ich meine zufallsvariable mehr "ausschlagen" lassen +/- mean oder so?

Was mich sehr wundert ist, dass bei dem original-Tool ein zweites ARMA - Fit (auf die original - Reihe) exakt die gleiche arma-Reihe erzeugt wie beim ersten Fit. Wenn doch da eine Zufallsvariable drin ist sollte das doch beim nächsten Durchlauf wenigstens minimal schwanken, oder? Klar, die geschätzten Parameter sind die gleichen, aber die daraus generierte Zeitreihe müsste doch immer wieder eine (minimal) Andere sein.

Verstehe ich da irgendwas Grundsätzliches nicht?

Grüße,
Koboldus
Zahlenschubser Auf diesen Beitrag antworten »

Also bei C++ muss ich leider passen...

Aber was ich dir zu deinem zweiten ARMA-Modell sagen kann: NEIN, es MUSS dasselbe rauskommen, weil die Ausgangsdaten diesselben sind! Das Ergebnis deines Modells hängt nicht vom Zufall ab, sondern die Realisation deiner Daten. Dieselben Daten = dasselbe Ergebnis.

Im Speziellen sind also auch die Zufallsvariablen wieder identisch.

Wenn du kannst, könntest du mir deinen Code vielleicht etwas erläutern? Ich weiß zum Beispiel nicht, was für Zufallszahlen du generierst etc. (und was die 50 dort bedeutet).
 
 
Koboldus Auf diesen Beitrag antworten »

klar erleutere ich das:

Ich stopfe Parameter ai und bi (im Vektor ab, was nichts anderes ist als ein array) und den durchschnitt der ursprünglichen Zeitreihe, sowie p und q (anzahl der a's und b's) und auch noch die länge der zu generierten arma - reihe rein.

code:
1:
vector<System::Double>* setControl::create_artificial_arma(vector<System::Double>* ab, double mean, int p, int q,  int length )


Variablen initialisieren:
in Result kommt die generierte arma - reihe rein.
random sind die et's von gaaanz oben.
i,j,k sind zählvariablen für die schleifen.
die doubles sind hilfsvariabeln, sie später gebraucht werden.
sowie zufallsgenerator initialisieren

code:
1:
2:
3:
4:
5:
6:
	vector<System::Double>* result = new vector<System::Double>;
	vector<System::Double>* random = new vector<System::Double>;
	int i,j,k;
	double val, zufall, rho;
        srand(GetTickCount());


Erstmal alle arrays mit nullen füllen, ist dann später übersichtlicher zu proggen.
code:
1:
2:
3:
4:
5:
6:
7:
8:
	// initialize length of artificial time series:
	i = 0;
	while (i < length) {
		result->push_back(0);
		random->push_back(0);
		i++;
	}


Hier mache ich konkrete realisierungen von et's (siehe gaaanz oben), die 101 und 50 sorgen dafür, dass die zufallszahlen zwischen -1 und +1 schwanken und 2 stellen hinter dem komma haben.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
		// initialize random variables
		i = 0;
		while (i < length) {
			zufall = (rand()%101)-50;
			val = (double)zufall/50; 
			random->at(i) = val;
			i++;
		}


Das Rho, was zu jedem generierten Wert dazukommt:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
		// set additional rho
                rho = 0;
		int n = 0;
		while (n < p) {
			rho += ab->at(n);
			n++;
		}
		rho = (1-rho)*mean;


Jetzt hab ich alles was ich brauche um die arma - reihe zu generieren:
ich laufe mit l von 0 bis length (Länge der generierten reihe),
und stecke in result(l) immer den berechneten wert rein.
Macht eigentlich genau das, was in der Formel ganz oben steht.
dieses ->at(x) macht nichts anderes als feld[x] aufzurufen..
die random->at(l-j)'s sind die et's von oben,
ab->at(p+j-1) sind die bi's
ab->at(m) sind die ai's

folgender Code realisiert die rechte Seite von der obigen Formel (erscheint unten im origninal-kontext):
code:
1:
result->at(l) -= ab->at(p+j-1)*random->at(l-j);


folgender Code realisiert die linke Seite von der obigen Formel (erscheint unten im origninal-kontext):
code:
1:
result->at(l) += ab->at(m)*result->at(l-m);


das rho habe ich auf einer anderen Website entdeckt und nachträglich dazugetan ursprünglich hatte ich da nicht rho stehen sonder ein et (wie es oben in der formel steht) das hat aber dann noch weniger hingehauen unglücklich

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
		// simulate the arma model here:
		int l = 0;
		while (l < length) {
			result->at(l) = rho;

			// build MA - Part:
			int j = 0;
			while (j < q) {
				if (l-j >= 0) {result->at(l) -= ab->at(p+j-1)*random->at(l-j);};
				j++;
			}

			// build AR - Part:
			int m = 0;
			while (m < p) {
				if (l-m >= 0) {
					result->at(l) += ab->at(m)*result->at(l-m);
				}
				m++;
			}
			l++;
		}


Gebe nun die generierte reihe zurück:
code:
1:
return result;


ich hoffe, ich konnte klar machen, was ich wo mache.. erkläre sehr gerne ausführlicher...

(hab jetzt aber feierabend, kann erst morgen wieder hier reinschauen)

vielen Dank für deine geistige Bemühungen !

Grüße,
Koboldus
Zahlenschubser Auf diesen Beitrag antworten »

Hallo!

Sorry, bin am WE nicht dazu gekommen.

Was ich immer noch nicht verstehe, ist wozu du Zufallszahlen erzeugst? Willst du eine künstliche ARMA-Zeitreihe erstellen oder hast du eine bestehende Zeitreihe, die du in die Zukunft prognostizieren willst?

Im ersten Fall sind deine Zufallszahlen unbrauchbar, weil sie nicht normalverteilt sind, im zweiten Fall entstehen die Zufallszahlen aus der Realisation deines Prozesses, damit brauchst du keine mehr zu erzeugen.

Nehmen wir ein einfaches Beispiel, ARMA(1,1): .

Das ist deine Zufallsvariable, die du nicht erzeugst, sondern aus der konkreten Realisation entsteht. In der Periode erhältst du: , wobei den letzten Beobachtungszeitpunkt kennzeichnet.

Das heißt hier ist nur noch ein stochastischer Einfluss, für ergibt sich , und hier ist kein stochastischer Einfluss mehr vorhanden. Dies ist grundsätzlich der Fall, sobald dir die MA-Terme ausgehen. Dann handelt es sich um eine rein deterministische Fortschreibung (AR) der Zeitreihe.
Koboldus Auf diesen Beitrag antworten »

okay, bin ja froh, dass sich überhaupt jemand die Geduld nimmt mir das zu erzklären.. da hab ich nichts zu meckern..

vielen Dank erstmal..
--> falsche Verteilung (das ist schonmal was) hatte das irgendwie unterschlagen..

also meine Intension ist schon, dass ich Forecaste. Aber damit ich meine Algorithmen testen kann habe ich nun erstmal versucht überhaupt eine künstliche Zeitreihe zu erzeugen, zu der ich die Parameter kenne.

nun bin ich glaub soooo knapp davor dass sich der knoten in meinem hirn löst verwirrt .

Also.. nehmen wir mal an, ich habe mittels Yule-Walker meine und und rausbekommen.

wie enstehen denn dann die 's ? Muss ich dann nochmal Gleichungssysteme lösen mit meinen Ursprungswerten und ausgerechneten und ? Dann hätte ich ja die zufallsvariablen.. oder? aber ist das "legal"?

ich glaub ich hab echt ein Brett vor dem Kopf traurig ..
Koboldus Auf diesen Beitrag antworten »

so.. dann lass uns nun mal ganz konkret werden smile

ich habe eine Zeitreihe mit folgenden Werten:
1,2,3,4,5,5,6,7,8,9,10 (ja die fünf ist doppelt)

dazu sind die autokovarianzen zu lag 0,1,2 (in der reihenfolge)
7,520661157 5,797520661 3,913682277

dann bekomme ich mit Yule-Walker (für ein ARMA(1,1) - Modell):
a = -0,675061376
b = 0,244761497
sigma = 2,944142753

das heißt doch jetzt, dass ich die Zufallsvariablen erzeugen muss, wenn ich mein ARMA - Modell plotten möchte.. Heißt ich lasse einen Zufallsgenerator laufen, der mir normalverteilte Zufallszahlen ausspuckt mit Mittelwert 0 und Varanz 2.94.. ?

Habe ich da jetzt irgendwo einen Denkfehler?

Liebe Grüße,
Koboldus
Zahlenschubser Auf diesen Beitrag antworten »

Hallo!

Yule-Walker ist m. E. nach für AR(2) und nicht für ARMA(1,1), also bin ich mir jetzt nicht sicher, was du geschätzt hast.

Nehme ich deine Parameter als ARMA(1,1) erhalte ich als Modell:



Der Forecast für den 12. Wert (11 hast du vorgegeben) ist demnach:

wobei und so weiter. ist die einzige Annahme die du treffen kannst, vorausgesetzt du hast keine weitere Informationen. Damit ist auch dein deterministischer (nicht stochastischer!) Anfangswert.

Ab dem 13. Wert ist alles gleich dem 12. Wert, da jetzt der stochastische Einfluss verschwindet.

Du brauchst an keiner Stelle Zufallszahlen zu erzeugen, die gesamte Prognose hängt NUR von den gegebenen Zeitreihenwerten ab, also muss auch immer dasselbe rauskommen! Sonst würdest du immer andere Ergebnisse erhalten, in Abhängigkeit von der Realisation deiner erzeugten Zufallsvariablen.
Koboldus Auf diesen Beitrag antworten »

okay !!! jetzt ist mir vieles Klar !!
thx a lot !!

die obige Zeitreihe (Beispiel) war mit trend .. und halt auch net arma(1,1) modellierbar.. aber deine Erklärung zu den Zufallsvariabeln hat mir seeehr geholfen !!

Grüße,
Koboldus
Koboldus Auf diesen Beitrag antworten »

doch .. eine Frage habe ich noch an Dich Zahlenschubser smile

woher weißt du das? Ich habe Einführungen in die Zeitreihenanalyse gelesen, das Buch von Box/Jenkins, jede Menge webseiten angesehen...
hat mir aber nicht weitergeholfen..

hast du da ein tolles Buch, was du mir empfehlen kannst?

liebe Grüße,
Koboldus
Zahlenschubser Auf diesen Beitrag antworten »

Ich habe den Mist als Schwerpunkt im Studium gehabt und arbeite unter anderem in dem Bereich...

Bücher sind teilweise Mist, höchstens als Nachschlagewerk zu gebrauchen. Ein wirklich gutes kenne ich nicht. Webseiten sind übrigens noch mehr Müll. Im Zweifel einfach mal 10 Bücher zu Ökonometrie aus der Bib nehmen und die Zeitreihenanalyse durchblättern...
Koboldus Auf diesen Beitrag antworten »

okay Augenzwinkern
danke.. die meisten bücher sind aus dem vwl bereich oder bwl die ich durchgelesen habe. Werde mir dann wohl nochmal welche ausleihen müssen ..

auf jeden fall mal vielen dank !!
Koboldus Auf diesen Beitrag antworten »

Also.. Zahlenschubser, ich hab mich jetzt etwas "belesen" und hab nun auch ein tolles buch gefunden, in dem das steht, was du geschrieben hast smile

(darf man hier werbung für ein buch machen?)
John M. Gottman
Time series analysis
A comprehensive introduction for social scientists
(1981)

das ist ein "arima for dummies" buch smile viele Praktische Beispiele, schön schritt für Schritt erklärt... weil du doch meintest es gibt nicht so viele gute Bücher..

Grüße
(kann man den Thread irgendwie schließen?)
wurwunchik Auf diesen Beitrag antworten »
Arma(arima)
Hallo!
jetzt habe ich eine Frage. Wenn ich diese 11 Daten habe und den Forecast für den 14. Wert brauche, wie kann ich ihn bekommen?

Danke im Voraus!
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »