LesezeichenAbonnierenRSS-Feed abonnieren
sauer
Obsidian | Level 7

Guten Abend zusammen.

 

Hat denn zufällig jemand schon mal einen Reverse Arrangement als Stationaritätstest für eine Zeitreihe programmiert?

Ich habe zwischen 300 und 2000 Werte in der Reihe und befürchte, da das sicherlich nur mit grossen Matrizen-Operationen geht, an Kapazitätsgrenzen zu stossen. Über einen Hinweis würde ich mich freuen.

 

Grüße

Frank

5 ANTWORTEN 5
FreelanceReinh
Jade | Level 19

Hallo, Frank,

 

nein, mit diesem Test hatte ich leider noch nichts zu tun. Die Beschreibung in diesem Artikel hat mich aber dazu motiviert, eine einfache Simulation zu programmieren. Matrizenrechnung kommt darin nicht vor.

 

Im Artikel heißt es über die Teststatistik, "the tendency to normality is extremely rapid", und die Normalapproximation wird bereits für Datenreihen ab Länge 14 nahegelegt. In meiner Simulation wird der in diesem Sinne approximative, zweiseitige Test zum Niveau alpha auf t unabhängige "Zeitreihen" der Länge n angewandt (Stichproben einer Rechteckverteilung; hier sollte also die Nullhypothese gelten).

 

%let n=300;       /* Länge der Zeitreihe */
%let t=100000;    /* Anzahl Simulationen */
%let alpha=0.05;  /* Signifikanzniveau */

data sim;
call streaminit(271828);
array x[&n] _temporary_;
m=&n*(&n-1)/4;                    /* Erwartungswert der Teststatistik lt. Artikel */
s=sqrt(&n*(&n-1)*(2*&n+5)/72);    /* Standardabw. der Teststatistik lt. Artikel */
u=quantile('NORMAL', 1-&alpha/2);
do k=1 to &t;
  do r=1 to &n;                   /* Erzeugen der "Zeitreihe" */
    x[r]=rand('uniform');
  end;
  a=0;                            /* Berechnung der Teststatistik */
  do i=1 to &n-1;
    do j=i+1 to &n;
      a+(x[i]>x[j]);
    end;
  end;
  z=(a-m)/s;    /* z-Score */
  y=(abs(z)>u); /* Indikator für Signifikanz zum Niveau &alpha */
  output;
end;
keep k a y;
run;

proc freq data=sim;
tables y / binomial (level='1');
run;

Für alpha=0,05, t=100000 und n=300 (Laufzeit hier: 1,5 min) ergab sich eine Fehlerrate erster Art von 4,95 % (exaktes CI: 0,0481 - 0,0508), also tatsächlich sehr nah am gewählten Signifikanzniveau.


Für alpha=0,05, t=10000 und n=2000 (Laufzeit: 6,5 min) ergab sich eine Fehlerrate erster Art von 5,17 % (exaktes CI: 0,0474 - 0,0562), was ebenfalls für die Brauchbarkeit der Normalapproximation spricht.

 

Die Power des Tests könnte man bei Bedarf analog mit geeigneten Testdaten untersuchen.

 

Viele Grüße

 

Reinhard

sauer
Obsidian | Level 7

Hallo Reinhard,

 

das ist aber ein verblüffender Zufall: derselbe Artikel liegt vor mir auf dem Schreibtisch  Smiley (zwinkernd)

Ich habe zwischen 300 und 2000 Zahlenwerte, da steigt bei mir die array Definition aus. Aber da gibt es sicherlich Abhilfe.

Jedenfalls hatte ich nicht erwartet, dass das Problem mit so wenigen Zeilen abzuwickeln wäre.

Aber ich stecke auch nicht so tief im SAS drin 😞

Ich werde mit Deinem Code jetzt experimentieren und bin auf die Ergebnisse gespannt.

Vielen Dank für die voll ins Schwarze treffende Hilfe 😉

 

Viele Grüße

Frank

FreelanceReinh
Jade | Level 19

sauer schrieb:

 

(...) Ich habe zwischen 300 und 2000 Zahlenwerte, da steigt bei mir die array Definition aus. Aber da gibt es sicherlich Abhilfe. (...)


Wenn es die Genauigkeit der Werte zulässt, könnte man notfalls die Länge der Arrayvariablen auf einen Wert <8 reduzieren, um Speicherplatz zu sparen. Aber ich kann mir nur schwer vorstellen, dass das wirklich nötig sein sollte. Mit Arrays dieser Größenordnung habe ich schon in den späten 1990er-Jahren auf PCs gearbeitet, und in der Zwischenzeit hat sich doch gerade bei der üblichen RAM-Ausstattung einiges getan.

Kurt_Bremser
Super User

2000 Zahlenwerte * 8 bytes = 16K.

Da steigt kein Array aus, mit so einer mickrigen MEMSIZE würde SAS keinesfalls starten. Das muss einen anderen Grund haben.

sauer
Obsidian | Level 7

Hallo Reinhard,

 

vielen Dank nochmal für Deine Simulation.

Hat mir sehr geholfen beim Weiterkommen Smiley (fröhlich)

Inzwischen konnte ich auch nachvollziehen, was meine Vorgänger gerechnet haben.

 

Viele Grüße

Frank

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Diskussionsstatistiken
  • 5 Antworten
  • 1455 Aufrufe
  • 1 Kudo
  • 3 in Unterhaltung