Seite 1 von 2

Einen Paneldatensatz erstellen

Verfasst: Mo Okt 23, 2023 4:39 pm
von kosa
Liebe Forumsmitglieder,

ich habe einen Längschnitts-Datensatz im long-format, d.h. jeder Teilnahme an der mehrwelligen Befragung wird in einer Zeile gespeichert. So wird die Teilnahme der Person x mit Teilnahmecode "AH2D" zum ersten Messzeitpunkt in einer Zeile gespeichert und die Teilnahme derselben Person zum zweiten Messzeitpunkt in einer neuen Zeile gespeichert. Insgesamt gab es drei Messzeitpunkt.

Der Datensatz könnte beispielhaft so aussehen:

Code: Alles auswählen

dat<-data.frame(
"id" = c("A","A","A", "B","B","C","C","D"),
"time" = c("1", "2","3", "1", "2","1","3","2"),
"gender" = c("male","male", "male", "female", "female","male","male", "female"),
"age" = c(22,22,23,45,46,67,68,29))
Wie man sehen kann, hat nicht jede Person zu allen drei Messzeitpunkten teilgenommen. Es gibt Personen, die nur einmal (zu Zeitpunkt 1,2 oder 3) und Personen die zweimal (zu Zeitpunkt 1 und 2, 2 und 3 oder 1 und 3) teilgenommen haben.

Ich würde nun gern zwei Spalten erstellen:

In der Spalte "Anzahl Teilnahme" würde ich gern festhalten, wie oft die Person teilgenommen hat. In der zweiten Spalte "Teilnahme" würde ich gern die Kombination der Teilnahme festhalten. Hier gäbe es die Werte: T1, T2, T3, T1&2, T1&3, T2&3, sowie T1&2&3.

Das Ziel ist, dass ich den Datensatz später entsprechend filtern kann.

Ich habe bereits mit dem Package "plm" und der Funktion pdata.frame() versucht so etwas zu erstellen. Mit einem Table-Befehl konnte ich mir sogar für jeden Teilnehmenden anzeigen lassen, zu welchen Zeitpunkten er/sie teilgenommen hat (siehe Bild unten; Anmerkung Datensatz heißt im Bild sub_dat_wide2 und Teilnahmecodes sind etwas komplexer als im Beispiel oben)

Mir gelingt es jedoch nicht, die entsprechenden Spalten, die ich gern hätte, zu erstellen.


Weißt jemand, wie man das am besten macht?

Vielen Dank vorab.:)

Re: Einen Paneldatensatz erstellen

Verfasst: Di Okt 24, 2023 9:44 am
von Athomas
In der zweiten Spalte "Teilnahme" würde ich gern die Kombination der Teilnahme festhalten. Hier gäbe es die Werte: T1, T2, T3, T1&2, T1&3, T2&3, sowie T1&2&3.
Warum willst Du das tun: die schön übersichtliche Darstellung als Indikatorvariablen - 1 falls vorhanden, 0 wenn nicht - umwandeln in eine verquaste character-Kombinationsvariable :shock: ?

Ich sehe nicht, dass man dadurch irgendwas besser "filtern" könnte!?

Re: Einen Paneldatensatz erstellen

Verfasst: Di Okt 24, 2023 10:04 am
von kosa
Hallo Athomas,

ich würde das gern machen, damit ich für Analysen zum Beispiel die Teilnehmende aussuchen kann, die auch wirklich dreimal mal teilgenommen haben.

Mir ist bewusst, dass ich die Filterung auch über die Darstellung in der Tabelle filtern könnte, aber mir gelingt es zum Beispiel auch nicht diese Tabelle mit den Indikatorvaribalen 1 und 0 für jeden Messzeitpunkt eines Teilnehmenden an meinen dataframe zu mergen.

Da bräuchte ich Hilfe! :)

Re: Einen Paneldatensatz erstellen

Verfasst: Di Okt 24, 2023 10:11 am
von Athomas
aber mir gelingt es zum Beispiel auch nicht diese Tabelle mit den Indikatorvaribalen 1 und 0 für jeden Messzeitpunkt eines Teilnehmenden an meinen dataframe zu mergen.
Woran scheitert es? Das allgemeine Vorgehen beim "mergen" ist Dir klar?
Gib doch einfach ein kleines Beispiel und zeig, was Du machst!

Re: Einen Paneldatensatz erstellen

Verfasst: Di Okt 24, 2023 10:19 am
von Athomas
Ich muss gleich weg, deshalb mach ich mal ein kleines Beispiel, wie man den Datensatz in eine äquivalente "breite" Darstellung überführt - vielleicht hilft es ja was!

Code: Alles auswählen

library(data.table)

dat <- data.table(
  id     = c("A","A","A", "B","B","C","C","D"),
  time   = c("1", "2","3", "1", "2","1","3","2"),
  gender = c("male","male", "male", "female", "female","male","male", "female"),
  age    = c(22,22,23,45,46,67,68,29))

dat.wide <- dcast(dat, id ~ time, value.var=c("gender","age"))

Re: Einen Paneldatensatz erstellen

Verfasst: Di Okt 24, 2023 11:37 am
von kosa
Vielen Dank für die ganzen Hinweise und Reindenken.

Die Transformation in einen Wide-Datensatz habe ich auch bereits probiert. Da bekomme ich immer die folgende Warnung: 'Aggregate function missing, defaulting to 'length'.

Hinzukommt, dass das Alter der Teilnehmer, dann nicht mehr angezeigt wird. Das ganze sieht dann so aus:

Bild

Re: Einen Paneldatensatz erstellen

Verfasst: Di Okt 24, 2023 12:04 pm
von Athomas
Das ist aber nicht das, was ich gemacht habe!?

Code: Alles auswählen

> dat.wide
   id gender_1 gender_2 gender_3 age_1 age_2 age_3
1:  A     male     male     male    22    22    23
2:  B   female   female     <NA>    45    46    NA
3:  C     male     <NA>     male    67    NA    68
4:  D     <NA>   female     <NA>    NA    29    NA

Re: Einen Paneldatensatz erstellen

Verfasst: Di Okt 24, 2023 12:12 pm
von bigben
In jedem Fall ist es mit einem anderen Datensatz gemacht worden, wie man unschwer an der id-Spalte sehen kann.
Der Datensatz ist hier wichtig:
https://www.statology.org/r-aggregate-f ... to-length/

Anstelle des Bildschirmfotos wäre es interessant zu sehen, ob da irgendwo noch was anderes als 0 und 1 steht.

LG,
Bernhard

Re: Einen Paneldatensatz erstellen

Verfasst: Mi Okt 25, 2023 3:23 pm
von Athomas
Ich bitte zu bedenken, dass mein "dcast" die wunderbare Funktion aus dem ebenfalls wunderbaren Package :D "data.table" ist - und nicht das aus "reshape2", auf das sich der verlinkte Artikel bezieht!

Re: Einen Paneldatensatz erstellen

Verfasst: Mi Okt 25, 2023 4:11 pm
von bigben
Der Hinweis ist angemessen und das war mir durchaus bewusst :D . Aaaaber, für dcast.data.table finde ich in der Erklärung des Parameters fun.aggregate den Hinweis, dass dcast.data.table sich ebenso verhält:
Should the data be aggregated before casting? If the formula doesn't identify a single observation for each cell, then aggregation defaults to length with a message.
Ob die message die gleiche ist habe ich freilich nicht geprüft. Die Abhängigkeit von den Daten und das Umschalten auf Zählen scheinen aber identisch zu sein. :)

LG,
Bernhard