Stata 将本地宏用双引号括起来,esttab';s cells()选项

Stata 将本地宏用双引号括起来,esttab';s cells()选项,stata,Stata,我正试图懒洋洋地为一长串变量创建一个均值和标准误差表。SSC的estout包和tabstat似乎是最好的工具,但我无法让本地宏正常工作以指定esttab的单元格()选项 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

我正试图懒洋洋地为一长串变量创建一个均值和标准误差表。SSC的
estout
包和
tabstat
似乎是最好的工具,但我无法让本地宏正常工作以指定
esttab
单元格()
选项

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'")
这将生成一个“空”表

似乎
cells()
需要看到双引号,但我尝试在过程中的任何时候使用单引号和双引号添加它们。有没有办法让这种方法奏效?我希望避免手动生成
cells()
参数

* The following approach does work.
esttab ., cells("price(fmt(%9.3gc)) weight displacement")
这将生成正确的表

. 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                          
---------------------------------------------------

一个线索可能是
断言
未传递:

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)

一个线索可能是
断言
未传递:

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'")

这对我来说适用于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'")

@尼克已经给出了这个问题的解决方案。他声称只做了风格上的改变,但我怀疑更多

海报最初使用的双引号在
本地单元格
的定义中引入了一个额外的单词。当我们使用扩展宏函数
: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已经给出了一个解决方案。他声称只做了风格上的改变,但我怀疑更多

海报最初使用的双引号在
本地单元格
的定义中引入了一个额外的单词。当我们使用扩展宏函数
: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的解决方案不使用双引号,解决了这个问题。

感谢您的产品——我应该补充一点,我正在使用完全更新的Stata 11.2。但是你的改变解决了这个问题。我的原始代码中的双引号用法有问题。谢谢你的帮助。谢谢你的提醒——我应该补充一点,我现在使用的是完全更新的Stata 11.2。但是你的改变解决了这个问题。我的原始代码中的双引号用法有问题。感谢您的帮助。感谢指向
assert
的指针。我同意我的代码不起作用。:)尼克的清理工作解决了我的问题(为什么,我还不确定)。谢谢你的帮助。我在另一个答案中评论了为什么。谢谢你指向
assert
。我同意我的代码不起作用。:)尼克的清理工作解决了我的问题(为什么,我还不确定)。谢谢你的帮助。我在另一个答案中评论了为什么。法医Stata!谢谢你,罗伯托!所以这不是双引号本身,只是他们在第一个循环中创建的空单词。更不用说双引号中的空格是完全不必要的。谢谢你上了彻底的一课。非常有帮助,法医学专家!谢谢你,罗伯托!所以这不是双引号本身,只是他们在第一个循环中创建的空单词。更不用说双引号中的空格是完全不必要的。谢谢你上了彻底的一课。非常有用。