Dummies per Loop generieren

Fragen zu Stata Syntax und Do-Files.

Dummies per Loop generieren

Beitragvon raider1986 » Sa 5. Apr 2014, 14:52

Hallo liebe Statauser,

ich habe folgendes Problem: ich habe eine Dummyvariable namens rating_change, welche meistens den Wert 0 annimmt und ein paar mal den Wert 1. Ich möchte nun per Loop für alle Fälle wenn der Dummy=1 ist eine neue, eigene Variable generieren bilden. Ich habe es mit folgendem Command probiert, funktioniert jedoch nicht wie gewünscht.. Weiss jemand Rat? Wäre super wenn ihr ne Idee habt:)

Danke, Johannes

forvalue i=0/1 {
gen d_`i'=0 if rating_sp_change==1
}
raider1986
 
Beiträge: 7
Registriert: Sa 18. Jan 2014, 02:00
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Dummies per Loop generieren

Beitragvon daniel » So 6. Apr 2014, 20:19

Ich habe es mit folgendem Command probiert, funktioniert jedoch nicht wie gewünscht..


Geht das etwas genauer?
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Dummies per Loop generieren

Beitragvon raider1986 » So 6. Apr 2014, 22:14

hallo daniel, ich versuch mein problem nochmal klarer zu umreissen.
ich habe eine ganz normale dummy-variable, welche in den meisten fällen den Wert 0 annimmt und in einigen wenigen fällen den wert 1, nämlich dann wenn sich für das beobachtete land das rating ändert. daher auch der name rating_sp_change. die dummy-variable enthält also informationen zu allen ratingchanges die über einen längeren zeitraum vorgefallen sind. ich möchte nun diesen einheitsdummy aufspalten, und für jedes ratingereignis eine separate dummy-variable aus diesen informationen basteln.
meine idee war nun einen loop zu bauen, der die variable rating_sp_change durchläuft, und immer wenn die variable den wert 1 annimmt soll mir eine neue variable generiert werden, die an derselben stelle den wert 1 aufweist und ansonsten lauter nullen. so möchte ich die informationen der einzelnen ereignisse in getrennte variablen überführen.
das problem ist, dass ich nicht weiss wie ich stata sagen kann dass es mir für jede 1 in rating_sp_change eine neue variable generiert. mein loop erkennt zwar den unterschied zwischen 0 und 1 aber er generiert mir eben nicht für jede 1 eine neue variable.
ich hoffe das war jetzt halbwegs verständlich was mein ziel ist :)
raider1986
 
Beiträge: 7
Registriert: Sa 18. Jan 2014, 02:00
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Dummies per Loop generieren

Beitragvon daniel » Mo 7. Apr 2014, 10:30

Das Ziel ist etwas klarer. Wenn ich Dich richtig verstehe, willst Du eine Reihe neuer Variablen (also Spalten) erzeugen, von denen jede jeweils genau eine 1 und sonst nur 0 aufweist. Als Beispiel mit fünf Beobachtungen und drei Variablen, sp_ratings_change sowie zwei neuen Dummies würde das so aussehen

Code: Alles auswählen
clear
inp sp_ratings_change d1 d2
0 0 0
0 0 0
1 1 0
0 0 0
1 0 1
end


Das ist möglich, indem Du über jede Beobachtung loopst, aber ich bezweifele, dass eine solche Datenstruktur mit irgendwelchen Methoden analysierbar ist. Tu Dir einen Gefallen und denk nochmal genau darüber nach, was Du mit dieser Struktur dann tun willst. Wenn Du möchtest, kannst Du das ja auch posten. Vielleicht finde ich die Zeit, einen Alternativvorschlag zu machen. Ich denke da spontan in Richung -reshape- oder ähnliches.
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Dummies per Loop generieren

Beitragvon raider1986 » Mo 7. Apr 2014, 14:27

genau so wie in deinem beispiel solls aussehn! ich möchte das ganze innerhalb einer var-schätzung verwenden, welche ich getrennt nach ländern durchführe. ich kann natürlich auch mit dem ausgangsdummy arbeiten, aber möglicherweise gibt es ja unterschiede so dass ein ratingchange manchmal signfikanten einfluss hat und manchmal nicht, und um das zu sehen erscheint es mir die einzige möglichkeit für jedes ereignis einen eigenen dummy zu konstruieren. mir ist aber auch klar, dass das vorgehen alles andere als elegant aussieht - habe ich einem paper entnommen was auf dem gebiet erschienen ist.
was müsste ich an meinem loop denn ändern, damit die einzelnen beobachtungen unterschieden werden und nicht nur die werte 0 und 1?
raider1986
 
Beiträge: 7
Registriert: Sa 18. Jan 2014, 02:00
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Dummies per Loop generieren

Beitragvon daniel » Mo 7. Apr 2014, 14:49

Ok, damit kenne ich mich eher schlecht aus. Ich kann mir nach wie vor nicht vorstellen, dass Du mit der neuen Datensturktur etwas anfangen kannst. Dir ist auch klar, dass das Ergebnis, welcher Dummy wo genau eine 1 hat zu hundert Prozent von der Sortierung des Datensatzes abhängt?

Das "paper" kann ich (selbst wenn ich Zeit hätte, was nicht der Fall ist) natürlich nicht kommentieren, wenn Du keine näheren Angaben dazu machst.

Hier ist eine Möglichkeit (ohne jede Garantie)

Code: Alles auswählen
// create example data
clear
inp sp_ratings_change
0
0
1
0
1
0
0
1
1
0
end

// look at example data
l

// create a helper variable
// containing the running sum() of sp_ratings_change
g helper = sum(sp_ratings_change)

// look at what we have done so far
l

// now get the numbr of 1s
// so we know how many dummies to create
su helper ,mean
loc nind = r(max)

// create the dummies
forv j = 1/`nind' {
   g byte d`j' = sp_ratings_change if (helper == `j')
   replace d`j' = 0 if mi(d`j')
}

// look at the result
l

// get rid of the helper var
drop helper
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Dummies per Loop generieren

Beitragvon raider1986 » Mo 7. Apr 2014, 15:43

bei dem paper handelt es sich um ein working paper des imf, jedoch (noch) in keinem journal veröffentlicht worden. die problematik mit der sortierung ist mir bewusst. ich werde zunächst versuchen ohne die einzelnen dummies auszukommen, sondern nur mit der variable rating_sp_change zu arbeiten. wenn da nirgends etwas verwertbares rauskommt, dann wollte ich mir im nächsten schritt anschauen ob man vllt wenigstens einzelne signfikante ereignisse identifizieren kann. ist also mehr als absicherungsstrategie zu verstehen. aber danke mal für deinen vorschlag bezgl. des loop :)
raider1986
 
Beiträge: 7
Registriert: Sa 18. Jan 2014, 02:00
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Dummies per Loop generieren

Beitragvon raider1986 » Fr 11. Apr 2014, 21:02

Hey Daniel,

dein Vorschlag war gut, das Beispiel macht genau das was ich wollte. Ich habe allerdings noch eine zusätzliche Sache die mir das Leben erschwert. Leider sind meine Daten nicht wie in deinem Beispiel der Form:

0
0
1
0
1
usw.

sondern der Vektor der Grundlage der Berechnung ist, identisch vor für 12 Länder, es schaut also in Realität so aus:

Argentinien 0
Argentinien 0
Argentinien 1
Argentinien 0
Argentinien 1
Brasilien 0
Brasilien 0
Brasilien 1
Brasilien 0
Brasilien 1

Die Dummys die dabei rauskommen sollen, sollten dann für jedes Land genau gleich aussehn. Ich habe zunächst versucht das ganze mit dem by-Präfix zu lösen, was jedoch nicht klappt da man es nicht in Verbindung mit forvalue verwenden darf. Meine zweite Idee war, einfach einen zweiten Loop um deine Befehle zu legen, also so:

forvalue i=1/12 {
BEFEHLE ZUR ERSTELLUNG VON DUMMYS if country==`i'
}

das Ergebnis war jedoch dass ich mit diesem Vorgehen insgesamt 12 mal j Dummys erhalten habe und nicht wie gewünscht nur j. Fällt dir ein Fehler auf oder vielleicht ein Weg wie man es ganz anders lösen könnte?
raider1986
 
Beiträge: 7
Registriert: Sa 18. Jan 2014, 02:00
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Dummies per Loop generieren

Beitragvon daniel » Fr 11. Apr 2014, 23:34

Ich bin nicht sicher, ob ich verstehe, was genau Du willst, weil Du nun zwar die Datenstruktur skizzierst, aber nicht, wie das Ergebnis aussehen soll.

Hier ein Versuch

Code: Alles auswählen
// create example data
clear
inp country sp_ratings_change
1 0
1 0
1 1
1 0
1 1
2 0
2 0
2 1
2 1
2 0
3 0
3 1
3 0
3 1
3 0
3 1
end

// look at example data
l

// create a helper variable
// containing the running sum() of sp_ratings_change
// pre country
bys country : g helper = sum(sp_ratings_change) // <- this line is new

// look at what we have done so far
l

// now get the number of 1s
// so we know how many dummies to create
su helper ,mean
loc nind = r(max)

// create the dummies with missing vaues only
// these three lines are new
forv j = 1/`nind' {
   g byte d`j' = .
}

// here we initalize the loop over all countries
qui ta country    // <- this line is new
loc r = r(r)   // <- so is this line

forv c = 1/`r' {   // <- the 'outer' loop is new
   forv j = 1/`nind' {
      replace d`j' = sp_ratings_change if (helper == `j') ///
      & (country == `c') // <- this line is new; note the -replace-
      replace d`j' = 0 if mi(d`j') ///
      & (country == `c') // <- this line is new
   }
}

// look at the result
l

// get rid of the helper var
drop helper
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post


Zurück zu Stata Syntax

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 5 Gäste

cron