2016-05-10 5 views
0

Bei Verwendung des post Befehl, erhalte ich folgende Fehlermeldung:Mit postfile und Nach-Befehle

post command requires expressions be bound in parenthesis 

Mein Programm erzeugt eine Matrix, die Koeffizienten Regression für jede Simulation speichert und verwendet dann den post Befehl als float zu erklären und plazieren Sie die Ausgabe der Matrix in Klammern (betas).

Eine Probe des Code:

*Priors 
set more off 
global nmc=10 
global l = 4 /* number of lags */ 
global cnt=150 /* number of countries */ 
set seed 10101 

* Gen empty beta matrix 
matrix betas = J(153,$nmc+1,.) 

*** THIS IS WHERE MONTECARLO STARTS*** 
program bootStrapCH5, rclass 
tempname sim 
postfile `sim' betas using results, replace /* As trial I'll create only the betas matrix for now. */ 
*postfile `sim' betas alpha_mean b1_mean b2_mean b3_mean b4_mean se_alpha se1 se2 se3 se4 using results, replace 

quietly { 
forvalues i = 1/$nmc { 

    * Fixed effects regression. 
    reg gdp_growth_wb L(1/4).gdp_growth_wb i.id 
    matrix B1= e(b) 
    mat li B1 
    predict g_hat,xb 
    gen e_hat= gdp_growth_wb - g_hat 
    *gen flag=e(sample) 


    * Generate the "wild" errors for the forecasts 
    gen eta=rnormal() 
    gen e_star=e_hat*eta 

     **RECURSION 
    levelsof id, local(codes) 

    capture noisily replace y_star= _b[_cons] + _b[L.gdp_growth_wb]*L.y_star + /// 
     _b[L2.gdp_growth_wb]*L2.y_star + _b[L3.gdp_growth_wb]*L3.y_star + /// 
     _b[L4.gdp_growth_wb]*L4.y_star + e_star if (id==1 & Dini4forward==1) 

    forvalues cc= 2(1)150 { 
     capture noisily replace y_star= _b[_cons] + _b[`cc'.id] + _b[L.gdp_growth_wb]*L.y_star + /// 
     _b[L2.gdp_growth_wb]*L2.y_star + _b[L3.gdp_growth_wb]*L3.y_star + /// 
     _b[L4.gdp_growth_wb]*L4.y_star + e_star if (id==`cc' & Dini4forward==1) 

      } 

    *Regression with new sample: y_star 
    reg y_star L(1/4).y_star i.id 
    matrix b= e(b)' 
    matrix betas= (betas , b) 
    matrix list betas 

    post `sim' float (betas) 

    } 
    } 
    postclose `sim' 
    end 

    *Execute program 
    bootStrapCH5 
    use results, clear 
    summarize 

Ich habe auch versucht, eine Alternative:

post `sim' (betas) 

Und bekam den Fehler:

> type mismatch 
post: above message corresponds to expression 1, variable betas 

Alle Ideen, wie dies zu beheben sind sehr geschätzt.

+0

Wenn Sie für jeden Simulationslauf 1Xm-Matrix von Regressionskoeffizienten speichern, empfiehlt es sich möglicherweise, eine rXm-Speichermatrix (wobei r die Anzahl der Replikationen ist) über den Simulationen zu initialisieren und nach jeder Replikation eine Zeile dieser Matrix einzufügen . Verwenden Sie dann am Ende einen einzigen 'svmat'-Befehl, um Ihre Ergebnisse in den Hauptstatadatensatz zu bringen, oder verwenden Sie' putexcel', je nachdem, was Sie mit den Ergebnissen machen möchten. – lmo

+0

Danke. Ich werde den Befehl svat verwenden. Mucha geschätzt. – k1000x

Antwort

1

Ich bin nicht sehr vertraut mit postfile, aber ich denke, ein Problem könnte sein, dass Sie versuchen, eine kx2-Matrix in eine einzelne Variable innerhalb Ihrer Schleife mit post einfügen.

Wenn Sie initiieren postfile mit:

postfile `sim' betas using results 

Sie einen Stata-Datensatz mit einer einzigen Variablen deklariert haben, betas.

Anstatt also

post `sim' float (betas) 

mit können Sie versuchen:

tempname sim 
postfile `sim' float (betas1 betas2) using results, replace 
forvalues i = 1/$nmc { 

    * Some code. . . 
    local rows = rowsof(betas) 
    forvalues i = 1/`r' { 
     post `sim' (betas[`i',1]) (betas[`i',2]) 
    } 
    * some other code. . . 
} 

oder etwas ähnliches, eine Datei mit der richtigen Anzahl von Variablen zu erklären, die Sie auf post beabsichtigen ing zu dem Datensatz.

Weiter bin ich mir nicht sicher, dass Sie post eine Matrix direkt sowieso können (ich könnte mich diesbezüglich irren). Wenn das nicht möglich ist, können Sie eine forvalues -Schleife innerhalb der Schleife verschachteln, die Sie derzeit durchlaufen müssen, indem Sie die Elemente von betas durchlaufen und einzeln posten - wie im obigen Beispiel.

Schließlich versuchen Sie, die Werte betas als Datentyp float in Ihrem post Befehl zu übertragen. Ich glaube, die Speichertypen müssen im Befehl postfile deklariert werden (aber auch hier könnte ich mich irren). Der erste Fehler, den Sie angeben (in Klammern eingeschlossene Ausdrücke), ist ein direktes Ergebnis des Einfügens von float in den Befehl post.

Bottom line - Ich vermute, der erste Fehler ist wegen der Deklaration des Datentyps, wenn Sie versuchen, post die Daten, und der zweite Fehler (Typ nicht übereinstimmen) ist ein Ergebnis des Versuchs, eine kx2-Matrix in eine Variable einzufügen.Siehe unten für ein Beispiel eines Typenkonflikt, wenn sie versuchen, (falsch) erstellen, um Daten aus einer Matrix:

clear * 
mat a = (1\2) 
set obs 2 
gen x = a 

Obwohl ich zugegebenermaßen der Fehler erwartet hätte mehr analog dazu zu sein:

mat a = (1\2) 
set obs 2 
gen x = a*2 

matrix operators that return matrices not allowed in this context

Siehe auch svmat zum Erstellen von Daten aus Matrizen.

+1

Die Schlüsselidee ist in der Tat, dass jeder Aufruf von 'post 'dem produzierten Datensatz eine einzige Beobachtung hinzufügt. Sie können Werte mehrerer Variablen posten, aber für jede Variable können Sie nur einen einzelnen Wert hinzufügen. Es gibt keinen Sinn, in dem Sie eine ganze Matrix auf einmal veröffentlichen können, wie der ursprüngliche Code versuchte. Außerdem sind Deklarationen dem Post sehr fremd, so dass der Float-Aufruf illegal ist. –

+0

Danke @ ander2ed @ NickCox. Das war in der Tat das Problem. Die Lösung, an die ich denke, ist die folgende. Das endgültige Ziel besteht darin, einen Datensatz zu erstellen, der die Regressionskoeffizienten für jede Iteration speichert. Meine Idee ist es, für jede Simulation 0. ein Stata-Dataset calle BetaFinal (leer für jetzt) ​​zu erstellen. 1. Erstellen Sie den Regressionskoef. matrix (was ein Spaltenvektor ist), dann 2. temporär in ein Stata-Dataset umwandeln, nenne es beta_'mc '(mc ist die Montecarlo-Iterationszahl) und 3. füge das entsprechende Dataset an den BetaFinal-Satz an. Irgendwelche Ideen/Vorschläge? Vielen Dank! – k1000x

+1

Nun, sicher. Aber nichts passt gut in einen Kommentar oder als Kommentar zu dieser Frage. Eine allgemeine Lösung besteht darin, weitgehend so zu verfahren, wie Sie es getan haben, und dann 'svmat' zu verwenden, um einen temporären Datensatz aus dem Coef zu erstellen. Matrix (mit 'tempfile') und' append' diese Coef. Datensatz zum endgültigen Datensatz. Sehen Sie sich die Hilfedateien für 'mkmat' und' macro' genau an. Ich werde die Details dir überlassen. Wenn Sie nicht weiterkommen, können Sie eine neue Frage mit einem reproduzierbaren Beispiel, einschließlich einer Beschreibung des Problems, der Probendaten und des gewünschten Ergebnisses, veröffentlichen. – ander2ed