运行do文件时名称无效

时间:2017-09-16 01:45:25

标签: graph histogram stata

我得到"名字无效"运行以下代码时

foreach i in 2008 2009 2010 2011{
disp `"Working in Year `i'"'
tostring `i', local(yearStr)
disp `"yearStr"'
graph bar E if Year=="'i'", c(1) name ('i',replace)
histogram E if Year=="`i'", c(1) name (`yearStr',replace)
}

我要做的是绘制年份和" E"之间的图表栏。从我已输入的数据集中选择2008 2009 2010 2011年。但每当我尝试运行代码时,都会发现相同的错误。

错误:

    Working on year 2008
2008 invalid name
r(198);

1 个答案:

答案 0 :(得分:1)

这里有几个错误和误解。

您的代码在tostring 2008上失败,因为tostring需要变量名称。 tostring也不支持local()选项,但Stata没有达到目标。但是,这里根本不需要字符串转换。宏一个字符串。

您的代码可以重写为

forval i = 2008/2011 {
    graph bar E if Year == "`i'", subtitle(`i') name(B`i', replace)
    histogram E if Year == "`i'", subtitle(`i') name(H`i',replace)
}

出现的一些细节:

  1. 警告。为了实现这一点,Year必须是一个字符串变量,这在其他地方听起来并不常用。 Year会更好,就像数字一样。

  2. 语法。我将宏标点符号更正为不同的左右引号。

  3. 语法。我删除了选项c(1)。你有什么期望呢?我知道没有这样的相关选择。也许您想要连接一行,c(l),除了这些命令无法使用。

  4. 样式。您的代码的意图似乎是采用宏i的内容并将其放在另一个宏yearStr中。没有必要这样做。

  5. 语法。 name()更好地呈现没有空格,纯数字不能是合法的图形名称。

  6. 意图。与您的代码一样,宏iyearStr将具有相同的内容,您偶然尝试(例如)创建名称为2008的图形,然后覆盖它,如下一个图表所示有相同的名字。如上所述,语法在任何方面都是非法的,但只有不同的名称才有意义。

  7. 图表样式。最好将年份作为文本放在每个图表上,以解释每个图表显示的内容。

  8. 意图。第di "yearStr"行只会显示文字yearStr。它不会显示具有该名称的本地宏。 (我简化了复合双引号。)

  9. 所有这一切,用四年时间,你可能会更好用

    graph bar E, by(Year) 
    histogram E, by(Year) 
    

    但是,如果每年只有E的一个值,您可能需要更像

    的内容
    twoway bar E year, base(0)