Datensätze vergleichen

mit dem Stata-Programm cfout

Referat von Jannis Hutt am 04.02.2020

Warum vergleichen?

Warum vergleichen?

Zwei mögliche Szenarien:

  1. Aufbereitung von Datensätzen: vergleichen, welche Verarbeitungsverfahren am Ende der Datenaufbereitung zu welchen Ergebnissen führen.
  2. Unterschiedliche Versionen eines Datensatzes vergleichen, um herauszufinden, wo diese verändert wurden.

Voraussetzungen

Zwei Grundvoraussetzungen müssen erfüllt sein:

  1. Eine Variable zur eindeutigen Identifikation des Datensatzes (in diesem Fall persnr)
  2. Die Variablen sowohl im Master- als auch Using Dataset müssen benannt sein.

Ausgangsbedingungen

Datensatz

  • In diesem Beispiel: SOEP-Datensatz von 2009 (Kohler/Kreuter)
  • Zwei modifizierte Versionen des Datensatzes: soep_v1.dat & soep_v2.dat
    Diese Datensätze wurden mithilfe eines Skripts modifiziert

Arbeitsumgebung


  • Do-File zum Vergleichen: cfout.do
  • Arbeitsverzeichnis: data
  • Darin die jeweiligen Datensätze
  • Ergebnisse in results
    (ist vor dem Vergleichen noch leer)
  • Skript zum Generieren der Daten: datagen.do

Ordnerstruktur:

.
├── cfout.do
├── data
│   ├── results
│   │   ├── diffs.dta
│   │   ├── diffs1.dta
│   │   ├── ...
│   │   └── diffs6.dta
│   ├── soep_master.dta
│   ├── soep_v1.dta
│   ├── soep_v2.dta
│   └── soep_v3.dta
└── datagen.do

Installation von cfout

Über den Stata-Paketmanager:


						. ssc install cfout
						

Vorgehen

Master-Dataset in den Speicher laden


							. cd "/pfad/zum/arbeitsverzeichnis/data"
							. use soep_master.dta, clear
						

Einfacher Vergleich


							. use soep_master.dta, clear
							. cfout state-mar using ///
								soep_v1, id(persnr)
							
							--------------------------------
							Number of differences: 17599
							Number of values compared: 21644
							Percent differences: 81.311%
							--------------------------------
						

Einfacher Vergleich

bei fehlenden Variablen und Beobachtungen


							. use soep_master.dta, clear
							. cfout hhnr2009-xweights using ///
								soep_v2, id(persnr)
							    
							note: the following variables are not in the using data:  yedu eqpter
							note: the following observations are only in the master data:
							
							+---------+
							|  persnr |
							|---------|
							|  409601 |
							…
							| 1310001 |
							+---------+
							
							---------------------------------
							Number of differences: 5319
							Number of values compared: 333932
							Percent differences: 1.593%
							---------------------------------
						

Unterschiede speichern


							. use soep_master.dta, clear
							. cfout wor01-wor12 using soep_v1, ///
								id(persnr) ///
								saving(results/diffs, replace)
							
							--------------------------------
							Number of differences: 52522
							Number of values compared: 64932
							Percent differences: 80.888%
							--------------------------------
							
							. use results/diffs.dta
							. browse
						

Unterschiede speichern

Unterschiede speichern

mit eigenen Variablennamen


							. use soep_master.dta, clear
							. cfout hhnr2009-xweights using soep_v2, ///
								id(persnr) ///
								saving( ///
									results/diffs1, ///
									variable(varname) ///
									masterval(soep_master) ///
									usingval(soep_v2) ///
									replace ///
								)
							
							--------------------------------
							Number of differences: 52522
							Number of values compared: 64932
							Percent differences: 80.888%
							--------------------------------
							
							. use results/diffs.dta
							. browse
						

Unterschiede speichern

mit eigenen Variablennamen

Alle Variablen in einem neuen Datensatz speichern


							. use soep_master.dta, clear
							. cfout hhnr2009-xweights using soep_v2, ///
								id(persnr) ///
								saving( ///
									results/diffs2, ///
									all replace ///
								)
							
							---------------------------------
							Number of differences: 5319
							Number of values compared: 333932
							Percent differences: 1.593%
							---------------------------------
							
							. use results/diffs2.dta
							. count if diff
							5,319
						

Variablen übernehmen

aus dem Master- oder Using Dataset


							. use soep_master.dta, clear
							. cfout hhnr2009-xweights using soep_v2, ///
								id(persnr) ///
								saving( ///
									results/diffs3, ///
									keepmaster(yedu) ///
									replace ///
								)
								
							note: the following variables are not in the using data:  yedu eqpter
							note: the following observations are only in the master data:
							
							---------------------------------
							Number of differences: 5319
							Number of values compared: 333932
							Percent differences: 1.593%
							---------------------------------
							note: not all observations were compared; there are observations only in the master data.
						

Speicherart erfassen


							. use soep_master.dta, clear
							. cfout hhnr2009-xweights using soep_v1, id(persnr) ///
								saving( ///
									results/diffs5, ///
									properties(type) ///
									replace ///
								)
							
							. use results/diffs5.dta
							. browse
						

Speicherart erfassen

Beispiel

…in dem es Sinn ergeben könnte, die Speicherart zu erfassen und weiterzuverarbeiten

Annahmen

  • Speicherplatz reicht nicht aus, um Geburtsdatum als Integer zu speichern
    Der Datentyp Integer lässt Werte von -32.767 – 32.740 zu.
  • Deshalb soll als Byte gespeichert werden
    Der Datentyp Byte lässt Werte von -127 – 100 zu.
  • Um als Byte zu speichern, müsste man 1909 Jahre vom Geburtsdatum subtrahieren

Lösungsweg

  1. Dummy-Variable isInteger für Integer-Variablen erstellen
  2. 1909 Jahre von jedem Geburtsdatum abziehen
  3. Datentyp ändern

Lösung


							// Wir arbeiten im Ergebnis-Datensatz
							. use results/diffs.dta, clear

							// Dummy-Variable für Integer-Variablen
							. gen isInteger = strmatch(type, "int")

							// Arbeitsvariablen für Datenoperation:
							// 1909 Jahre abziehen
							. gen new_master = Master-1909
							. gen new_using = Using-1909

							// Ersetzen der Original-Variablen
							. replace Master = new_master if isInteger
							. replace Using = new_using if isInteger

							// Hilfsvariablen inkl. Dummy-Variable löschen
							. drop new_master new_using isInteger

							// Datentyp von Using und Master auf Byte wechseln
							. recast byte Master Using

							// Und schon hat diffs.dta nur noch 1,07MB statt "monströsen" 1,20MB
							// Herzlichen Glückwunsch, wir haben 130kB gespart.
							// Das ist die 0,91-fache Kapazität einer 5,25" floppy disk 
							// (Apple Disk II DOS 3.3 war 140 KiB groß)
							// ((1983 war das das modernste Disketten-Betriebssystem auf dem Markt))
						

Quellen


https://slides.hutt.io/cfout.html