【问题标题】:Using postfile and post commands使用 postfile 和 post 命令
【发布时间】:2016-05-11 14:27:55
【问题描述】:

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

post command requires expressions be bound in parenthesis

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

代码示例:

*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

非常感谢有关如何解决此问题的任何想法。

【问题讨论】:

  • 如果要为每次模拟运行存储 1Xm 的回归系数矩阵,最好在模拟上方初始化一个 rXm 存储矩阵(其中 r 是复制次数)并填充一行每次复制后的矩阵。然后在最后使用单个 svmat 命令将您的结果放入主 stata 数据集,或使用 putexcel,具体取决于您要对结果执行的操作。
  • 谢谢。我将使用 svat 命令。非常感谢。

标签: recursion functional-programming stata montecarlo


【解决方案1】:

我对@9​​87654321@ 不是很熟悉,但我认为一个问题可能是您尝试使用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. . .
}

或类似的东西来声明一个具有适当数量的变量的文件,您打算在 posting 上向数据集发送这些变量。

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

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

底线 - 我怀疑第一个错误是由于在您尝试 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 从矩阵创建数据。

【讨论】:

  • 关键思想确实是每次调用post 都会向正在生成的数据集添加一个观察结果。您可以发布多个变量的值,但对于每个变量,您只能添加一个值。正如原始代码试图做的那样,一次发布整个矩阵是没有意义的。此外,声明与post 完全不同,因此float 调用是非法的。
  • 感谢@ander2ed @NickCox。这确实是问题所在。我想到的解决方案如下。最终目标是创建一个数据集,用于存储每次迭代的回归系数。我的想法是,对于每个模拟,0。创建一个名为 BetaFinal 的 stata 数据集(暂时为空)。 1. 创建回归系数。矩阵(这是一个列向量),然后 2. 临时转换为一个 stata 数据集,称为 beta_`mc' (mc 是 Montecarlo 迭代次数)和 3. 将相应的数据集附加到 BetaFinal 集。有什么想法/建议吗?谢谢!
  • 嗯,当然。但没有什么适合评论或作为对这个问题的评论。一种通用的解决方案是尽可能地继续,然后使用svmat 从 coef 创建一个临时数据集。矩阵(使用tempfile)和append这个系数。数据集到最终数据集。请务必仔细查看mkmatmacro 的帮助文件。我会把细节留给你。如果您遇到困难,请随时发布带有可重现示例的新问题,包括问题描述、示例数据和所需结果。
  • 谢谢@ander2ed。现在就做。让我们看看这是怎么回事。如果我遇到更多问题,我会再次发布。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2011-03-01
  • 2020-10-07
  • 2012-10-01
相关资源
最近更新 更多