在stata中使用"foreach"循环存储结构断点
Storing structural break points with "foreach" loop in stata
read.csv("C:\Users\easy\Desktop\workbook.csv")
我需要估计数据集中国家列表的回归结构断点,我需要为我拥有的每个国家存储这些盈亏平衡点,并在 table 形式中显示这些盈亏平衡点循环结束。我的数据集是面板数据,这就是为什么我需要遍历国家/地区。
我在国家列表的 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 询问 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.
一般解决方案
我相信我有办法解决你的问题。由于使用了局部变量,这个程序需要同时全部运行。这对我在 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
只要您之前没有创建标量,它就会return 列出所有国家/地区的截止日期,语法为 (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
这将 return stata 输出中的以下内容,
. scalar list
break22 = 1980q4
break1 = 1958q1
read.csv("C:\Users\easy\Desktop\workbook.csv")
我需要估计数据集中国家列表的回归结构断点,我需要为我拥有的每个国家存储这些盈亏平衡点,并在 table 形式中显示这些盈亏平衡点循环结束。我的数据集是面板数据,这就是为什么我需要遍历国家/地区。
我在国家列表的 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 询问 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.
一般解决方案
我相信我有办法解决你的问题。由于使用了局部变量,这个程序需要同时全部运行。这对我在 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
只要您之前没有创建标量,它就会return 列出所有国家/地区的截止日期,语法为 (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
这将 return stata 输出中的以下内容,
. scalar list
break22 = 1980q4
break1 = 1958q1