用双引号包装本地宏,这对于esttab的cells()选项是可见的

时间:2015-02-11 15:58:48

标签: stata

我试图懒洋洋地为一长串变量创建一个均值和标准误差表。来自SSC和estout的{​​{1}}软件包似乎是最好的工具,但我无法让本地宏正常工作以指定tabstat的{​​{1}}选项

esttab

这会产生一个“空”表。

cells()

似乎sysuse auto, clear * build macro for `cells()` option local i = 1 foreach v of varlist price weight displacement { local cells "`cells'" " `v'" if (`i' == 1) local cells "`cells'(fmt(%9.3gc))" local ++i } * properly built display "`cells'" * but does not work with `esttab` estpost tabstat price weight displacement, statistics(mean semean) esttab ., cells("`cells'") 需要看双引号,但我尝试在流程中的任何一点添加单引号和双引号。有没有办法让这种方法有效?我想避免手动生成. esttab ., cells("`cells'") ------------------------- (1) b ------------------------- ------------------------- N 74 ------------------------- 参数。

cells()

这会产生正确的表格。

cells()

3 个答案:

答案 0 :(得分:2)

@Nick已经解决了这个问题。他声称只做了风格改变,但我怀疑更多。

海报最初使用的双引号在local cells的定义中引入了另一个词。当我们使用扩展宏函数 : word count计算本地宏中包含的单词时,这一点很清楚。 @Richard使用三个变量,但我们算四个字。仔细检查表明,第一次在循环中引入了额外的惊喜词""

在这种情况下,使用display检查本地内容是误导性的,因为该命令将取消""。结果,我们在屏幕上看到了三个"话。显示每个单词(逐个),更清楚地显示第一个单词是空白。

这意味着您编写的内容如下:

esttab ., cells(""" price weight displacement")

当你真正的意思

esttab ., cells("price weight displacement")

下面我发布一些与此假设一致的代码。为了简化说明,我删除了原始代码中不必要的复杂情况。

sysuse auto, clear

// build macro
local i = 1
foreach v of varlist price weight displacement {
    local cells "`cells'" " `v'"
    *local cells `cells' `v'
}

// check contents of macro cells
local wc : word count "`cells'"   
display `wc'

forvalues i = 1/4 {
    local w`i' : word `i' of "`cells'" 
    display "`w`i''"
}

// display a test
local test "" " price" " weight" " displacement"
local wct : word count "`test'"
display `wct' // four words also

// more displays
display "`cells'" 
display """ price weight displacement" // same display result 

// tables

// post
quietly estpost tabstat price weight displacement, statistics(mean semean)

// original with error
esttab ., cells("`cells'")

// original with error after dereferencing the local macro cells
esttab ., cells(""" price weight displacement")

Nick的解决方案,没有使用双引号,解决了这个问题。

答案 1 :(得分:1)

一条线索可能是assert未通过:

sysuse auto, clear

* build macro for `cells()` option
local i = 1
foreach v of varlist price weight displacement {
    local cells "`cells'" " `v'"
    if (`i' == 1) local cells "`cells'(fmt(%9.3gc))"
    local ++i
}

* properly built
display "`cells'"

* but does not work with `esttab`
estpost tabstat price weight displacement, statistics(mean semean)

display "`cells'"
esttab ., cells("`cells'")

local cells2 price(fmt(%9.3gc)) weight displacement
esttab ., cells("`cells2'")

assert "`cells'" == "`cells2'"

esttab ., cells(price(fmt(%9.3gc)) weight displacement)

答案 2 :(得分:1)

这适用于Stata 13.1并且更新了来自SSC的estout。我对你的代码的更改与风格一样,但请参阅@Roberto Ferrer的回答。

我的机器上潜伏着旧版本的错误,因此更新似乎至少是解决方案的一部分。

sysuse auto, clear

* build macro for `cells()` option
local i = 1
foreach v of varlist price weight displacement {
    local cells `cells' `v'
    if (`i' == 1) local cells `cells'(fmt(%9.3gc))
    local ++i
}

* properly built
display "`cells'"

estpost tabstat price weight displacement, statistics(mean semean)
esttab ., cells("`cells'")