Daten paarweise mitteln

Fragen und Diskussionen rund um die Statistik und deren Anwendung.
Antworten
kunde_x
Beiträge: 21
Registriert: 05.08.2007, 16:28

Daten paarweise mitteln

Beitrag von kunde_x »

Hallo,

ich habe einen ziemlich großen Datensatz der manuelle Bearbeitung unmöglich macht. Ich muss nun aus jeweils zwei benachbarten Zellen einer Variable den Mittelwert bilden, so dass der Fallumfang halbiert wird. Ein eventuell benötigter Zähler ist in einer anderen Variable in Form der Uhrzeit (HH:MM:SS) vorhanden. Kann mir da jemand helfen?
Ich verwende Statistica, wäre aber auch für eine Erklärung in SPSS dankbar.

schön Gruß
Noonen
Beiträge: 818
Registriert: 26.09.2006, 14:52

Beitrag von Noonen »

Hallo
so dass der Fallumfang halbiert wird
Du meinst wohl Variablenumfang?!? Mittelwerte über mehrere Variablen hinweg bilden ist mit COMPUTE nicht schwer.
Wenn Du tatsächlich Fälle reduzieren möchtest (warum will man das überhaupt?), dann wirst Du wohl via die SELECT IF-Befehle einen Weg finden.

Gruss
Patrick
Volker
Beiträge: 67
Registriert: 17.01.2007, 18:15

Beitrag von Volker »

Hallo,

Wie das bei statistica geht weiß ich zwar nicht, aber unter SPSS müsste das mit "Daten aggregieren" klappen. Als "Break-Variable" gibst du deine "Zähler-Variable" ein, als Funktion den Mittelwert. Das Ganze dann in eine neue Datei ausgeben lassen.

Gruß
Volker

PS: Deine "Zählvariable" enthält "HH:MM:SS". Wenn du so vorgehst wie ich vorgeschlagen habe, müsstest du für jede Sekunde einen Mittelwert erhalten. Falls du mehr als zwei Messungen pro Sekunde hast, wird der Mittelwert auch über mehr als zwei Messungen gebildet.
kunde_x
Beiträge: 21
Registriert: 05.08.2007, 16:28

Beitrag von kunde_x »

Hallo zusammen,

danke erstmal für die Tipps, aber es ist tatsächlich wie Patrick vermutet. Ich habe EINE Variable deren Fälle ich halbieren muss, sprich aus 1 Hz Messdaten 0,5 Hz Messdaten errechnen. Der Grund ist schlicht, dass diese Variable einen Umfang von 2,6 MIO Fällen hat, was ungefähr der Sekundenzahl eines Monats entspricht. Die Reduzierung ist also eine Art Tiefpassfilterung zur besseren Weiterverarbeitung und Vergleichbarkeit der Daten.

Der Vorschlag mit "select - if" könnte ein guter Ansatz sein, aber wie sollte da die Bedingung und der SPSS-Code aussehen?
Man müsste dem Programm sagen, "gehe zu Fall 1, mittle ihn mit dem darunterliegenden Fall 2, schreibe den Mittelwert in eine neue Variable, dann nimm dir Fall 3 vor, mittle ihn mit Fall 4 usw."

Da das ganze bis Fall Nr. 2,6 Million gehen muss, ist irgendeine Art von Programmschleife unausweichlich.

Eine ziemlich ungewöhnliche Aufgabenstellung, glaub ich...
Noch Ideen?

Schön Gruß,
Lars
Volker
Beiträge: 67
Registriert: 17.01.2007, 18:15

Aktualisierter Beitrag

Beitrag von Volker »

Hallo Lars,

genau das kannst du mit der Vorgehensweise über „Daten aggregieren“ machen. Vorrausetzung ist ,dass du eine Variable hast die du als „Breakvariable“ verwenden kannst, d.h, diese Variable gibt an, welche Fälle du mitteln möchtest. Angenommen, du hast pro Sekunde zwei Messungen, dann kannst du diese „Zeitvariable“ dazu verwenden. Angenommen, deine Daten liegen folgendermaßen vor:

Messung---Zeit-------Messwert
1-----------15:30:10------4
2-----------15:30:10------8
3-----------15:30:11------3
4-----------15:30:11------5
usw.

Wenn du die Daten jetzt mit SPSS aggregieren möchtest und dazu die Zeitangabe verwendest erhältst du folgendes Ergebnis:

Zeit-----------MeanMesswert
15:30:10------------6
15:30:11------------4
usw.
Dadurch kannst du deine Fallzahl halbieren.

Das klappt aber nur dann, wenn du pro Sekunde auch nur zwei Messwerte hast, hast du pro Sekunde mehr als zwei, wird der Durchschnitt auch über mehr als zwei Messpunkte berechnet, eben immer der durchschnittliche Messwert pro Sekunde. Ich nehme an, dass 1 Hz Messdaten deutlich mehr als 2 Messungen pro Sekunde sind. ;-)

In diesem Fall würde ich dir raten, eine „Breakvariable“ selbst zu generieren. Bei 2,6 Mio Fällen, bzw. Messwerten, ist das aber eine irre Aufgabe. Da du mit „statistica“ arbeitest, weiß ich leider nicht, wie das geht. Mit SPSS würde ich mir dazu eine Syntax mit „IF“ schreiben, bzw. über ein Makro in Word schreiben lassen. Ich schildere dir mal das Vorgehen, vielleicht kannst du das ja auf „statsitika“ übertragen.

Als erstes benötigst du eine eindeutige Fallzuweisung. Falls du schon eine ID-Nummer pro Fall hast kannst du die verwenden, falls nicht, kann man sich in SPSS nachträglich eine erstellen.

Dazu müssen die Daten zeitlich aufsteigend sortiert sein. Aber ich nehme an, das ist sowieso schon der Fall.

Als zweites kannst du dir mit folgender Syntax eine ID-Variable erstellen lassen:
Compute ID = $casenum.
Exe.

Zum Hintergrund: SPSS verwendet mehrere temporäre Systemvariablen, die beginnen normalerweise mit dem Dollarzeichen. Eine dieser Variablen ($casenum) gibt jedem Fall eine temporäre Fallnummer. Diese Fallnummer kann man sich als Variable abspeichern. Das macht die obige Syntax.

Jetzt kannst hergehen und dir mit folgender Syntax eine „Breakvariable" erstellen.
If (ID = 1 or ID = 2) Break = 1.
If (ID = 3 or ID = 4) Break = 2.
Usw.
Exe.

Dadurch weist du jeweils zwei aufeinander folgenden Fällen eine neue „BreakNummer“ zu. Ich habe das zwar schon mit ca. 2000 Fällen gemacht, aber 2,6 Mio. ist doch eine ganz andere Dimension.

Größere Syntaxfolgen, die immer identisch sind und in denen nur Werte, also Platzhalter, verändert werden, schreibe ich in Word mit einem kleinen VBA-Makro. Diese Syntax kann man dann einfach in das SPSS-Syntaxfenster kopieren und abarbeiten lassen.

Das kann man wahrscheinlich auch in SPSS mit einer Schleife machen, aber da müsste ich mich noch etwas einarbeiten. Ist vielleicht ein Anlass.

Ich hoffe, der Tipp mit dem Aggregieren hilft dir weiter.

Gruß, Volker


PS:
Ich habe mich mal kurz eingearbeitet, das Thema hat mich einfach interessiert. :) Ich habe meinen Beitrag daher um eine SPSS-Syntax aktualisiert. Dadurch wird mein obiger Tipp mit Word und einem VBA-Makro überflüssig. Die folgende Syntax habe ich mit 40 Fällen (SPSS 14) getestet, sie läuft aber mit bis zu 3 Mio. Fällen. Bei weniger Fällen sollte man den Wert für die Fallzahl entsprechend anpassen, das spart Rechenzeit.

Das SetUp setzt voraus, dass in der Datei eine ID-Variable existiert. Falls das nicht der Fall ist, kann eine ID-Variable wie oben beschrieben erstellt werden.


*** Anfang Syntax *************************.

* Syntax, um immer zwei aufeinanderfolgenden Fällen einen gemeinsamen Wert zuzuweisen.
* Im ersten Schritt wird allen ungeraden Fällen ein Wert in der Variable "break" zugewiesen.
* Das Setup ist für bis zu 3 Mio Fälle geschreiben, es läuft aber auch mit weniger Fällen.

* Im ersten Schritt wird allen ungeraden Fällen ein Wert in der Variable "break" zugewiesen.
loop #i = 1 to 3000000 by 2.
if (id = #i) break = #i.
end loop.
exe.

* Im zweiten Schritt wird allen geraden Fällen ein Wert in der Variable "break" zugewiesen.
loop #i = 2 to 3000000 by 2.
if (id = #i) break = #i-1.
end loop.
exe.

* Schritt drei: Mittelwert bilden aus jeweils zwei aufeinanderfolgenden Fällen.
* Die aggregierten Daten werden als neue Datei "aggr" in das Stammverzeichnis "C" geschrieben.
AGGREGATE
/OUTFILE='C:\aggr.sav'
/BREAK=break
/Wert_mean = MEAN(Wert).

*** Ende Syntax *************************.


Das Ganze geht vielleicht noch etwas eleganter, aber so geht's auch.

Gruß, Volker.
kunde_x
Beiträge: 21
Registriert: 05.08.2007, 16:28

Beitrag von kunde_x »

Hallo Volker, also das klappt rein methodisch wunderbar, scheint Dich wirklich interessiert zu haben ;-)

Problematisch ist nur noch die Rechenzeit. Meiner braucht für 86.400 Fälle (1 Tag) ca. eine halbe Stunde, NUR zur Zuweisung der ungeraden Fälle! D.h. bei 2,5 Mio wirds richtig übel ;-)

Danke für Deine Lösung!!

Schöne Grüße, Lars
Volker
Beiträge: 67
Registriert: 17.01.2007, 18:15

Beitrag von Volker »

Hallo Lars,

schön, dass es auch mit deinem Datensatz klappt, zwar langsam, aber immer noch schneller als von Hand.

Eventuell geht das schneller, wenn du SPSS mehr Arbeitsspeicher zuweist. So weit ich weiß, arbeitet SPSS in der Voreinstellung mit 512kb, das ist nicht gerade viel. Probiers mal mit 128000kb.

Mit folgender Syntax kannst du dir den zugewiesenen Arbeitsspeicher anzeigen lassen:
show workspace.

Mit folgender Syntax weist du 128000kb zu:
set workspace = 128000.

Gruß
Volker

PS: Ich wollte mich schon längst mal in das Programmiern von Schleifen und Makros unter SPSS einarbeiten. Das war ein sinnvoller Anlass, damit anzufangen.
kunde_x
Beiträge: 21
Registriert: 05.08.2007, 16:28

Beitrag von kunde_x »

Du hast ja Ideen ohne Ende...
Mein Speicher stand bei 4096 kb (!)
Ich habs probiert mit bis zu 256 mb, schätze da komme ich so auf 20 min, aber immerhin.

Schön Gruß, Lars

PS: Freut mich dass ich Dir einen Anlass geben konnte - sei versichert, mir fällt noch einiges zum fragen ein ;-)
Volker
Beiträge: 67
Registriert: 17.01.2007, 18:15

Beitrag von Volker »

Hallo Lars,

freut mich, dass dir meine Ideen gefallen.

Noch ein Nachtrag zum Workspace. Wenn du den zu hoch setzt, kann SPSS auch damit Probleme bekommen. Ich weiß jetzt nicht, ob SPSS tatsächlich 256MB verwalten kann. Probier's mal aus, wenn es nicht klappt, bringt SPSS eine Meldung, dann musst du ihn einfach wieder runtersetzen.

Da du mit einer Datei mit 86400 Datensätzen (1 Tag) getestet hast vermute ich, dass du 30 solcher Einzeldateien hast. Wenn du jetzt jede Datei von Hand einliest und das SetUp jedesmal manuell startest, verbrauchst du zusätliche Zeit. Kopier das Setup doch 30mal untereinander und lasse die Dateien automatisch einlesen und abspeichern. Dazu müssen deine Dateien entsprechende Namen haben, z.B. Datei01.sav, Datei02.sav usw. Im Setup musst du das dann entsprechend anpassen.

Zur Sicherheit würde ich aber in diesem Fall noch in jede Datei eine Dateinummer eintragen. Anhand derer kannst du dann nach dem Zusammenfügen deiner aggregierten Dateien überprüfen, ob auch alle 30 Dateien zusammengefügt wurden.

compute DateiNr = 1.


**** Datei01 ****.
GET FILE='C:\Datei01.sav'.
compute DateiNr = 1.
exe.

***SetUp einfügen und abarbeiten ****.

AGGREGATE
/OUTFILE='C:\Test\aggr01.sav'
/BREAK=break
/Wert_mean = MEAN(Wert) /Datei_meanNr = MEAN(DateiNr).




**** Datei02 ****.
GET FILE='C:\Datei02.sav'.
compute DateiNr = 2.
exe.

***SetUp einfügen und abarbeiten ****.

AGGREGATE
/OUTFILE='C:\Test\aggr02.sav'
/BREAK=break
/Wert_mean = MEAN(Wert) /Datei_meanNr = MEAN(DateiNr).

** usw ***********.



Dann läuft dein PC zwar rund 30 Stunden, aber du bist in dieser Zeit frei, anderes zu erledigen. Um sicherzugehen, ob alles funktioniert teste dein GesamtSetUp aber ersteinmal mit ein paar kleinern Dateien. Kannst das Ganze ja auch auf mehrere PCs verteilen, aber das ist dir sicher bereits selbst eingefallen. ;-)


Gruß, Volker
kunde_x
Beiträge: 21
Registriert: 05.08.2007, 16:28

Beitrag von kunde_x »

Hallo Volker,

naja eigentlich habe ich bereits im voraus die Halbstunden(!)- Dateien zusammengefügt und als Monatsdatei in SPSS importiert, die Tagesdatei ist nur probeweise. Meinst du es macht einen Zeitunterschied, ob SPSS den Algorithmus an einer großen oder vielen kleinen Dateien ausführt? Ich glaube selbst wenn, wird der Unterschied marginal sein...

Schön Gruß,
Lars
Volker
Beiträge: 67
Registriert: 17.01.2007, 18:15

Beitrag von Volker »

Hallo Lars,

da habe ich wohl etwas zu viel interpretiert.

Ich denke, dass SPSS mit der großen Gesamtdatei zurechtkommen müsste. Da SPSS die Transformationen nur temporär vornimmt und erst nach einer Prozedur, bzw. execute, in die Datei schreibt, wird ein großer Speicher benötigt. Bei vielen kleinen Dateien ist das kein Problem, aber mit 256MB eigentlich auch nicht.

Dann, viel Erfolg
Volker
kunde_x
Beiträge: 21
Registriert: 05.08.2007, 16:28

Beitrag von kunde_x »

Ich hab das Problem jetzt in einem kleinen Java-programm gelöst. Es dauert lange 2 Minuten ;-)
SPSS war für diese Aufgabe wohl überdimensioniert...

Danke für deine Hilfe!
Lars
Volker
Beiträge: 67
Registriert: 17.01.2007, 18:15

Beitrag von Volker »

Mein Respekt Lars!

Jetzt kannst du aber nicht mehr mit einem 30 Std.-SPSS-Setup protzen. ;-)

Gruß
Volker
Anzeige:Statistik und SPSS: Die besten Bücher
Als Buch oder E-Book - Jetzt bestellen
spss datenanalyse
SPSS - Moderne Datenanalyse - Jetzt bestellen!
statistik datenanalyse
Statistik - Der Weg zur Datenanalyse - Jetzt bestellen!
Antworten