Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Fragen zu Stata Syntax und Do-Files.

Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon Francis » So 28. Jul 2013, 10:04

Hallo!
Ich will den Sales-Wachstum von unterschiedlichen Firmen-Gruppen in unterschiedlichen Jahren kalkulieren. Die Firmen sind gruppiert durch die Variablen:
Code: Alles auswählen
country
und
Code: Alles auswählen
industry


cross-post: http://stackoverflow.com/questions/1774 ... 9_17748340

Anbei habe ich ein Beispiel angehängt um das Problem zu beschreiben. Mein Datensatz enthält ca. 10.000 Firmen über 10 Jahren.
Ich summierte die sales je nach Gruppe mit identischen Variablen:
Code: Alles auswählen
country industry year

Code: Alles auswählen
bysort country year industry: egen sales_total = sum(sales)

und gruppierte jede Kombination:
Code: Alles auswählen
egen group = group(year country industry)


Ich habe verschiedene Kombinationen schon ausprobiert:

Code: Alles auswählen
egen group = group(year country industry)
xtset group year, yearly
bys group: g salesgrowth = log(D.sales_total)


oder

Code: Alles auswählen
egen group = group(year country industry)
xtset group year, yearly
bysort group: gen salesgrowth=(sales_total[_n]-sales_total[_n-1])/sales_total[_n-1]
auch mit tsset.


Bekomme aber immer den Fehler:
repeated time values within panel

aufgrund der Wiederholung der Gruppen-Nummer in Group-Variable.

Das Hauptproblem liegt darin, dass ich gerne die restlichen Variablen und Observationen behalten will. Ich hatte nämlich schon eine potenzielle Lösung mit
Code: Alles auswählen
collapse
gefunden:

Code: Alles auswählen
collapse (sum) sales, by(country year industry)
egen group1 = group(industry country)
drop if missing(industry)
drop if missing(country)
xtset group1 year
bysort group1: gen sales_growth = (sales[_n]-sales[_n-1])/sales[_n-1]


Aber ich habe mehrere
Code: Alles auswählen
industry
-gruppen (industry_1, industry_2 usw) und auch noch eine ganze Menge von andere Variablen, die ich gerne behalten will. Wenn ich
Code: Alles auswählen
collapse
benutzen würde, würden diese ja alle wegfallen. Zudem will ich anschließend eine andere Wachstumsariable berechnen, wo ich zwei verschiede Wachstumsvariablen brauche:

je Land(country):
Wachstum(von industry x) - Wachstum(von allen Firmen in einem Land)


Ich hoffe ich habe mein Problem so gut wie möglich geschildert. Auch wenn es viel Text ist hoffe ich, dass ihr mir helfen könnt. Wäre toll. Vielen Dank, Franz.
Dateianhänge
Bildschirmfoto 2013-07-28 um 09.41.07.png
Beispiel
Bildschirmfoto 2013-07-28 um 09.41.07.png (27.92 KiB) 7656-mal betrachtet
Zuletzt geändert von Francis am Di 30. Jul 2013, 11:26, insgesamt 2-mal geändert.
Francis
 
Beiträge: 8
Registriert: So 28. Jul 2013, 09:38
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon daniel » So 28. Jul 2013, 13:19

Ich kann das genaue Problem nicht aus dem Text extrahieren. Wie sehen die Daten aus? wei willst Du, dass sie aussehen?

Das year teil des Gruppierungsprozesses ist und gleichzeitig als Zeitvariable des Panels (-xtset-) verwendet werden soll, scheint mir nicht schlüssig.

Der -collapse- Ansatz kann evtl. mit -merge- kombiniert werden, um auch Variablen zu behalten, die ansonsten verloren gehen. Ob das der beste/einfachste/effizienteste Weg ist, zu erreichen, was Du erreichen willst, kann ich nicht beurteilen.
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: Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon Francis » So 28. Jul 2013, 14:58

Hallo Daniel. Erstmals Danke für die Mühe!

Um deine Fragen zu beantworten:

1. Wie sehen die Daten aus: Siehe Anhang für einen kleinen Auszug aus meiner Datenbank. Ich habe ca. 50 Variables und mehr als 150.000 Observationen. Auch mit einigen missing values bei country(countrycode) year sales(net_sales) industries(ff_industry_5 usw.

2. Wie willst du, dass sie aussehen: Ich würde gerne das Ergebnis in der selben .dta-file haben, sprich eine neue Spalte / Variable die sales_growth heißen könnte und die für jede company, einen Wert hat. Der Grund liegt darin, dass ich dieses Ergebnis später nochmals für eine andere Variable brauche, wo ich die hier kalkulierte Wachstumsvariable mit einer anderen Wachstumsvariable subtrahiere. Deswegen wäre es toll, wenn ich nicht die Daten auf verschiedenen dtas haben könnte / nicht collapsen müsste (da dann andere später gebrauchte Variablen weg wären).

3. Year gleichzeitig Zeitvariable & Gruppierungsprozessteil: Da war ich mir nicht so sicher: Anscheinend reicht es doch, wenn ich die Einteilung der Firmen nur bei country und industry lasse, da sie sowieso später durch die years aufgeteilt werden.
Dateianhänge
Bildschirmfoto 2013-07-28 um 14.54.28.png
Auszug aus Datenbank
Bildschirmfoto 2013-07-28 um 14.54.28.png (42.08 KiB) 7651-mal betrachtet
Francis
 
Beiträge: 8
Registriert: So 28. Jul 2013, 09:38
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon daniel » So 28. Jul 2013, 15:17

Sorry, ich verstehe es nicht.

eine neue Spalte / Variable die sales_growth heißen könnte und die für jede company, einen Wert hat


Da soll nur ein Wert pro company stehen? Auf welchem Level soll das denn aggregiert sein? Wie wird denn dieser Wert berechnet?

Hier mal der Anfang eines leicht zu replizierenden Beispiels. Bitte verändere dieses Beispiel mal so, dass ich erkennen kann, was genau Du da eigentlich haben willst. Fülle mal die Variable sales_gr mit den Werten aus, die da drin stehen sollen, (also den Teil des code der in < und > steht erstzen).

Code: Alles auswählen
// create toy data
clear
se more off
se seed 42
se obs 5
g cid = _n
expand 9
bys cid : g year = 2000 + _n
bys cid : g sales = floor(10*runiform())

// list data
l

// insert values for slaes_gr here
g sales_gr = .

e // <- delete this line
replace sales_gr = <here goes your input> if cid == 1
replace sales_gr = <here goes your input> if cid == 2
replace sales_gr = <here goes your input> if cid == 3
replace sales_gr = <here goes your input> if cid == 4
replace sales_gr = <here goes your input> if cid == 5
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: Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon Francis » So 28. Jul 2013, 16:11

Hey, kein Problem. Was ich berechnen will:

Wachstum der Sales (von Jahr zu Jahr) von Industrie-Gruppen. Die unterschiedlichen Gruppen sollten Firmen beinhalten, die zur selben Industrie-Gruppe und zum selben Land gehören:


sales_growth = (sales[_n]-sales[_n-1])/sales[_n-1] pro Jahr, pro Gruppe (Firmen die zur selben Industrie und zum selben Land gehören).

Bei deinem Beispiel (ohne variablen: Country & Industry) habe ich es hinbekommen (habe es nicht zu 100 % verstanden wie ich vorgehen sollte um das Ergebnis (sales_growth) zu kriegen, aber so ging es auch):

Code: Alles auswählen
/* create toy data */
clear
se more off
se seed 42
se obs 5
g cid = _n
expand 9
bys cid : g year = 2000 + _n
bys cid : g sales = floor(10*runiform())

/* list data*/
l

/* new variable = growth variable is being calculated*/
xtset year
gen sales_growth = (sales[_n]-sales[_n-1])/sales[_n-1]



--> Ich würde gerne genau das gleiche Ergebnis haben, nur mit der Gruppierung (bysort) von Unternehmen in Country & Industry, wenn diese beiden Variablen auch hinzugefügt werden. (genau da liegt das Problem mit den: repeated time values within panel.

Hoffentlich hab ich's besser erklärt :?
Francis
 
Beiträge: 8
Registriert: So 28. Jul 2013, 09:38
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon daniel » So 28. Jul 2013, 16:31

Das Ergebnis sieht falsch aus.

1. Wie kann sales_gr bei der zweiten company im ersten Jahr einen Wert haben? Das ist das erste Mal, dass diese company einen sale macht -- es kann hier kein growth geben. Du behandelst die Daten, als sei alles eine einzige company.

2. Du sagst oben, Du willst einen Wert pro company haben. sales_gr hat für 45 Beobachtungen 26 verschiedenen Werte. Das passt nicht zusammen.

3. -xtset- year ist falsch (year ist bestenfalsl die Zeitvariable, niemals die Panelvariable) und 3b. überflüssig, weil Du hier keinerlei Bezug auf iregndwein Merkmal des Panlecharakters nimmst.


Wenn Du kein replizierbares Beispiel (add-ons-und-ado-files-f20/beispieldatensatze-erzeugen-t232.html) der kompletten (relevanten) Datenstruktur erstellen kannst, das zeigt was Du hast, und was Du haben willst, kann ich Dir leider nicht weiterhelfen, sorry.
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: Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon Francis » So 28. Jul 2013, 17:24

Entschuldige. Ich hatte die falsche Code-Quelle kopiert. Hier die richtige:

Code: Alles auswählen
/* create toy data */
clear
se more off
se seed 42
se obs 5
g cid = _n
expand 9
bys cid : g year = 2000 + _n
bys cid : g sales = floor(10*runiform())

/* list data*/
l
tsset cid year
bysort cid: gen sales_growth = (sales[_n]-sales[_n-1])/sales[_n-1]


1. sales_growth für 2001 ist nun überall "." was logisch ist.
2. Ich will / kann natürlich nur einen Wert haben für ein Unternehmen/Industrie (im Jahr n), wenn das Unternehmen/die Industrie
im Jahr n sales>0 hat und
im Jahr n-1 auch einen sales >0 hat.
Dementsprechend werden nicht alle Observationen einen Wert haben der >0.

Genau das würde ich gerne mit der Einteilung von den Firmen in Country-Industry-Gruppen haben: So zu sagen:

Code: Alles auswählen
egen group = group(year country industry) if !missing(country) & !missing(year) & !missing(industry) & !missing(sales)
tsset group year, yearly
bysort group: gen salesgrowth=(sales_total[_n]-sales_total[_n-1])/sales_total[_n-1]

Was mir den Fehler gibt mit repeated time values within panel.


Ich hoffe dass du es jetzt verstehst.
Francis
 
Beiträge: 8
Registriert: So 28. Jul 2013, 09:38
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon daniel » So 28. Jul 2013, 17:27

Bevor ich da nochmal näher reinschaue, wozu -tsset-est Du die Daten eigentlich? Das Löst doch den Fehler aus, oder? Du verwendest aber keine time series operators oder ähnliches.

Schau Dir auch mal die Syntax zu -bysort- genauer an. Du kannst (und solltest) nach mehr als einer Variable sortieren. Statt

Code: Alles auswählen
bys cid :


ist

Code: Alles auswählen
bys cid (year) :


besser, weil damit sichergestellt ist, dass innerhalb von cid nach Jahr geordnet wird. Ja, die Klammersetzung ist entscheidend (vgl. help by).


Nochmal zur Erinnerung: Ich helfe gerne, aber ich werde unter keinen Umständen selbst einen Beispieldatensatz bauen, in dem die

komplette[n] (relevante[n]) Datenstruktur


zu erkenn ist -- also der Teil auf den sich Dein -egen- Befehl und die Gruppen beziehen. Einfach so "in the dark" ohne Daten bin ich nicht in der Lage den code zu addaptieren.
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: Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon Francis » Mo 29. Jul 2013, 12:55

Lieber Daniel,

ich habe jetzt mal eine Beispieldatei erstellt (siehe Anhang). So kann man sich die Variablen vorstellen die relevant sind.

Da ich den Wachstum von der Summe der Sales aller Firmen im selben Jahr, Land und der selben Industrie haben möchte, summiere ich erstmals die Sales der Firmen die zur selben Industrie-Country-Jahr-Gruppe gehören, auf:

Code: Alles auswählen
bys country industry (year): egen sum_sales = sum(sales)


In anderen Worten könnte man alle Firmen die zur selben Industrie und zum selben Land gehören, als eine "neue große Firma" bezeichnen.

Bis hierhin gibt es keine Probleme bei mir.
___________
Probleme:

Jetzt will ich den Wachstum berechnen durch:

Code: Alles auswählen
egen group = group(country industry)
xtset group year
bys group (year):gen growth_sales21= (sum_sales[_n]-sum_sales[_n-1])/sum_sales[_n-1]

und bekomme die Fehlermeldung: repeated time values within panel r(451). Mir ist klar, dass -xtset- benutzt wird um die panel variable und time Variable festzusetzen. Bei bysort ist mir klar, dass (year), so geschrieben wird, dass die Daten durch `group`und `year` gegliedert werden, innerhalb `year`.
Ich habe mir die stata-help Fenster angeguckt und finde keine Lösung.

Um dir das erwünschte Ergebnis zu zeigen, habe ich aus dem Beispieldaten, den Wachstum für die Firmen der
- Industrie-gruppe 1 & Land ger
- Industrie-gruppe 2 & Land fr
für Jahr 1 und 2 manuell berechnet (siehe pdf-Anhang)
(Für die Jahre 1 ist der Wachstum, wie schon bemerkt, immer gleich "0" oder ".", da es kein Jahr 0 mit Werten gibt).

Ich hoffe, jetzt habe ich es besser erklärt, was ich "habe" und was ich "will".
Danke.
Dateianhänge
beispiel-Ergebnis-Wachstum.pdf
Beispiel Wachstum Berechnung
(74.77 KiB) 321-mal heruntergeladen
Beispiel_growth.dta
DTA Beispiel
(1.98 KiB) 337-mal heruntergeladen
Francis
 
Beiträge: 8
Registriert: So 28. Jul 2013, 09:38
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Wachstums-Berechnung in Abhängigkeit mehrerer Variablen

Beitragvon daniel » Mo 29. Jul 2013, 15:30

Ok. Wie ich bereits erwähnte kommt der Fehler von -xtset- das an dieser Stelle überflüssig und irreführend ist. Aber darauf möchte ich nicht näher eingehen.

Bitte lösche die sum_sales Variable wieder, die ist nicht nötig. Bitte speichere den Originaldatensatz ab.

Deine -collapse- Idee aufgreifend, verwende dann diesen code

Code: Alles auswählen
// collapse the data
collapse (sum) sales ,by(industry country (year))

// calculate growth
bys industry (year) : ///
g growth = (sales - sales[_n - 1])/sales[_n - 1]
   // at this point industry and country should
   // be the same (due to -collapse-),
   // i.e. you should get the same
   // result sorting on country (year)

// now merge back original data
ren sales sum_sales
mer 1:m industry country year using <foo>    // <- substitute <foo>
                                 // for the name of the
                                 // original .dta file
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

Nächste

Zurück zu Stata Syntax

Wer ist online?

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