Site menu:

Sprache auf englisch umschalten

cNORM - Datenaufbereitung

Inhalt

  1. Repräsentativität der Datenbasis
  2. Wahl der Stichprobengröße
  3. Datenaufbereitung in R
  4. Ermittlung der Perzentile und Normwerte
  5. Berechnung von Potenzen und Interaktionen
  6. In einem Schritt



Repräsentativität der Datenbasis

Der Ausgangspunkt einer Normierung sollte immer eine repräsentative Stichprobe sein. Die Herstellung der Repräsentativität ist eine der schwierigsten Aufgaben der Testkonstruktion und muss deshalb mit entsprechender Sorgfalt durchgeführt werden. Dabei ist es zunächst wichtig, diejenigen Variablen zu identifizieren, die systematisch mit der zu messenden Variable kovariieren. Bei Schulleistungs- und Intelligenztests sind dies in Deutschland beispielsweise die Schulform, das Bundesland, der sozioökonomische Hintergrund usw. Achtung: Die Vergrößerung einer Stichprobe nützt der Normierungssicherheit nur dann, wenn die genannten Variablen hierdurch nicht systematisch verzerrt bleiben oder verzerrt werden. So wäre es beispielsweise bei der Erhebung von Schulleistungstests nutzlos oder sogar kontraproduktiv, die Stichprobe weiter zu vergrößern, wenn die Stichprobe nur an einer einzigen Schulform oder nur in einem einzigen Bundesland erhoben wird.



Wahl der Stichprobengröße

Die Größe der notwendigen Stichprobe kann nicht allgemein verbindlich beziffert werden, sondern richtet sich danach, wie gut der Test (bzw. die Skala) in den Extrembereichen differenzieren muss. In Deutschland ist es beispielsweise üblich (wenn auch längst nicht immer sinnvoll), bei der Auswahl der geeigneten Schulform zwischen IQ < 70 (Förderschwerpunkt geistige Entwicklung) und IQ > 70 (Förderschwerpunkt Lernen) zu differenzieren. Ein IQ-Test, der für die Schulplatzierung eingesetzt wird, muss also in der Lage sein, eine Abweichung von 2 SD vom Mittelwert noch möglichst präzise abzubilden. Geht es hingegen um die Diagnose einer Lese-Rechtschreibstörung, dann reicht im Allgemeinen bereits eine Abweichung von 1,5 SD vom Populationsmittelwert für die Diagnose aus. Als Daumenregel für die Ermittlung der idealen Stichprobengröße lässt sich festhalten, dass die Normierungsunsicherheit vor allem in denjenigen Leistungsbereichen zunimmt, die nur noch mit geringer Wahrscheinlichkeit in der Normierungsstichprobe vertreten sind. (Dies gilt übrigens nicht nur für das hier vorgestellte nonparametrische Verfahren, sondern im Prinzip auch für alle parametrischen Normierungsverfahren.) So beträgt beispielsweise die Wahrscheinlichkeit, dass in einer repräsentativen Zufallsstichprobe von N = 100 kein einziges Kind einen IQ unter 70 aufweist, etwa 10%. Bei einer Stichprobengröße von N = 200 sinkt diese Wahrscheinlichkeit auf 1 %. Die Verdopplung der Stichprobengröße trägt in diesem Bereich also stark zur Erhöhung der Normierungssicherheit bei.



Datenaufbereitung in R

Wenn eine repräsentative Stichprobe in ausreichender Größe hergestellt wurde (Missings sollten ausgeschlossen werden), dann müssen die Daten zunächst eingelesen werden. Es ist sinnvoll, zunächst mit einem einfach strukturierten Datensatz vom Typ data.frame zu beginnen, der nur numerische Variablen ohne Wertelabels enthält. Es ist günstig, die gemessenen Testrohwerte mit dem Variablennamen "raw" zu bezeichnen, da dies die voreingestellte Bezeichnung in cNORM ist. Alle Variablennamen können jedoch auch individuell gewählt werden, müssen dann aber als Funktionsparameter angegeben werden. Die explanatorische Variable ist bei psychometrischen Leistungstests in der Regel das Alter. Diese Variable wird bei uns deshalb mit "age" bezeichnet. Tatsächlich muss aber dahinter nicht unbedingt eine Altersvariable stecken. Auch die Beschulungsdauer oder andere explanatorische Variablen können in die Modellierung einfließen. Es muss sich dabei aber um eine intervallskalierte (oder ggf. dichotome) Variable handeln. Als Letztes wird noch eine Gruppierungsvariable benötigt, um die explanatorische Variable in kleinere Normierungsgruppen zu unterteilen (z. B. Klassenstufen oder Altersgruppen). Das Verfahren ist relativ robust gegenüber Veränderungen in der "Feinheit" der Gruppenunterteilung. So hängt das Ergebnis der Normierung beispielsweise kaum davon ab, ob man Halbjahres- oder Ganzjahresabstufungen wählt (siehe A. Lenhard, Lenhard, Suggate & Segerer, 2016). Je stärker die zu messende Variable mit der explanatorischen Variable kovariiert, desto mehr Gruppen müssen zuvor gebildet werden. Die Gruppierungsvariable wird bei uns mit dem Variablennamen "group" bezeichnet.

Falls Sie bei der Verwendung von cNORM zunächst nur die kontinuierliche Altersvariable zur Verfügung haben, muss die Gruppierungsvariable daraus erst erstellt werden. Der folgende Code könnte hierbei hilfreich sein (eine andere Möglichkeit besteht in der weiter unten beschriebenen Funktion 'rankBySlidingWindow'):

# Generiert eine Gruppierungsvariable aus einer fiktiven Altersvariable
# für Kinder zwischen 2 und 18 Jahren. Die Variable Alter wird hierdurch
# in eine diskrete Gruppenvariable umkodiert, die pro Stufe einen Jahrgang
# umfasst.

data$group <- c(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)
  [findInterval(data$age, c(-Inf, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
  13, 14, 15, 16, 17))]

Es ist natürlich auch möglich, einen Datensatz zu verwenden, bei dem bereits Normwerte für einzelne Altersgruppen existieren. Eine kontinuierlich verteilte Altersvariable ist in diesem Fall nicht notwendig. Bei Verwendung von RStudio lassen sich Daten bequem über die Import-Funktion aus anderen Statistik-Umgebungen einlesen:


Für Demonstrationszwecke enthält cNORM bereits einen bereinigten Datensatz, welcher einem ehemaligen Normierungsprojekt entstammt (ELFE 1-6, W. Lenhard & Schneider, 2006, Untertest Satzverständnis) und den wir in der Folge zur Demonstration des Packages verwenden.

Ein weiterer großer (aber nicht repräsentativer) Datensatz, den wir hier zur Demonstration verwenden, basiert auf einem ins Deutsche adaptierten Wortschatztest (PPVT-4, A. Lenhard, Lenhard, Segerer & Suggate, 2015). Als weitere Datensätze für physiologische bzw. biometrische Daten enthält cNORM einen großen Datensatz des CDC mit Wachstumskurven von 2 bis 25 (Körpergröße, Gewicht und BMI) von über 45.000 Kindern und Jugendlichen aus den USA (CDC, 2012) und Daten der Weltbank zur weltweiten Entwicklung der Mortalität und Lebenserwartung Neugeborener. Informationen über die zwei Datensätze erhalten Sie, indem Sie ?elfe, ?ppvt, ?CDC, ?life oder ?mortality eingeben. Um die Datensätze zu laden, gehen Sie bitte wie folgt vor:

# Lädt das Package cNorm

library(cNORM)

# Kopiert den Datensatz "elfe" aus der globalen Umgebung in das Objekt 'normData'

normData <- elfe

# Oder verfahren Sie analog mit "ppvt"

normData <- ppvt

# Und schließlich die Daten zum Body Mass Index
# In der Folge muss in diesem Fall als 'raw'-Variable bei den weiteren Analyse 'bmi'
# angegeben werden

normData <- CDC

# Zeigt die ersten Reihen des Datensatzes

head(normData)

Wie man sieht, existiert im Datensatz "elfe" gar keine Altersvariable, sondern nur eine Personen-ID, ein Rohwert und eine Gruppierungsvariable. Die Gruppierungsvariable dient in diesem Fall gleichzeitig als kontinuierliche explanatorische Variable, da bei der Testnormierung Kinder nur ganz zu Beginn und in der Mitte des Schuljahres untersucht wurden. Der Wert 2.0 bedeutet beispielsweise, dass sich die Kinder zu Beginn des 2. Schuljahres befanden, der Wert 2.5 heißt, dass die Kinder in der Mitte des 2. Schuljahres untersucht wurden. Man könnte bei der Durchführung einer Normierung aber beispielsweise auch Kinder gleichmäßig über das ganze Schuljahr hinweg untersuchen. Die Beschulungsdauer ginge dann als explanatorische Variable ein, in der Gruppierungsvariable könnte jeweils die erste und die zweite Hälfte jedes Schuljahres zu einer Gruppe zusammengefasst werden.


Im "elfe"-Datensatz gibt es sieben Gruppen mit jeweils 200 Fällen, ingesamt also 1400 Fälle. Mithilfe des psych-Packages lassen sich deskriptive Daten, falls dies gewünscht wird, gruppenweise darstellen:

# Package installieren

install.packages("psych", dependencies = TRUE)

# Deskriptive Ergebnisse ausgeben

library(psych)
describeBy(normData, group="group")



Ermittlung der Perzentile und Normwerte

Der nächste Schritt besteht darin, in jeder Gruppe über die rankByGroup-Funktion einen Rangplatz für jede Person zu ermitteln. Die Funktion gibt Perzentile zurück und führt darüber hinaus eine Normalrangtransformation durch, bei der standardmäßig T-Werte (M = 50, SD = 10) zurückgeliefert werden. Grundsätzlich kommt unsere mathematische Methode auch ohne Normalrangtransformation aus, d. h. das Verfahren könnte theoretisch auch mit den Perzentilen durchgeführt werden. Dies bietet sich beispielsweise dann an, wenn man eine Größe erfassen möchte, die extrem von der Normalverteilung abweicht bzw. einer ganz anderen Verteilung folgt. Für die meisten psychischen oder physischen Skalen gilt allerdings, dass die Verteilungen selbst bei starken Boden- und Deckeneffekten noch genug Ähnlichkeit mit der Normalverteilung aufweisen. In diesen Fällen erhöht die Normalrangtransformation i. d. R. die Modellpassung und erleichtert die Weiterverrechnung der Daten. Außer als T-Werte können die Normwert auch als z- oder IQ-Werte zurückgegeben werden. Außerdem kann zwischen verschiedenen Ranking-Verfahren gewählt werden (RankIt, Blom, van der Warden, Tukey, Levenbach, Filliben, Yu & Huang). Wir wollen aber zunächst bei T-Werten und RankIt bleiben, die standardmäßig voreingestellt sind:

# Ermittlung der Perzentile getrennt nach Gruppen

normData <- rankByGroup(elfe, group = "group")

Um die Ranking-Methode zu ändern, muss die Methode mit method = x spezifiziert werden (x = Methodenindex; siehe Funktionshilfe). Der Normwert kann als T-Wert, IQ-Wert, z-Wert oder mithilfe eines Doppelvektors aus M und SD spezifiziert werden, z. B. scale = c(10, 3) für Wertpunkt-Skalen. Die Gruppierungsvariable kann deaktiviert werden, indem group = FALSE gesetzt wird. Die Normalrangtransformation wird dann auf die gesamte Stichprobe angewendet.

Bitte beachten Sie, dass es noch eine weitere Funktion zur Ermittlung des Rangplatzes gibt, welche ohne diskrete Gruppierungsvariable funktioniert. Der Rang jeder einzelnen Testperson wird dann auf Basis der kontinuierlichen explanatorischen Variablen mit Hilfe eines gleitenden Fensters geschätzt. Die Breite dieses Fensters lässt sich individuell spezifizieren. Bei einer kontinuierlichen Altersvariablen bedeutet die Spezifikation width = 0.5 beispielsweise, dass zur Bestimmung des Ranges alle Testpersonen herangezogen werden, die höchstens 3 Monate jünger oder älter sind als die betreffende Testperson. Die Breite des Fensters beträgt dann also insgesamt ein halbes Jahr.

# Schätzung der Normdaten mittels eines 'Sliding Windows' der Breite 'width'

normData2 <- rankBySlidingWindow(data = elfe, age = "group", raw = "raw",
  width = 0.5)

Allerdings ist die Verwendung der Funktion 'rankBySlidingWindow' nur dann sinnvoll, wenn die Altersvariable tatsächlich kontinuierlich ist. Im ,elfe'-Datensatz dient die Variable 'group' hingegen sowohl als kontinuierliche explanatorische Variable als auch als diskrete Gruppierungsvariable. Wir erhalten hier deshalb mit der Funktion 'rankBySlidingWindow' die gleichen Normwerte wie mit der Funktion ,rankByGroup'.

Bei beiden Ranking-Funktion ('rankBySlidingWindow' und 'rankByGroup') enthält der Datensatz nach Schätzung der Normwerte zwei zusätzliche Spalten, nämlich ,percentile' und ,normValue'. Zudem werden jedem Fall deskriptive Angaben zur jeweiligen Gruppe hinzugefügt, nämlich n, m, md und sd.




Die deskriptiven Ergebnisse sind nur unter bestimmten Umständen notwendig. Die Erstellung dieser Variablen kann über den Parameter 'descriptives' deaktiviert werden.



Berechnung von Potenzen und Interaktionen

An dieser Stelle, an der viele Testentwickler mit der Normierung bereits aufhören, beginnt der eigentliche Modellierungsprozess. Hierbei wird eine Funktion ermittelt, die den Rohwert in Abhängigkeit vom latenten Personenparameter l und von der explanatorischen Variable darstellt. Letztere bezeichnen wir im Folgenden mit a. Im ,elfe'-Beispiel verwenden wir für a die diskrete Variable ,group'. Falls eine kontinuierliche Altersvariable vorliegt, sollte diese wegen der höheren Präzision als explanatorische Variable a verwendet werden.

Zur Umsetzung des mathematischen Modells müssen alle Potenzen der Variablen l und a bis zu einem bestimmten Exponenten k gebildet werden. Anschließend müssen auch alle Interaktionen zwischen diesen Potenzen durch einfaches Ausmultiplizieren berechnet werden. Als Faustregel gilt, dass k > 5 zu Überanpassung führt. In der Regel wird aber bereits k = 4 oder sogar k = 3 ausreichen, um menschliche Leistungsdaten mit ausreichender Präzision zu modellieren. Bitte verwenden Sie für die Berechnung die folgende Funktion:

# Berechnung von Potenzen und Interaktionen bis zur vierten Potenz

normData <- computePowers(normData, k = 4, norm = "normValue", age = "group")

Der Datensatz hat jetzt 24 neue Variablen (k2 + 2*k), nämlich alle Potenzen von l (L1, L2, L3, L4), alle Potenzen von a (A1, A2, A3, A4 ) und alle Produkte aus den Potenzen (L1A1, L1A2, L1A3, ... L4A3, L4A4).



In einem Schritt

cNorm enthält außerdem auch eine bequeme Hilfsfunktion 'prepareData' mithilfe derer sowohl das Ranking als auch die anschließende Berechnung der Potenzen in einem Schritt durchgeführt werden können. Beachten Sie, dass hierfür die Variablen 'group' und 'raw' verwendet werden, sofern die Variablennamen nicht explizit angegeben werden.

# Verknüpft die Funktionen 'rankByGroup' und 'computePowers'

normData <- prepareData(normData)


# Variablennamen können ebenfalls angegeben werden
# Im Beispiel wird der CDC-Datensatz zur BMI-Entwicklung verwendet

data.bmi <- prepareData(CDC, group="group", raw="bmi", age="age")



Installation
Modellierung