将局部宏用双引号括起来,这对 esttab 的 cells() 选项可见
Wrap local macro in double quotes that will be visible to esttab's cells() option
我正在尝试懒惰地为较长的变量列表创建一个 table 均值和标准误差。似乎来自 SSC 的 estout
包和 tabstat
是最好的工具,但我无法让本地宏正常工作以指定 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'")
这会产生一个 "empty" table。
. esttab ., cells("`cells'")
-------------------------
(1)
b
-------------------------
-------------------------
N 74
-------------------------
似乎 cells()
需要看到双引号,但我尝试在过程中的任何时候用单引号和双引号添加它们。有没有办法使这种方法起作用?我想避免手动生成 cells()
参数。
* The following approach does work.
esttab ., cells("price(fmt(%9.3gc)) weight displacement")
这会产生正确的 table。
. esttab ., cells("price(fmt(%9.3gc)) weight displacement")
---------------------------------------------------
(1)
price weight displacement
---------------------------------------------------
mean 6,165 3,019 197
semean 343 90.3 10.7
---------------------------------------------------
N 74
---------------------------------------------------
一个线索可能是 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)
这对我适用于 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'")
@Nick已经给出了解决问题的方法。他声称只做了风格上的改变,但我怀疑更多。
最初由 poster 使用的双引号在 local cells
的定义中引入了一个额外的词。当我们使用 扩展宏函数 : word count
计算本地宏中包含的单词时,这一点就很清楚了。 @Richard 使用三个变量,但我们计算四个单词。仔细检查后发现,附加的 惊喜词 是 ""
,它是第一次在循环中引入的。
在这种情况下,使用 display
来检查本地的内容会产生误导,因为该命令将简单地删除 ""
。结果,我们在屏幕上看到 "three" 个字。显示每个单词(一个一个),更清楚地显示第一个是空白。
这意味着您正在编写如下代码:
esttab ., cells(""" price weight displacement")
当你真正的意思
esttab ., cells("price weight displacement")
下面我post一些代码符合这个假设。为了简化说明,我从原始代码中删除了不必要的复杂内容。
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 的不使用双引号的解决方案解决了这个问题。
我正在尝试懒惰地为较长的变量列表创建一个 table 均值和标准误差。似乎来自 SSC 的 estout
包和 tabstat
是最好的工具,但我无法让本地宏正常工作以指定 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'")
这会产生一个 "empty" table。
. esttab ., cells("`cells'")
-------------------------
(1)
b
-------------------------
-------------------------
N 74
-------------------------
似乎 cells()
需要看到双引号,但我尝试在过程中的任何时候用单引号和双引号添加它们。有没有办法使这种方法起作用?我想避免手动生成 cells()
参数。
* The following approach does work.
esttab ., cells("price(fmt(%9.3gc)) weight displacement")
这会产生正确的 table。
. esttab ., cells("price(fmt(%9.3gc)) weight displacement")
---------------------------------------------------
(1)
price weight displacement
---------------------------------------------------
mean 6,165 3,019 197
semean 343 90.3 10.7
---------------------------------------------------
N 74
---------------------------------------------------
一个线索可能是 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)
这对我适用于 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'")
@Nick已经给出了解决问题的方法。他声称只做了风格上的改变,但我怀疑更多。
最初由 poster 使用的双引号在 local cells
的定义中引入了一个额外的词。当我们使用 扩展宏函数 : word count
计算本地宏中包含的单词时,这一点就很清楚了。 @Richard 使用三个变量,但我们计算四个单词。仔细检查后发现,附加的 惊喜词 是 ""
,它是第一次在循环中引入的。
在这种情况下,使用 display
来检查本地的内容会产生误导,因为该命令将简单地删除 ""
。结果,我们在屏幕上看到 "three" 个字。显示每个单词(一个一个),更清楚地显示第一个是空白。
这意味着您正在编写如下代码:
esttab ., cells(""" price weight displacement")
当你真正的意思
esttab ., cells("price weight displacement")
下面我post一些代码符合这个假设。为了简化说明,我从原始代码中删除了不必要的复杂内容。
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 的不使用双引号的解决方案解决了这个问题。