Anteilswerttests in Schleife

Fragen zu Stata Syntax und Do-Files.

Anteilswerttests in Schleife

Beitragvon florinvo » Di 11. Okt 2022, 15:24

Hallo zusammen,

ich arbeite mit europäischen Mikrodaten (EU-SILC) zum Thema Energiearmut im Mietsektor. Die entsprechende Energiearmutsvariable ener_poor ist binär codiert. Nun möchte ich mit prtest einen Einstichprobentest für einen Anteilswert durchführen, um die Hypothese zu überprüfen, dass der Anteil energiearmer Haushalte, die zur Miete wohnen, signifikant von dem Wert in der Grundgesamtheit abweicht und anschließend den p-wert in einer neuen Variable ikw_sign speichern. Dabei habe ich eine Variable tenure, die den Wohnstatus, eine Variable year, die das Beobachtungsjahr und eine Variable ctry, die das jeweilige Land der Beobachtung anzeigt. Die Datenstruktur sieht folgendermaßen aus:

ctry year tenure ener_poor ikw
1 2005 tenant 0 .0345208
1 2006 tenant 1 .0365275
1 2007 owner 0 .0279774
1 2009 tenant 1 .0346515
1 2012 owner 1 .0343459
1 2013 owner 1 .0321103
1 2006 tenant 0 .0365275
1 2007 owner 1 .0279774
1 2009 owner 0 .0346515
1 2010 tenant 0 .0367003
1 2011 owner 0 .0307313
1 2012 tenant 1 .0343459
1 2013 tenant 1 .0321103
1 2006 tenant 0 .0365275
1 2007 owner 0 .0279774
1 2010 owner 1 .0367003
1 2011 tenant 1 .0307313
1 2012 owner 0 .0343459
1 2013 owner 1 .0321103
1 2007 tenant 0 .0279774
1 2008 owner 0 .0451276
1 2009 tenant 0 .0346515
1 2010 owner 0 .0367003
1 2011 tenant 1 .0307313

Die Syntax für den Test für ein Jahr und ein Land ist mir klar und funktioniert auch soweit:

prtest ener_poor==.0345208 if ctry==1 & tenure==1 & year==2005
replace ikw_sign=r(p) if ctry==1 & tenure==1 & year==2005

Allerdings habe ich Daten für 27 Länder und bis zu 16 Jahre (2004-2020). Entsprechend würde ich das gerne in eine Schleife integrieren. Dabei habe ich die jeweiligen Antweilswerte in der Grundgesamtheit in einer Variable ikw abgespeichert und würde diese gerne daraus für den Anteilswerttest abrufen:

foreach x of varlist ctry{
forvalues i=2004(1)2020{
prtest ener_poor==ikw if ctry==`x' & tenure==1 & year==`i'
replace ikw_sign=r(p) if ctry==`x' & tenure==1 & year==`i'
}
}

Der Befehl funktioniert aber so nicht, da mit Blick auf die Syntax STATA hier davon ausgeht, dass es sich um einen Zweistichprobentest für einen Anteilswertvergleich mit zwei binär codierten Variablen handelt. Entsprechend bekomme ich eine Fehlermeldung, dass es sich bei ikw nicht um eine binär codierte Variable handelt. Hat jemand eine Idee, wie ich hier für ikw den jeweiligen Wert eingelesen bekomme, ohne dass STATA von einem Zweistichprobentest ausgeht und eine Fehlermeldung ausgibt?

Vielen Dank im voraus für eure Unterstützung!
florinvo
 
Beiträge: 4
Registriert: Di 11. Okt 2022, 13:50
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Anteilswerttests in Schleife

Beitragvon Staxa » Mi 12. Okt 2022, 08:56

Das grundsätzliche Problem bei deinen Analysen ist, dass du Mikro und Makrodaten zusammen in einer Datei behalten willst, was keine gute Idee ist. So hast du offenbar in deinem File Mikrodaten, die p-Werte die du am Ende bekommst, sind aber ja Makrodaten, beziehen sich also nicht auf einen Einzelfall, sondern eine ganze Gruppe. Die speicherst du aber einfach wieder in die Mikrodaten rein, was verwirrend ist. Grundsätzlich solltest du diese Ergebnisse am Ende anders abspeichern in einem neuen File, dazu gibt es etwa den Befehl postfile.

Um das Problem mit der Schleife zu lösen könntest du deine Makroindikatoren, also die jeweiligen Werte, gegen die du testen willst, in einem 2. Stata File speichern, jeweils eine Zweile pro Land und Zeitwert. Die Idee wäre dann, dass du in der Schleife die alte Datei zwischenspeicherst (preserve), die neue Datei lädst, die entsprechende Zeile über die Land und Zeitvariable nachschlägst, in ein local speicherst. die alte Datei wieder holst und den Test durchführst. Also etwa:

Code: Alles auswählen
foreach x of varlist ctry {
    forvalues i=2004(1)2020 {
        preserve
        use makro.dta, clear
        sum makrowert if ctry == `x' & year == `i'
        local testwert = r(mean)
        restore
        prtest ener_poor==`testwert' if ctry==`x' & tenure==1 & year==`i'
        post ...
    }
}
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 680
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Anteilswerttests in Schleife

Beitragvon florinvo » Mi 12. Okt 2022, 17:32

Hallo Staxa,

vielen Dank für Deine Antwort und den guten Lösungsvorschlag! Wenn ich die Schleife in dieser Form laufen lasse, führt STATA allerdings den sum Befehl unter Verwendung der Makrowerte aller Länder für ein bestimmtes Jahr und nicht für jedes Land einzeln aus. Dadurch stimmt dann der im local gespeicherte Wert nicht, da es der Mittelwert über alle Länder ist. Ich bin etwas ratlos, da mir in der Syntax eigentlich nichts falsches auffällt....hast Du eine Idee woran das liegen könnte?

Vielen Dank nochmal für Deine Unterstützung!
florinvo
 
Beiträge: 4
Registriert: Di 11. Okt 2022, 13:50
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Anteilswerttests in Schleife

Beitragvon Staxa » Mi 12. Okt 2022, 20:11

Das Problem ist also in der Zeile:

Code: Alles auswählen
sum makrowert if ctry == `x' & year == `i'


Oder was meinst du? Schau mal auf die Fallzahlen, die werden ja mit den Ergebnis angezeigt. Wenn die if-Bedingung korrekt gesetzt ist, dann müssen nur die richtigen Länder laufen. Anders kann ich mir das nicht erklären.
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 680
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Anteilswerttests in Schleife

Beitragvon florinvo » Do 13. Okt 2022, 13:44

Ja, die Zeile meinte ich. Im Ergebnis wird auch dann angezeigt, dass der Mittelwert über mehrere Beobachtungen gebildet wurde. Was aber mit dem Befehl und der zugrundeliegenden Datenstruktur eigentlich nicht passieren dürfte. Und auch der Anteilswerttest wird dann so ausgeführt als wäre die Bedingung ctry==`x' nicht gesetzt. Entsprechend läuft die Schleife auch nur so häufig durch, wie es Beobachtungsjahre gibt. Sehr seltsam....

Die ctry Variable ist auch nicht als string codiert oder Ähnliches..
florinvo
 
Beiträge: 4
Registriert: Di 11. Okt 2022, 13:50
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Anteilswerttests in Schleife

Beitragvon Staxa » Fr 14. Okt 2022, 08:45

Zur Ferndiagnose ist das schwierig. Zum Debuggen kann man nur einen Teil des Datensatzes benutzen und einfache Debug Meldungen ausgeben, also etwa

Code: Alles auswählen
di "P1 reached"


Immer auch anzeigen lassen, "wo" man gerade ist, also in der Schleife denn etwa

Code: Alles auswählen
di "`x' `i'"


damit du siehst, wo die Schleife rein läuft. Die Freuden der Programmierung. Andernfalls auch assert nutzen um Breakpoints einzubauen.
Stata für Anfänger: www.statabook.com
Staxa
 
Beiträge: 680
Registriert: Di 27. Feb 2018, 12:56
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Anteilswerttests in Schleife

Beitragvon florinvo » Fr 14. Okt 2022, 12:21

Ich habe den di Befehl jetzt einmal eingebaut. Aus irgendeinem Grund hat Stata die einzelnen Werte der ctry variable nicht erkannt in der Schleife. Ich habe sie jetzt in eine Stringvariable umcodiert und ein local benutzt. Jetzt läuft die Schleife auch so, wie sie es soll (warum auch immer) :). Vielen Dank für Deine Geduld und hilfreichen Hinweise! Jetzt habe ich auch wieder ein paar neue Befehle gelernt, mit denen ich zukünftig Probleme analysieren und lösen kann :)
florinvo
 
Beiträge: 4
Registriert: Di 11. Okt 2022, 13:50
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post


Zurück zu Stata Syntax

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

cron