Regressionsschleife mit String Observationen

Fragen zu Stata Syntax und Do-Files.

Regressionsschleife mit String Observationen

Beitragvon xaaaaam » Mo 21. Okt 2013, 11:32

Hallo Leute,

ich bin ein Stata Neuling und arbeite mich gerade erst ein.
Nun bin ich auf ein Problem gestoßen und hoffe auf eure Hilfe.

Ich möchte eine Panelregression machen, in der ich aus dem Datensatz zunächst die Länder herraussuche und dann für jedes Land einzeln eine FE Regression durchführe.

In meinem Beispiel wäre das für die USA:


clear

* Datei öffnen
use F:\Stata\EuropeanCos_PANEL.dta

* Gewünschtes Land auswählen
drop if CountryCode!="USA"

* Fehlende Daten herausfiltern
drop if CashDividendsCFStmt==.

* Dividende vom Vorjahr berechnen
generate LastDiv=CashDividendsCFStmt[_n-1] if Key[_n]==Key[_n-1]

* Erstes Jahr herausfiltern
drop if LastDiv ==.

* Regression FE
encode Key, gen(Key1)

xtset Key1 Year

xtreg CashDividendsCFStmt NetIncomeBasic LastDiv, fe}[/b]


Nun würde ich gerne alle Regressionen in einem Do-File durchführen und nicht jedes mal manuell "USA" "DEU" usw einfügen.
Außerdem hätte ich gerne nach Durchführung der Schleife den Output der FE Regression von jedem Land zu sehen.

Ich habe mal eine Schleife versucht, leider funktioniert diese aber nicht wirklich:

* Clear
clear

* Datei öffnen
use F:\Stata\EuropeanCos_PANEL.dta

*Herauslesen der Länder
levels CountryCode, local(levels)

foreach l of local levels {

clear

* Datei öffnen
use F:\Stata\EuropeanCos_PANEL.dta

* Gewünschtes Land auswählen
drop if CountryCode!=`"l"'

* Fehlende Daten herausfiltern
drop if CashDividendsCFStmt==.

* Dividende vom Vorjahr berechnen
generate LastDiv=CashDividendsCFStmt[_n-1] if Key[_n]==Key[_n-1]

* Erstes Jahr herausfiltern
drop if LastDiv ==.

* Regression FE
encode Key, gen(Key1)

xtset Key1 Year

xtreg CashDividendsCFStmt NetIncomeBasic LastDiv, fe}

end



Letztendlich werden alle Oberservations gelöscht und es kommt eine Fehlermeldung "variable __000001 not found".
Kann mir da jemand weiter helfen?

Vielen Dank!!!
Max
xaaaaam
 
Beiträge: 15
Registriert: Mo 21. Okt 2013, 11:21
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Regressionsschleife mit String Observationen

Beitragvon daniel » Mo 21. Okt 2013, 13:38

Nur einige Anmerkungen, hoffentlich dennoch hilfreich.

* Fehlende Daten herausfiltern
drop if CashDividendsCFStmt==.
[...]
* Erstes Jahr herausfiltern
drop if LastDiv ==.


Vermutlich überflüssig. In den Regressionsanylsen werden fehelnde daten ohnehin ausgeschlossen.

* Dividende vom Vorjahr berechnen
generate LastDiv=CashDividendsCFStmt[_n-1] if Key[_n]==Key[_n-1]


Kann gefährlich sein. besser: erst -encode-n (falls nötig), dann -xtset-en. Dann lag operatoren benutzen (help tsvarlist)


*Herauslesen der Länder
levels CountryCode, local(levels)


-levels- ist veraltet. -levelsof- ist er Ersatz.

Die Fehlermeldung ist schwer zu interpretieren. Resultiert die wirklich aus exakt diesem code? -set trace on- kann helfen, die Stelle des Auftretens zu identifizieren.
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: Regressionsschleife mit String Observationen

Beitragvon xaaaaam » Mo 21. Okt 2013, 16:17

Vielen Dank für deine Anmerkungen!
Muss ich die Ergebnisse der Regressionen irgendwo einlesen?
Oder wie schaffe ich es, dass ich nach Ausführung des Do-Files alle Regressions-Outputs sehe?
xaaaaam
 
Beiträge: 15
Registriert: Mo 21. Okt 2013, 11:21
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Regressionsschleife mit String Observationen

Beitragvon daniel » Di 22. Okt 2013, 12:05

Der code, den Du hier beschrieben hast zeigt die Ergebnisse der einzelnen Regressionen. Ich kann kein Fragen beantworten, wenn ich nicht (mindestens) exakt den code sehe, den Du verwendest.
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: Regressionsschleife mit String Observationen

Beitragvon xaaaaam » Di 5. Nov 2013, 11:25

Was meinst du mit dem exakten Code?
Habe die Do-File mal angehängt.
Habe den Fehler leider bis heute nicht finden können :/
xaaaaam
 
Beiträge: 15
Registriert: Mo 21. Okt 2013, 11:21
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Regressionsschleife mit String Observationen

Beitragvon xaaaaam » Di 5. Nov 2013, 11:26

Funktioniert irgendwie nicht.
Könnte sie per E-Mail senden
xaaaaam
 
Beiträge: 15
Registriert: Mo 21. Okt 2013, 11:21
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Regressionsschleife mit String Observationen

Beitragvon xaaaaam » Mi 20. Nov 2013, 15:03

Hab das Problem leider bisher immer noch nicht gelöst

Unten der Code und der Output von Stata.

Kann mir jemand helfen?


Mein Code lautet:

* Clear
clear

* Datei öffnen
use F:\Stata\EuropeanCos_PANEL.dta

levelsof CountryCode, local(levels)

foreach l of local levels {

* Gewünschtes Land auswählen
drop if CountryCode!=`"l"'


* Non-puplic companies herausfiltern
drop if YrEndMarketCap==.

* Financial companies herausfiltern
drop if SICCode<=6999 & SICCode>=6000

* VARIABLEN
* Profitability, ROE kleiner als Null mit Null ersetzen
generate ROE=NetIncomeBasic[_n-1]/TotalCommonEquity[_n-1] if Key[_n]==Key[_n-1]

replace ROE = 0 if (ROE <=0)

* Free Cash Flow
generate FCF=log((NetIncomeBasic[_n-1]+DepreciationDeplAmortExpens[_n-1]-CapitalExpendituresCFStmt[_n-1])) if Key[_n]==Key[_n-1]

* Leverage
generate Leverage=TotalAssets[_n-1]/(TotalCommonEquity[_n-1]+MinorityInterestBalSht[_n-1]) if Key[_n]==Key[_n-1]

* Growth
generate SalesGrowth=(Sales[_n-1]/Sales[_n-2])-1 if Key[_n]==Key[_n-2]

* Size
generate Size=log(Employees[_n-1]) if Key[_n]==Key[_n-1]


* ab 1990
drop if Year<=1989 /*drop if Year>=2006*/

* Regression FE
encode Key, gen(Key1)

xtset Key1 Year

areg DividendPayout ROE FCF Leverage SalesGrowth Size, absorb(Key1)

* Korrelationsmatrix & Variance inflation factor
corr ROE FCF Leverage SalesGrowth Size

vif, uncentered

}


Stata spuckt aus:


. * Clear
. clear

.
. * Datei öffnen
. use F:\Stata\EuropeanCos_PANEL.dta

.
. levelsof CountryCode, local(levels)
`"AUT"' `"BEL"' `"CHE"' `"DEU"' `"DNK"' `"ESP"' `"FIN"' `"FRA"' `"GBR"' `"GRC"'
> `"IRL"' `"ITA"' `"LUX"' `"NLD"' `"NOR"' `"PRT"' `"SWE"'

.
. foreach l of local levels {
2.
. * Gewünschtes Land auswählen
. drop if CountryCode!=`"l"'
3.
.
. * Non-puplic companies herausfiltern
. drop if YrEndMarketCap==.
4.
. * Financial companies herausfiltern
. drop if SICCode<=6999 & SICCode>=6000
5.
. * VARIABLEN
. * Profitability, ROE kleiner als Null mit Null ersetzen
. generate ROE=NetIncomeBasic[_n-1]/TotalCommonEquity[_n-1] if Key[_n]=
> =Key[_n-1]
6.
. replace ROE = 0 if (ROE <=0)
7.
. * Free Cash Flow
. generate FCF=log((NetIncomeBasic[_n-1]+DepreciationDeplAmortExpens[_n
> -1]-CapitalExpendituresCFStmt[_n-1])) if Key[_n]==Key[_n-1]
8.
. * Leverage
. generate Leverage=TotalAssets[_n-1]/(TotalCommonEquity[_n-1]+Minority
> InterestBalSht[_n-1]) if Key[_n]==Key[_n-1]
9.
. * Growth
. generate SalesGrowth=(Sales[_n-1]/Sales[_n-2])-1 if Key[_n]==Key[_n-2
> ]
10.
. * Size
. generate Size=log(Employees[_n-1]) if Key[_n]==Key[_n-1]
11.
.
. * ab 1990
. drop if Year<=1989 /*drop if Year>=2006*/
12.
. * Regression FE
. encode Key, gen(Key1)
13.
. xtset Key1 Year
14.
. areg DividendPayout ROE FCF Leverage SalesGrowth Size, absorb(Key1)
15.
. * Korrelationsmatrix & Variance inflation factor
. corr ROE FCF Leverage SalesGrowth Size
16.
. vif, uncentered
17.
. }
(438816 observations deleted)
(0 observations deleted)
(0 observations deleted)
(0 real changes made)
(0 observations deleted)
variable __000001 not found
r(111);

end of do-file
xaaaaam
 
Beiträge: 15
Registriert: Mo 21. Okt 2013, 11:21
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Regressionsschleife mit String Observationen

Beitragvon daniel » Do 21. Nov 2013, 11:31

Aus der Fehlermeldung werde ich leider nicht schlau. Dein Loop kann allerdings ohnehin nicht funktionieren, weil Du (i) beim ersten Durchlauf bereits alle Beobachtungen, die nicht zum ersten Land gehören -drop-st und demnach beim Versuch, nur die Beobachtungen des zweiten Landes zu behalten (i.e. zweiter Durchlauf) keine Beobachtgungen mehr übrig sind, (ii) Du innerhalb des loops -generate- verwendest, die erzeugte Variable aber nicht am Ende jedes Durchlaufs löschst, und Stata sich somit beim zweiten Durchlauf weigern wird, eine Variable zu erstellen, die bereits vorhanden ist, (iii) -vif- nach -areg- höchstwahrscheinlich nicht funktioniert. Ob -areg- in Deinem Fall angemessen ist, ist eine andere Frage, die in letzter Zeit ebenfalls im Forum diskutiert wurde.

Mein Tip: Mach das Ganze mal Schritt für Schritt, zunächst für ein einziges Land, i.e. den gesamte ersten Durchlauf "manuell", also ohne -foreach- und schau, wo das Problem liegt. Erst wenn das funktioniert, denk über einen -foreach- Loop nach. Dabei beachte bitte, dass m.E. die komplette Datenaufbereitung außerhalb des Loops stattfinden kann. Die Regressionen etc. würde ich schlicht mit einem -if- qualifier auf die gewünschten Beobachtungen beschränken. Dieses (durch den loop) wiederholte -drop-en von Beobachtungen, generieren von Variablen etc. ist langsam und fehleranfällig.
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: Regressionsschleife mit String Observationen

Beitragvon xaaaaam » Do 21. Nov 2013, 18:56

Hallo Daniel,
vielen Dank dass du mir mal wieder hilfst!
Ich habe deinen Tip befolgt und mal den Bearbeitungsprozess des Samples nach vorne geschoben.
Die Regression klappt soweit ohne die -foreach- loop.

Nun habe ich versucht, mithilfe einer -if- Funktion zu regressieren.
Stata meldet mir den Fehler "no obervations".
Weißt du, an was das liegen könnte?



CODE:

* Clear
clear

* Datei öffnen
use F:\Stata\EuropeanCos_PANEL.dta

* VARIABLEN
* Profitability, nur für positives Common Equity
generate ROE=NetIncomeBasic[_n-1]/TotalCommonEquity[_n-1] if Key[_n]==Key[_n-1]
replace ROE=. if TotalCommonEquity[_n-1]<=0

* Free Cash Flow
generate FCF=(NetIncomeBasic[_n-1]+DepreciationDeplAmortExpens[_n-1]-CapitalExpendituresCFStmt[_n-1]) if Key[_n]==Key[_n-1]

* Leverage
generate Leverage=TotalAssets[_n-1]/(TotalCommonEquity[_n-1]+MinorityInterestBalSht[_n-1]) if Key[_n]==Key[_n-1]
replace Leverage=. if Leverage <=0

* Growth
generate SalesGrowth=(Sales[_n-1]/Sales[_n-2])-1 if Key[_n]==Key[_n-2] & Year[_n]==Year[_n-1]+1

* Size
generate Size=log(Employees[_n-1]) if Key[_n]==Key[_n-1]

* DROPS
* ab 1990
drop if Year<=1999
drop if Year>=2011

* Non-puplic companies herausfiltern
drop if YrEndMarketCap==.

* Financial companies herausfiltern
drop if SICCode<=6999 & SICCode>=6000

* Regression FE
encode Key, gen(Key1)

xtset Key1 Year

levelsof CountryCode, local(levels)

foreach l of local levels {

* Gewünschtes Land auswählen
*drop if CountryCode!=`"GBR"'

areg DividendPayout ROE FCF Leverage SalesGrowth Size if CountryCode==`"l"' , absorb(Key1)

* Korrelationsmatrix & Variance inflation factor
corr DividendPayout ROE FCF Leverage SalesGrowth Size

vif, uncentered

* Descriptive Statistics
summarize ROE FCF Leverage SalesGrowth Size DividendPayout
}

STATA

. * Clear
. clear

.
. * Datei öffnen
. use F:\Stata\EuropeanCos_PANEL.dta

.
. * VARIABLEN
. * Profitability, nur für positives Common Equity
. generate ROE=NetIncomeBasic[_n-1]/TotalCommonEquity[_n-1] if Key[_n]==Key[_n-1]
(284138 missing values generated)

. replace ROE=. if TotalCommonEquity[_n-1]<=0
(5173 real changes made, 5173 to missing)

.
. * Free Cash Flow
. generate FCF=(NetIncomeBasic[_n-1]+DepreciationDeplAmortExpens[_n-1]-CapitalExpendituresCF
> Stmt[_n-1]) if Key[_n]==Key[_n-1]
(308107 missing values generated)

.
. * Leverage
. generate Leverage=TotalAssets[_n-1]/(TotalCommonEquity[_n-1]+MinorityInterestBalSht[_n-1])
> if Key[_n]==Key[_n-1]
(289420 missing values generated)

. replace Leverage=. if Leverage <=0
(4894 real changes made, 4894 to missing)

.
. * Growth
. generate SalesGrowth=(Sales[_n-1]/Sales[_n-2])-1 if Key[_n]==Key[_n-2] & Year[_n]==Year[_n
> -1]+1
(300736 missing values generated)

.
. * Size
. generate Size=log(Employees[_n-1]) if Key[_n]==Key[_n-1]
(302456 missing values generated)

.
. * DROPS
. * ab 1990
. drop if Year<=1999
(274260 observations deleted)

. drop if Year>=2011
(13713 observations deleted)

.
. * Non-puplic companies herausfiltern
. drop if YrEndMarketCap==.
(80360 observations deleted)

.
. * Financial companies herausfiltern
. drop if SICCode<=6999 & SICCode>=6000
(18478 observations deleted)

.
. * Regression FE
. encode Key, gen(Key1)

.
. xtset Key1 Year
panel variable: Key1 (unbalanced)
time variable: Year, 2000 to 2010, but with gaps
delta: 1 unit

.
. levelsof CountryCode, local(levels)
`"AUT"' `"BEL"' `"CHE"' `"DEU"' `"DNK"' `"ESP"' `"FIN"' `"FRA"' `"GBR"' `"GRC"' `"IRL"' `"ITA"' `"LUX"' `"NLD
> "' `"NOR"' `"PRT"' `"SWE"'

.
. foreach l of local levels {
2.
. * Gewünschtes Land auswählen
. *drop if CountryCode!=`"GBR"'
.
. areg DividendPayout ROE FCF Leverage SalesGrowth Size if CountryCode==`"l"' , absorb(Key1)
3.
. * Korrelationsmatrix & Variance inflation factor
. corr DividendPayout ROE FCF Leverage SalesGrowth Size
4.
. *vif, uncentered
.
. * Descriptive Statistics
. summarize ROE FCF Leverage SalesGrowth Size DividendPayout
5. }
no observations
r(2000);

end of do-file

r(2000);

.
xaaaaam
 
Beiträge: 15
Registriert: Mo 21. Okt 2013, 11:21
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Regressionsschleife mit String Observationen

Beitragvon daniel » Fr 22. Nov 2013, 10:48

Ja, das weiß ich. Diesen Teil

* Gewünschtes Land auswählen
*drop if CountryCode!=`"GBR"'


bitte ersatzlos streichen. Genau das wird doch durch den -if- qualifier (nicht Funktion) ersetzt, den Du übrigens auch für Dein -correlate- command willst.

Momentan behälst Du nur Beobachtungen aus GBR, versuchst aber die Regression für das Land AUT durchzuführen.
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 1 Gast