Stata estpost esttab:生成按年份和组划分的变量平均值的表



我想用estout包在Stata中创建一个表,以高效的方式显示按两组(年份和二进制指标)划分的变量的平均值。

我找到了一个解决方案,就是通过生成新的变量,例如cash_at1和cash_at2,手动将主变量cash_at分为两组。然后,我可以使用tabstat生成汇总统计信息,并使用esttab获得输出。

estpost tabstat cash_at1 cash_at2, stat(mean) by(year)
esttab, cells("cash_at1 cash_at2")

链接到当前结果:https://i.stack.imgur.com/lIYMe.jpg

然而,我更喜欢一个水平表(例如,x轴上的年份),以及一种不用手工分组的方法——有办法做到这一点吗?

在这些情况下,我倾向于将year放在行中,将统计数据(例如平均值)放在列中,但如果您想反过来做,应该没有问题。

对于您想要的表,只要有您已经提到的二进制变量(我将其命名为标志)和适当的标签就足够了。您可以使用内置的table命令:

clear all
set more off
* Create example data
set seed 8642
set obs 40
egen year = seq(), from(1985) to (2005) block(4)
gen cash = floor(runiform()*500)
gen flag = round(runiform())
list, sepby(year)
* Define labels
label define lflag 0 "cash0" 1 "cash1"
label values flag lflag
* Table
table flag year, contents(mean cash)

通常,对于表,除了estout模块外,您可能还需要考虑用户编写的命令tabout。有关详细信息,请运行ssc describe tabout

另一方面,你所说的"用手分裂群体"是什么意思还不清楚。你没有显示这个操作的代码,但只要它对你的目的足够通用(并且实用),我认为你应该允许它。代码可能没有你希望的那么优雅,但如果它在做它应该做的事情,我认为它是可以的。例如:

clear all
set more off
set seed 8642
set obs 40
* Create example data
egen year = seq(), from(1985) to (2005) block(4)
gen cash = floor(runiform()*500)
gen flag = round(runiform())
* Data management
gen cash0 = cash if flag == 0
gen cash1 = cash if flag == 1
* Table
estpost tabstat cash*, stat(mean) by(year)
esttab, cells("cash0 cash1")

可以用于您在原始帖子中提供的表格。确实,您有两个额外的行和变量,但它们可能是无害的。我同意这样一种观点,即一般来说,一旦你的程序运行得当,你就会担心效率;当然,除非缺乏它会阻止你达到那种状态。

最新更新