使用postfile和post命令

时间:2016-05-10 22:52:00

标签: recursion functional-programming stata montecarlo

使用post命令时,出现以下错误:

post command requires expressions be bound in parenthesis

我的程序生成一个矩阵,存储每个模拟的回归系数,然后使用post命令声明为float并将矩阵的输出放在括号中(beta)。

代码示例:

*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 

我也试过了另一种选择:

post `sim'  (betas)

得到了错误:

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

非常感谢任何关于如何解决这个问题的想法。

1 个答案:

答案 0 :(得分:1)

我对postfile不太熟悉,但我认为有一个问题可能是你试图用post将kx2矩阵插入到循环内的单个变量中。

使用以下方式启动postfile

postfile `sim' betas using results

您已使用单个变量betas声明了Stata数据集。

所以,而不是使用

post `sim' float (betas)
你可以试试:

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. . .
}

或类似的东西声明一个文件,其中包含您想要post数据集的适当数量的变量。

此外,我不确定你是否可以直接post矩阵(我可能错了)。如果你不能,那么你可以在你当前必须迭代forvalues元素的循环中嵌套betas循环并单独发布它们 - 正如我在上面的例子中所做的那样。

最后,您试图在betas命令中将post的值转换为数据类型float。我认为存储类型需要在postfile命令中声明(但同样,我可能错了)。您引用的第一个错误(括号中绑定的表达式)是在float命令中包含post的直接结果。

底线 - 我怀疑第一个错误是由于在您尝试post数据时声明数据类型,而第二个错误(类型不匹配)是尝试将kx2矩阵插入到数据中的结果变量。请参阅下文,了解尝试(错误地)从矩阵创建数据时类型不匹配的示例:

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

虽然我承认错误更像是这样:

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

在此上下文中不允许返回矩阵的矩阵运算符

另请查看svmat从矩阵创建数据。