Die folgenden Folien beinhalten Erläuterungen, die einen Inhalt des Seminars Fehler in der Schule...

Preview:

Citation preview

Die folgenden Folien beinhalten Erläuterungen, die einen Inhaltdes Seminars ‚Fehler in der Schule – Schülerfehler‘ unterstützensollen:

Die Frage, wie sich systematisch auftretende Fehler erkennen lassen.

Bei Klassengrößen zwischen 25 und 30, und vier bis sechs zu betreuenden Klassen, dürfte es kaum möglich sein, die Fehler, die jede einzelne Schülerin, jeder Schüler macht, im Blick zu behalten.

Damit liegt es nahe, rechnergestützte Analyseverfahren zu nutzen unddamit zugleich einen Blick auf die angewandten wissenschaftlichen Methoden psychologisch-pädagogischer Fehlerforschung zu richten.

Die Folien sollen dabei behilflich sein, in Eigenarbeit die imSeminar besprochenen und erprobten Rechnen- und Analyseschrittenach zu vollziehen.

Ein erster, wichtiger Schritt der systematischen Analyse von Fehlernbesteht in der Erfassung auftretender Fehler.Die detaillierte Feinauflösung dieser Erfassung kann nur gegenstands-,bzw. fachspezifisch diskutiert und erläutert werden.Im Prinzip gilt es, auftretende Fehler, unterschieden nach unter-schiedlichen Fehlerarten (siehe dazu Weimer 1925), möglichst genau,bezogen auf den Ort ihres Auftretens, zu erfassen.Um dies an einem einfachen Beispiel kurz zu demonstrieren, wird aufder nächsten Folie ein Text vorgestellt, der als Diktat vorgegeben wird.Die hier nicht geleistete Aufgabe bestünde bei der Konzeption desTextes darin, unterschiedliche Komma-Setz-Regeln (der aktuelle Duden behandelt dieses Thema in den § 71 bis 79) an verschiedenen Stellendes Textes, idealer Weise möglichst mehrfach, einzubauen. Das mehrfache Auftreten erlaubt Hinweise auf irrtümliche Annahmen,wenn auf inkonsistente Art und Weise mit der Kommasetzung unge-gangen wird.

Beispiel für einen zu analysierenden Text; der Fokus soll hier auf der Analyse von Komma-Fehlern liegen

Text eines Diktats:

„Peter, ein Junge aus der Nachbarschaft, traf seine Freundin Inge. Inge war gerade auf dem Weg zum Freibad,obwohl es regnete, recht kalt war und das Wetter damit nicht gerade zum Baden einlud. Peter, der einen dicken Pullover unter einer Regenjacke trug, fand das Badengehendaher auch eine recht merkwürdige Idee. Er schlug statt dessen vor, ins Kino zu gehen. Doch er wollte, sie nicht. […..]“

SchülerIn Komma_01 Komma_02 Komma_03 Komma_04 Komma_05 Komma_06 Komma_07 Komma_08

Sahra 1 1 1 1 2 1 1 1

Beate 1 1 1 1 1 1 1 1

Jürgen 2 1 2 2 1 2 2 2

Günther 1 1 2 2 2 1 2 2

Dieter 1 1 2 2 2 2 0 1

….

Codierung:• 0 = Nicht bearbeitet• 1 = Richtig• 2 = Fehler

Die im Text zu analysierenden Fehler müssen in einem ersten Schritt markiert werden. EineMöglichkeit wäre es, einfach alle erforderlichen Kommata durchzunummerieren. Wichtig ist es,ein möglichst einfach und sicher handhabbares Verfahren anzuwenden.

Im Anschluss wird eine Datenmatrix erstellt, bspw. so wie in der folgenden Tabelle dargestellt.Für jede Schülerin und jeden Schüler wird mit Hilfe einer festzulegenden Codierung eingetragen, ob das erforderliche Komma richtig oder falsch gesetzt wurde oder ob die Passagegar nicht geschrieben wurde.

Wie lassen sich diese Daten nun auswerten?

Zunächst ist zu betonen, dass es ganz unterschiedliche Fragen gibt, die an diese Daten gestellt werden können. Entsprechend gibt esmehr als eine Antwort auf die Frage nach der Vorgehensweise einerAuswertung.

Hier wird eine dieser Fragen in einem exemplarischen Sinne hervor-gehoben, um die Vorgehensweise vorzustellen und zu erläutern.Diese Frage lautet:

Wie häufig tritt bei einem einzelnen Schüler/Schülerin ein bestimmterFehler auf. Oder anders formuliert: Wie verteilen sich die Fehler-häufigkeiten bezogen auf die Schüler/Schülerinnen und die verschiedenen Anlässe, einen Fehler zu machen?

Vorgestellt wird die Vorgehensweise an einem Datensatz, der (auch) imSeminar erhoben wurde: Daten des d2 Aufmerksamkeits-Belastungstests(Brickenkamp 1981; 2002).

Vereinfacht sind in diesem Satz die dabei erhobenen Daten wie folgt codiert:

• 0 = Nicht bearbeitet• 1 = Richtig• 2 = Fehler

Für jede der 14 Zeilen und allen Spaltendes Tests wird eingetragen, ob das Zeichen richtig (= 1), fehlerhaft (= 2) odergar nicht (= 0) bearbeitet wurde. Wie man sieht, wurden in dem hier gezeigten Abschnitt alle Zeichen richtigangestrichen.

Die Daten jedes Testbogens sind hier durch eine Leerzeile vonein-ander getrennt.

Die hier gestellte Aufgaben lautetdamit genauer:Wie häufig werden die Zeichen inder Zeile 1 und in der Spalte 1fehlerhaft markiert?

Wie häufig werden die Zeichen inder Zeile 2 und in der Spalte 1fehlerhaft markiert? Etc.

Gib mirnur die Daten

der zweiten Zeile,erste Spalte

Gib mirnur die Daten

der zweiten Zeile,erste Spalte

Die Vorgehensweise zur Beantwortung dieser Frage lässtsich schematisch wie folgt darstellen:

Gesamtdatensatz

Gib mirnur die Daten

der ersten Zeile,erste Spalte

Teildatensatz

Aus dem Gesamtdaten-satz werden nacheinanderTeildatensätze gebildet, diejeweils nur die Daten einerZeile und einer Spalteenthalten.

SPSS/PASW bietet dafür unter Daten die Option Fälle auswählen

Klicken Sie diese Option an, öffnet sich das folgende Dialogfenster.Dort klicken Sie das Feld Falls Bedingung zutrifft Falls an, woraufdas nächste Dialogfenster geöffnet wird, in dem Sie Zeile = 1eingeben.

Die Datei sieht nun wie folgt aus: Es gibt nur noch die Daten aller Zeilen 1und der Spalte 1 (S_01).

Wie kann jetzt ermittel werden,wie oft in der Variable S_01 die Werte0, 1 und 2 vorkommen?

Dazu gibt es einen Befehl:

Unter Transformieren findet sich die Option Werte in Fällen zählen

Auf die bis zum diesem Punkt erläuterte Art und Weise ließensich jetzt alle Spalten, aller Zeilen nacheinander analysieren. Doch: bei 14 Zeilen à 47 Spalten müsste 658 mal dieselbe Prozedurmit Mausklick und entsprechenden Eingaben durchgeführt werden— eine extrem mühsame ‚Eselsarbeit‘ .

Doch SPSS/PASW bietet, wie fast alle anderen Programme auch, Automatisierungsoptionen in Form sog. Syntax-Prozeduren oderMakros.

Im folgenden wird die Nutzung dieser Optionen erläutert. Kurz: fürjede Spezifikation per Mausklick und Tastatur wird im Hintergrundein Programmier-Code generiert, der für gewöhnlich ‚unsichtbar‘bleibt. Um diesen Code zu sehen müssen folgende Einstellungenvorgenommen werden:

Unter Bearbeiten finden Sieganz unter die Option Optionen.Diese klicken Sie an.

Dann weiter zu Datei-Speicherstellen. Dort findet sich das FeldSitzungs-Journal.

Hier kann die Option Syntax in Journal aufzeichnen aktiviert werden,wodurch automatisch im Hintergrund der Programmier-Code (nahezu) aller Arbeitsschritte aufgezeichnet wird. Ein Stufe tiefer kann festgelegtwerden, ob die Aufzeichnung jeweils an die bereits vorhandenen Auf-zeichnungen angehängt werden sollen, oder ob bei jedem Neustart des Programms die vorherigen Eintragungen gelöst und eine neueAufzeichnung erstellt wird. Hier gilt es zu bedenken, dass bei Anhängenund komplexen Programmen relativ schnell vorhandene Speicher-kapazitäten erreicht werden können, die Software dann auf unterschied-liche Speicherorte zugreift, was die Rechengeschwindigkeit erheblichreduzieren kann.Zu guter Letzt muss der Speicherort der Datei und der Name derJournal-Datei festgelegt werden – sofern nicht die Voreinstellungakzeptiert wird.

Um alle verfügbaren Befehle und Optionen, inklusive ihrer Spezifikationen, zu sehen und erläutert zu bekommen, findet sich unterHilfe die Rubrik Befehlssyntax-Referenz.

Die folgenden Seiten erläutern nun Schritt für Schritt den Inhalt einerSyntax, mit der die Berechnungen der Fehlerhäufigkeit in Prozentenaller bearbeiteten Spalten und Zeilen durchgeführt werden kann.

Die Befehle können dabei

a) als solche direkt in das Programm eingegeben werden – was die Kenntnis dieser Befehle und ihrer Spezifikationen erfordert, oder

b) die Befehle können per Mausklick und Tastatureingaben, wie weiter oben erläutert, so lange eingegeben werden, bis das Resultat den gewünschten Zielen entspricht, um dann den Programmier-Code aus dem Journal heraus zu kopieren und in das Programm einzufügen.

GET FILE='SPEICHER01.sav' /KEEP= Zeile, S_01 .EXECUTE .

SELECT IF (Zeile = 1) .EXECUTE .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

COMPUTE Fall = 1 .CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

Dieser Befehlsbereichöffnet die in Anführungszeichengesetzte Datei und listet dabeidurch den Zusatz KEEP nur dienach dem Gleichheitszeichenaufgeführten Variablen.

GET FILE='SPEICHER01.sav' /KEEP= Zeile, S_01 .EXECUTE .

SELECT IF (Zeile = 1) .EXECUTE .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

COMPUTE Fall = 1 .CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

Durch diesen Befehl SELECT IF alle Fälle aus der Datei entfernt, bei denen die Variable Zeilenicht den Wert 1 aufweist.

GET FILE='SPEICHER01.sav' /KEEP= Zeile, S_01 .EXECUTE .

SELECT IF (Zeile = 1) .EXECUTE .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

COMPUTE Fall = 1 .CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

In diesem Block werden durchden Befehl COUNT zunächst neue Variablen generiert, dieden nach COUNT eingetragenenNamen erhalten. Hier also F_S (soll für Fehler in der Spaltestehen) R_S (richtig in der Spalte)und O_S (ohne Bearbeitung). Nach dem Gleichheitszeichen wird die Variable aufgeführt, in der die in Klammern stehendenWerte gezählt werden sollen.

GET FILE='SPEICHER01.sav' /KEEP= Zeile, S_01 .EXECUTE .

SELECT IF (Zeile = 1) .EXECUTE .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

COMPUTE Fall = 1 .CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

Der Befehl RECODE codiert inallen nachstehend aufgeführtenVariablen, hier F_S, R_S und O_S,die in der nachfolgenden Klammer stehenden Werte um.In dem hier gezeigten Fall werdenaus fehlenden Werten (MISSING)der Wert Null.Der Sinn dieses Befehls bestehtdarin, sicher zu stellen, dass keine fehlenden Werte vorliegen, weil in einem solchen Fall das gleich folgende Aufaddieren derWerte einer Spalte genau voreinem fehlenden Wert stoppenwürde.

GET FILE='SPEICHER01.sav' /KEEP= Zeile, S_01 .EXECUTE .

SELECT IF (Zeile = 1) .EXECUTE .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

COMPUTE Fall = 1 .CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

In diesem Block sind zwei Befehleenthalten: COMPUTE und CREATE CSUM. Mit COMPUTE wird eine neue Variable generiert,die den Namen Fall erhält. Durch das Gleichheitszeichen wirdallen Fällen dieser neuen Variableder danach angegebene Wert, hier 1, zugewiesen.

Mit CREATE und CSUM werdenalle Werte einer Spalte auf-addiert. Direkt nach CREATE wirddie Zielvariable des Aufaddierensangeben.

GET FILE='SPEICHER01.sav' /KEEP= Zeile, S_01 .EXECUTE .

SELECT IF (Zeile = 1) .EXECUTE .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

COMPUTE Fall = 1 .CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

Nach dem Gleichheitszeichensteht CSUM für den Befehl Aufaddieren. Dahinter wird inKlammern die Variable angegeben, deren Werte auf-addiert werden sollen.Wie hier gezeigt, können die Werte einer Variable auch inderselben Variable aufaddiertwerden. Zu beachten ist hier,dass dadurch die zuvor in derVariable enthaltenen Werteüberschrieben werden und damitnicht mehr vorhanden sind!

GET FILE='SPEICHER01.sav' /KEEP= Zeile, S_01 .EXECUTE .

SELECT IF (Zeile = 1) .EXECUTE .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

COMPUTE Fall = 1 .CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

Mit SORT CASES BY werdenanhand der nachfolgend genannten Variable, hier Fall, alleFälle der Datei sortiert.Die Sortierung kann in zweiverschiedenen RichtungenVorgenommen werden. Das in Klammern stehende D steht für descend (absteigend),ein A (arise) bewirkt eine auf-steigende Sortierung.Mit SELECT IF (siehe oben) wirdhier durch $casenum auf die ganzlinks stehenden, automatisch generierten Zeilennummernabgehoben. Kurz: Es wir der erste,höchste Werte beibehalten.

GET FILE='SPEICHER01.sav' /KEEP= Zeile, S_01 .EXECUTE .

SELECT IF (Zeile = 1) .EXECUTE .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

COMPUTE Fall = 1 .CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

COMPUTE ist quasi der Universal-befehl für die unterschiedlichsten Berechnungen. Auch hier wird wieder direkt nach dem Befehl die Zielvariable angegeben, in die die zu berechnenden Werteeingetragen werden sollen (hierProz_F). Dann wird die Berechnugnach dem Gleichheitszeichen an-gegeben: 100 mal F_S, geteiltdurch F_S plus R_S. Der einfacheDreisatz zur Berechnung derFehlerprozente.

GET FILE='SPEICHER01.sav' /KEEP= Zeile, S_01 .EXECUTE .

SELECT IF (Zeile = 1) .EXECUTE .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

COMPUTE Fall = 1 .CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

Auf Basis der bisherigen Erklärungenkönnten jetzt für jede einzelne Berechnungdie jeweils zu verändernden Werte – per Hand! – eingesetzt werden.

Bspw. an diesen Stellen.

Dies wäre etwas komfortabler, als mit Maus undTastatur, aber immer noch recht mühsam.

Die Lösung: Nutzung von Makros

31

SPSS Makros Struktur

Makro(grob)struktur Bedeutung, Funktion

DEFINE !freq1 () . Anfang der Makrodefinitionmit Name „!FREQ1“ undArgument „()“ .

descriptives Makroinhaltvar = alter fameink .

!ENDDEFINE . Ende der Makrodefinition

!freq1 . Makroaufruf

32

Die variablen Teile des Programms werden in einem Makrodurch „Platzhalter“ markiert und am Ende des Programmswird in der sog. Makroexpansion festgelegt, welche Wertedie „Platzhalter“ in dem jeweiligen Programmdurchlaufannehmen sollen.

/* MAKRO zum Einlesen der Beispieldateien

DEFINE !EINLESENUEBUNGSTXT (PFAD = !charend ('§')/KLASSE = !charend('§')/PLATZ = !charend ('§') ) .

GET DATA /TYPE = TXT /FILE = !QUOTE (!PFAD) /DELCASE = LINE /DELIMITERS = "\t " /ARRANGEMENT = DELIMITED /FIRSTCASE = 1 /IMPORTCASE = ALL /VARIABLES = V1 F7.2 …

Name des Makros: MAKRO_Einlesen_UebungsDateien.sps

33

!ENDDEFINE .

!EINLESENUEBUNGSTXT PFAD = C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\School performance_Klasse_A.txt § KLASSE = 'A' §PLATZ = C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\School performance_Klasse_A.sav § .

An Ende des Programmaufrufs werden die Werte, die durch „Platzhalter“ beim Programmdurchlauf einnehmen sollendefiniert.

Name des Makros: MAKRO_Einlesen_UebungsDateien.sps

34

Was bedeutet „TOKENS“? (engl. „Zeichen)

Mit der Option !TOKENS werden die nächsten n Tokensim Makroaufruf dem Argument bzw. den Argumentenzugewiesen.Als Elemente zählen Variablen, Zahlen, Strings usw.:

Beschreibung Beispiele Anzahl Tokens und Erläuterungen

Variablenliste Var1 Var2 Var3 3 (jeder Variablenname zählt als ein einzelnes Token)

Werteliste 2 5 5.22 0.005 4 (jede Zahl zählt als einzelnes Token)

Zeichenliste und Kommas

A , b 3 (ein Komma wird als separates Token gezählt; Groß-/Kleinschreibung ist unerheblich)

35

Bei !TOKENS sind das Ausrufezeichen und die Anzahln in einer Klammer wichtig. n entspricht positivenganzzahligen Werten. Die Option !TOKENS-Option istalso nützlich, wenn die Anzahl der Token bekannt undkonstant ist. Bei der Festlegung der Anzahl der Tokensind Besonderheiten bei der „Zählweise“ von Token zu berücksichtigen:

Beschreibung Beispiele Anzahl Tokens und Erläuterungen

Anführungs-zeichen

„Alter ..“ ‚cc 00 cd‘ 2 (Inhalte zwischen paarigen Anführungszeichen bzw. Hoch-kommatas zählen als ein Token)

Zeichen-kombinationen

11A 2 (Zahl vor String)

A11 1 (String vor Zahl)

36

In dem Beispiel Makro MACRO_Einfaches_Beispiel wird nach

den Namensargumenten Var1 und Var2 unmittelbarnach einem notwendigen =-Zeichen die Option!TOKENS(1) angegeben. Während der sog. Makro-expansion greift !AUSWERTUNG auf die Vorgaben zurück, die durch dieses Argument festgelegt wurden,nämlich eine Variable Var1 und eine Variable Var2bereitzustellen.Die Information „ein Zeichen“ wird daher mit der Zu-weisung zur gleichen Anzahl an Variablen zumArgument im Makroaufruf für die Analyse verknüpft.

37

/* Einfaches erstes Beispiel für eine Makro-Programmierung

DEFINE !Auswertung (VAR1 = !TOKENS(1)/ VAR2 = !TOKENS(1)) .

GET FILE='C:\Programme\SPSS\1993 US Sozialerhebung (Teilmenge).sav'.EXECUTE .

GRAPH /SCATTERPLOTT(BIVAR)= !VAR1 WITH !VAR2 .

!ENDDEFINE .

!AUSWERTUNG VAR1=alter VAR2= kinder .!AUSWERTUNG VAR1=alter VAR2= zeitung .!AUSWERTUNG VAR1=einkom91 VAR2= alter .

/* GRAPH/* /SCATTERPLOT(BIVAR)=alter WITH kinder/* /MISSING=LISTWISE .

Name des Macros: MACRO_Einfaches_Beispiel

Ein Beispiel:

38

In diesem Makro „MACRO_Einfaches_Beispiel“ wird oben fest-gelegt, dass den beiden Platzhaltern VAR1 und VAR2 Zeichenim Umfang von einem Zeichen zugeordnet werden. In den Befehl zum Erstellen eines Scatterplotts werden dannkeine Variablennamen, sondern nur die Platzhalter gesetzt.

/* Einfaches erstes Beispiel für eine Makro-Programmierung

DEFINE !Auswertung (VAR1 = !TOKENS(1)/ VAR2 = !TOKENS(1)) .

GET FILE='C:\Programme\SPSS\1993 US Sozialerhebung (Teilmenge).sav'.EXECUTE .

GRAPH /SCATTERPLOTT(BIVAR)= !VAR1 WITH !VAR2 .

!ENDDEFINE .

!AUSWERTUNG VAR1=alter VAR2= kinder .!AUSWERTUNG VAR1=alter VAR2= zeitung .!AUSWERTUNG VAR1=einkom91 VAR2= alter .

/* GRAPH/* /SCATTERPLOT(BIVAR)=alter WITH kinder/* /MISSING=LISTWISE .

Was an Stelle derPlatzhalter bei jedemDurchlauf gesetztwerden soll, wird andieser Stelle fest-gelegt.

39

!CHAREND („Zeichen“) – Listen durch ein einzelnes Zeichen

Mittels !CHAREND werden alle Tokens bis zu einem explizitfestzulegenden Zeichen in einem Makroaufruf dem Argumentzugewiesen und ausgeführt.Bei diesem Zeichen muss es sich um ein einzelnes Zeichen (String mit der Länge 1) handeln, das zwischen Hochkommataund in Klammern steht. Im Prinzip kann jedes beliebige Zeichenals Trennzeichen eingesetzt werden. Die SPSS CommandSyntax Reference (2004) verwendet z.B. einen sog. Slash ‚/‘, umeine Trennung zu signalisieren.Dieser Slash hat also nichts mit dem Trennungszeichen zu tun,das zwischen zwei Argumentdefinitionen stehen muss; um eineVerwechslung zu vermeiden, wird empfohlen, als Zeichen keinenSlash, sondern ein beliebiges anderes Zeichen zu nehmen, bspw. ‚§‘.

40

Bei !CHAREND-Trennungszeichen ist ihre richtige Position absolut entscheidend. Eine falsche Position führt dazu, dassdiese Positions- oder auch Namensargumente beim Aufruf desMakros falsche Token-Zusammenstellungen an SPSS über-geben. !CHAREND-Optionen sind v.a. bei positionalen Argumenten nützlich, können jedoch auch bei Namens-argumenten eingesetzt werden.

DEFINE !Beispiel1 (key1 = !CHAREND (‚§‘) / key2 = !CHAREND (‚§‘) ).

frequencies var = !key1 .descriptives var = !key2 .

!ENDDEFINE .

!Beispiel1 KEY1=familienstand ausbild abschluss geschl § KEY2=alter § .

41

/* Einfaches zweites Beispiel für eine Makro-Programmierung

DEFINE !Auswertung1 (VAR1 = !TOKENS(1)/ VAR2 = !TOKENS(1)/VAR3 =TOKENS(1)) .

GET FILE='C:\Programme\SPSS\1993 US Sozialerhebung (Teilmenge).sav'.EXECUTE .

CROSSTABS /TABLES= !VAR1 BY !VAR2 BY !VAR3 /FORMAT= AVALUE TABLES /CELLS= COUNT EXPECTED ROW COLUMN TOTAL /COUNT ROUND CELL .!ENDDEFINE .

!AUSWERTUNG1 VAR1= famstand VAR2 = leben VAR3 = ethgr .

Name des Macros: MACRO_Einfaches_Beispiel2

Ein Beispiel dazu:

42

Eine weitere Möglichkeit die hier Erwähnung finden soll ist dieVerwendung sog. positionaler Argumente.Dabei wird, wie in dem folgenden Beispiel gezeigt, durch denBefehl !POS und dem Zusatz !TOKENS die Möglichkeitgeschaffen, durch die Benennung der Platzhalter in Form von!1 oder !2 etc. das Programm anzuweisen, den ersten Wert(durch !1), den zweiten Wert (durch !2) etc. aus der Reiheder aufgelisteten Tokens in das Programm aufzunehmen.

43

/* Ein drittes Beispiel für eine Makro-Programmierung

DEFINE !Auswertung1 (!POS = !TOKENS(1)/ !POS = !TOKENS(1)/!POS = !TOKENS(1)) .

GET FILE='C:\Programme\SPSS\1993 US Sozialerhebung (Teilmenge).sav'.EXECUTE .

CROSSTABS /TABLES= !1 BY !2 BY !3 /FORMAT= AVALUE TABLES /CELLS= COUNT EXPECTED ROW COLUMN TOTAL /COUNT ROUND CELL .!ENDDEFINE .

!AUSWERTUNG1 famstand leben ethgr .!AUSWERTUNG1 famstand todesstr ethgr . !AUSWERTUNG1 famstand todesstr sternzei .

Name des Macros: MACRO_Einfaches_Beispiel3

44

Die bislang vorgestellten Optionen erforderten es, dass die Anzahlund/oder Stellung der Platzhalter in der Definition festlag und bekannt war.

Eine oft sehr nützliche Alternative zu dieser Option stellt der Befehl !CHAREND dar. Ein Beispiel für diesen bereits erläuterten Befehls folgt in dem nächsten Makro.

Das besondere und neue an diesem nächsten Beispiel ist jedochdie Einführung von einer Schleife, einem sog. Loop. Was bewirkenbzw. können solche Loops?

Während in den bisherigen Beispielen für jeden Durchlauf desgestarteten Makros die dabei einzusetzenden Variablenwertefestgelegt werden mussten, werden bei einem Loop, genauermit Hilfe eines sog. List-Processing-Loops eine (nahezu unbegrenzte) Menge von Werten vorgegeben, die dann auto-matisch der Reihe nach eingesetzt werden.

45

Schematisch lässt sich das Ganze so darstellen:

Am Anfang eines solchen Loops steht der Befehl !DO gefolgtvon der Bezeichnung des Platzhalters der einzusetzendenVariablen, bspw. !VAR, dann folgt der Befehl !IN und schließ-lich wird der Platz angegeben, an dem die einzusetzenden Werte oder Zeichen stehen, bspw. (LISTE). Das Ende derSchleife, des Loops wird durch den Befehl !DOEND ange-geben:

!DO !VAR !IN (LISTE)

-Befehle –

!DOEND

46

!DO !VAR !IN (LISTE)

Select if (ALTER > !VAR)

CROSSTABS /TABLES= Gehalt BY Hausbesitz /FORMAT= AVALUE TABLES /CELLS= COUNT EXPECTED ROW COLUMN TOTAL /COUNT ROUND CELL .

!DOEND

LISTE = 30 40 50 60

In dieser schematischen Darstellung würden also alle vier Werteaus der „Liste“ automatisch nacheinander in die Berechnung ein-gesetzt werden.

47

/* Ein fünftes Beispiel für eine Makro-Programmierung mit einer Schleife/* SET PRINTBACK=ON MPRINT=ON .

DEFINE !Auswertung3 (LISTE1 = !CHAREND ('/')/ VAR1 = !TOKENS(1)) .

GET FILE='C:\Programme\SPSS\1993 US Sozialerhebung (Teilmenge).sav'.EXECUTE .

!DO !WERT1 !IN (!LISTE1) .

CROSSTABS /TABLES= !WERT1 BY !VAR1 /FORMAT= AVALUE TABLES /CELLS= COUNT EXPECTED ROW COLUMN TOTAL /COUNT ROUND CELL .

!DOEND .

!ENDDEFINE .

!AUSWERTUNG3 LISTE1 = famstand beschäft partei sternzei / VAR1 = todesstr .

Name des Macros: MACRO_Einfaches_Beispiel5

48

/* Ein fünftes Beispiel für eine Makro-Programmierung mit einer Schleife/* SET PRINTBACK=ON MPRINT=ON .

DEFINE !Auswertung3 (LISTE1 = !CHAREND ('/')/ VAR1 = !TOKENS(1)) .

GET FILE='C:\Programme\SPSS\1993 US Sozialerhebung (Teilmenge).sav'.EXECUTE .

!DO !WERT1 !IN (!LISTE1) .

CROSSTABS /TABLES= !WERT1 BY !VAR1 /FORMAT= AVALUE TABLES /CELLS= COUNT EXPECTED ROW COLUMN TOTAL /COUNT ROUND CELL .

!DOEND .

!ENDDEFINE .

!AUSWERTUNG3 LISTE1 = famstand beschäft partei sternzei alterhei geschw kinder alter gebmonat sternzei ausbild abschlus vaterab mutterab geschl ethgr einkom91 einkbefr region ort einwohn partei wahl92 einstell todesstr waffen gras religion leben kindid pille sexualkd prügel sterbehi zeitung tvstunde bigband blugrass country blues musicals klassik folk jazz opern rap hvymetal sport kultur tvshows tvnews tvpbs wissen4 partner sexfreq wohnen soi gebjahr fameink schulab altergr politik region4 verheira classic3 jazz3 rap3 blues3 /VAR1 = todesstr .

Name des Macros: MACRO_Einfaches_Beispiel5a

49

Was zunächst sehr kompliziert zu klingen scheint ist jedochin den meisten Fällen eher einfach und sehr nützlich: Es lassensich (nahezu) unbegrenzt viele Schleifen miteinanderverschachteln:

LOOP I LOOP II

Das nächste Makrodemonstriert diese Möglichkeit. Zuerstwird das erste Zeichender Liste1 eingesetzt,dann das erste Zeichender Liste2, dann daszweite Zeichen derListe2 usw. Sind alleZeichen der Liste2 durch, wird das zweiteZeichen der Liste1eingesetzt usw. usw.

50

/* Ein viertes Beispiel für eine Makro-Programmierung mit zwei ineinander/* verschachtelten Schleifen/* SET PRINTBACK=ON MPRINT=ON .

DEFINE !Auswertung3 (LISTE1 = !CHAREND ('/')/ LISTE2 = !CHAREND ('§')) .

GET FILE='C:\Programme\SPSS\1993 US Sozialerhebung (Teilmenge).sav' .EXECUTE .

!DO !WERT1 !IN (!LISTE1) .

!DO !WERT2 !IN (!LISTE2) .

CROSSTABS /TABLES= !WERT1 BY !WERT2 /FORMAT= AVALUE TABLES /CELLS= COUNT EXPECTED ROW COLUMN TOTAL /COUNT ROUND CELL .

!DOEND .

!DOEND .

!ENDDEFINE .

!AUSWERTUNG3 LISTE1 = famstand beschäft partei / LISTE2 = todesstr sternzei § .

Nam

e de

s M

acro

s: M

ACRO

_Ein

fach

es_B

eisp

iel4

51

Eine weitere Möglichkeit der Schleifenkonstruktion ist die eines sog. Index-Loop. Beim Index-Loop wird bei einem Zähler mitdem Wert 1 gestartet und im Allgemeinen in n+1-Schrittensolange wiederholt, bis ein bestimmter (Index-) Wert erreicht ist.

!DO !var = (Anfang) !TO (Ende) [optional: !BY (Schritt)]- Befehle -!DOEND

Das folgende Makro zeigt ein Beispiel für einen solchen Index-Loop, mit dem sechs zusätzliche Variablen mit den Namenneu1var bis neu6var generiert werden:

Im Anschluss an dieses Beispiel wird der bislang noch nichteingeführte Befehl !CONCAT erläutert.

52

/* Ein sechstes Beispiel für eine Makro-Programmierung mit einer Index-Schleife/* SET PRINTBACK=ON MPRINT=ON .

DEFINE !LOOP1 (key1 = !TOKENS(1)/key2 = !TOKENS(1)) .

!DO !i = !KEY1 !TO !KEY2 .

COMPUTE !CONCAT (neu, !i, var) = normal (1) .

!DOEND .

!ENDDEFINE .

!LOOP1 Key1 = 1 Key2 = 6 .

Name des Macros: MACRO_Einfaches_Beispiel6

53

Stringfunktionen und einige ihrer Variationsmöglichkeiten

Syntax für Strings Funktion, Rückmeldung und Beispiel

!LENGTH (String) Länge des angegebenen Strings. Bsp.: !LENGTH(Hello). Ergebnis: 5

!CONCAT (String1, String2, …)

Aneinanderkettung der zusammenzu-führenden Strings. Bsp.: !CONCAT(hel, lo). Ergebnis: Hello

!QUOTE (String) Das Argument wird in Anführungs-zeichen gesetzt. Bsp.: !QUOTE(Hello).Ergebnis: „Hello“

!SUBSTR (String, FROM, [Länge])

Abschnitt des Strings, der ab FROM startet und bei nicht festgelegter Länge bis zum Stringende geht

Bsp.: !SUBSTR(Hello, 3) Ergebnis: „LLO“

54

Eine weitere Anwendung von Makros:

Das Zusammenführen von ausgesuchten Variablen aus verschiedenen Dateien:

• Dazu müssen die einzelnen Dateien nacheinander aufgerufen werden• Dabei werden nur die Variablen geladen, die von Interesse sind• Die Auswahl der Variablen wird in einer (Zwischen-)Datei abgelegt• Der nächste Datensatz wird aufgerufen, die Variablen ausgesucht etc.• Der Datensatz wird mit den Daten in der Zwischendatei verbunden• Wenn alle Datei „durchkämmt“ sind, ist der Datensatz „fertig“

Beispiel:

55

/* Ein siebentes Beispiel für eine Makro-Programmierung zum Zusammenfügen verschiedener Datensätze/* SET PRINTBACK=ON MPRINT=ON .

GET FILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\1991 US Sozialerhebung.sav' /KEEP = kinder .EXECUTE .

COMPUTE YEAR = 1991 .FORMATS YEAR (F 1.0) .EXECUTE .

SAVE OUTFILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\SPEICHER01.sav' .EXECUTE .

DEFINE !Zusammen1 (PFAD = !CHAREND ('/')/ WERT1 = !CHAREND ('§')) .

GET FILE= !QUOTE(!PFAD)/KEEP = kinder .EXECUTE .

COMPUTE YEAR = !WERT1 .FORMATS YEAR (F 1.0) .EXECUTE .

ADD FILES /FILE=* /* Alternative: MATCH/FILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\SPEICHER01.sav' . EXECUTE .SAVE OUTFILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\SPEICHER01.sav' .EXECUTE .

!ENDDEFINE .

!Zusammen1PFAD = C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\1993 US Sozialerhebung (Teilmenge).sav / WERT1 = 1993 § .

!Zusammen1PFAD = C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\Mehl Fake.sav / WERT1 = 2000 § .

Nam

e de

s M

acro

s: M

ACRO

_Ein

fach

es_B

eisp

iel7

56

/* Ein achtes Beispiel für eine Makro-Programmierung zum Berechnen des Mittelwertes /* SET PRINTBACK=ON MPRINT=ON .

GET FILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\SPEICHER01.sav' .EXECUTE .

SELECT IF (YEAR = 2000) .EXECUTE .

COMPUTE Fall = 1 .EXECUTE .

CREATE SUMFall = CSUM(Fall) .EXECUTE .CREATE SUMChild = CSUM(Kinder) .EXECUTE .SORT CASES BY SUMfall (D) .SELECT IF ($casenum = 1) .COMPUTE MEANChild = SUMChild/SUMFall .EXECUTE .

RENAME VARIABLES (MEANChild = MEANChild2000) .EXECUTE .

SAVE OUTFILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\SPEICHER02.sav' / KEEP= MEANChild2000 .EXECUTE .

/* HIER BEGINNT DAS MAKRO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Name des Macros: MACRO_Einfaches_Beispiel8; Fortsetzung nächste Seite ↓

57

DEFINE !Mittelwerte1 (LISTE1 = !CHAREND ('/')) .

!DO !Jahr !IN (!LISTE1) .

GET FILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\SPEICHER01.sav' .EXECUTE .

SELECT IF (YEAR = !Jahr) .EXECUTE .

COMPUTE Fall = 1 .EXECUTE .

CREATE SUMFall = CSUM(Fall) .CREATE SUMChild = CSUM(Kinder) .SORT CASES BY SUMFall (D) .SELECT IF ($casenum = 1) .COMPUTE MEANChild = SUMChild/SUMFall .EXECUTE .

RENAME VARIABLES (MEANChild = !CONCAT(MEANChild, !Jahr)) .EXECUTE .

MATCH FILES /FILE=*/FILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\SPEICHER02.sav' /DROP = Fall, SUMFall, SUMChild, YEAR, Kinder .EXECUTE .SAVE OUTFILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\SPEICHER02.sav' . EXECUTE .

!DOEND .

SAVE OUTFILE='C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\SE_Komplexe_Daten\SPEICHER02.sav' . EXECUTE .

!ENDDEFINE .

!Mittelwerte1 LISTE1 = 1993 1991 / .

58

• Auswahl relevanter Variablen• Berechnungen

• Auswahl relevanter Variablen• Berechnungen

Die schematische Logik dieser Variante:

Ursprungs-Datei

Datei als Zwischenablage

Ziel-Datei

• Auswahl relevanter Variablen• Berechnungen

12345678

98765432

Add

Match

12345678 98765432

59

Wie lassen sich nun aus diese Art und Weise zusammengestellteDateien weiterverarbeiten?

Eine Möglichkeit, die ausführlicher, d.h. nicht mit der maximal möglichen Eleganz vorgestellt wird (weil noch zu komplex), istdas Berechnen von Mittelwerten:

∑ aller Werte : Anzahl der Werte

Dazu ist es wichtig, die Funktionen Lag und Lead einzuführen:

X Lag Lead

198 . 220

220 198 305

305 220 470

470 305

60

COMPUTE Fall = 1 .EXECUTE .

/* ALTERNATIVE: COMPUTE Fall = $casenum ./* SELECT IF (Kinder = 4) .

IF ($casenum >1) Fall = Lag(Fall, 1) + Fall .EXECUTE .

SORT CASES BY Fall (D) . /* ALTERNATIV: (A)EXECUTE .

SELECT IF ($casenum = 1) .EXECUTE .

COUNT Anzahl_2 = var001 (2) .EXECUTE .

Name der Syntax: Syntaxbeispiel_Zählen_Sortieren_Auswählen

Anmerkungen:

• Bitte vergleichen mit „create“

• „$casenum“ verweist auf die Fallnummern am linken Rand der Datenmaske

• Lag(XYZ, 1) = die Zahl gibt den Abstand an: 1 = nächste Zeile; 2 = übernächste Zeile

• „D“ = down „A“ = up

• Setzt in eine Variable Anzahl_2 die Anzahl der Werte ‚2‘ der Variable var001 ein(siehe auch Syntax Befehlsdefinitionen)

61

Häufigkeiten zählen mit dem Befehl „COUNT“:

Allgemeine Syntax: COUNT Zielvariable = Quellvariable(n) (Werteliste)

Zu zählende Werte Beschreibung

Einzelwerte 1 2 3 4 5

Alle fehlenden Werte missing

Systemdefinierte fehlende Werte sysmis

Wertebereiche: … bis … 5 thru 10

Wertebereiche: kleinster bis … lowest thru 0

Wertebereiche: … bis größter Wert 100 thru highest

62

CREATEFunction keywords:

CSUM Cumulative sumDIFF DifferenceFFT Fast Fourier transformIFFT Inverse fast Fourier transformLAG LagLEAD LeadMA Centered moving averagesPMA Prior moving averagesRMED Running mediansSDIFF Seasonal differenceT4253H Smoothing

ACHTUNG, ganz WICHTIG!!!

CREATE bezieht sich wie folgtauf die Spalten:

63

ACHTUNG, ganz WICHTIG!!!

COMPUTE bezieht sich dagegen fast – aber leider nicht immer – wie folgtauf die Zeilen:

Befehl

COMPUTE

64

COMPUTE

COMPUTE target variable=expression

ExampleCOMPUTE newvar1=var1+var2.COMPUTE newvar2=RND(MEAN(var1 to var4).COMPUTE logicalVar=(var1>5).STRING newString (A10).COMPUTE newString=CONCAT((RTRIM(stringVar1), stringVar2).Functions and operators available for COMPUTE are described in “Transformation Expressions”on p. 44.

ABS(arg) Absolute value. ABS(SCALE) is 4.7 when SCALE equals 4.7 or –4.7.RND(arg) Round the absolute value to an integer and reaffix the sign. RND(SCALE) is–5 when SCALE equals –4.7.TRUNC(arg) Truncate to an integer. TRUNC(SCALE) is –4 when SCALE equals –4.7.MOD(arg,arg) Remainder (modulo) of the first argument divided by the second. When YEARequals 1983, MOD(YEAR,100) is 83.SQRT(arg) Square root. SQRT(SIBS) is 1.41 when SIBS equals 2.EXP(arg) Exponential. e is raised to the power of the argument. EXP(VARA) is 7.39when VARA equals 2.LG10(arg) Base 10 logarithm. LG10(VARB) is 0.48 when VARB equals 3.LN(arg) Natural or Naperian logarithm (base e). LN(VARC) is 2.30 when VARC equals10.LNGAMMA(arg) Logarithm (base e) of complete Gamma function.ARSIN(arg) Arcsine. (Alias ASIN.) The result is given in radians. ARSIN(ANG) is 1.57when ANG equals 1.ARTAN(arg) Arctangent. (Alias ATAN.) The result is given in radians. ARTAN(ANG2) is0.79 when ANG2 equals 1.SIN(arg) Sine. The argument must be specified in radians. SIN(VARD) is 0.84 whenVARD equals 1.COS(arg) Cosine. The argument must be specified in radians. COS(VARE) is 0.54 whenVARE equals 1.

65

SUM(arg list) Sum of the nonmissing values across the argument list.MEAN(arg list) Mean of the nonmissing values across the argument list.SD(arg list) Standard deviation of the nonmissing values across the argument list.VARIANCE(arg list) Variance of the nonmissing values across the argument list.CFVAR(arg list) Coefficient of variation of the nonmissing values across the argument list.The coefficient of variation is the standard deviation divided by the mean.MIN(arg list) Minimum nonmissing value across the argument list.MAX(arg list) Maximum nonmissing value across the argument list.

COMPUTE - Befehle

The following arithmetic operators are available:+ Addition– Subtraction* Multiplication/ Division** Exponentiation

66

Aufgabe 1:

Stellen Sie eine neue Datei zusammen, die Variablen enthält, die dieAnzahl von 1, 2 und 3 Kindern in den Dateien • 1991 US Sozialerhebung.sav• 1993 US Sozialerhebung (Teilmenge).sav• Mehl Fake.sav

wiedergeben:

oder:

Ein_Kind_1991 Zwei_Kind_1991 Drei_Kind_1991 ….

29 4 34

Jahr Ein_Kind Zwei_Kinder Drei_Kinder

1991 29 4 34

1993

67

Probleme: Wie muss die Grobstruktur des Programms aussehen?Makrodefinition (2 Loops)

Zweite Schleife (Anzahl Kinder)• Variablenauswahl, Werteselektion

• Berechnen• Sortieren• Renamen

• Matchen (Variablen hinzufügen)• Im Zwischenspeicher ablegen

Ende der ersten Schleife

Erste Schleife (Jahr)

• Adden (cases hinzufügen)• Um cases erweiterte Datei ablegen

Ende der zweiten Schleife

Makroende

68

Regeln für die Vergabe von Variablennamen:

• Variablennamen können aus Buchstaben und Ziffern gebildet werden. Erlaubt sindferner die Sonderzeichen _ (underscore), . (Punkt) sowie die Zeichen @, #, $Nicht erlaubt sind Leerzeichen sowie spezifische Zeichen, wie !, ?, » und *.• Der Variablenname muss mit einem Buchstaben beginnen. Erlaubt ist ferner dasSonderzeichen @.• Das letzte Zeichen darf kein Punkt und sollte kein _ (underscore) sein, um Konfliktemit speziellen Variablen, die von SPSS-Prozeduren angelegt werden, zu vermeiden.•Der Variablenname darf (ab der Version 12) max 64 Zeichen lang sein.• Variablennamen sind nicht case-sensitive, d.h. die Groß- und Kleinschreibungist nicht relevant.• Variablennamen dürfen nicht doppelt vergeben werden.• Reservierte Schlüsselwörter können nicht als Variablennamen verwendet werden.Zu den reservierten Schlüsselwörtern zählen: ALL, AND, BY, EQ, GE, GT, LE, LT,NE, NOT, OR, TO, WITH.

Beispiele für ungültige Variablennamen:

1mal1 Bühl&Zöfel Stand 94 Wagen!

69

Kommen wir jetzt auf das Eingangs-Beispiel d² - Test zurück:

• Wie lässt sich für jedes Feld der %-Anteil einer fehlerhaften Bearbeitung berechnen?• Ein erster Schritt wäre es, eine Datei mit allen Fällen der einzelnen Dateien zusammenzustellen, die vollständige Id‘s enthält• Dann, Spalte für Spalte, alle Zeilen einzeln aller Bearbeitungen zu betrachten und zusammenzuzählen, wie oft dort eine 1 (fehlerfrei) oder eine 2 (Fehler) ein- getragen wurde.• Schließlich wird die Summe aller Werte > 1 und die Summe aller Werte = 2 ermittelt• Auf dieser Grundlage ergibt sich dann der %-Anteil

70

/* Makro zum Ersetzen/Ausfüllen der Id-Nummern/* SET PRINTBACK=ON MPRINT=ON .

CD 'C:\Dokumente und Einstellungen\Klaus Mehl\Eigene Dateien\Daten\D_Zwei' . ERASE FILE = 'SPEICHER01.sav' .

DEFINE !Vervollstaendigen (LISTE = !CHAREND ('/')) .

!DO !Datei !IN (!LISTE) .

GET FILE= !Datei .EXECUTE .

RECODE ID (MISSING=0) .EXECUTE .

IF ((Zeile > 0) & ($casenum > 1)) Id = Id + Lag(Id, 1) .EXECUTE .

ADD FILES /FILE=*/FILE='SPEICHER01.sav' .EXECUTE .SAVE OUTFILE= 'SPEICHER01.sav' . EXECUTE .

!DOEND .

!ENDDEFINE .

!VervollstaendigenListe = 'Daten-Mi-10.sav' 'Daten-Mi-11.sav' 'Daten-Mi-12.sav' 'Daten-Mi-13.sav' 'Daten-Mi-14.sav' 'Daten-Mi-15.sav' 'Daten-Mi-16.sav' 'Daten-Mi-17.sav' 'Daten-Mi-18.sav' 'Daten-Mo-01.sav' 'Daten-Mo-02.sav' / .

71

Anhand dieser Datei aller Bearbeitungen gilt es jetzt eineStruktur wie die folgende zu erstellen:

Spalte S_01, Zeile 1 des ersten Testteilnehmers

Spalte S_01, Zeile 1 des zweiten Testteilnehmers

Spalte S_01, Zeile 1 des letzten Testteilnehmers

Datei der Datenaller

Bearbeitungen

72

Sind auf diese Art und Weise die Werte Zeile 1, Spalte S_01zusammengestellt, gilt es die Werte ‚1‘ und ‚2‘ zu erfassen undzusammenzuzählen, etwa auf diesem Weg:

S_01 F_S R_S O_S

0 . . 1

1 . 1 .

0 . . 1

2 1 . .

COUNT F_S = S_01 (2) .EXECUTE .COUNT R_S = S_01 (1) .EXECUTE .COUNT O_S = S_01 (0) .EXECUTE .

73

Um die Summe der F_S, R_S und O_S zusammenzuaddierengibt es – wie immer – verschiedene Wege. Zunächst müssendie Missing Values in die Werte ‚0‘ umkodiert werden:

RECODE F_S R_S O_S (MISSING=0) .EXECUTE .

Dann kann mit dem Befehl:

CREATE Fall = CSUM(Fall) .CREATE F_S = CSUM(F_S) .CREATE R_S = CSUM(R_S) .CREATE O_S = CSUM(O_S) .EXECUTE .

oder

74

S_01 F_S R_S O_S

0 . . 1

1 . 1 .

0 . . 1

2 1 . .

Mit der Anweisung:

IF ($casenum > 1) F_S = LAG(F_S, 1) + F_S .EXECUTE .

gearbeitet werden. Ihnen ist sicher das Aufaddieren einer Variablen ‚Fall‘ aufgefallen – die zuvor auf den Wert ‚1‘ gesetztwurde. Diese Variable dient dazu, die letzte Zeile in der Dateizu bestimmen, um den Sortierbefehl richtig anwenden zukönnen. Dieser Befehl lautet:

75

SORT CASES BY Fall (D) .SELECT IF ($casenum = 1) .EXECUTE .

Mit der ersten Zeile werden die Werte von Fall absteigend (D)sortiert, so dass die höchsten Werte alle in der ersten Zeile stehen. Dann wird die erste Zeile ausgewählt – die anderensind in diesem Moment verschwunden!

Die gewünschte Berechnung erfolgt durch diesen Befehl:

COMPUTE Proz_F = (100 * F_S) / (F_S + R_S) .EXECUTE .

Damit haben wir den Prozentanteil der Fehler beim Bearbeitender ersten Zeile der Spalte S_01 berechnet.

76

Damit ist aber noch nicht das Ende erreicht. Um zu markieren,welchen Wert wir jetzt berechnet haben, nennen wir die VariableProz_F um in die Variable ProzF_S_01 – die Variable Proz_F istdamit nicht mehr im Bestand der Datei!!Schließlich speichern wir in einer Zwischendatei den berechnetenWert und werfen mit DROP alle Variablen raus, die wir nichtbenötigen:

RENAME VARIABLES (Proz_F = !CONCAT(ProzF_, !Spalte)) .EXECUTE .

MATCH FILES /FILE=*/FILE='SPEICHER02.sav' /DROP = Id, Fall, R_S, O_S, F_S, !Spalte .EXECUTE .SAVE OUTFILE='SPEICHER02.sav' . EXECUTE .

Recommended