Hallo, ich bräuchte eure Hilfe.
Ich habe einen Datensatz mit etwa 60 Vp und knapp über 500 Variablen - die meisten davon Fragebogendaten.
Nun hat natürlich Person x hier und da mal ein Item nicht beantwortet. In den entsprechenden Testmanualen wird z.B. empfohlen, bei weniger als 2 fehlenden Items pro Subskala die fehlenden Werte der Person x mit dem Mittelwert der restlichen beantworteten Items der Person x in dieser Subskala zu ersetzen. Dies sollte die Daten nicht allzu stark verfälschen.
Wie kann ich dies denn jetzt erreichen? D.h. ich möchte den entsprechenden fehlenden Wert (bisher mit '9' bezeichnet) durch den Mittelwert der restlichen Items ersetzen. Habt ihr einen Tipp, wie ich das erreichen kann - auch gerne mit entsprechender Syntax.
Bisher habe ich es nur so gefunden, dass der fehlende Wert der Person x für das Item durch den Mittelwert aller anderen Personen in diesem Item ersetzt wird.
Ich hoffe, ich konnte mein Problem einigermaßen erklären und ihr könnt mir dabei helfen.
LG Kat
Fehlende Werte in Fragebögen
-
- Beiträge: 939
- Registriert: 13.05.2008, 10:52
hallo,
das ist eigentlich ganz einfach und zwar:
wenn man den mittelwert berechnen muss --> nichts anderes tun als die funktion mean(var1, var2,... varx) zu benutzen. mean und auch sum bilden mittelwert bzw. summe über vorhandene items.
wenn man die summe berechnen muss --> mean(var1, var2,... varx) * anzahl der variablen.
kannst ja mal in einer excel-tabelle ausprobieren, um zu sehen, dass es stimmt.
das ist eigentlich ganz einfach und zwar:
wenn man den mittelwert berechnen muss --> nichts anderes tun als die funktion mean(var1, var2,... varx) zu benutzen. mean und auch sum bilden mittelwert bzw. summe über vorhandene items.
wenn man die summe berechnen muss --> mean(var1, var2,... varx) * anzahl der variablen.
kannst ja mal in einer excel-tabelle ausprobieren, um zu sehen, dass es stimmt.
-
- Beiträge: 114
- Registriert: 30.03.2009, 09:39
Hallo,
in Ergänzung zu Karin, würde ich das per Syntax in etwa so lösen:
***************.
* Die Zahl der Missings bei Subskala 1 ermitteln und
* die mit 9 codierten fehlenden Werte für Skala 1
* auf MISSING setzen.
COMPUTE zahl_miss_skala1 = 0.
DO REPEAT vars = skala1_v1 skala1_v2 skala1_v3.
DO IF vars = 9.
COMPUTE vars = $SYSMIS.
COMPUTE zahl_miss_skala1 = zahl_miss_skala1 + 1.
END IF.
END REPEAT.
EXE.
* Das gleiche jetzt mit Subskala 2.
COMPUTE zahl_miss_skala2 = 0.
DO REPEAT vars = skala2_v1 skala2_v2 skala2_v3.
DO IF vars = 9.
COMPUTE vars = $SYSMIS.
COMPUTE zahl_miss_skala2 = zahl_miss_skala2 + 1.
END IF.
END REPEAT.
EXE.
* Falls weitere Subskalen, dann den obigen Schritt mit diesen wiederholen.
* Mittelwerte der Subskalen berechnen.
COMPUTE mw_skala1 = RND(MEAN(skala1_v1, skala1_v2, skala1_v3)).
COMPUTE mw_skala2 = RND(MEAN(skala2_v1, skala2_v2, skala2_v3)).
EXE.
* Mittelwert der Subskala 1 einsetzen.
DO REPEAT vars = skala1_v1 skala1_v2 skala1_v3.
IF MISSING(vars) & zahl_miss_skala1 < 2 vars = mw_skala1.
END REPEAT.
EXE.
* Mittelwert der Subskala 2 einsetzen.
DO REPEAT vars = skala2_v1 skala2_v2 skala2_v3.
IF MISSING(vars) & zahl_miss_skala2 < 2 vars = mw_skala2.
END REPEAT.
EXE.
* Falls weitere Subskalen, dann den obigen Schritt mit diesen wiederholen.
***************.
, wobei ich davon ausgegangen bin, dass Du zwei Subskalen (skala1, skala2) mit jeweils 3 Variablen (v1, v2, v3) hast.
Dies musst Du entsprechend Deines tatsächlichen Datendesigns natürlich noch abändern.
Außerdem werden die Mittelwerte durch die Syntax gerundet. Falls Du das nicht wünschst, musst den RND-Befehl rausnehmen.
Ich hoffe, das hilft Dir weiter.
Beste Grüße vom
georggraph
in Ergänzung zu Karin, würde ich das per Syntax in etwa so lösen:
***************.
* Die Zahl der Missings bei Subskala 1 ermitteln und
* die mit 9 codierten fehlenden Werte für Skala 1
* auf MISSING setzen.
COMPUTE zahl_miss_skala1 = 0.
DO REPEAT vars = skala1_v1 skala1_v2 skala1_v3.
DO IF vars = 9.
COMPUTE vars = $SYSMIS.
COMPUTE zahl_miss_skala1 = zahl_miss_skala1 + 1.
END IF.
END REPEAT.
EXE.
* Das gleiche jetzt mit Subskala 2.
COMPUTE zahl_miss_skala2 = 0.
DO REPEAT vars = skala2_v1 skala2_v2 skala2_v3.
DO IF vars = 9.
COMPUTE vars = $SYSMIS.
COMPUTE zahl_miss_skala2 = zahl_miss_skala2 + 1.
END IF.
END REPEAT.
EXE.
* Falls weitere Subskalen, dann den obigen Schritt mit diesen wiederholen.
* Mittelwerte der Subskalen berechnen.
COMPUTE mw_skala1 = RND(MEAN(skala1_v1, skala1_v2, skala1_v3)).
COMPUTE mw_skala2 = RND(MEAN(skala2_v1, skala2_v2, skala2_v3)).
EXE.
* Mittelwert der Subskala 1 einsetzen.
DO REPEAT vars = skala1_v1 skala1_v2 skala1_v3.
IF MISSING(vars) & zahl_miss_skala1 < 2 vars = mw_skala1.
END REPEAT.
EXE.
* Mittelwert der Subskala 2 einsetzen.
DO REPEAT vars = skala2_v1 skala2_v2 skala2_v3.
IF MISSING(vars) & zahl_miss_skala2 < 2 vars = mw_skala2.
END REPEAT.
EXE.
* Falls weitere Subskalen, dann den obigen Schritt mit diesen wiederholen.
***************.
, wobei ich davon ausgegangen bin, dass Du zwei Subskalen (skala1, skala2) mit jeweils 3 Variablen (v1, v2, v3) hast.
Dies musst Du entsprechend Deines tatsächlichen Datendesigns natürlich noch abändern.
Außerdem werden die Mittelwerte durch die Syntax gerundet. Falls Du das nicht wünschst, musst den RND-Befehl rausnehmen.
Ich hoffe, das hilft Dir weiter.
Beste Grüße vom
georggraph
-
- Beiträge: 939
- Registriert: 13.05.2008, 10:52
hallo,
ich hab das früher auch so ähnlich wie georggraph beschrieben hat gemacht, zwar nicht mit schleife, aber auch anzahl missings ermittelt und wo und zig hilfvariablen erzeugt.
dann hab ich eine syntax geschickt bekommen und da war es
erstaunlicherweise
eben so gelöst für summenscore:
compute summe = mean(var1, var2, var3...) * anzahl items.
geht einfach halt auch.
ich hab das früher auch so ähnlich wie georggraph beschrieben hat gemacht, zwar nicht mit schleife, aber auch anzahl missings ermittelt und wo und zig hilfvariablen erzeugt.
dann hab ich eine syntax geschickt bekommen und da war es


compute summe = mean(var1, var2, var3...) * anzahl items.
geht einfach halt auch.

-
- Beiträge: 5
- Registriert: 24.04.2009, 09:18
Vielen Dank für eure schnellen Antworten!
Ich habe es jetzt mal so versucht, wie es georggraph vorgeschlagen hat. Prinzipiell ist das auch genau das, was ich gesucht habe. Diese Syntax ersetzt mir die fehlenden Werte durch die entsprechenden Mittelwerte, allerdings tut er dies auch, wenn mehr als 2 Werte fehlen. D.h. es fehlen z.B. 6 von 7 Werten, dann ersetzt diese Syntax die fehlenden 6 Werte durch den einen vorhandenen. Und gerade das darf ja nicht passieren.
Hier nochmal meine umgewandelte Syntax für eine der Subskalen:
**********************
* Die Zahl der Missings bei flz_fin ermitteln und
* die mit 9 codierten fehlenden Werte für Skala flz_fin
* auf MISSING setzen.
COMPUTE miss_flz_fin = 0.
DO REPEAT vars = flz_fin1 flz_fin2 flz_fin3 flz_fin4 flz_fin5 flz_fin6 flz_fin7.
DO IF vars = 9.
COMPUTE vars = $SYSMIS.
COMPUTE miss_flz_fin = miss_flz_fin + 1.
END IF.
END REPEAT.
EXE.
* Mittelwerte der Subskalen berechnen.
COMPUTE mw_flz_fin = RND(MEAN(flz_fin1 to flz_fin7)).
EXE.
* Mittelwert der Subskala flz_fin einsetzen.
DO REPEAT vars = flz_fin1 flz_fin2 flz_fin3 flz_fin4 flz_fin5 flz_fin6 flz_fin7.
IF MISSING(vars) & miss_flz_fin < 2 vars = mw_flz_fin.
END REPEAT.
EXE.
*******************
Lieber georggraph, kannst du mir sagen, was da falsch gelaufen ist?
Ich dachte in folgendem Ausdruck verbirgt sich die Bedingung "höchstens 1 fehlendes Item":
*****
IF MISSING(vars) & miss_flz_fin < 2 vars = mw_flz_fin.
*****
Liebe Grüße und vielen Dank schonmal im Voraus!!
Kat
Ich habe es jetzt mal so versucht, wie es georggraph vorgeschlagen hat. Prinzipiell ist das auch genau das, was ich gesucht habe. Diese Syntax ersetzt mir die fehlenden Werte durch die entsprechenden Mittelwerte, allerdings tut er dies auch, wenn mehr als 2 Werte fehlen. D.h. es fehlen z.B. 6 von 7 Werten, dann ersetzt diese Syntax die fehlenden 6 Werte durch den einen vorhandenen. Und gerade das darf ja nicht passieren.
Hier nochmal meine umgewandelte Syntax für eine der Subskalen:
**********************
* Die Zahl der Missings bei flz_fin ermitteln und
* die mit 9 codierten fehlenden Werte für Skala flz_fin
* auf MISSING setzen.
COMPUTE miss_flz_fin = 0.
DO REPEAT vars = flz_fin1 flz_fin2 flz_fin3 flz_fin4 flz_fin5 flz_fin6 flz_fin7.
DO IF vars = 9.
COMPUTE vars = $SYSMIS.
COMPUTE miss_flz_fin = miss_flz_fin + 1.
END IF.
END REPEAT.
EXE.
* Mittelwerte der Subskalen berechnen.
COMPUTE mw_flz_fin = RND(MEAN(flz_fin1 to flz_fin7)).
EXE.
* Mittelwert der Subskala flz_fin einsetzen.
DO REPEAT vars = flz_fin1 flz_fin2 flz_fin3 flz_fin4 flz_fin5 flz_fin6 flz_fin7.
IF MISSING(vars) & miss_flz_fin < 2 vars = mw_flz_fin.
END REPEAT.
EXE.
*******************
Lieber georggraph, kannst du mir sagen, was da falsch gelaufen ist?
Ich dachte in folgendem Ausdruck verbirgt sich die Bedingung "höchstens 1 fehlendes Item":
*****
IF MISSING(vars) & miss_flz_fin < 2 vars = mw_flz_fin.
*****
Liebe Grüße und vielen Dank schonmal im Voraus!!
Kat
-
- Beiträge: 114
- Registriert: 30.03.2009, 09:39
Hallo,
ich habe die von Dir angepasste Syntax nochmal bei mir getestet. Bei mir hat alles problemlos geklappt - sie hat wirklich nur dann den Mittelwert eingesetzt, wenn in den Variablen flz_fin1 bis flz_fin7 nur genau 1 Missing vorhanden war.
Weshalb es bei Dir nicht geklappt hat, ist mir leider auch rätselhaft
Schau Dir die Daten nochmal genau an und melde Dich nochmal, wenn Du noch Unterstützung brauchst.
Beste Grüße vom
georggraph
ich habe die von Dir angepasste Syntax nochmal bei mir getestet. Bei mir hat alles problemlos geklappt - sie hat wirklich nur dann den Mittelwert eingesetzt, wenn in den Variablen flz_fin1 bis flz_fin7 nur genau 1 Missing vorhanden war.
Weshalb es bei Dir nicht geklappt hat, ist mir leider auch rätselhaft

Schau Dir die Daten nochmal genau an und melde Dich nochmal, wenn Du noch Unterstützung brauchst.
Beste Grüße vom
georggraph
-
- Beiträge: 3
- Registriert: 28.06.2011, 16:44
Hey
ich hab das gleiche Problem, und es klappt auch wenn ich statt meinem benutzerdefiniertem fehlenden Wert halt über alle Variablen diesen suche und durch 9 ersetze. Ist aber sehr umständlich, gerade wenn ich alles an den alten Daten noch mal ausprobiere. WIe hast du es denn am Schluss gemacht? Ich habe versucht das If var = 9 und das end if wegzumachen, aber das funktioniert auch nicht.
Würd mich riesig über eine Anwort freuen.
Würd mich riesig über eine Anwort freuen.