我想在Stata中使用estout
包创建一个表,以有效的方式显示由2组(年份和二元指示符)拆分的变量的平均值。
我找到了一个解决方案,即通过生成新变量,例如将主变量cash_at分成2组。 cash_at1和cash_at2。然后,我可以使用tabstat生成摘要统计信息,并使用esttab获取输出。
estpost tabstat cash_at1 cash_at2, stat(mean) by(year)
esttab, cells("cash_at1 cash_at2")
指向当前结果的链接:http://imgur.com/2QytUz0
但是,我更喜欢水平表(例如x轴上的年份)以及一种不用手分割组的方法 - 是否有办法这样做?
答案 0 :(得分:4)
我在这些情况下的偏好是年在行中以及列中的统计数据(例如平均值),但如果您想以相反的方式执行此操作,则应该没有问题
对于像你想要的那样的表来说,你已经提到的二进制变量(我将其命名为 flag )和适当的标签就足够了。您可以使用内置的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")
可以用于您在原始帖子中提供的表格。确实,你有两个额外的行和变量,但它们可能是无害的。我同意这样的想法:一般来说,一旦你的程序表现得恰当,你就会担心效率;当然,除非它缺乏阻止你达到那个状态。