• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

SemiMarkov-Prozess

Mitglied seit
21.08.2010
Beiträge
8.008
Reaktionen
1.107
Hintergrund: Eine Person kauft ein Gut (bspw. Gummibärchen) und konsumiert es in der Zeit nach dem Kauf. Da die Umstände des Alltags nicht vorhersehbar sind, kann es sein dass die Gummibärchen nach ein paar Stunden schon weg sind, oder dass sie einen Monat lang halten. Typischerweise (== im Mittel) hält die Packung einen Monat (== 30 Tage, Kauffrequenz freq=30).

Die Zeit wird in (diskreten) Tagen gemessen. Nach dem Ereignis "Gummibärchen wurden gekauft" in t=t(x) wird ein erneuter Kauf bei t(x+30) erwartet. Durch besonderen Streß, Besuch oder andere exogenen Einflüsse kann es sein, dass die Gummibärchen schneller weg sind.

Wie würdet ihr das modellieren?

Vorschlag 1: (simpel)
Kaufereignis alle 'freq' Tage +/- eine Anzahl Tage die ich aus der Normalverteilung (oder einer beliebigen anderen univariaten Verteilung) ziehe und normal runde.

Vorschlag 2: (eigentlich unnötig komplex, aber fürs weitere Vorgehen sinnvoll)
Kaufereignis dann, wenn der folgende Semi-Markov-Prozess "wahr" zurückgibt:

Code:
if(1-exp((t+error)/(freq)-1)<=0)
'error' ist eine iid-verteilte zufallsvariable mit fester varianz (z.B. 1). Ohne es durchprobiert zu haben, müsste sich bei einem normalverteilten 'error' mit Varianz 1 ergeben, dass ~2/3 der Kaufereignisse genau am erwarteten Termin +/- ein Tag (symmetrisch über/unter dem Erwartungswert) stattfinden, und jeweils knapp ein Sechstel mit +/- 2 Tagen (ebenfalls symmetrisch) und ein geringer Rest von 2-3% weicht höher ab. Der Ausdruck wird zu jedem neuen Tag evaluiert, wodurch sich vermutlich eine gewisse Schiefe ergibt, weil der Prozess häufiger die Chance bekommt frühzeitig abzubrechen, als verspätet. D.h. die empirisch erzielte Kauffrequenz dürfte im Mittel signifikant unter der durch "freq" eingestellten liegen.

Das Schöne an dieser Variante ist aber, dass sich so realisieren lässt, dass immer bei Auftreten eines Kaufereignisses neu angefangen wird zu zählen.

Außerdem kann in einem weiteren Schritt Folgendes realisiert werden:
Man nehme an, dass die gekauften Güter unterschiedliche Qualitätsstufen besitzen, welche vom Kaufpreis adäquat reflektiert werden. Abhängig vom Einkommen des Konsumenten wird bei höherem Einkommen tendenziell höhere Qualität gekauft. Güter von höherer Qualität haben annahmegemäß eine höhere Haltbarkeit, sprich sie werden langsamer konsumiert. Ein Beispiel wäre ein teurer Neuwagen gegenüber dem billigen Gebrauchten. Im Mittel erwartet man, dass der teure "Qualitätsneuwagen" eine längere Lebensdauer vor sich hat.

In der ersten Variante ist dies schwer zu modellieren, wohingegen ich im zweiten Ansatz folgendes machen könnte:
Ich ersetze den Kern der exp()-funktion
Code:
Kern(1):  (t+error)/(freq)-1
durch
Code:
Kern(2):  (price/(1+discountfactor)^(t-t_lastbuy))-error

dadurch würde nach dem Kauf geringerwertiger Güter der SMP tendenziell schneller ein "wahr" zurückliefern, da der Fehlerterm 'error' eine über alle Individuen konstante Varianz ausweist.

Wenn ich jetzt noch den ursprünglichen Kern(1) der Funktion gegen einen nach dem Muster von Kern(2) ersetze, und hierbei für 'price' einfach eine Konstante einsetze, habe ich idealerweise schön vergleichbare Werte für "Kauffrequenz ist Erwartungswert plusminus Scatter" und "Kauffrequenz kovariiert (negativ) mit der Haltbarkeit des Items".
Da ohnehin nur positive Werte des Fehlerterms interessant sind, könnte man da direkt eine Chi²-Verteilung annehmen und diese entsprechend verschieben damit der Erwartungswert wieder 0 ist.

Was haltet ihr davon?

Extrafrage für Interessierte: Wie sollte ich die vermutliche Verzerrung der Verteilung vermeiden? Den Ausdruck nur einmal evaluieren pro Kaufereignis ... wäre zumindest mein erster Gedanke.

Weitere erläuternde Informationen: In meinem Datensatz ist die Zeiteinheit eine Woche, es sind 1000 synthetische Individuen im Datensatz, es wird (geplant) über 40 Jahre simuliert. Nur ein Gut, verschiedene Kauffrequenzen. Dadurch sind dann effektiv 24000 Individuen pro Modellierungsansatz im Datensatz. Die Ansätze sind: Fixe Kauffrequenz, Kauffrequenz gemäß Vorschlag 1, Kauffrequenz gemäß Vorschlag 2, zusätzlich kommen noch verschiedene Modellierungen von Saisonabhängigkeit im Konsum mit rein. Insgesamt sind es wohl so 8-16 mal 1000 synth. Individuen mal 24 Kauffrequenzen (1-24 Wochen) mal 52 Wochen mal 40 Jahre Datenpunkte im zu erstellenden synthetischen Datensatz.
 
Mitglied seit
21.08.2010
Beiträge
8.008
Reaktionen
1.107
ich glaube ich löse das ganze doch viel einfacher:
Code:
durability(t)=durability(t-1)-error(t-1)
das fasst sich zusammen in:
Code:
durability(t)=durability(0)-sum[i]{error(i)} mit i element von 1 bis t
also bisher ein normaler random walk, aber:
Code:
error verteilt als chi² mit df=1
weiterhin:
durability bekommt einen standardwert von ln(mean(income)), und an den error multipliziere ich noch ln(mean(income))/freq ran, damit es ordentlich miteinander skaliert.
für die variante mit qualitätsunterschieden wird der standardwert für durability durch
Code:
expenditure=ln(income + random scatter)
ersetzt.
der fehlerterm zieht also im mittel so viel pro woche von der durability ab, dass nach freq wochen ein neues kaufereignis registriert wird. die bedingung für einen neuen kauf ist damit
Code:
if(durability<=0)
und noch viel wichtiger ist, dass der prozess jetzt kein gedächtnis mehr hat und damit die markov-property erfüllt
kruemeltop00d3e392.gif



P.S.: Dass bei niedrigen Kauffrequenzen die tatsächliche Kauffrequenz wild schwanken dürfte ist nicht so schlimm, denn interessant wird es für mich erst ab ca. freq=10
 
Zuletzt bearbeitet:
Mitglied seit
21.08.2010
Beiträge
8.008
Reaktionen
1.107
Code:
else if (sset==3) { /* THIRD SUPERSET - stochastic expediture, dynamic frequency determination, no seasonal influences */
exp[(sset-1)*`n_freqs'*`n_hh'+(freq-1)*`n_hh'+hh,week+1]=(stock<=0 ? ln(basedata[(sset-1)*`n_freqs'*`n_hh'+(freq-1)*`n_hh'+hh,3]*(1+rnormal(1,1,0,`inc_scatter'))) : 0)
stock=(exp[(sset-1)*`n_freqs'*`n_hh'+(freq-1)*`n_hh'+hh,week+1]==0 ? stock-ln(basedata[(sset-1)*`n_freqs'*`n_hh'+(freq-1)*`n_hh'+hh,3])*((1+rnormal(1,1,0,`con_scatter'))/freq) : exp[(sset-1)*`n_freqs'*`n_hh'+(freq-1)*`n_hh'+hh,week+1]-ln(basedata[(sset-1)*`n_freqs'*`n_hh'+(freq-1)*`n_hh'+hh,3])*((1+rnormal(1,1,0,`con_scatter'))/freq))
stock=(week==`n_weeks' ? 0 : stock) /* keep eventual rest of stock from being carried over to the next household */
}
die funktionierende lösung falls es jemanden interessiert.
 
Mitglied seit
04.10.2006
Beiträge
643
Reaktionen
0
Ort
München
Da frag ich mich doch nur: warum simulierst du eigentlich über 40 jahre?
 
Mitglied seit
21.08.2010
Beiträge
8.008
Reaktionen
1.107
berechtigte frage ... ich zerfaser grad das ding in verschiedene schichten und stacke den datensatz nun doch nicht über alle frequenzen und verschiedenen parametrisierungen weil der rechner dafür nicht genügend RAM freigeschaufelt bekommt :ugly:

40 jahre deshalb, weil die randomisierung der frequenz dazu führt dass manche haushalte schneller wieder was kaufen und manche langsamer. dadurch werden sich die zentralen momente pro periode stark ändern schätze ich. um zu überprüfen ob das irgendwann konvergiert, d.h. ob irgendwann eine stabile maximale durchmischung der kauf zeitpunkte erreicht ist, oder ob es sogar zyklisch ist ... dazu brauche ich die 40 jahre. insb. weil das bei frequenzen von 26 wochen oder sogar länger gar nicht so viel ist.
 
Mitglied seit
04.10.2006
Beiträge
643
Reaktionen
0
Ort
München
zsfg:
- mikrofundierung der agenten? zumindest verbal?
- welches ziel?
- wie willst du kalibrieren :ugly: ?

Also nochmal zum Verständnis:

- Was willst Du -- am Ende des Tages -- herausfinden?
- wieviele haushalte betrachtest Du? einen?
- Da Du scheinbar stochastische Kaufzeitpunkte berechnest kannst Du dich doch auch bei den Produktionswissenschaftlern bedienen und stochastische Lagergrößen/Bestellmengenmodelle verwenden. ( (s,S)-Policy etc )
- Wie motivierst Du, dass Du eine X²-Verteilung nimmst? Diese ist die Summe von N-Quadraten, also wohl erstmal nur ein approximatives Werkzeug?
- An welchen Momenten bist Du interessiert? Wofür benötigst Du diese? Dein Modell scheint jetzt nicht sonderbar kompliziert, kannst du die momente nicht algebraisch oder zumindest per numerischer integration (heisst das so?) bestimmen?
 
Mitglied seit
21.08.2010
Beiträge
8.008
Reaktionen
1.107
fundierung: empirisch im wesentlichen, ansonsten kann man noch indirekt über das erste gossensche gesetz argumentieren dass die ausgaben pro gut eben grob ln(income)-mäßig aussehen. ich hab auch ein paar engelkurven geschätzt, aber für dieses konkrete problem gibts halt null vorliteratur.
kalibrierung: ich hab nen datensatz mit echten daten vom statistischen bundesamt (EVS), da kann ich die parameter für die einkommensverteilung rausziehen.

mein 'echter' datensatz beruht auf 200k beobachtungen die sich aber über verschiedene erhebungen verteilen. d.h. für eine erhebung hab ich *nur* um die 30-40k. die chi² hab ich mittlerweile auch ersetzt. an momenten betrachte ich die ersten vier zentralen.
mein ziel ist herauszufinden ob, und wenn ja wie und wie gut, man zwei erhebungen einer flussvariablen bezüglich ihrer verteilungen vergleichen kann bzw. vergleichbar machen kann, wenn zwischen den erhebungen die methodik geändert wurde.
wie du schon bemerkst ist das ganze nicht furchtbar komplex wenn man in statistik/öko einigermaßen fit ist, aber die umsetzung bei beschränkten rechnerressourcen, die ordentliche (quasi-)stratifizierung und vor allem das schreiben des codes an sich dauert schon ne halbe ewigkeit wenn man hundert einzelfälle und ausnahmen bedenkt etc.pp.

€: der synthetische datensatz wird nach aktueller planung umfassen: 6 verschiedene parametrisierungen, frequenzen von 1 bis 40 geschichtet generiert in zehnergruppen und danach erst in einen datensatz gestackt, pro parametrisierung und frequenz 1000 haushalte. insg. 240k datensätze :gosu:

€€: die sache mit den lagermodellen ist bestimmt auch hilfreich, nur leider hab ich in dem gebiet nie wirklich was gemacht :| d.h. ich kenn mich nicht aus und verschwende womöglich nur zeit. was ich schon gemacht habe bezüglich der methodischen fragen ist, mich bei finance und HFT umzuschauen, da hab ich halbwegs vergleichbare probleme und den vorteil dass ich mich in der materie auskenne.
 
Zuletzt bearbeitet:
Oben