Data Science, Machine Learning und KI
Kontakt

Hauptanalyse

Unsere Archäologen stehen vor ihrem analytischen Ziel, die Voraussetzungsprüfung der ANOVA ist überstanden. Zur Erinnerung noch einmal die Forschungsfrage:

H1: Je länger die Löwen bei den Zirkusspielen im Einsatz sind, desto höher ist ihr Gewicht.

Da alle Daten (Gewicht als metrische und Monate im Zirkus als kategoriale Variable) vorbereitet sind, kann es direkt losgehen. Der Stata-Befehl für die Analyse ist:

anova gewicht monate_kat

und erzeugt die untenstehenden Ergebnisse.

Ergebnisse der ANOVA

Insgesamt liegen N = 517 Fälle für die Analyse vor, der erklärte Varianzanteil beträgt R^2 = 0.7505 = 75.05%. Die kategorisierten Monate können also einen sehr hohen Varianzanteil am Gewicht erklären. Darunter folgt eine Zeile für Model und eine Zeile für die Monate. Beide Zeilen sind in diesem einfachen Modell gleich was die Werte angeht (SS steht für Sum of Squares). Für Nutzer von SPSS sei an dieser Stelle gesagt, dass hier nur eine der beiden Zeilen aufgeführt wird und mit „zwischen den Gruppen“ (engl.: between groups) beschriftet ist. Vor allem der englische Begriff ist in der statistischen Fachwelt sehr gebräuchlich und hätte von Stata auch verwendet werden sollen. Die Zeile „residuals“ wird bei SPSS „innerhalb der Gruppen“ (eng.: within groups) genannt, auch hier ist der englische Fachbegriff durchaus in deutscher Fachliteratur üblich.
Zusätzlich findet sich beim between-Effekt die Angabe des F-Werts sowie der dazu gehörende Signifikanzwert. Dieser ist mit p le .001 signifikant, so dass die Monate im Zirkus einen signifikanten Effekt auf das Gewicht haben. Eine Aussage darüber, welche Kategorien der Monate hier genau signifikant sind und welchen Unterschied diese bezüglich des Gewichts haben, kann an dieser Stelle noch nicht getroffen werden. Dokumentiert wird das Ergebnis der ANOVA mit F(df1,df2) = F-Wert, p-Wert. In unserem Fall also mit F(5,511) = 311.49, p le .001.
In einigen Fachbereichen ist es üblich die Effektstärke der Analyse mit anzugeben. Ohne auf die Bedeutung dieser Maßzahl näher einzugehen, sei hier kurz gesagt, dass eine Effektstärke eine Aussage darüber trifft, ob ein gefundener Zusammenhang einer Analyse auch eine praktische Relevanz besitzt. Für die ANOVA lässt sich eta^2 als Effektstärke einfach berechnen:

 eta^2 = frac{ SS_{between} }{ SS_{top} } = frac{415662.19} {552039.08} = 0.753

In einer einfaktoriellen Varianzanalyse wie dieser lässt sich eta^2 einfach mit 100 multiplizieren, und es gilt:

 R^2 = eta^2

Somit lässt sich die Interpretation von eta^2 ebenso einfach auf den Korrelationskoeffizienten r herunterbrechen, welcher einfach mit

r = sqrt{R^2} = 0.868

zu berechnen ist (Field 2013: 472). Auch hier zeigt sich der extrem starke Effekt der ANOVA. Stata kann die Effektstärke auch direkt nach der ANOVA berechnen, dafür muss folgender Befehl verwendet werden

estat esize

Da eta^2 mathematisch einen Bias aufweist (Levine 2002), wird meist Omega-Quadrat als Maß der Effektstärke für eine ANOVA angegeben. Stata kann dies mittlerweile von Haus aus berechnen mit

estat esize, omega

Das Ergebnis ist omega^2 = 0.7502 , hinsichtlich der Grenzwerte gelten die gleichen wie für eta^2 (Kirk 1996). Es liegt also ein starker Effekt vor. Doch wie unterscheiden sich nun die Monate im Detail?

posthoc-Test

Zur Erinnerung wie schwer die Löwen durchschnittlich in den einzelnen Monatskategorien sind, wird die Tabelle aus Teil 2 an dieser Stelle noch einmal gezeigt.

Deskriptive Übersicht

Stata bietet im Nachgang der ANOVA mehrere posthoc Befehle an. Mit

pwcompare monate_kat, group effects mcompare(bon)

würden alle Monatskategorien, d.h. alle möglichen Kombinationen, miteinander verglichen werden. Dies erzeugt eine recht große Tabelle, die hier nicht abgebildet wird, da sie für uns nicht von Interesse ist. Da es das Ziel der Forscher war zu untersuchen, ob mit längerem Aufenthalt die Löwen bei den Zirkusspielen an Gewicht zunehmen, interessiert uns im Moment nur, ob Löwen, die in der nächsthöheren Kategorie von Monaten sind, sich gegenüber der vorherigen Kategorie unterscheiden. Der Befehl „pwcompare“ kann uns hier jedoch nicht weiterhelfen, so dass wir nunmehr

contrast ar.monate_kat, mcompare(bon) effects

durchführen müssen. Mit der Präfix “ar.” weisen wir Stata an, beginnend mit der ersten Kategorie (weniger als 6 Monate) immer zur nächsthöheren Kategorie zu vergleichen. Die Ergebnisse sind in der unten stehenden Tabelle zu finden.

Tabelle posthoc

Die Kategorie „6-10 Monate“ unterscheidet sich von der Kategorie „le 6 Monate“ um 29.71. Der Kontrast ist dabei nichts anderes als die Differenz der Mittelwerte dieser Kategorien, also 131.17 – 101.46 = 29.71. Dabei wird immer die zuletzt genannte Kategorie des Kontrasts von der zuerst genannten Kategorie abgezogen. Da der Wert positiv ist, bedeutet dies also, dass die Löwen mit 6-10 Monaten im Zirkus durchschnittlich 29,71kg schwerer sind als Löwen die weniger als 6 Monate im Zirkus sind. Dieses Ergebnis ist mit t = 12.97, p le .001 signifikant. Als posthoc Test wurde Bonferroni durchgeführt. Eine Diskussion der unzähligen Tests kann an dieser Stelle nicht gegeben werden und es sei an dieser Stelle auf weiterführende Fachliteratur verwiesen (Field 2013: 458 ff.). Auch wenn Bonferroni recht konservativ rechnet, so kann mit Blick auf diese Analyse gesagt werden, dass keine andere Testmethode ein anderes Ergebnis hervorbringt.
Der Blick auf die Tabelle verrät also, dass die Löwen mit zunehmender Zahl an Monaten schwerer werden, zunächst legen sie 29.71kg (p le .001) zu, dann 33.41kg (p le .001), die Gewichtszunahme verringert sich dann auf 14.91kg (p le .001) beim Vergleich von „16-20 Monate“ vs. „11-15 Monate“ und beim darauf folgenden Vergleich liegt die Zunahme lediglich bei durchschnittlich 4.17kg, ist aber mit p = .720 nicht signifikant. Im Vergleich der letzten und vorletzten Kategorie miteinander nehmen die Löwen dann wieder ab, der Kontrast liegt bei -15.15 (p le .01).
Mit Hilfe des komfortablen Befehls „margins“ bzw. „marginsplot“ lässt sich nun folgende Grafik zu dieser Veränderung anzeigen, wobei auf den Code, der trotz der Einfachheit der Darstellung relativ lang ist, an dieser Stelle verzichtet werden soll.

Abbildung zu Kontrasten - Gewicht und Monate im Zirkus

Auch wenn die obenstehende Grafik inhaltlich bereits die Wünsche der Forscher erfüllt, soll eine weitere erzeugt werden (siehe unten). Diese Grafik zeigt den Wert des Kontrasts zwischen den aufsteigenden Kategorien der Monate auf. Zusätzlich wurde ein rote Linie am Wert für 0kg abgetragen, welche einmal durch das Konfidenzintervall durchbrochen wird. Bei „21-25 vs. 16-20“ Monate ist der Kontrast +4.17kg, es liegt also noch eine leichte Gewichtszunahme vor, das Konfidenzintervall liegt jedoch zwischen -3.20 und +11.53. Mit einer 95%igen Wahrscheinlichkeit liegt der Kontrast also in diesem Bereich und umschließt den Wert 0. Das Ergebnis ist somit auch ohne den eigentlich p-Werten zu kennen, nicht signifikant, da der Kontrast anstatt positiv (+4.17kg) auch negativ sein kann (bis -3.20kg) und die inhaltliche Interpretation komplett anders wäre.

Abbildung zu Kontrasten - Veränderung von Gewicht und Monaten im Zirkus

Die Forscher sehen ihre Hypothese als größtenteils bestätigt, fragen sich aber nach der ersten Euphorie, ob denn nicht das Alter der Löwen einen Nebeneffekt hat, den man statistisch Kovariate nennt und zu einer Kovarianzanalyse (ANCOVA) führt.

Referenzen

  1. Cohen, J. (1988): Statistical Power Analysis for the Behavioral Sciences. Hoboken: Taylor and Francis
  2. Field, Andy (2013): Discovering Statistics Using SPSS. 4th Edition, SAGE: London
  3. Kirk, R. E. (1996): Practical significance: A concept whose time has come. Educational and Psychological Measurement 56(5), S. 746-759
  4. Levine, T. R., & Hullett, C. R. (2002). Eta Squared, Partial Eta Squared, and Misreporting of Effect Size in Communication Research. Human Communication Research 28(4), S. 612–625

Nick Bornschein

Nach der deskriptiven Betrachtung der historischen Daten gehen unsere Archäologen einen Schritt weiter und stellen sich folgende Forschungsfrage:

H1: Je länger die Löwen bei den Zirkusspielen im Einsatz sind, desto höher ist ihr Gewicht.

Für die Beantwortung dieser Frage bedienen sich die Forscher zunächst einer einfachen Korrelationsanalyse.

pwcorr gewicht monate, sig obs

Diese fördert zu Tage, dass das Gewicht und die Monate im Zirkus positiv mit Pearson’s Rho rho = .7718 und einer Signifikanz von p  le .001 korrelieren. Die Löwen wurden also schwerer, je länger sie sich im Zirkus befanden.

Jedoch wussten die auswertenden Statistiker aus der vorherigen Analyse, dass die Gewichtszunahme nicht kontinuierlich fortschritt. Vor allem bei Löwen, die schon länger im Zirkus waren, konnte man graphisch erkennen, dass hier das Gewicht wieder abnahm. Daher kategorisierten die Wissenschaftler die Monate, um mit der neuen Variable eine Varianzanalyse (ANOVA) durchführen zu können.

tab monate_kat

Häufigkeiten der Kategorien

Ziel der ANOVA ist es nun sich anzusehen, ob das durchschnittliche Gewicht zwischen den neu gebildeten Gruppen verschieden ist, und (Vorteil ANOVA gegenüber einer Korrelation) in welche Richtung sich das Gewicht unterscheidet. Dabei stellt das Verfahren mehrere Anforderungen an die Daten, die in Teil 2 dieser Reihe einzeln betrachtet werden sollen.

Voraussetzungen einer ANOVA

Annahme 1: Die abhängige Variable (Gewicht) sollte metrisch sein. Gewicht entspricht aufgrund des Nullpunkts einer Verhältnisskala (Ratioskala).
Annahme 2: Die unabhängige Variable (Monate in Kategorien) sollte aus mindestens 3 Kategorien bestehen. Unsere Variable besteht aus insgesamt 6 Kategorien und scheint somit bestens geeignet.
Annahme 3: Es sollten unabhängige Beobachtungen vorliegen. Dies bedeutet, dass zwischen den Beobachtungen in und zwischen jeder Gruppe kein Zusammenhang bestehen sollte.

Während die ersten drei Annahmen nicht mit einem statistischen Verfahren überprüft werden können, ist die bei den nunmehr folgenden Annahmen der Fall.

Annahme 4: Es sollten keine signifikanten Ausreißer existieren. Die Überprüfung dieser Annahme erfolgt graphisch mit Hilfe von Boxplots. Wie man hier untenstehend erkennen kann, liegen statistisch gesehen keine vor, da ansonsten in der Darstellung Punkte ober- bzw. unterhalb der Antennen vorhanden wären.

graph box gewicht, over(monate_kat, label(labsize(vsmall)))

Boxplots der Kategorien

Statistisch gesehen ist die Berechnung von Ausreißern sehr einfach: Ausgehend vom oberen und unteren Ende der Box (75% bzw. 25% Quartil) wird der Interquartilsabstand (für jede Gruppe) berechnet.

Formel: IQR = x_{0.75} - x_{0.25}

Für die Löwen, die weniger als 6 Monate im Zirkus sind, kann dies mit dem Stata command

centile gewicht if monate_kat == 1, centile(25 75)

berechnet werden. So ist der 75% Quartil in dieser Gruppe 112kg und das 25% Quartil 93kg. Der IQR somit 112kg – 93kg = 19kg.

Ein Ausreißer „nach oben“ bzw. „nach unten“ ist so definiert, dass das 1.5-fache der Kantenlänge nicht überschritten werden darf. Dies gilt als Standardwert in der Berechnung von Ausreißern, so dass das Ende der Antennen beim Boxplot exakt diesen Schwellenwert darstellt. Berechnet wird dies mit

Ausreibeta er_{oben} = |{frac{ Wert - Quartil_{0,75} }{ IQR } }| Ausreibeta er_{unten} = |{frac{ Wert - Quartil_{0,25} }{ IQR } }|

Am Beispiel der Löwen in Kategorie 1 (weniger als 6 Monate im Zirkus) lassen wir uns das minimale und maximale Gewicht anzeigen.

su gewicht if monate_kat == 1

Das minimale Gewicht dieser Löwen beträgt 75kg, das Maximalgewicht 127kg. Der Anteil am IQR ist damit:

Ausreibeta er_{oben} = |{frac{ 127 - 112 }{ 19 } }| = 0.789 le 1.5 Ausreibeta er_{unten} = |{frac{ 75 - 93 }{ 19 } }| = 0.947 le 1.5

Da also das Minimum und Maximum in dieser Gruppe den Wert 1.5 nicht überschreitet, liegen keine Ausreißer vor. Stata liefert von Haus aus leider keine Berechnung inklusive Anzeige von Ausreißern nach dieser Logik mit, jedoch lässt sich der Befehl „extremes“ zusätzlich installieren. Der Befehl führt die eben besprochenen Berechnungen sofort durch und würde Ausreißerwerte anzeigen.

ssc install extremes 
bysort monate_kat: extremes gewicht, iqr(1.5)

Da die Eingabe des Befehls, gruppiert nach den Kategorien der Monate, keine Werte zeigt, bestätigt sich die graphische Betrachtung der Boxplots natürlich.

Annahme 5: Die abhängige Variable (Gewicht) sollte innerhalb jeder Kategorie (Monate) normalverteilt sein. Normalverteilung wird aus unserer Erfahrung oftmals als casus belli für den weiteren Verlauf der Analyse betrachtet. Nahezu stoisch wird dafür gern ausschließlich der eher nicht zu empfehlende Kolmogorov-Smirnov-Test (Field 184 ff.) verwendet, ohne sich dabei auch die graphische Verteilung selbst anzusehen. Die unten stehenden Histogramme betrachten die Verteilung des Gewichts über alle 6 Kategorien der Monate hinweg und geben zudem das Ergebnis des empfohlenen Shapiro-Wilk-Tests auf Normalverteilung wieder. Ist bei diesem Test (ähnlich wie Kolmogorov-Smirnov) die Signifikanz p  le .05, so kann die Variable als normalverteilt gelten.

Verteilung der Kategorien

Für drei der sechs Kategorien gilt per Test mit p  le .05, dass keine Normalverteilung vorliegt. Optisch jedoch lässt sich auch bei diesen 3 Kategorien keine grobe Verletzung feststellen, so dass auch hier kein Einwand gegen die Auswertung mit der ANOVA besteht. Zudem sei auf die zahlreiche Literatur hinsichtlich der Robustheit der ANOVA bei Verletzung dieser Voraussetzung verwiesen.

Annahme 6: Die letzte Annahme der ANOVA ist, dass die Varianzen zwischen den Gruppen hinsichtlich der abhängigen Variable gleich sind. Dies bezeichnet man auch als Homogenität der Varianzen. Mit alleinigem Blick auf die Varianz kann man dies nur schwer beurteilen (siehe untere Tabelle), so dass ein Test auf Varianzhomogenität durchgeführt werden muss.

tabstat gewicht, statistics(mean var) by(monate_kat)

Deskriptive Statistik der Kategorien

Dieser Test ist der Levene-Test, der mit p  ge .05 Varianzhomogenität nachweist und in Stata über

robvar gewicht, by(monate_kat)

anzufordern ist. Die Ausgabe des Levene-Tests ist in Stata mit W0 gekennzeichnet und zeigt in diesem Fall p  le .001 an, so dass nicht von der Homogenität der Varianzen gesprochen werden kann. In diesem Fall sollte für die Berechnung der F-Werte der ANOVA eine Korrektur per Welch oder Brown-Forsythe durchgeführt werden, ebenso existieren posthoc-Tests für die Verletzung dieser Annahme. Im Gegensatz zu SPSS verfügt Stata nicht über eine Option innerhalb des Befehls, um Welch oder Brown-Forsythe anzuwenden, jedoch sei auch hier auf die Robustheit der ANOVA hingewiesen. Zudem verfügt Stata mit Hilfe des Regressionsbefehls, welcher komplementär zur ANOVA verwendet werden kann, über weitaus größere Möglichkeiten der Berechnung beim Auftreten dieses Problems. Für unsere Analysten stellt daher die Verletzung der Varianzhomogenität im Moment kein Problem dar.

Auf ein Wort

Die Annahmen der ANOVA werden gern als heilig und unumstößliches Gesetz betrachtet. Oftmals wird bereits bei Verletzung einer Annahme, auf die die ANOVA durchaus robust reagiert, ein nicht-parametrisches Alternativverfahren verwendet. Mehr noch, nicht selten werden Mittelwerte über die Gruppen deskriptiv dargestellt und dann mit den Ergebnissen (Signifikanzen) des nicht-parametrischen Verfahrens interpretiert. Insgesamt ist die ANOVA ein robustes Verfahren, welches sich auch bei groben Verletzungen der Annahmen noch anwenden lässt.

Referenzen

  1. Field, Andy (2013): Discovering Statistics Using SPSS, 4th Edition. SAGE: London

Nick Bornschein

Der folgende Blog und seine Fortsetzungen behandeln ein fiktives Projekt anhand konstruierter Daten und begleiten es von der ersten deskriptiven Betrachtung (Teil 1) bis hin zur Auswertung mit Hilfe verschiedener analytischer Möglichkeiten und graphischer Darstellungen. Das Verständnis der Daten steht dabei im ersten Teil im Vordergrund, denn ohne die Kenntnis der eigenen Daten kann auch keine gute Analyse stattfinden. Mehr noch, viel zu oft erleben wir, dass einfach „drauf los“ gerechnet wird. Kein einfacher Blick auf deskriptive Statistiken, der vor allem mit einer gewissen Erfahrung auch für die später folgenden Analysen bereits einiges an Bedeutung hat, keine Betrachtung von Ausreißern etc. Für alle Teile dieses Blogs gilt, dass hauptsächlich bei Grafiken auf die detaillierte Beschreibung der commands in Stata verzichtet wird, da dies für einen Blog deutlich zu weit führen würde. Blogeinträge zum Thema Grafiken werden aber in Zukunft ebenfalls folgen. Wie in jeder guten statistischen Analyse steht am Anfang eine kurze Einführung in die Daten.

Einführung in die Daten

Bei den Zirkusspielen (ludi circenses) im Alten Rom handelte es sich um eine außerordentlich populäre Attraktion für die damalige Stadtbevölkerung. Zeitgleich waren die Spiele eine Möglichkeit, politische Störenfriede und Gefangene loszuwerden. Diese Methode war allerdings nicht nur todsicher und überaus beliebt, sondern hatte eine missliche Nebenwirkung: fette Löwen. Während einer archäologischen Ausgrabung im Kolosseum in Rom wurden auf Tontafeln Strichlisten und Einträge zu den dort für die Spiele gehaltenen Löwen gefunden. Diese beinhalteten Informationen zum Geschlecht, Alter, Gewicht und Art der Löwen, sowie Angaben darüber, wie lange die Löwen bereits für die Spiele eingesetzt wurden. Nach dem mühsamen Zusammensetzen der Scherben wurden die Daten in eine Excel-Datei übertragen und stehen somit für die Auswertung bereit.

Deskriptive Auswertung

Die ausführenden Archäologen des Projekts, begannen den überraschenden Fund zunächst deskriptiv auszuwerten.

tab geschlecht
tab art
su gewicht monate

Insgesamt finden sich N=517 Angaben über Löwen, von denen 53,19% (N=275) männlich und 46,81% (N=242) weiblich sind. Anscheinend war es für das Entertainment egal, welches Geschlecht ein Löwe hatte. Hinsichtlich der Arten gab es zum Zeitpunkt der Zählung 156 Berberlöwen (30,17%), 167 Massai-Löwen (32,30%) und 194 Senegal-Löwen (37,52%). Das durchschnittliche Gewicht aller Löwen beträgt M=150,57 mit einer Standardabweichung von SD=32,709, wobei das Gewicht zwischen 75kg und 209kg schwankt. Durchschnittliche 12,74 Monate (knapp 1 Jahr) waren die Löwen bereits im Einsatz (SD=6,948), minimal einen Monat und maximal 33 Monate, immerhin fast 3 Jahre.

Grafische Betrachtung

Um ohne tiefergehende Statistik schnell zu erfassen, wie sich Alter, Gewicht und Geschlecht zueinander verhalten, erstellten die Forscher ein Streudiagramm (siehe unten). Wenig überraschend steigt das Gewicht der Löwen mit zunehmender Alter an, wobei zwischen dem Geschlecht rein optisch kein größerer Unterschied zu existieren scheint. Zwei markante Ausreißer wurden in den Daten zudem markiert, die vielleicht später noch von Interesse sein könnten.

Scatterplot Alter Gewicht und Geschlecht von Loewen

Eine Forschungsfrage entsteht

Bezüglich der Daten muss folgende Anmerkung gemacht werden: Das Gewicht der Löwen bei ihrer Ankunft in Rom wurde anscheinend nicht erfasst. Somit wissen wir aus obiger Grafik lediglich, dass Löwen mit einem höheren Alter auch mehr wiegen, nicht aber welchen Gewichtszuwachs ein einzelner Löwe während seines Aufenthalts im Zirkus zu verzeichnen hat. Die hiesigen Forscher hoffen, durch neue Ausgrabungen weitere Tontafeln mit zusätzlichen Daten zu finden (wir werden hier darüber berichten), doch aktuell muss die vorhandene Datenlage als ausreichend hingenommen werden. Somit kann nicht mit Gewissheit gesagt werden, dass die Löwen aufgrund ihrer Dauer im Zirkus dicker geworden sind, es ist jedoch mit Blick auf die Umstände anzunehmen. Wir gehen an dieser Stelle einfach davon aus.

Die erste naheliegende Frage der Forscher war im Anschluss, ob die Löwen – nunmehr nicht in ihrer natürlichen Umgebung beheimatet und gut gefüttert – aufgrund der Zeit im Zirkus schwerer wurden.

Boxplots Gewicht Dauer und Alter von Loewen

Graphisch zeigt sich, dass Löwen, die erst seit kurzem im Zirkus sind, noch um die 100kg wiegen und das Gewicht bis zu einer Dauer von 16 bzw. 17 Monaten ansteigt, um dann nach einer gewissen Zeit (18-24 Monate) ihr Gewicht zunächst zu halten. Erst ab dem 25. Monat scheinen sie dann wieder an Gewicht zu verlieren.

Scatterplot Gewicht Dauer und Alter von Loewen

Auch wenn das Ausgangsgewicht der Tiere nicht vorlag, so wollte man nun zumindest feststellen, ob es ggf. auch ältere Tiere gab, die nur kurze Zeit im Zirkus waren und umgekehrt. Die obenstehende Grafik macht deutlich, dass sich Löwen unter 9 Jahren auch nur bis zu ca. 13 Monate im Zirkus befinden und Löwen mittleren und höheren Alters breiter streuen. Konkreter wollte man an dieser Stelle jedoch ohne tiefergehende statistische Analysen nicht werden. Dennoch spricht die Grafik dafür, dass die Löwen ausschließlich im jungen Alter gefangen wurden, womöglich da sie in diesem Alter besser erziehbar waren.

Abgerundet wird die Betrachtung durch eine Tabelle, welche die Mittelwerte, Standardabweichungen, Mediane und Minimal- sowie Maximalwerte auflistet, welche den Forschern rein deskriptiv in ihrer Vermutung recht gibt.

tabstat gewicht, statistics(count mean sd median min max) by(monate_kat)

Stata Ausgabe deskriptiver Statistik

Ausblick

Ob die Archäologen auch aus statistischer Sicht Recht behalten sollen und die Löwen wirklich schwerer wurden, je länger sie im Zirkus waren, zeigen wir im 2. Teil des Blogs. Nick Bornschein

Mit Blick auf die oftmals mühsam erstellten Ergebnisse in Stata erreichten manche Nutzer bis Stata 12 oftmals eine weitere Hürde. Den Export – aus dem wie eine Schreibmaschine aufgebautem Output Fenster – zu kopieren, ging entweder nur über zusätzliche ado-Files, copy & paste oder oftmals auch gar nicht, so dass die Ergebnisse im letzteren Fall mühsam abgetippt werden mussten.

Tabellen aus Stata exportieren mit putexcel

Ab Stata 13 ermöglicht es die Funktion putexcel, praktisch jeden Output nach Excel zu exportieren. Auch wenn dies initial in einigen Fällen mit etwas Mühe verbunden ist, kann ein einmal gespeichertes do-File meist auf andere Fälle mit wenig Aufwand angewendet werden.

In den Daten zur „National Longitudinal Surveys of Young Women and Mature Women“ (NLSW ) Studie aus dem Jahr 1988 wurden die 2246 Befragten nach ihrem Beziehungsstatus befragt. Stata liefert uns in der Häufigkeitstabelle den unschönen Output. Selbst mit copy & paste scheitert man ohne weitere Kenntnisse am Zahlenformat und den Begrenzungen, die Stata für Tabellen vorgibt. Mit Hilfe von putexcel ist der Export nach Excel auf den ersten Blick vielleicht kompliziert, mit Blick darauf, dass später auch beliebig viele Tabellen inklusive Formatvorgaben direkt aus Stata heraus erstellt werden können, aber doch die Mühe wert.

Vorgehen beim Exportieren von Daten aus Stata nach Excel

Zunächst wird der NLSW-Datensatz geladen und mit putexcel set im aktuellen Arbeitspfad eine Excel-Datei (.xlsx) mit dem Namen „Auswertung“ und dem Tabellenblatt „verheiratet“ angelegt. Wichtig dabei ist, dass die Option replace gesetzt wird, da bei einem Fehler in der Berechnung beim nochmaligen Ausführen Teile der existierenden Excel-Datei ggf. nicht ersetzt werden.


sysuse nlsw88.dta
putexcel set Auswertung, sheet(„verheiratet“) replace

Es folgt der für Anfänger zunächst schwierigere Teil des Exports. Mittels local row = 1, werden alle späteren Berechnungen und Benennungen innerhalb der Excel-Datei gesteuert, ohne dass man spezifische Zellbezüge von Hand angeben muss. Im Rahmen des Beispiels wurde diese Programmierung dennoch etwas vereinfacht, voll automatisierte Tabellen-Exports sind problemlos möglich. Zudem wird über global var = "married" die Variable direkt angesteuert, um später das Label und die Codes automatisch abzuziehen.


local row = 1
global var = "married"

Mit Hilfe des tabulate Befehls, der die Ergebnisse der Tabelle nur mit den Optionen matcell und matnames für die weitere Verwendung im Hintergrund abspeichert, wird die Anzahl der Zeilen – also praktisch die Anzahl der Kategorien der Variable – ausgelesen (local rows), zudem wird für die spätere Prozentuierung der Wert 0 vergeben.


tabulate married, miss matcell(freq) matrow(names)
local rows = rowsof(names)
local cum_percent = 0

In diesem Beispiel wird die Kopfzeile der Tabelle nur halbautomatisch gesetzt, da hier sonst eine andere Herangehensweise an die Programmierung hätte gewählt werden müssen. Das Ansteuern der Zellen erfolgt mit dem zu Beginn gesetzten local row, allerdings ohne händische Zuweisung.


putexcel A`row’=(„verheiratet?“) B`row’=(„N“) C`row’=(„%“) D`row’=(„kum. %“), bold hcenter
local row = `row‘ + 1

Kernstück der Programmierung ist eine Schleife, die Zeile für Zeile, d.h. pro Kategorie der Variable, den Export nach Excel übernimmt. Die Schleife steuert sich automatisch ab Zeile 1 bis zur letzten Kategorie (forvalues i = 1/`rows‘) und nimmt die Labels der Kategorien aus dem tabulate Befehl mit Hilfe der Matrix names auf (local val bzw. local val_lab). Die Prozentuierung wird direkt berechnet, da diese Informationen in der Matrix selbst nicht gespeichert werden, allerdings Zugriff auf alle relevanten Werte besteht (local percent_val bzw. local cum_percent). Die beiden schließenden putexcel Befehle führen dann den Export der Informationen für eine Zeile direkt durch. Innerhalb der Schleife wird dann die nächste Zeile mit row + 1 in Angriff genommen.


* Loop über alle Zeilen
forvalues i = 1/`rows‘ {
  * Berechnung der Werte
  local val = names[`i‘,1] 
  local val_lab : label ($var) `val‘
  local freq_val = freq[`i‘,1] 
  local percent_val = `freq_val’/`r(N)’* 100
  local percent_val : display %9.2f `percent_val‘
  local cum_percent : display %9.2f (`cum_percent‘ + `percent_val‘)
  * Schreiben nach Excel
  putexcel A`row’=(„`val_lab'“)
  putexcel B`row’=(`freq_val‘) C`row’=(`percent_val‘) D`row’=(`cum_percent‘)
  * Zeile hochzählen
  local row = `row‘ + 1
}

Abschließend wird die letzte Zeile mit den Ergebnissen der Summe über das Setzen einer Excel-Formel berechnet. Die Tabelle ist damit vollständig in Excel berechnet und teilweise formatiert (bold bzw. hcenter aus dem ersten putexcel-Befehl oben).


putexcel A`row’=(„Gesamt“)
putexcel B`row’=formula(SUM(B2:B3)) C`row’=formula(SUM(C2:C3))

Zusammenfassung

Mit ausreichenden Kenntnissen im Bereich der Stata-Programmierung lässt sich diese Syntax auf beliebige Tabellen automatisieren. Außerdem ist hinsichtlich Variablennamen und –labels eine Programmierung über eine Schleife zur Erstellung von Tabellen über beliebig viele Fragen auf einmal möglich. Nick Bornschein

Mit Blick auf die oftmals mühsam erstellten Ergebnisse in Stata erreichten manche Nutzer bis Stata 12 oftmals eine weitere Hürde. Den Export – aus dem wie eine Schreibmaschine aufgebautem Output Fenster – zu kopieren, ging entweder nur über zusätzliche ado-Files, copy & paste oder oftmals auch gar nicht, so dass die Ergebnisse im letzteren Fall mühsam abgetippt werden mussten.

Tabellen aus Stata exportieren mit putexcel

Ab Stata 13 ermöglicht es die Funktion putexcel, praktisch jeden Output nach Excel zu exportieren. Auch wenn dies initial in einigen Fällen mit etwas Mühe verbunden ist, kann ein einmal gespeichertes do-File meist auf andere Fälle mit wenig Aufwand angewendet werden.

In den Daten zur „National Longitudinal Surveys of Young Women and Mature Women“ (NLSW ) Studie aus dem Jahr 1988 wurden die 2246 Befragten nach ihrem Beziehungsstatus befragt. Stata liefert uns in der Häufigkeitstabelle den unschönen Output. Selbst mit copy & paste scheitert man ohne weitere Kenntnisse am Zahlenformat und den Begrenzungen, die Stata für Tabellen vorgibt. Mit Hilfe von putexcel ist der Export nach Excel auf den ersten Blick vielleicht kompliziert, mit Blick darauf, dass später auch beliebig viele Tabellen inklusive Formatvorgaben direkt aus Stata heraus erstellt werden können, aber doch die Mühe wert.

Vorgehen beim Exportieren von Daten aus Stata nach Excel

Zunächst wird der NLSW-Datensatz geladen und mit putexcel set im aktuellen Arbeitspfad eine Excel-Datei (.xlsx) mit dem Namen „Auswertung“ und dem Tabellenblatt „verheiratet“ angelegt. Wichtig dabei ist, dass die Option replace gesetzt wird, da bei einem Fehler in der Berechnung beim nochmaligen Ausführen Teile der existierenden Excel-Datei ggf. nicht ersetzt werden.


sysuse nlsw88.dta
putexcel set Auswertung, sheet(„verheiratet“) replace

Es folgt der für Anfänger zunächst schwierigere Teil des Exports. Mittels local row = 1, werden alle späteren Berechnungen und Benennungen innerhalb der Excel-Datei gesteuert, ohne dass man spezifische Zellbezüge von Hand angeben muss. Im Rahmen des Beispiels wurde diese Programmierung dennoch etwas vereinfacht, voll automatisierte Tabellen-Exports sind problemlos möglich. Zudem wird über global var = "married" die Variable direkt angesteuert, um später das Label und die Codes automatisch abzuziehen.


local row = 1
global var = "married"

Mit Hilfe des tabulate Befehls, der die Ergebnisse der Tabelle nur mit den Optionen matcell und matnames für die weitere Verwendung im Hintergrund abspeichert, wird die Anzahl der Zeilen – also praktisch die Anzahl der Kategorien der Variable – ausgelesen (local rows), zudem wird für die spätere Prozentuierung der Wert 0 vergeben.


tabulate married, miss matcell(freq) matrow(names)
local rows = rowsof(names)
local cum_percent = 0

In diesem Beispiel wird die Kopfzeile der Tabelle nur halbautomatisch gesetzt, da hier sonst eine andere Herangehensweise an die Programmierung hätte gewählt werden müssen. Das Ansteuern der Zellen erfolgt mit dem zu Beginn gesetzten local row, allerdings ohne händische Zuweisung.


putexcel A`row’=(„verheiratet?“) B`row’=(„N“) C`row’=(„%“) D`row’=(„kum. %“), bold hcenter
local row = `row‘ + 1

Kernstück der Programmierung ist eine Schleife, die Zeile für Zeile, d.h. pro Kategorie der Variable, den Export nach Excel übernimmt. Die Schleife steuert sich automatisch ab Zeile 1 bis zur letzten Kategorie (forvalues i = 1/`rows‘) und nimmt die Labels der Kategorien aus dem tabulate Befehl mit Hilfe der Matrix names auf (local val bzw. local val_lab). Die Prozentuierung wird direkt berechnet, da diese Informationen in der Matrix selbst nicht gespeichert werden, allerdings Zugriff auf alle relevanten Werte besteht (local percent_val bzw. local cum_percent). Die beiden schließenden putexcel Befehle führen dann den Export der Informationen für eine Zeile direkt durch. Innerhalb der Schleife wird dann die nächste Zeile mit row + 1 in Angriff genommen.


* Loop über alle Zeilen
forvalues i = 1/`rows‘ {
  * Berechnung der Werte
  local val = names[`i‘,1] 
  local val_lab : label ($var) `val‘
  local freq_val = freq[`i‘,1] 
  local percent_val = `freq_val’/`r(N)’* 100
  local percent_val : display %9.2f `percent_val‘
  local cum_percent : display %9.2f (`cum_percent‘ + `percent_val‘)
  * Schreiben nach Excel
  putexcel A`row’=(„`val_lab'“)
  putexcel B`row’=(`freq_val‘) C`row’=(`percent_val‘) D`row’=(`cum_percent‘)
  * Zeile hochzählen
  local row = `row‘ + 1
}

Abschließend wird die letzte Zeile mit den Ergebnissen der Summe über das Setzen einer Excel-Formel berechnet. Die Tabelle ist damit vollständig in Excel berechnet und teilweise formatiert (bold bzw. hcenter aus dem ersten putexcel-Befehl oben).


putexcel A`row’=(„Gesamt“)
putexcel B`row’=formula(SUM(B2:B3)) C`row’=formula(SUM(C2:C3))

Zusammenfassung

Mit ausreichenden Kenntnissen im Bereich der Stata-Programmierung lässt sich diese Syntax auf beliebige Tabellen automatisieren. Außerdem ist hinsichtlich Variablennamen und –labels eine Programmierung über eine Schleife zur Erstellung von Tabellen über beliebig viele Fragen auf einmal möglich. Nick Bornschein