Seite 1 von 1

Nested for loop

BeitragVerfasst: Mi 23. Sep 2020, 14:27
von hb144
Hi, ich möchte Personen aus einem Datensatz auf der Basis einiger Informationen matchen (Alter, Anzahl der Kinder, Bildung etc.).
Dazu möchte ich erstmal einen for loop ausführen, um eine Variable zu erstellen, die von 1 bis x die möglichen x Kombinationen aus den unterschiedlichen Informationen sozusagen durchnummeriert, z.B. wenn man 50 ist, 3 Kinder hat und einen Bachelor-Abschluss hat, dann bekommt man die 1 in der neuen Variable zugewiesen. Wenn man 51 ist mit 3 Kindern und Bachelor-Abschluss die 2 usw.
Dafür habe ich den folgenden loop geschrieben:
gen match = .
foreach i in 1 2 3 4 5 6 7 8 9 {
foreach j in 0 1 2 {
foreach k in 0 1 2 3 {
foreach l in 0 1 2 3 4 {
foreach m in 1 2 3 {
foreach n in 0 1 {
replace match = 2 if age_group == `i' & bbrn3_group == `j' & bbrn410_group == `k' & bbrn17_group == `l' & edu == `m' & homeowner == `n'
}
}
}
}
}
}

Ich weiß allerdings nicht, wie ich dafür sorgen kann, dass die Variable match die Werte 1-x (x = Anzahl der Kombinationsmöglichkeiten) annimmt, also wie ich match = 2 ändern muss, damit es so wird wie ich es möchte. Ich hatte an eine Liste list = [1,2,3,4,...,x] gedacht, aber weiß nicht, wie das in Stata geht. x müsste in dem Fall 3240 sein, da es 3240 verschiedene Kombinationsmöglichkeiten gibt (9 x 3 x 4 x 5 x 3 x 2).
Hat jemand eine Idee?

Vielen Dank im Voraus :)

Re: Nested for loop

BeitragVerfasst: Fr 25. Sep 2020, 11:01
von Staxa
Kannst du nicht Statas Interna zum matchen bzw. mergen benutzen?
Code: Alles auswählen
help merge


Das was du vorhast erscheint mir sehr fehleranfällig und umständlich. Falls du statistisch matchen willst, probiere exaktes Matchen oder CEM. Es gibt ein ausgezeichnetes Ado dazu:
Code: Alles auswählen
ssc install kmatch
help kmatch


Siehe auch : https://www.stata.com/meeting/uk17/slides/uk17_Jann.pdf

Für deine Aufgabe musst du eine local Variable erstellen, etwa so:

Code: Alles auswählen
local counter = 1
foreach NUM1 of numlist 1/10 {
    foreach NUM2 of numlist 1/10 {
        di "`counter'"
        local counter = `counter' + 1
    }
}