Seite 1 von 1

Merkmalsausprägungen finden, die nicht koexistieren

BeitragVerfasst: Mo 12. Sep 2022, 09:36
von BenediktK
Guten Morgen :)
Ich suche eine automatisierte Möglichkeit um herauszufinden welche Ausprägungskombination zwischen zwei Variablen (über alle Variablen) eines Datensatzes nicht auftreten.
Dafür bin ich bisher wie folgt vorgegangen:

1. Dummyvariablen für alle Variablen erstellen, die neuen Variablen enthalten also je eine Ausprägung der Variablen:

tab VariableX, gen(VariableX)
tab VariableY, gen(VariableY)
(...)
tab VariableN, gen(VariableN)

2. Jeweils zwei der Dummyvariablen unterschiedlicher Variablen werden aufaddiert und in eine neue Variable geschrieben.

gen X1Y1 = VariableX1 + VariableY1
recode X1Y1 (2=1) (1=0) (0=0)
gen X1Y2 = VariableX1 + VariableY2
recode X1Y1 (2=1) (1=0) (0=0)
(...)
gen X1YN = VariableX1 + VariableYN
recode X1YN (2=1) (1=0) (0=0)

gen X2Y1 = VariableX2 + VariableY1
recode X1Y1 (2=1) (1=0) (0=0)
gen X2Y2 = VariableX2 + VariableY2
recode X2Y1 (2=1) (1=0) (0=0)
(...)
gen X2YN = VariableX1 + VariableYN
recode X2YN (2=1) (1=0) (0=0)
*Dies wird wiederholt mit allen Ausprägungen i,j und allen Variablen A-Z

3. Alle neuen Kombinationsvariablen werden mittels sum einzeln überprüft. Ist die Anzahl des gesamten Observationen gleich der Häufigkeit von 1, tritt die Ausprägungskombination im Datensatz nicht auf.

sum X1Y1
sum X2Y1
(...)

Die Vorgehensweise ist bei wenigen Variablen mit wenigen Ausprägungen machbar. Für Datensätze mit mehr Variablen, beziehungsweise mehr Ausprägungen pro Variablen steigt schnell der benötigte Schreibaufwand.
Ich vermute, dass man den 2. Schritt mit einer Foreach-Schleife lösen könnte, allerdings bin ich mit den multiplen Indizes überfordert. Es wäre schön, falls hier jemand helfen könnte.
Beste Grüße und vielen Dank!
Benedikt

Re: Merkmalsausprägungen finden, die nicht koexistieren

BeitragVerfasst: Mo 12. Sep 2022, 11:12
von Staxa
Mh ob das der beste Weg ist? Eigentlich liefert der tab Befehl ja die Nullzellen direkt, man muss sie nur raussuchen. Ich habe da mal einen Befehl dafür geschrieben. Hier mit einem Setup:

Code: Alles auswählen
clear all
webuse nhanes2
replace race = 1 if race == 3 & region == 3
replace race = 3 if race == 2 & region == 1
tab race region


Wie wir sehen treten zwei Nullzellen auf in diesem Beispiel. Hier das Programm:

Code: Alles auswählen
cap program drop nullfinder
program define nullfinder
   args var1 var2
   qui tab `var1'
   local nrows = r(r)
   qui tab `var2'
   local ncols = r(r)
   tab `var1' `var2', matcell(res)
   *matrix list res
   forvalues r = 1/`nrows' {
      forvalue c = 1/`ncols' {
         if res[`r',`c'] == 0 {
            di "Leere Zelle gefunden!"
            preserve
            qui replace `var1' = `r' in 1
            qui replace `var2' = `c' in 1
            tab `var1' `var2' if `var1' == `r' & `var2' == `c'
            restore            
         }
      }
   }   
end

nullfinder region race

Die Anzeige ist etwas frickelig aber man sieht auf diese Weise direkt angezeigt welche Nullzellen bestehen. Dann muss man nur noch über alle Kombinationen loopen:


Code: Alles auswählen
ssc install tuples, replace
tuples sex race smsa region, min(2) max(2)
forvalues i = 1 / `ntuples' {
   nullfinder `tuple`i''
}

Re: Merkmalsausprägungen finden, die nicht koexistieren

BeitragVerfasst: Mo 12. Sep 2022, 11:33
von BenediktK
Danke für die Hilfe! Das sieht sehr gut aus, gerade führt mein Stata eine längere Imputation durch, danach werde ich das mal versuchen und mich zurückmelden :)

Re: Merkmalsausprägungen finden, die nicht koexistieren

BeitragVerfasst: Mo 12. Sep 2022, 13:56
von BenediktK
Super, das Programm läuft :) Nur kann ich Tuples nicht herunterladen, ich versuche mal das anderweitig in den Griff zu bekommen.