使用 postfile 和 post 命令
Using postfile and post commands
当使用 post
命令时,出现以下错误:
post command requires expressions be bound in parenthesis
我的程序生成一个矩阵,其中存储每次模拟的回归系数,然后使用 post
命令声明为 float
并将矩阵的输出放在括号 (betas) 中。
代码示例:
*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
非常感谢任何有关如何解决此问题的想法。
我对 postfile
不是很熟悉,但我认为一个问题可能是您试图使用 post
将 kx2 矩阵插入到循环内的单个变量中。
当您启动 postfile
时使用:
postfile `sim' betas using results
您已经声明了一个带有单个变量的 Stata 数据集,betas
。
所以,而不是使用
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
ing 到数据集的适当数量的变量。
此外,我不确定您是否可以直接 post
矩阵(我可能错了)。如果你不能,那么你可以在循环中嵌套一个 forvalues
循环,你目前必须单独迭代 betas
和 post 的元素 - 正如我在上面的例子。
最后,您试图在 post
命令中将 betas
的值转换为 float 数据类型。我相信存储类型需要在 postfile
命令中声明(但同样,我对此可能是错误的)。您引用的第一个错误(括号中的表达式)是在 post
命令中包含 float
的直接结果。
底线 - 我怀疑第一个错误是由于在尝试 post
数据时声明了数据类型,第二个错误(类型不匹配)是尝试插入 kx2 矩阵的结果成一个变量。尝试(错误地)从矩阵创建数据时,请参见下面的类型不匹配示例:
clear *
mat a = (1)
set obs 2
gen x = a
虽然我承认错误会更类似于此:
mat a = (1)
set obs 2
gen x = a*2
matrix operators that return matrices not allowed in this context
另请参阅 svmat
从矩阵创建数据。
当使用 post
命令时,出现以下错误:
post command requires expressions be bound in parenthesis
我的程序生成一个矩阵,其中存储每次模拟的回归系数,然后使用 post
命令声明为 float
并将矩阵的输出放在括号 (betas) 中。
代码示例:
*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
非常感谢任何有关如何解决此问题的想法。
我对 postfile
不是很熟悉,但我认为一个问题可能是您试图使用 post
将 kx2 矩阵插入到循环内的单个变量中。
当您启动 postfile
时使用:
postfile `sim' betas using results
您已经声明了一个带有单个变量的 Stata 数据集,betas
。
所以,而不是使用
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
ing 到数据集的适当数量的变量。
此外,我不确定您是否可以直接 post
矩阵(我可能错了)。如果你不能,那么你可以在循环中嵌套一个 forvalues
循环,你目前必须单独迭代 betas
和 post 的元素 - 正如我在上面的例子。
最后,您试图在 post
命令中将 betas
的值转换为 float 数据类型。我相信存储类型需要在 postfile
命令中声明(但同样,我对此可能是错误的)。您引用的第一个错误(括号中的表达式)是在 post
命令中包含 float
的直接结果。
底线 - 我怀疑第一个错误是由于在尝试 post
数据时声明了数据类型,第二个错误(类型不匹配)是尝试插入 kx2 矩阵的结果成一个变量。尝试(错误地)从矩阵创建数据时,请参见下面的类型不匹配示例:
clear *
mat a = (1)
set obs 2
gen x = a
虽然我承认错误会更类似于此:
mat a = (1)
set obs 2
gen x = a*2
matrix operators that return matrices not allowed in this context
另请参阅 svmat
从矩阵创建数据。