【问题标题】:Storing structural break points with "foreach" loop in stata在stata中使用“foreach”循环存储结构断点
【发布时间】:2021-07-17 15:28:50
【问题描述】:
read.csv("C:\Users\easy\Desktop\workbook.csv")

我需要在我的数据集中的国家列表上估计回归的结构断点,我需要为我拥有的每个国家/地区存储这些盈亏平衡点,并在循环结束后以表格形式显示这些盈亏平衡点。我的数据集是面板数据,这就是我需要遍历国家/地区的原因。

我估计了我的countrynum 国家列表变量中每个国家的回归。我尝试将每个国家/地区回归估计的盈亏平衡点存储如下

foreach i in  countrynum {
    by countrynum, sort: reg y x1 x2 x3  if `i'== countrynum
    est store `r'(breakdate)
 }

Stata 正在返回以下错误消息:

( invalid name
) invalid name
r(7);

知道我的代码有什么问题吗?

【问题讨论】:

    标签: loops time-series regression stata panel-data


    【解决方案1】:

    一般解决方案

    我相信我有解决您问题的方法。由于使用了局部变量,这个程序需要全部同时运行。这对我的 usmacro 测试数据很有用,我观察了国家 1 和国家 2 的一半。只要你的数据已经是 tsset,它就应该对你有用。

    levelsof countrynum
    foreach lev in `r(levels)' {
        reg y x1 x2 x3 if countrynum == `lev'
        estat sbsingle
        scalar break`lev' = r(breakdate)
    }
    scalar list
    

    只要您之前没有创建任何标量,它将返回国家/地区的所有中断日期列表,语法为 (break)(countrynum),不带括号。如果这对您不起作用,请告诉我,没有您提供的任何示例数据很难,但它适用于我的测试环境。

    示例

    如果您想在数据集上运行它之前看看它是如何工作的,请立即使用以下命令,

    clear all
    webuse usmacro
    gen countrynum = 01 if _n < 35
        replace countrynum = 22 if countrynum == .
    tsset date
    levelsof countrynum
    foreach lev in `r(levels)' {
        reg fedfunds L.fedfunds inflation if countrynum == `lev'
        estat sbsingle
        scalar break`lev' = r(breakdate)
    }
    scalar list
    

    它将在stata输出中返回以下内容,

    . scalar list
        break22 = 1980q4
        break1 = 1958q1
    

    【讨论】:

    • 这个想法很好,但是你需要在回归上使用if 限定符,以避免一次又一次地得到相同的结果。
    • 作为levelsof的原作者,我认为statsby的使用频率比较高,感觉比较简单!
    • 感谢您指出这一点!我已经进行了所需的编辑。别担心尼克,我是levelsof 的忠实粉丝。
    • 感谢杰西和尼克的帮助。杰西,我试过你的代码,它可以工作,但重复估计 3 次(等于级别数)。另外,我试图发布我的数据集以进行说明,但我不知道如何(抱歉,我对此仍然很陌生)。关于如何上传数据集的任何帮助,以便您更清楚我的问题?非常感谢
    • 有趣!在您的示例中,您的面板在日期上没有重叠,因此如果您要扩展到平衡面板,您将在 tsset date 中收到重复的时间值错误。
    【解决方案2】:

    不幸的是,您的代码有很多错误,尽管您没有注意到各种错误,因为它们是含义错误,而不是语法错误。

    首先,

    foreach i in  countrynum { 
    

    不会countrynum 的不同值上触发循环。它是对一项的循环,变量名countrynum

    所以你的测试变成了

    if countrynum == countrynum 
    

    这始终是正确的,并且循环不是循环,而是等价于

    by countrynum, sort: reg y x1 x2 x3  
    est store `r'(breakdate)
    

    现在的下一个问题是第一个命令会运行多次回归,但只有最后一次回归的结果(对于最后一个命名的国家/地区)会保留在内存中。

    Stata 注意到的错误是它不知道你的意思

    `r'(breakdate) 
    

    您似乎指的是需要额外语法才能获得的结果

    `r(breakdate)' 
    

    积极的建议。使用statsby 是一个更好的主意。

    【讨论】:

      【解决方案3】:

      假设 Nick Cox 恰当地布置了语法修复,那么在向 Stata 询问 r(breakdate) 之前,您缺少的是 sbsingle 或其他一些结构中断命令; see here for more。之后,您可以执行类似的操作,假设您的面板由 countrynum 标识。

      * EX DATA
      webuse usmacro, clear
      tempfile append
      save `append', replace
      append using `append', gen(countrynum)
      
      * Run By program (ssc install runby)
      capture program drop panel_breakdate
      program panel_breakdate
          tsset date 
          regress fedfunds L.fedfunds
          estat sbsingle
          gen breakdate = r(breakdate)
      end
          
      runby panel_breakdate, by(countrynum) verbose
      * After this format your breakdate how you please.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多