Datenbereinigung

Alles zum Thema der beschreibenden Statistik

Moderator: jogo

Carolin
Beiträge: 16
Registriert: Fr Okt 04, 2019 2:36 pm

Datenbereinigung

Beitrag von Carolin »

Liebe alle,

ich habe einen riesigen Längsschnittdatensatz zum Pendelverhalten, in dem die Versuchspersonen u.a. die tägliche Pendeldauer angeben mussten. Nun gibt es über 60 Personen, die ich aufgrund einer Pendeldauer von Null oder größer als 300 Min aus der Analyse ausschließen möchte.

Bei einzelnen Outliern hab ich das bisher so gemacht, dass ich die entsprechende Zeilennummer ermittelt habe und dann mit [-c(Zeilennummer),]die Zeile gelöscht habe.
Das wäre bei der Masse an Outliern aber unpraktisch.

Gibt es eine Möglichkeit, den Befehl so zu schreiben, dass er alle Personen, die eine Pendeldauer < 1Min und größer 300 Min haben, alle aufeinmal auszuschließen?

Viele Grüße
Carolin
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Datenbereinigung

Beitrag von Athomas »

Gibt es eine Möglichkeit, den Befehl so zu schreiben, dass er alle Personen, die eine Pendeldauer < 1Min und größer 300 Min haben, alle aufeinmal auszuschließen?
Ja!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Datenbereinigung

Beitrag von bigben »

which() hilft bei Finden der betreffenden Zeilennummern.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Carolin
Beiträge: 16
Registriert: Fr Okt 04, 2019 2:36 pm

Re: Datenbereinigung

Beitrag von Carolin »

Ich hab jetzt nochmal ein bisschen rumprobiert mit ifelse. Das klappt auch und reduziert meinen Gesamtdatensatz um circa 200 Personen (die entweder angaben, 0 minuten oder mehr als 180 minuten zu pendeln).
Ich hatte vorher im unbereinigten Zustand 1004 n's und 514 NA's. Nach dem Filtern hat sich das Verhältnis von n und NA's dramatisch verändert. Mittlerwele gehen nur noch 478 n in die Berechnung ein bei 848 NA's. Dabei habe ich doch nur 200 Personen ausgeschlossen. Wie kann das sein?

Hier mal der entsprechende Ausschnitt aus meinem "gekniteten" markdown

describe(selected.data$T2_cvar1) # mean 65.58 SD 127.84 NAs 518 n 1004 --> alle 2 SDs über Mean raus: 321,26 --> zu groß, 180 als cut-off
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 1004 65.58 127.84 25 33.89 22.24 0 999 999 3.97 17.2
## se
## X1 4.03
selected.data$T2_cvar1_select <- ifelse(is.na(selected.data$T2_cvar1) == TRUE, selected.data$T2_cvar1, ifelse(selected.data$T2_cvar1 > 0 & selected.data$T2_cvar1 < 181, selected.data$T2_cvar1, -999))

selected.data<- selected.data[selected.data$T2_cvar1_select != -999, ]
# 118 partcipants excluded, 1406 remain

table(selected.data$T3_cvar1)
##
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18
## 22 4 4 8 2 19 2 5 7 1 66 1 6 1 1 71 1 2
## 20 22 23 25 30 32 33 35 40 44 45 50 52 55 60 65 66 70
## 83 4 2 35 86 1 1 34 29 1 48 19 1 3 35 2 1 3
## 75 80 90 100 105 110 120 130 140 180 195 200 210 240 300 320 360 400
## 2 5 7 8 1 1 15 1 1 1 1 6 1 2 5 1 1 5
## 500 600 660 700 800 880 900
## 1 4 1 2 6 1 1
selected.data$T3_cvar1_select <- ifelse(is.na(selected.data$T3_cvar1) == TRUE, selected.data$T3_cvar1, ifelse(selected.data$T3_cvar1 > 0 & selected.data$T3_cvar1 < 181, selected.data$T3_cvar1, -999))

selected.data<- selected.data[selected.data$T3_cvar1_select != -999, ]
#60 people excluded, 1346 remain

selected.data$T4_cvar1_select <- ifelse(is.na(selected.data$T4_cvar1) == TRUE, selected.data$T4_cvar1, ifelse(selected.data$T4_cvar1 > 0 & selected.data$T4_cvar1 < 181, selected.data$T4_cvar1, -999))

selected.data<- selected.data[selected.data$T4_cvar1_select != -999, ]
# 19 people excluded, 1327 remain

selected.data$T5_cvar1_select <- ifelse(is.na(selected.data$T5_cvar1) == TRUE, selected.data$T5_cvar1, ifelse(selected.data$T5_cvar1 > 0 & selected.data$T5_cvar1 < 181, selected.data$T5_cvar1, -999))

selected.data<- selected.data[selected.data$T5_cvar1_select != -999, ]
# 3 people excluded, 1324 remain

describe(selected.data$T2_cvar1)
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 476 33.66 28.94 25 28.59 14.83 1 180 179 2.04 4.83
## se
## X1 1.33
summary(selected.data$T2_cvar1)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 1.00 15.00 25.00 33.66 40.00 180.00 848
describe(selected.data$T3_cvar1)
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 476[/b] 31.33 23.77 25 27.84 14.83 1 180 179 1.99 5.8
## se
## X1 1.09
describe(selected.data$T4_cvar1)
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 476 29.85 22.66 25 26.53 14.83 1 150 149 2.07 5.98
## se
## X1 1.04
describe(selected.data$T5_cvar1)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 476 29.2 21.73 25 26.2 14.83 1 160 159 1.99 6.33 1
### I excluded all persons which indicated a commute duration shorter than 1 min or longer than 180 min for each time point.--> they always had to commute between 1 and 180 minutes to be part of the analysis.

#--> why did my NAs grow?


Liebe Grüße und ein schönes Wochenende
Carolin
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datenbereinigung

Beitrag von jogo »

Hallo Carolin,

das ist alles sehr schwer zu lesen und entspricht nicht den Anforderungen hier im Forum,
siehe: viewtopic.php?f=20&t=29

Die Konstruktion

Code: Alles auswählen

is.na(...) == TRUE
ist verquast (soll heißen doppelt gemoppelt) und macht nichts anderes als

Code: Alles auswählen

is.na(...)
(auch die Konstruktion Rundrum um jene Stellen ist zu umständlich)
Wenn ich den Code beim groben Lesen richtig verstanden habe, lässt Du NA wie sie sind und führst in anderen Fällen neue Kennzeichen dafür ein, dass Du den Wert nicht akzeptieren möchtest (bei Dir -999).
Du wirst um eine sauberes Filtern Deiner Datensätze nicht herumkommen (das geht mit subset() oder mit einer Indizierung der Zeilen über einen logischen Vektor). Aus meiner Erfahrung heraus empfehle ich Dir, das Ergebnis dieses Filters in einen neuen Dataframe zu packen - so bleiben die originalen Daten unverändert. Alternativ kannst Du auch immer wieder neu die Daten einlesen.

Gruß, Jörg
Carolin
Beiträge: 16
Registriert: Fr Okt 04, 2019 2:36 pm

Re: Datenbereinigung

Beitrag von Carolin »

Hallo Jörg,

vielen Dank für deine Antwort. Und Entschuldigung wegen des langen inputs; ich hatte die Nutzungsrichtlinien tatsächlich noch nicht gelesen.

das mit dem abspeichern im neuen Datenframe wollte ich umgehen, damit ich die nächsten 600 Zeilen, die ich schon geschrieben habe, wieder umschreiben muss :D das war also reine Faulheit.

Das gezielte Filtern der entsprechenden Fälle über die Zeilen erscheint mir bei über 200 Personen sehr aufwändig.

Verstehst du, warum die Anzahl meiner NAs durch das filtern so massiv gestiegen ist? Die gefilterten Personen können es ja nicht sein.

Viele Grüße,
Carolin
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datenbereinigung

Beitrag von jogo »

Hallo Carolin,
Carolin hat geschrieben: Fr Okt 25, 2019 8:59 pm das mit dem abspeichern im neuen Datenframe wollte ich umgehen, damit ich die nächsten 600 Zeilen, die ich schon geschrieben habe, wieder umschreiben muss :D das war also reine Faulheit.
dann muss man für Datensicherheit sorgen, indem man nach dem Einlesen

Code: Alles auswählen

Data <- read....
gleich

Code: Alles auswählen

Data0 <- Data
schreibt.
Wenn die nächsten 600 Zeilen genau so aussehen, wie der bisherige Quelltext, kann man bestimmt 400 davon einsparen bei guter Programmierung.
... sorry :oops:
Das gezielte Filtern der entsprechenden Fälle über die Zeilen erscheint mir bei über 200 Personen sehr aufwändig.
Verstehst du, warum die Anzahl meiner NAs durch das filtern so massiv gestiegen ist? Die gefilterten Personen können es ja nicht sein.
Du filterst/selektierst ja nicht wirklich, denn Du reduzierst ja nicht die Anzahl der Datensätze in Deinem Dataframe.

Gruß, Jörg
Carolin
Beiträge: 16
Registriert: Fr Okt 04, 2019 2:36 pm

Re: Datenbereinigung

Beitrag von Carolin »

Achso, nein, ich überschreibe nicht das Datenset, was ich eingelesen habe. Das ist schon ein subset.

Und zu den NAs: ich glaube schon, dass zu einer Reduktion der Beobachtungen führt. Zumindest sehe ich das im Environment, dass meine Observations um circa 200 Personen schrumpfen, wenn ich die Selektion für alle 4 Wellen durchführe.
Aber warum wirkt sich das auf die Anzahl meiner NAs aus und reduziert mein n mehr als Versuchspersonen "rausselektiert" werden? Ist an meinen Code etwas falsch?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datenbereinigung

Beitrag von jogo »

Carolin hat geschrieben: Sa Okt 26, 2019 5:03 pm Achso, nein, ich überschreibe nicht das Datenset, was ich eingelesen habe.
ok, das ist schon mal gutes handling.
Und zu den NAs: ich glaube schon, dass zu einer Reduktion der Beobachtungen führt. Zumindest sehe ich das im Environment, dass meine Observations um circa 200 Personen schrumpfen, wenn ich die Selektion für alle 4 Wellen durchführe.
Aber warum wirkt sich das auf die Anzahl meiner NAs aus und reduziert mein n mehr als Versuchspersonen "rausselektiert" werden? Ist an meinen Code etwas falsch?
Dein Code ist für mich unleserlich. Deshalb kann ich auch nicht genau beurteilen, ob etwas falsch ist.
... nur er macht nach meiner groben Begutachtung den Eindruck, dass ...
Ohne Daten ist das ohnehin schwierig zu beurteilen. Du hast nicht zufällig einen Dropbox-Link zu einer Datei, die Du mit save() oder mit save.image() erzeugt hast?

Was meinst Du mit Wellen, etwa die verschiedenen Auswahlbedingungen?

Gruß, Jörg
Carolin
Beiträge: 16
Registriert: Fr Okt 04, 2019 2:36 pm

Re: Datenbereinigung

Beitrag von Carolin »

Hallo Jörg,

mit den verschiedenen Wellen meine ich die 4 Ergebungszeitpunkte, zu denen jeweils die Pendeldauer der Teilnehmer erfragt wurde.

Ich habe gerade wieder Ewigkeiten versucht, den Code umzuschreiben, dass zum Zeitpunkt 1,2,3 und 4 die Personen, die weniger als 1 und länger als 180 Minuten Pendeln, rausgeschmissen werden.
Hinsichtlich der observations klappt das auch (der Datensatz reduziert sich von 1522 auf 1324), aber mein Verhältnis von n und Na ändert sich dramatisch( T1 n von 1004 auf 476, T1 NA von 518 auf 848. Dabei dürfte ich doch bei ursprünglich max. 198 Beobachtungen durch eben jene 198 Personen, die entweder bei T1,2,3 oder 4 meine Bedingung nich erfüllen,verlieren, oder? Wieso steigen meine NAs überhaupt an? Ich schreibe doch im Code, das NAs NAs bleiben sollen.

Ich weiß wirklich nicht mehr weiter....Hab ich dabei irgendwo einen Denkfehler?
Antworten