在stata中使用“foreach”循环存储结构断点

问题描述

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);

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

解决方法

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

首先,

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 是一个更好的主意。

,

假设 Nick Cox 恰当地布置了语法修复,在向 Stata 请求 sbsingle 之前,您缺少的是 r(breakdate) 或其他一些结构性中断命令; 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.
,

通用解决方案

我相信我有解决您问题的方法。由于使用了局部变量,该程序需要同时运行。这在 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