mean Jahre in neuen Variablenzusammenfassen

Allgemeine Fragen rund um Statistik mit Stata.

mean Jahre in neuen Variablenzusammenfassen

Beitragvon r.h. » Do 12. Apr 2012, 16:39

Ich habe einen Datensatz mit 5 Variablen (v1-v5) und diese für jede von ihnen für jedes Land und zu jedem Jahr zwischen 1980 und 2010 einen Wert. Der Datensatz ist im long format in Stata eingelesen. Nun möchte ich für alle Variablen neue Durchschnittsvariablen für Zeitabschnitte generieren: Für jedes Land und jede der 5 Variablen einen Durchschnitt der Variablenwerte von 1980-1989, einen Durchschnitt 1990-1999 und einen Durchschnitt 2000-2009.
So dass ich nachher für jedes Land und jede der 5 Variablen 3 Durchschnittswertevariablen habe.
Wie kann ich das mit Stata tun?
Vielen Dank für jede Hilfe.
r.h.
 
Beiträge: 11
Registriert: Mo 12. Mär 2012, 12:06
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: mean Jahre in neuen Variablenzusammenfassen

Beitragvon daniel » Do 12. Apr 2012, 17:21

Eine Möglichkeit wäre den Datensatz zu -reshape-n und im wide Format mit -egen- und der -rowmean()- Funktion zu arbeiten.

Pseudo etwa

Code: Alles auswählen
reshape wide v1-v5 ,i(land) j(jahr)
egen mean_v1_1980_89 = rowmean(v11980-v11989)
.
.
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: mean Jahre in neuen Variablenzusammenfassen

Beitragvon r.h. » Do 12. Apr 2012, 18:07

Vielen Dank, es klappt aber noch nicht ganz 100%
Ich habe folgenden Statabefehl eingegeben (sind andere Jahresgruppen, das spiel aber keine Rolle):
reshape long v1 v2 v3 v4 v5, i(country) j(year)
reshape wide v1 v2 v3 v4 v5 ,i(country) j(year)
egen v1m1 = rowmean(v11994-v11998)
egen v1m2 = rowmean(v11999-v12003)
egen v1m3 = rowmean(v12004-v12008)
egen v2m1 = rowmean(v21994-v21998)
egen v2m2 = rowmean(v21999-v22003)
egen v2m3 = rowmean(v22004-v22008)
egen v3m1 = rowmean(v31994-v31998)
egen v3m2 = rowmean(v31999-v32003)
egen v3m3 = rowmean(v32004-v32008)
reshape long v1 v2 v3 v4 v5, i(country) j(year)
browse

nun stehen zwar hinter den v1-v5 noch die v1m1-v3m3, aber die Werte sind komisch: ZB hat Land A jetzt für v1m2 einen Wert (der unter allen überhaupt vorhandenen v1-Werten liegt), jedoch sollte genau Land A für v1m2 keinen Wert haben, da in diesen Jahren Land A für diese Jahre nur missings hat. Irgendetwas stimmt also doch noch nicht (?)....
Vielen Dank jedenfalls für die Hilfe.

Edit: Ich hatte ursprünglich an
collapse v1 v2 v3 v4 v5 if year>1993 & year<1999
gedacht, allerdings gibt es dann noch keine neue Variable (?) und die ursprünglichen Variablen verschwinden, so, dass ich das für die anderen Perioden nicht mehr machen kann.
r.h.
 
Beiträge: 11
Registriert: Mo 12. Mär 2012, 12:06
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: mean Jahre in neuen Variablenzusammenfassen

Beitragvon daniel » Do 12. Apr 2012, 23:48

Kannst Du (am besten mittels -input-) die Struktur Deines Datensatzes mal an einem kleinen Beispiel skizzieren. Ich habe gerade leichte Probleme mir das genau vorzustellen. Skizzier doch mal wie die Sturktur ist und wie Du sie gerne hättest.
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: mean Jahre in neuen Variablenzusammenfassen

Beitragvon daniel » Fr 13. Apr 2012, 23:16

Ich antworte auf die PN im Forum, da die Kommunikation mittels PN mindestens drei Nachteile hat:

1. Potentielle Helfer schauen vielleicht mal im Forum vorbei, um zu sehen, ob es einen neuen post gibt. Sie melden sich aber sicher nicht jedes mal an, und schauen in ihre PN. Auf eine Antwort muss i.d.R. also länger gewartet werden.

2. Die Beantwortung von Fragen kostet Zeit. Damit sich diese Investition lohnt, sollten möglichst viele Personen davon profitieren. Wenn in einer PN geantwortet wird, dann hat eine Person etwas von der Antwort. Im Forum ist die Antwort öffentlich, also für eine unbegrenzte Zahl von Persone zugänglich, die potentiell ähnliche Probleme haben, oder den Lösungsansatz auf andere Probleme übertragen können. Zudem können Helfer in zukünftigen Antworten auf ähnliche Fragen auf ihre vorherigen posts verweisen, und müssen nicht wiederholt das gleiche schreiben. Dies ist auch der Grund, weshalb ich diese Auflistung der Nachteile von PN nicht in einer PN schreibe.

3. PN unterliegen keinerlei Kontrolle. Im Forum besteht zumindest die Chance, dass jemand einen Fehler in Antworten korrigiert oder eine effizientere Lösung vorschlägt.


Nun zum Inhaltlichen.

Ich kann aus Deiner verbalen Beschreibung nicht genau erkennen, wie Dein Datensatz aussieht und wie er aussehen soll. Hier ist ein Beispielcode, der einen (mini) Datensatz erzeugt und diesen verändert.

Code: Alles auswählen
clear
inp str11 country year var1 var2 var3
"afghanistan" 1994 1 2 3
"afghanistan" 1995 4 5 6
"afghanistan" 1996 7 8 9
"afghanistan" 1997 10 11 12
"angola" 1994 12 11 10
"angola" 1995 9 8 7
"angola" 1996 6 5 4
"angola" 1997 3 2 1
end

forv j = 1/3 {
   bys country : egen m_var`j'9495 = mean(var`j') /*
   */ if inrange(year, 1994, 1995)
   bys country : egen m_var`j'9697 = mean(var`j') /*
   */ if inrange(year, 1996, 1997)
}


Da Du die Syntax zur Lösung Deines Problems suchst, könntest Du mittes -input- Befehl zwei Datensätze erzeugen. Einen, der zeigt, wie Dein Datensatz aufgebaut ist und einen, der zeigt, wie das Ergebnis aussehen soll. Der -input- befehl hat den großen Vorteil, dass sich potenzielle Helfer nicht selbst Datensätze zusammenbasteln müssen. Denn, zumindest ich, kann mir komplexere Datenmodifikationen schlecht vorstellen und muss das in Stata testen.
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: mean Jahre in neuen Variablenzusammenfassen

Beitragvon r.h. » Sa 14. Apr 2012, 11:20

Ich probiers mal (hier steht zwar nirgendwo input.. aber ich probiers mal mit dem "Code"-Befehl und wenn das nicht geht mit dem "Quote"-Befehl. ;-)
Zuerst lade ich meinen Datensatz (Worldbankdaten), der sieht (Ausschnitt aus Honduras/India)) so aus:
Code: Alles auswählen
clear
inp str11 country   year   countryme   countrycode   v1   code   v2   v3   v4   v5   v6
"Honduras"   2006   "Honduras"   "HND"   57.56   "HND"   6.128703   -.775474   -.6107732   -.480074   -.9950408
"Honduras"   2007   "Honduras"   "HND"   56.16   "HND"   7.50361            
"Honduras"   2008   "Honduras"   "HND"   61.33   "HND"   6.694473   -.8343934   -.6061334   -.2982948   -.9831115
"Honduras"   2009   "Honduras"   "HND"   56.95   "HND"   3.691041            
"Honduras"   2010   "Honduras"   "HND"      "HND"   5.177754   -.8598239   -.6685874   -.2047289   -.8708074
"Honduras"   2011   "Honduras"   "HND"      "HND"               
"India"   1994   "India"   "IND"   30.82   "IND"   .300851            
"India"   1995   "India"   "IND"      "IND"   .6016374            
"India"   1996   "India"   "IND"      "IND"   .6247187   -.4055347   -.0981129   -.3344198   .2854066
"India"   1997   "India"   "IND"      "IND"   .8705763            
"India"   1998   "India"   "IND"      "IND"   .6329457   -.285922   -.0631108   -.3565015   .2775477
"India"   1999   "India"   "IND"      "IND"   .4813997            
"India"   2000   "India"   "IND"      "IND"   .7788695   -.3651289   -.0974836   -.0754548   .2906811
"India"   2001   "India"   "IND"      "IND"   1.145121            
"India"   2002   "India"   "IND"      "IND"   1.109257   -.4908049   -.1484825   -.3670624   -.00984
"India"   2003   "India"   "IND"      "IND"   .7211053            
"India"   2004   "India"   "IND"      "IND"   .7998214   -.4181599   -.1274873   -.3854784   .0370605
"India"   2005   "India"   "IND"   33.38   "IND"   .9120023   
end         


Nun möchte ich, dass wie folgt aussieht (wobei zB v1_1994-1998 der Durchschnitt der V1-Werte von 1994-1998 des jeweiligen Staates ist):
Code: Alles auswählen
country   code   v1_1994-1998   v1_1999-2003   v1_2004-2008   v2_1994-1998   v2_1999-2003   v2_2004-2008   v3_1994-1998   v3_1999-2003   v3_2004-2008
Honduras                              
India                              

Ist das so anschaulicher? Und sorry nochmals für die PN: Ich wollte damit nur das Forum nicht unübersichtlich machen. Vielen Dank für die Hilfe!
Ps. Ich hab mal gedacht ich könne das eventuell mit
Code: Alles auswählen
collapse v1 v2 v3 if year>1993 & year<1999, by (country)

machen, allerdings werden dann ursprünglichen Variablen v1, v2, v3 gelöscht und es funktioniert nicht mehr für die restlichen Zeitperioden.
Wenn ich den Beispielcode von oben eingebe (der mit afghanistan und angola) kommt bei mir "varlist not allowed"
r.h.
 
Beiträge: 11
Registriert: Mo 12. Mär 2012, 12:06
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: mean Jahre in neuen Variablenzusammenfassen

Beitragvon daniel » Sa 14. Apr 2012, 12:17

Ich probiers mal (hier steht zwar nirgendwo input..


Mein Fehler. -inp- ist die Abkürzung für den -input- Befehl in Stata (vgl. help -input-).

Zuerst lade ich meinen Datensatz (Worldbankdaten), der sieht (Ausschnitt aus Honduras/India)) so aus:


Ich kann das nicht replizieren. Fehler:
'Honduras' cannot be read as a number


Wenn Du string Variablen einlesen willst, müssen die zuvor als solche defieniert werden. Vergleiche

Code: Alles auswählen
clear
inp var1
"test"
end
l


(erzeug einen Fehler und keinen Datensatz) und

Code: Alles auswählen
clear
inp str244 var1
"test"
end
l


Nun möchte ich, dass wie folgt aussieht (wobei zB v1_1994-1998 der Durchschnitt der V1-Werte von 1994-1998 des jeweiligen Staates ist):

Ich denke mein code erreicht in etwa das.

Wenn ich den Beispielcode von oben eingebe (der mit afghanistan und angola) kommt bei mir "varlist not allowed"

Kopier mal meinen kompletten code in ein do-file und lass das komplett laufen. Ich kann Deine Fehlermeldung nicht reproduzieren. Es mag sein, dass der Zelenumbruch (/* */) in der command line nicht funktioniert.

Wenn Du mit -collapse- arbeiten willst, dann musst Du vermutlich mit -preserve- und -restore- arbeiten, Deine "Zwischenergebnisse" als einzelne Datensätze speichern und am Ende alles zusammen -mere-en. Scheint mir aufwendiger als ein loop.

[/quote]
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: mean Jahre in neuen Variablenzusammenfassen

Beitragvon r.h. » Mo 16. Apr 2012, 11:50

Der roawmean Befehl hat nun funktioniert. Allerdings bin ich nicht sicher was passiert wenn ich da 5 Jahre roawmeane, eines davon allerdings ein Missing ist. Zählt es dann die 5 Jahre zusammen und teilt die Summe durch 5 oder durch 4?
r.h.
 
Beiträge: 11
Registriert: Mo 12. Mär 2012, 12:06
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: mean Jahre in neuen Variablenzusammenfassen

Beitragvon daniel » Mo 16. Apr 2012, 14:57

-help egen- ergibt

rowmean(varlist)
may not be combined with by. It creates the (row) means of the variables in varlist, ignoring missing values; for example, if three variables are specified and, in some observations, one of the variables is missing, in those observations newvar will contain the mean of the two variables that do exist. Other observations will contain the mean of all three variables. Where none of the variables exist, newvar is set to missing.
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 Statistik allgemein

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron