Stata的estout有两组边距

时间:2014-12-26 23:23:23

标签: stata

假设我有这样的模型:

webuse nlswork
poisson hours i.union##c.tenure, robust
margins union, dydx(tenure)
margins rb1.union, dydx(tenure)

我想使用Ben Jann的-estout-将两个AME叠加在AME的差异之上。不幸的是,您需要发布estout的边距结果,这会干扰第二个边距命令。

有什么方法吗?

Statalist forum交叉发布一段时间没有答案。

2 个答案:

答案 0 :(得分:3)

我从未使用过--estout-,但也许这会给你一个开始。

 webuse nlswork
 poisson hours i.union##c.tenure, robust
 estimates store m0

 margins union, dydx(tenure) post
 estimates store m1

 estimates restore m0

 margins rb1.union, dydx(tenure) post
 estimates store m2

为什么会这样:margins需要访问此示例中原始命令poisson的结果。由于margins本身不会留下估算结果,如果您在没有margins的情况下运行post,原始结果仍然可用,并且您可以连续执行多个margins命令而不会出现问题。但是,如果将post选项添加到第一个margins命令,则新发布的结果将替换内存中的结果。在这种情况下,第二个margins会抱怨

  

边距不能与自己发布的结果一起使用

因此,解决方案是将第二个margins与原始估算结果一起呈现,正是estimates restore的设计目标。

更新

r(table)包含margins的所有结果,并且列名为。这是Roberto的堆叠解决方案的一个版本,它利用了这些属性:

use nlswork, clear,
poisson hours i.union##c.tenure, robust

margins union, dydx(tenure)
matrix list r(table)
matrix m1 = r(table)
matrix  m11 = m1["b".."se", 1...]'
matrix m12 = m1["ll".."ul",1...]'
matrix first = m11,m12

margins rb1.union, dydx(tenure)
matrix m2 = r(table)
matrix m21 = m2["b".."se", 1...]'
matrix m22 = m2["ll".."ul",1...]'
matrix second = m21,m22
matrix rownames second = tenure:diff

matrix RESULTS = first \ second
estout matrix(RESULTS)

答案 1 :(得分:3)

estout需要矩阵,所以也许你可以试试:

webuse nlswork, clear

poisson hours i.union##c.tenure, robust
margins union, dydx(tenure)

matrix first = r(b)
matrix list first

margins rb1.union, dydx(tenure)

matrix second = r(b)
matrix list second

*-----

matrix b = first[1,1] ,  first[1,2] \ second[1,1] ,  .

estout matrix(b)

当然,你需要对结果进行润色。

更新

有一个thread on Statalist from 2007,其中Ben Jann(estout的作者)澄清单独estout无法将多个存储结果堆叠到一列中。他的解决方案涉及program合并操作矩阵和列/行名称的结果。

对于您提供的示例,类似以下内容:

webuse nlswork, clear

poisson hours i.union##c.tenure, robust

// first margin
margins union, dydx(tenure)
matrix first = r(b)

// second margin
margins rb1.union, dydx(tenure)
matrix second = r(b)
matrix rownames second = tenure:diff

// put together
matrix c = first' \ second

estout matrix(c)

(线程有点旧,所以我不确定estout目前是否已经更新过。)