Einleitung Show
Vor jeder statistischen Auswertung ist es notwendig, die Daten entsprechend der angestrebten Analyse aufzubereiten. Beispielsweise kann das beinhalten, Daten zusammenzuführen, zu extrahieren oder zu sortieren, aber auch Variablen umzukodieren oder transformierte Variablen zu erstellen. In diesem Kapitel wollen wir uns verschiedene Schritte der Datenvorbereitung anschauen. Wir nutzen dafür größtenteils Funktionen aus zwei verschiedenen Paketen: dem
Standardpaket base und dem Zusatzpaket dplyr. Zweiteres laden wir mit Wir fangen mit grundsätzlichen Überprüfungen unserer der Daten an. Nachfolgend arbeiten wir uns in spezifischere Aufbereitungsbereiche vor, die wir in Abhängigkeit unserer geplanten Auswertung ggf. benötigen. Beispieldatensätze für dieses KapitelFür das vorliegende Kapitel nutzen wir mehrere Datensätze, um die unterschiedlichen Verarbeitungsschritte zu demonstrieren. Den Datensatz airquality werden wir am meisten nutzen. Dieser enthält Daten aus einer Untersuchung der Luftqualität in New York, die von Mai bis September des Jahres 1973 stattfand. Der Datensatz ist standardmäßig in R enthalten und wir bekommen ihn mit der Funktion
Der Datensatz enthält 6 Variablen:
Mehr Informationen zum
Datensatz finden wir hier. Den Datensatz PWE_data, welcher Daten einer psychometrischen Erhebung enthält, werden wir auch häufiger nutzen. Um den Datensatz und das Codebuch herunterzuladen, klicken wir auf diesen Link. Dann gehen wir in den Ordner PWE_data und lesen data.csv ein:
Der Datensatz enthält 102 Variablen. Einige davon schauen wir uns im Laufe des Kapitels noch genauer an. Im Codebook, welches sich ebenfalls im Ordner PWE_data befindet, finden wir eine Erklärung zu den Variablen. Mehr Informationen zum Erhebungsinstrument, der Protestant Work Ethic Scale, finden wir in Mirels & Garrett (1971) (nur über HU-VPN zugänglich). Im Abschnitt Plausibilitäts-Check werden die Kodierungen einiger Variablen noch
korrigiert. Außerdem müssen die Werte der Variablen Die Datensätze vornamen_13 und vornamen_14 enthalten die Vornamen der Neugeborenen in München, jeweils für die Jahre 2013 und 2014. Diese werden wir nur für 2. Datensätze zusammenführen nutzen. Zuerst laden wir die csv-Dateien für 2013 und 2014 runter und lesen sie dann folgendermaßen in R ein:
Die Datensätze enthalten jeweils die gleichen 3 Variablen:
Es kommt häufiger zu Problemen bei der Ausführung der Funktionen 1. Grundlegende erste SchritteZuerst widmen wir unsere Aufmerksamkeit der Überprüfung wichtiger übergreifender Punkte der Datenvorbereitung. Diese sind: ob unser Datensatz als Dataframe vorliegt, ob unsere Daten plausibel und fehlende Werte korrekt kodiert sind, ob nominal- und v.a. ordinalskalierte Variablen faktorisiert sind, und ob wir unser bestehendes Tabellenformat ggf. ändern müssen. Die Schritte sind bereits in einer sinnvollen Abfolge angeordnet (z.B. ist es vorteilhaft, erst unplausible und fehlende Werte ausfindig zu machen und umzukodieren, bevor man Variablen faktorisiert). Optional können wir vorher unser Wissen zum Messen von Merkmalen und der korrekten Darstellung dieser in R auffrischen. Wir schauen uns nachfolgend nur die Datensätze airquality und PWE_data an. Recap: Kodierung von DatenGenerell wenn wir mit Daten arbeiten, ist es ratsam, sich zuallererst Gedanken darüber zu machen, welche Informationen wir diesen entnehmen können (Messniveau) und ob sie so gespeichert sind, dass R sie richtig erkennt (Datentypen und -strukturen). Die nachfolgende Wiederholung ist eine verkürzte Variante des Abschnitts Daten aus dem Kapitel zu Einführung in R. MessniveausDas Messniveau (oder auch Skalenniveau) ist eine wichtige Eigenschaft von Merkmalen (Variablen) von Untersuchungseinheiten. Es beschreibt, welche Informationen in unseren Messwerten abgebildet werden und damit auch welche mathematischen Transformationen mit den Messwerten sinnvoll sind (z.B. das Berechnen von Mittelwerten). Somit begrenzt das Messniveau auch die zulässigen Datenauswertungsverfahren unserer Variablen. Die Kodierung von nominalskalierten Merkmalen ist insofern willkürlich, als dass lediglich auf Gleichheit versus Ungleichheit geachtet werden muss (z.B. airquality: - Die Kodierung von
ordinalskalierten Merkmalen geschieht der Größe nach, d.h. dass die Rangfolge der Kodierungen einzelner Gruppen relevant ist (z.B. airquality: - Bei der Kodierung von intervallskalierten Merkmalen sind sowohl die Rangfolge als auch die Abstände zwischen den Ausprägungen relevant (z.B. airquality: Bei der Kodierung von verhältnisskalierten Merkmalen ist zusätzlich noch ein Nullpunkt vorhanden. Dieser erlaubt es, dass Quotienten zwischen Werten gebildet werden können. Ein beliebtes Beispiel ist die Kelvin Skala. Bei dieser ist bei 0°K keine Bewegungsenergie mehr vorhanden und 20°K sind doppelt so viel wie 40°K. airquality: Zu guter Letzt gibt es noch absolutskalierte** Merkmale, welche sowohl einen eindeutigen Nullpunkt als auch eine eindeutige Einheit der Skala (z.B. Anzahl der Kinder) vorweisen kann. Die Kodierung entsprcht der natürlichen Einheit. airquality: - Nachfolgend finden wir eine Tabelle der möglichen Unterscheidungen der jeweiligen Messiniveaus.
Datentypen und DatenstrukturenDie Unterteilung nach “Datentyp” und “Datenstruktur” sind getreu des Manuals von R. Man stößt in anderen Quellen aber auch auf abweichende Unterteilungen bzw. Benennungen. Der Datentyp gibt an, um was für Daten es sich handelt, d.h. welche Werte(bereiche) diese haben und welche Operationen wir auf sie anwenden können. Wir nutzen zumeist Zeichen, Wahrheitswerte und Zahlen. Diese werden in R als character, logical, integer und double gespeichert, wobei letztere beiden häufig als numeric zusammengefasst werden. Die Datenstruktur bestimmt die Organisation und Speicherung von Daten(typen). In R gibt es z.B. Vektoren, Matrizen, Dataframes, Listen und Faktoren. Beispielsweise können Vektoren und Matrizen jeweils nur einen Datentypen enthalten, während Dataframes mehrere Datentypen enthalten können. Datentyp und -struktur sind ausschlaggebend dafür, welche Funktionen wir anwenden können bzw. welchen Output wir bekommen.
Nachfolgend finden wir eine Übersicht zu den Möglichkeiten der Kodierung von Merkmalen mit verschiedenen Skalenniveaus.
Mit der Funktion
Für den Beispieldatensatz
airquality liegen die verhältnisskalierten Variablen Für den Datensatz PWE_data schauen wir uns exemplarisch nur die letzten 15 Variablen an:
Wir nutzen hier für PWE_data die Funktion Wie wir sehen, liegen fast alle Variablen als numeric vor, obwohl viele nominalskaliert sind. So würden sie von R nicht entsprechend ihres Messniveaus behandelt werden. Wir müssen diese also entweder in character umwandeln oder faktorisieren (später mehr dazu). DataframeFür viele Anwendungen in R (z.B. für das Erstellen von Grafiken mit gglot2) ist es notwendig, dass der Datensatz als Dataframe vorliegt. Folgendermaßen können wir prüfen, ob ein Datensatz ein Dataframe ist: Was genau ist ein Dataframe?Ein Dataframe ist eine Datenstruktur, die es uns erlaubt, Daten tabellarisch zu speichern. Der Dataframe ist eine Liste aus Vektoren mit gleicher Länge. Listen können (im Gegensatz zu Matrizen) Variablen mit unterschiedlichen Datentypen speichern. Mehr Informationen gibt es im vorhergehenden Abschnitt zu Datentypen und Datenstrukturen. Falls unser Datensatz kein Dataframe ist, können wir ihn folgendermaßen umwandeln: Die Funktion Plausibilitäts-CheckIm nächsten Schritt lohnt es sich zu überprüfen, ob in den vorangegangen Schritten der Erhebung und Kodierung unserer Daten, Fehler passiert sind. Das ist wichtig damit wir solche Fehler nicht in unsere Analyse übertragen, wo sie sehr viel unwahrscheinlicher auffallen werden. Dafür überprüfen wir, ob die Messniveaus und Ausprägungen unserer interessierenden Variablen auch unseren Erwartungen entsprechen. Entweder man hat die Daten selbst erhoben und somit Wissen darüber, welche Werte möglich sind, oder man schaut sich die Dokumentation zu den Daten an. Für den Datensatz airquality finden wir die Dokumentation hier. Konkretisieren wir einmal einen hypothetischen Fall an der Variable Das Auftauchen von unplausiblen Werten ist z.B. wahrscheinlicher, wenn Daten manuell digitalisiert (d.h. eingetippt) wurden (z.B. Paper-and-Pencil Tests). Gerade in diesen Fällen sollte man sicher gehen, und die Daten auf unplausible Werte hin überprüfen. Die Funktion
Einen kompakten Überblick über die
Verteilung der Variablen können wir mit der Funktion
Insgesamt sehen die Daten plausibel aus. Für eine spezifischere Einschätzung der Wetter-Variablen ( Für den Datensatz PWE_data schauen wir uns hier wieder nur einige Variablen an. Informationen zu den Variablen finden wir in der Codebook, welches sich im Ordner PWE_data befindet.
Es fällt auf, dass alle dargestellten Variablen (bis auf Wie wir sehen, geht die Überprüfung von plausiblen und fehlenden Werten häufig ineinander über. Werte, die außerhalb des Ranges der betrachteten Variable liegen, können eine Kodierung für fehlende Werte darstellen. Wenn wir unplausible Werte in unseren Daten finden, können wir zu 5. Kodierung ändern springen, und diese umkodieren. Wenn wir
fehlkodierte Missings finden, können wir auch Weil wir in PWE_data
sehr viele Variablen haben und es zu umständlich wäre, alle einzeln umzukodieren, kodieren wir erst im gesamten Datensatz
Nun schauen wir uns noch die Verteilungen der Variablen an.
Hier sehen wir auch, dass für nominalskalierte Merkmale, wie z.B. Fehlende WerteGenerell werden fehlende Werte (Missings) in R mit
Neben der im letzten Abschnitt vorgestellten Varianten, Missings mit Beispielsweise können wir mit der Kombination von
Wenn wir Variablen mit Missings für unsere Analysen nutzen wollen, sollten wir überprüfen, ob die Missings zufällig sind und in Abhängigkeit davon unseren Umgang anpassen, um systematischen Verzerrungen der Analysen entgegenzuwirken. Einen ausführlichen Überblick zu Missings finden wir im Kapitel Fehlende Werte. FaktorisierenWir schauen uns das Faktorisieren exemplarisch an zwei Variablen aus dem Datensatz PWE_data an:
Zuerst erstellen wir einen (neuen) unsortierten (d.h. nominalskalierten) Faktor. Dafür benötigen wir nur die Funktion
Nun erstellen wir einen (neuen) sortierten (d.h.
ordinalskalierten) Faktor. Dafür ergänzen wir das Argument
Mit dem Argument Manchmal wollen wir diese Sortierung aber nicht übernehmen, sondern eine eigene Hierarchie erstellen, die nicht der natürlichen Rangfolge entspricht. Das können wir machen, indem wir zusätzlich das Argument
Abschließend vergleichen wir die ursprüngliche numeric-Variable (
Wir sehen, dass alle Variablen des gleichen Merkmals zwar die gleichen Werte (gender: 1, 2, 3 und education: 1, 2, 3, 4) haben, aber in unterschiedlichen Datentypen bzw. -strukturen (numeric, factor, Ordered factor) und teils unterschiedlichen Sortierungen vorliegen. Außerdem sehen wir, dass die selbst sortierten Faktoren intern eine neue Kodierung bekommen haben (siehe Wide- und Long-FormatIn Abhängigkeit unserer Daten und der Analyse, die wir durchführen wollen, ist es ggf. erforderlich, dass unsere Daten in ein anderes Tabellenformat überführt werden müssen. Es gibt das Wide- und das Long-Format. Die Unterscheidung von Wide- und Long-Format ist von Bedeutung, wenn unsere Daten eine genestete Struktur aufweisen, das heisst jeweils mehrere Messungen von derselben Untersuchungseinheit vorliegen (z.B. bei Längsschnitterhebungen, mehrere Ratern oder Schülern in Klassen). Im Wide-Format liegen Messungen einer Untersuchungseinheit in einer Zeile vor. Jeder Messzeitpunkt bzw. jede Messung ist eine eigene Variable. Beispiel 1 Wide-Format: Messzeitpunkte
Beispiel 2 Wide-Format: Rater
Im Long-Format liegen Messungen einer Untersuchungseinheit in mehreren Zeilen vor. Alle Messzeitpunkte bzw. Messungen von unterschiedlichen Ratern liegen in einer Variable vor und die Messzeitpunkte bzw. Rater werden in einer separaten Variable kodiert. Beispiel 1 Long-Format: Messzeitpunkte
Beispiel 2 Long-Format: Rater
Im Beispieldatensatz PWE_data gibt es keine wiederholte Messungen. Psychometrische und demographische Daten wurden einmalig erhoben. Hierfür gibt es keine Notwendigkeit der Formatierung vom Long- ins Wide-Format oder vice-versa. Im Beispieldatensatz airquality gibt es wiederholte Messungen der Untersuchungseinheiten ( Im Kapitel zum Wide- & Long-Format erfahren wir, wie wir beide Formate ineinander überführen können. Hierzu werden jeweils zwei Möglichkeiten vorgestellt: 2. Datensätze zusammenführenSynonyme: Mergen, Fusionieren, Integrieren Nicht immer haben wir das Glück, dass die für uns relevanten Daten in einem gemeinsamen Dataframe vorliegen. Daher schauen wir uns nachfolgend an, wie man Dataframes zusammenführen kann. Es gibt dabei zwei Szenarien, die man unterscheiden kann:
Wir schauen uns wieder Funktionen aus zwei
verschiedenen Paketen an: Wir nutzen dafür die Datensätze Es kann sein, dass wir einen Dataframe nach dem Zusammenführen noch in ein anderes Format überführen müssen, um unsere Auswertung durchführen zu können (siehe Wide- und Long-Format). Selbe Variablen, unterschiedliche FälleDie beiden nachfolgend vorgestellten Funktionen unterscheiden sich bezüglich einiger Funktionalitäten. Ein wichtiger Unterschied ist, dass In Abhängigkeit der geplanten Nutzung der Daten sollten wir individuell entscheiden, welche Funktion wir nutzen wollen. merge() Mit Wir müssen dabei unbedingt Mit
Die Reihenfolge der Zeilen im gemeinsamen Dataframe richtet sich nach der natürlichen Sortierung der ersten Variable (im zuerst übergebenen Datensatz). Für unser Beispiel sind die Vornamen nach dem Alphabet (beginnend mit “A”) sortiert. Mit der Funktion Hier sehen wir den eingangs erwähnten Unterschied von
Beispielsweise kommt folgender Fall in beiden Dataframes vor:
So verschwindet
die gleiche Anzahl an Fällen, die wir mit dem Default-Verhalten der Funktion ( Wir sollten mit Schauen wir uns das Problem an einem Beispiel an: Nehmen wir an, dass ein Dataframe
Man könnte denken, dass 6 Fälle in merge_xy zu finden sind. Weil aber jeweils ein Fall (x : Zeile 2; y Zeile 3) bis auf a die gleichen Ausprägungen in den beiden Dataframes hat, wird dieser nicht mit übernommen. bind_rows() Der Funktion Optional können wir der Funktion das Argument
Hier sehen wir die ID-Variable. Von den Zeilen 1 bis 4012 ist diese Es ist auch möglich, der Funktion mehr als zwei Dataframes zu übergeben, welche in einem gemeinsamen Dataframe gespeichert werden. Wir können beliebig viele Dataframes mit Zur
Überprüfung schauen wir uns mit vornamen_13 und vornamen_14 überein, d.h. es wurden alle Fälle übernommen. Unterschiedliche Variablen, selbe FälleIm Gegensatz zu Allerdings kann man die merge(..., by) Die Funktion Mit dem Argument Wenn es unterschiedliche Benennungen der gleichen ID-Variablen in den beiden Datensätzen gibt, müssen wir
Wir wollen auch hier wieder die
Daten aus beiden Dataframes übernehmen, und geben das mit Wir könnten aber hier ebenso
Nun schauen wir uns einmal die (ersten 6 Fälle der) neu erstellten Variablen an.
In den beiden Dataframes Nachfolgend schauen wir uns jeweils ein Beispiel sowie die Anzahl der Fälle dieser Szenarien an.
Wir können uns hier nur die Missings in den einzelnen Spalten anschauen, um die Häufigkeiten für dieses Szenario zu bekommen, weil es vorher in den einzelnen Dataframes keine Missings gab. Wenn wir nun alle Werte aufsummieren, kommen wir auf die Anzahl der Zeilen im gemeinsamen Dataframe: _join() Die Für Daten aus beiden Datensätzen nutzt man Für Daten aus dem
ersten bzw. zweiten Datensatz und den überlappenden Fällen nutzt man Für Daten, die in beiden Datensätzen überlappen nutzt man
Nun überprüfen wir wieder die Dimensionen des neu erstellten Dataframes. Wir sehen, dass der mit full_join() als Alternative zu bind_rows() Mit
Zur Demonstration der Übereinstimmung schauen wir uns die Dimensionen und den Aufbau des Dataframes (am Beispiel der ersten 6 Zeilen) an.
Synonyme: Splitten, Subsetten, Filtern, Selektieren, Extrahieren Manchmal möchten wir nur bestimmte Variablen bzw. bestimmte Fälle aus einem Datensatz betrachten. Generell bietet es sich an, dafür reguläre Ausdrücke (regular expressions z.B. die
Metacharactere Wie wir Variablen (Spalten) und Fälle (Zeilen) selektieren und in einem neuen Dataframe speichern können, schauen wir uns nun an. VariablenWenn wir nur einige Variablen aus einem bzw. aus mehreren Datensätzen benötigen, können wir diese mit verschiedenen Möglichkeiten entnehmen. Im Folgenden schauen wir uns dafür Möglichkeiten aus dem Standardpacket base und dem Zusatzpaket dplyr an. Unten befindet sich eine Übersicht, der wir entnehmen können, welche Methode wir wählen sollten in Abhängigkeit davon, ob die Variablen, die wir extrahieren wollen, ähnlich oder unterschiedlich sind.
grep() Wenn Variablen eines Datensatzes eine Gemeinsamkeit (z.B. einen gemeinsamen Wortstamm) aufweisen, können wir diese mit der Funktion grep(pattern, names(Datensatz))
Wir wollen beispielshalber alle Variablen extrahieren, die irgendwo ein o im Namen haben.
Mit dieser Methode haben wir gleich den Vorteil, dass die Namen der Variablen im neuen Datensatz gleich denen im ursprünglichen Datensatz ist. Wir können unsere Suche mitgrep() auch noch spezifischer machen, indem wir die regulären Operatoren nutzen. Mit ^o suchen wir Variablen, die mit einem “o” beginnen; mit o$ jene die mit “o” enden. Mit ^o|o$ suchen wir Variablen, die entweder mit einem “o” beginnen oder enden. Ein Beispiel dazu finden wir im Abschnitt
Fälle mit grep() extrahieren. Mit ^o.*o$ suchen wir Variablen, die mit einem “o” beginnen und enden. $ Einzelne Variablen, die keine Gemeinsamkeit (z.B. einen gemeinsamen Wortstamm) aufweisen, kann man mit dem Diesen wendet man an, indem man die Form Data Frame$Variable nutzt. Die Variablen können folglich aus unterschiedlichen Datensätzen stammen, da wir jede Variable jeweils neu ansprechen müssen. Wir entnehmen die Variablen
Mit dieser Methode haben wir den Nachteil, dass die Variablen im neu erstellten Dataframe nicht mit ihrem ursprünglichen Namen, sondern in der Form Datensatz.Variable benannt sind. Wir können den Variablen z.B. colnames(Datensatz) <- c(“Var1”, “Var2”, …) wieder ihren ursprünglichen (oder einen neuen) Namen geben.select() Die Funktion Man übergibt der Funktion zuerst den Dataframe und anschließend die Namen der Variablen, welche man extrahieren möchte. Man kann diese sogar gleich umbenennen. Wir erstellen einen neuen Dataframe mit den Variablen
Wenn wir bis auf einige wenige Variablen alle
übernehmen wollen, können wir das realisieren, indem wir jeweils ein Schauen wir uns das für den Fall an, dass wir
Datums-Variablen splittenFür den Fall, dass wir eine Datums-Variable in unserem Datensatz haben, welche in einem für uns unangemessenen Format vorliegt, können wir diese mit dem Paket lubridate umformatieren. Auf dieser Seite wird der Umgang mit den im Paket enthaltenen Funktionen FälleWir schauen uns nachfolgend einige Möglichkeiten der Extraktion von Fällen mit spezifischen Ausprägungen (die man z.B. für eine Subgruppenanalyse benötigt) an. Auch hier schauen wir uns wieder sowohl Funktionen aus dem Standardpaket base als auch aus dem Zusatzpaket dplyr an. Unten befindet sich eine Übersicht, der wir entnehmen können, welche Methode wir wählen sollten in Abhängigkeit davon, ob die Fälle, die wir extrahieren wollen, ähnlich oder unterschiedlich sind.
grep() Wenn wir Ausprägungen suchen, die sich nicht durch logische Operatoren, sondern durch Ähnlichkeiten (z.B. ein gleiches Zeichen) filtern lassen, dann können wir dafür
Die Funktion durchsucht Elemente eines Vektor ( Unsere gesuchten Zahlen- oder Zeichenketten, die wir an das Argument Wenn eine Ausprägung irgendwo eine bestimmten Zahlen- oder Zeichenketten enthalten soll, geben wir diese einfach ein. Wir durchsuchen die Variable
Wenn eine Ausprägung eine bestimmte Zahlen- oder Zeichenketten zu Beginn enthalten soll, setzen wir ein Wenn wir beispielsweise alle Tage
suchen, an denen die Temperatur ( Diese Suche könnten wir auch mit den logischen Operatoren durchführen.
Wenn eine Ausprägung eine bestimmte Zahlen- oder Zeichenketten am Ende enthalten
soll, setzen wir ein Wenn wir beispielsweise alle Tage suchen, an denen die Temperaturangabe (
Wie beim Extrahieren von Variablen können wir auch hier mit Als Beispiel suchen wir Temperaturangaben, die zu Beginn eine 5 enthalten oder mit einer 5 enden.
Die Zahlen bzw. Zeichenketten dürfen nicht durch Freizeichen getrennt werden, z.B. würden mit Die Suche mit “^x|x$” ergibt gemeinsam die globale Suche nach “x”. Wenn
wir hingegen mehrere Bedingungen verknüpfen wollen, z.B. “^x” und “x$”, dann nutzen wir Ähnlich zum Abschnitt zu Variablen mit Wir können hierfür nur den Indizes-Vektor ( Logische OperatorenWenn wir logische Operatoren auf einzelne Variablen anwenden, können wir Fälle mit bestimmten Ausprägungen filtern. Hier finden wir eine Einführung zu logischen Operatoren mit Übungsfragen. Um nur diese Fälle im gesamten Datensatz zu extrahieren, nutzen wir folgende Syntax: Datensatz[Variable Operator Ausprägung,] Wenn wir Fälle (d.h. Zeilen) exrahieren wollen, müssen wir nach den Indizes
immer ein Komma angeben z.B. extrahiert df[2,] die zweite Zeile aus Beispielsweise können wir mit dem Gleichheits-Operator Wir
filtern die Variable
Wir können mittels Nun wollen wir zusätzlich zu nach Fällen mit der Ausprägung Weitere logische Operatoren sind z.B. != (nicht),
< (kleiner) und >= (größer gleich). filter() Mit Man übergibt der Funktion zuerst den Dataframe und anschließend die Namen der Variablen mit den Bedingungen, die auf diese jeweils zutreffen sollen. Wir wollen nur jene Fälle, die in der zweiten Hälfte des Junis erhoben wurden.
Zu Beginn haben wir erläutert, warum wir manchmal 4. Daten sortierenFür manche Vorhaben, wie z.B. grafische Darstellungen oder dem Quantifizieren von Heteroskedastizität, benötigt man sortierte Daten. Wir schauen uns nachfolgend zwei Möglichkeiten an, einen Dataframe nach den Ausprägungen seiner Variablen zu sortieren. order() Nachfolgend sehen wir, wie man mit Weil mit
Wenn wir nach den absteigenden Werte der Variablen sortieren wollen, hängen wir jeweils ein arrange() Die Funktion Standardmäßig wird hier ebenso wie bei Schauen wir uns das für das letzte Beispiel im vorhergehenden Abschnitt an. Wir sortieren den Dataframe absteigend nach
5. Kodierung ändernWenn die Daten nicht in einer angemessenen Kodierung vorliegen, muss man diese nachträglich anpassen bzw. neu erstellen. Die Kodierung einer Variablen ist von ihrem Messniveau abhängig. Für dieses Kapitel beschränken wir uns auf die Nutzung des Datensatzes PWE_data, welchen wir zu Beginn heruntergeladen haben. UmkodierenWenn wir zum Beispiel Messwerte in Meter zu Messwerten in Zentimeter ändern oder negativ gepolte Items umpolen wollen, spricht man von Umkodieren. Wir können die Kodierung von Merkmalen in R auf verschiedene Arten ändern. Nachfolgend schauen wir uns zwei Funktionen an, die wir nutzen können. recode() In der Funktion Wir müssen
hierbei einige syntaktische Besonderheiten von
Wir invertieren im Folgenden die Werte der Variablen So sehen die Daten (der ersten 10 Personen) bisher aus: Jetzt invertieren wir die Skalen:
Abschließend überprüfen wir (visuell), ob die Umkodierung geklappt hat: Wenn die Kodierung aus Zeichenketten (character) besteht, müssen wir diese jeweils noch mit Schauen wir uns an, wie man die Ausprägungen von Mit dem Parameter Leider können wir so aber nur ungeordnete (nominalskaliert) und keine geordneten (ordinalskaliert) Faktoren erstellen. Dafür müssten wir auf die Funktion
Abschließend vergleichen
wir die Daten (der ersten 10 Personen) von case_when() Mit der Funktion Im Gegensatz zu Als Beispiel bilden wir Kategorien für das intervallskalierte Merkmal
Nun haben wir eine neue Variable
Indikatorvariablen: Kodierung nominaler MerkmaleNominale Merkmale kann man in Form von Dummy-, Effekt- und Kontrastkodierungen repräsentieren. Eine solche Repräsentation ist vor allem im Rahmen des Allgemeinem Linearen Modells (ALM) von Interesse. Untenstehende Tabelle gibt einen groben Überblick über die Interpretation der Parameter des ALM in Abhängigkeit der Kodierung.
Für mehr Informationen zu Indikatorvariablen können wir z.B. folgende Quelle nutzen:
Im Folgenden schauen wir uns an, wie man konkret bei der Erstellung der verschiedenen Arten der Indikatorvariablen vorgehen kann. Dafür nutzen wir die im Abschnitt Faktorisieren erstellte Variable Zusätzlich rechnen wir jeweils eine einfache lineare Regression mit den verschiedenen Kodierungen, um die Unterschiede zwischen den Koderierungsarten zu veranschaulichen. Wir regredieren dafür die Zeit in Sekunden, die die Probanden auf der Instruktionsseite verbracht haben ( Die nachfolgend vorgestellten Funktionen lassen sich auch auf ordinalskalierte Merkmale (d.h. sortierte Faktoren) anwenden. Bei diesen unterscheidet sich aber die Interpretation der geschätzten Koeffizienten der Regression. Wir bekommen Schätzungen für lineare (L), quadratische (Q) und kubische (C) Trends. Daher behandeln wir im folgenden Abschnitt nur die Kodierung von nominalskalierten Merkmalen. Dummy-KodierungViele Funktionen in R (z.B. Man benötigt für eine Dummykodierung mit \(k\)-Kategorien \(k-1\) Indikatorvariablen. Die jeweils interessierende Gruppe wird in der jeweiligen Indikatorvariablen mit 1 kodiert; die anderen mit 0. Als Referenzkategorie (von der die Abweichung berechnet wird) gilt jene, welche in allen Indikatorvariablen mit 0 kodiert wird. Die Indikatorvariablen erstellt uns die Funktion Um die faktorisierte Variable C(Faktor, contr.treatment(n, base)) setzt die Konstraste für den kategorialen Prädiktor innerhalb von
Nun vergleichen wir das Regressionsmodell mit den Dummy-kodierten Indikatorariablen (
Da die Referenzkategorie identisch ist, sehen wir, dass wir bei beiden die gleichen Ergebnisse erhalten. Bei der Dummykodierung entspricht unser Interzept \(b_0\) dem ungewichteten Mittelwert in der Referenzkategorie ( Alternativ zu Dem Argument
EffektkodierungFür diese Kodierung benötigen wir ebenfalls \(k-1\) Indikatorvariablen. Die jeweils
zutreffende Gruppe wird in der jeweiligen Indikatorvariablen mit 1 kodiert; die nicht zutreffende mit 0 (ebenso wie bei der Dummy-Kodierung). Die “Referenzkategorie” (in unserem Beispiel Es gibt eigentlich keine echte Referenzkategorie (wie bei der Dummy-Kodierung). Vielmehr entspricht der Interzept dem Mittelwert über alle Gruppen hinweg. Analog zu
Wir müssen lediglich in
Bei der Effektkodierung entspricht unser Interzept
\(b_0\) dem Mittelwert der ungewichteten Gruppenmittelwerte. Die partiellen Steigungsgewichte \(b_j\) ( Leider können wir mit KonstrastkodierungBei der Kontrastkodierung können wir uns eigens gewählte Kontraste zwischen verschiedenen Gruppen anschauen. Die Gewichte \(c_i\) eines Kontrastes müssen der Bedingung genügen, dass die Summe der Gewichte über die Anzahl der zu kodierenden Kategorien \(i\) null ist, d.h. \(\sum\limits_{i} c_i = 0\). Die jeweilige Kodierung mit 0 in einer Indikatorvariablen sorgt dafür, dass eine Gruppe bzw. ein Fall nicht mit in einen Kontrast eingeht. Bei multiplen Kontrasten (d.h. mindestens zwei kontrastkodierten Variablen) können wir orthogonale (d.h. unkorrelierte) und nicht orthogonalen (d.h. korrelierte) Kontraste unterscheiden. Zwei Kontraste \(j\) und \(j'\) sind orthogonal wenn zusätzlich zur oberen Bedingung gilt: \(\sum\limits_{i} \, c_{ij} \cdot c_{ij'} = 0\) Im Folgenden werden wir nur einen Kontrast erstellen. Für mehr Informationen zur Orthogonalität von multiplen Kontrasten können wir z.B. bei Bortz & Schuster (2010) nachschauen. Wir kontrastieren Männer und Frauen hinsichtlicher der verbrachten Zeit auf der Instruktionsseite ( Dafür sortieren wir den Datensatz PWE_data_fac zuerst mit
Anschließend erstellen wir mit
rep(Gewichtung, Gruppengröße): Die jeweilige Gewichtung einer Gruppe (bzw. Kombination von Gruppen) richtet sich nach ihrer Größe. Wie genau funktioniertrep() ? Für die manuelle Erstellung von Indikatorvariablen kann man die Funktion Schauen wir uns die Funktionsweise der Funktion an einigen Beispielen an. Die Zahl 1 wird 10 mal (
Die Zahlenfolge
Wenn wir erst 10 mal die
Die Gewichte einer kontrastierten Gruppe (hier: jeweils Männer bzw. Frauen) werden so gewählt, dass sie aufsummiert 1 bzw. -1 ergeben. Wenn wir die gleiche Anzahl an Fällen in den zu kontrastierenden Gruppen haben, können wir die einzelnen Gewichte auch zu 1 bzw. -1 vereinfachen. Wenn wir ungleich große Gruppen haben, wie in unserem Beispiel, dann liegen die einzelnen Gewichtungen als Brüche vor z.B. \(c_{Männer} = \frac{1}{675}\) und
\(c_{Frauen} = -\frac{1}{627}\). Wenn wir die Elemente unserer kontrastkodierten Variablen Jetzt nehmen wir die kontrastkodierte Variable als Prädiktor in ein neues Regressionsmodell auf.
In unserem Regressionsmodell mit dem Kontrast Männer vs. Frauen entspricht der Interzept \(b_0\) dem Mittelwert der Gruppenmittelwerte der betrachteten Gruppen (d.h. Männer und Frauen) und das partiellen Steigungsgewichte \(b_1\) dem Unterschied in den Mittelwerten der betrachteten Gruppen.6. Summary-VariablenWenn wir nicht mit den Rohdaten arbeiten wollen, sondern Informationen von mehreren, aggregierten Variablen (z.B. Summenwerte, Mittelwerte) oder anderweitig transformierten Variablen (z.B. standardisierte Werte) auswerten wollen, müssen wir Summary-Variablen erstellen. Wir nutzen zu diesem Zweck den Datensatz PWE_data, welcher aus einer psychometrischen Erhebung stammt. Zu Beginn des Kapitels haben wir den Datensatz heruntergeladen. Die Werte der Variablen rowSums() , rowMeans() und select() : Summen- und MittelwerteWir schauen uns im Folgenden an, wie man Summen- und Mittelwerte von mehreren Variablen erstellt. Dieses Vorgehen ist beispielsweise für die Erstellung von Skalenwerten in der Testkonstruktion von großer Relevanz. Wir schauen uns den Summen- sowie den Mittelwert über alle Items der Protestant Work Ethic Scale an. Die Fragen wurden auf einer intervallskalierten Skala - von 1 (stimme nicht zu) bis 5 (stimme zu) - beantwortet und in den Variablen, die mit einem Q beginnen und einem A enden gespeichert. Um einen Summenwert, d.h. eine Summe einer Person über mehrere Variablen, zu bilden, können wir auf die Funktion Es ist zusätzlich sinnvoll, mit einer Kombination aus
Nun schauen wir uns die neu erstellte Variable (für die die ersten 10 Personen) einmal an: Wenn wir hingegen nicht den Summen- sondern den Mittelwert einer Person über Variablen
bilden wollen, nutzen wir Abschließend schauen wir uns wieder die neu erstellte Variable (für die die ersten 10 Personen) an: ifelse() : Auswahl bestimmter FälleJetzt schauen wir uns an, wie wir eine Variable nur für eine bestimmte Gruppe erstellen können. Dafür nutzen wir die Funktion Für unser Beispiel sollen alle Fälle, auf die die Bedingung(en) nicht zutreffen, ein Wenn wir mehrere Bedingungen nutzen wollen, können wir auf die logischen Operatoren zurückgreifen. Mit Wir nutzen
das gleiche Beispiel wie im Abschnitt vorher, nur dass wir jetzt nur den Summenwert für weibliche (
Schauen wir uns die neu erstellte Variable sowie die Gruppierungsvariablen (der Personen 687 bis 691 an, unter denen sich 2 von insgesamt 9 weibliche Buddhistinnen befinden) einmal an: mutate() : Summary-Variablen
als Funktion von anderen Variablen erstellenWenn wir neue Variablen erstellen wollen, die Funktionen von bestehenden Variablen sind, können wir die Funktion Nachdem wir schon den Mittelwert der Skale berechnet haben (
Abschließend können wir uns den neu erstellten Datensatz 7. Weitere wichtige HinweiseCheat Sheet dplyrWer Gefallen an den tidyverse-Funktionen StichprobengrößeEs ist generell sehr wichtig, auch bei der Datenvorbereitung, ein Auge auf die Stichprobengröße zu haben. Teilweise werden bei der Datenvorbereitung einige Untersuchungseinheiten aus der Analyse exkludiert und damit sinkt die Stichprobengröße \(N\). Wenn wir Auswertungen machen, in denen wir Ergebnisobjekte bekommen (z.B. bei der Regression mit ReplizierbarkeitWir sollten unsere R-Skripte generell großzügig kommentieren (mit Es lohnt sich auch, wenn man einen Datensatz (teil-)aufbereitet hat, diesen zu speichern, d.h. als neue Datei außerhalb von R zu exportieren (z.B. wenn man einen Datensatz vom Wide- ins Long-Format gebracht hat). Außerdem ist es sinnvoll, alle Schritte der Datenvorbereitung sowie Datenauswertung im gleichen Programm durchzuführen, um möglichen Kompatibilitätsproblemen zwischen verschiedenen Programmen vorzubeugen. Um eine möglichst exakte Replikation der Funktionen zu gewährleisten gibt es im folgenden relevante Angaben zum System (R-Version, Betriebssystem, geladene Pakete mit Angaben zur Version), mit welchem diese Seite erstellt wurde.
Für Informationen zur Interpretation dieses Outputs schaut auch den Abschnitt Replizierbarkeit von Analysen des Kapitels zu Paketen an. Was ist der Unterschied zwischen Zählenwenn und Zählenwenns?Zu beachten. ZÄHLENWENNS zählt die Anzahl der Zellen in einem Bereich, der die angegebenen Kriterien erfüllt. Im Gegensatz zur ZÄHLEWENN-Funktion kann ZÄHLENWENNS mehr als einen Satz von Kriterien mit mehr als einem Zellbereich anwenden.
Welche Excel Funktion addiert die Werte eines Tabellen Bereichs aber nur wenn diese eine bestimmte Eigenschaft haben?Mit der Funktion ZÄHLENWENN werden nur die Werte addiert, die einem einzelnen Kriterium entsprechen.
Wie funktioniert die Zählenwenns Funktion?Bei der ZÄHLENWENN-Funktion handelt es sich im Prinzip um eine Kombination aus der WENN-Funktion (eine logische Funktion) und der ANZAHL-Funktion bzw. der ANZAHL2-Funktion (statistische Funktionen). Die Kombination ergibt, dass Excel eine Zelle nur dann zählt, wenn ein bestimmter Wert erfüllt ist.
Wie funktioniert die Index Funktion in Excel?Die Indexfunktion von Excel ermöglicht es Ihnen, sich den Wert einer Zelle auszugeben zu lassen, die sich an einer bestimmten Position innerhalb einer Matrix befindet. Dabei wird über die Zeilen- und Spaltenposition deren Inhalt ermittelt. Die Indizes müssen vorher von Ihnen festgelegt werden.
|