首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在stata中用"foreach“循环存储结构断点

在stata中用"foreach“循环存储结构断点
EN

Stack Overflow用户
提问于 2021-04-23 12:09:08
回答 3查看 368关注 0票数 1
代码语言:javascript
复制
read.csv("C:\Users\easy\Desktop\workbook.csv")

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

我估计每个国家在我的国家名单的countrynum变量中的回归。我试图存储每个国家回归估计的盈亏平衡点如下

代码语言:javascript
复制
foreach i in  countrynum {
    by countrynum, sort: reg y x1 x2 x3  if `i'== countrynum
    est store `r'(breakdate)
 }

Stata返回以下错误消息:

代码语言:javascript
复制
( invalid name
) invalid name
r(7);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-23 13:15:25

假设Nick Cox恰当地布局了语法修复,那么在向Stata请求r(breakdate)看这里有更多之前,您缺少的是r(breakdate)或其他结构中断命令。之后,您可以这样做,假设您的面板是由countrynum标识的。

代码语言:javascript
复制
* 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.
票数 2
EN

Stack Overflow用户

发布于 2021-04-23 12:36:44

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

首先,

代码语言:javascript
复制
foreach i in  countrynum { 

不是countrynum的不同值上触发循环吗?它是一项的循环,变量名为countrynum

所以你的测试变成

代码语言:javascript
复制
if countrynum == countrynum 

,并且循环不是循环,而是等效于

代码语言:javascript
复制
by countrynum, sort: reg y x1 x2 x3  
est store `r'(breakdate)

现在,下一个问题是,第一个命令运行在几个回归过程中,但是只有最后一个回归(对于最后一个国家)的结果才会留在内存中。

Stata注意到的错误是它不知道你说的是什么意思。

代码语言:javascript
复制
`r'(breakdate) 

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

代码语言:javascript
复制
`r(breakdate)' 

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

票数 2
EN

Stack Overflow用户

发布于 2021-04-23 15:10:48

通解

我相信我有办法解决你的问题。由于使用局部变量,这个程序需要同时运行。对于我来说,这个方法适用于us宏测试数据,在这个测试数据中,我做了一半的观察国家1和另一半国家2。只要您的数据已经是tsset,它也应该适用于您。

代码语言:javascript
复制
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),不带括号。如果这不适用于您,请告诉我,没有来自您的任何示例数据是很困难的,但是它在我的测试环境中是有效的。

示例

如果要在dataset上运行它之前查看它是如何工作的,请同时使用以下命令,

代码语言:javascript
复制
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输出中返回以下内容,

代码语言:javascript
复制
. scalar list
    break22 = 1980q4
    break1 = 1958q1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67229671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档