【问题标题】:When using esttab, why does keep() suboption not work with all variables?使用 esttab 时,为什么 keep() 子选项不适用于所有变量?
【发布时间】:2016-07-31 12:43:36
【问题描述】:

我正在使用 Stata 命令 esttab 将一些表格输出转换为 Latex 形式。我想在表格的最后一行的每一列中包含观察总数。我使用blistkeep 子选项遇到了一个问题。有时保持按预期执行。有时它什么也不做。

我在 statalist 上发现了以下内容,这表明它可能与 coeflist 和 varlist 之间的区别有关,但我认为这不是问题所在。 http://www.statalist.org/forums/forum/general-stata-discussion/general/131816-using-factor-variables-in-estimates-table-keep

这是一个可重现的示例。

clear all
sysuse auto

gen big=(weight>3000)
label define Big 0 "Not in Big Set" 1 "In Big Set"
label values big Big
label variable big "Is Item Found in Big Set?"
compress big  //want it to be byte to match my real data

estpost tabulate big foreign

esttab using myfilename.tex, replace f ///
cell(colpct(fmt(2)) b(fmt(g) par keep(Total))) ///
collabels(none) unstack noobs nonumber nomtitle    ///
eqlabels(, lhs("Size Category"))                     ///
varlabels(, blist(Total "\hline "))

estpost tabulate rep78 foreign

esttab using myfilename2.tex, replace f ///
cell(colpct(fmt(2)) b(fmt(g) par keep(Total))) ///
collabels(none) unstack noobs nonumber nomtitle    ///
eqlabels(, lhs("Repair Rec."))                     ///
varlabels(, blist(Total "\hline "))

第一种情况下的 Latex 输出如下所示:

Size Category&    Domestic&     Foreign&       Total\\
\hline
Not in Big Set&       28.85&       90.91&       47.30\\
            &        (15)&        (20)&        (35)\\
In Big Set  &       71.15&        9.09&       52.70\\
            &        (37)&         (2)&        (39)\\
\hline Total       &      100.00&      100.00&      100.00\\
            &        (52)&        (22)&        (74)\\

在第二种情况下看起来像这样(正确):

Repair Rec. &    Domestic&     Foreign&       Total\\
\hline
1           &        4.17&        0.00&        2.90\\
2           &       16.67&        0.00&       11.59\\
3           &       56.25&       14.29&       43.48\\
4           &       18.75&       42.86&       26.09\\
5           &        4.17&       42.86&       15.94\\
\hline Total       &      100.00&      100.00&      100.00\\
        &        (48)&        (21)&        (69)\\

我也认为这可能与我的存储类型有关,但在第一个 estpost 之前添加 recast int big 并没有解决它。

为什么keep 在这些情况下只适用于其中一种?如何修复?

或者是否有另一种解决方法来实现我在最后一行中出现的每列中的观察次数的目标(将它们标记为“观察次数”将是一个奖励)?

【问题讨论】:

  • 由于我真的不知道estout,所以我将对此发表评论:也许有人会看到没有答案并会提供明确的答案。感谢您出色的可重现示例,我能够发现,本着您尝试将big 重铸为int 的精神,删除big 上的值标签导致第一种情况现在与第二种情况匹配。祝你好运!
  • 谢谢威廉!这太有趣了!我可以用keep 确认这确实创造了我想要的效果。但是,这导致了我现在没有合理的行标签的问题。我觉得这应该可以通过eqlabels 选项解决,但我还没有弄清楚。
  • 当然我的意思是varlabels

标签: latex stata


【解决方案1】:

我向esttab 程序集的开发人员指出了这个讨论,因为他在 Stack Overflow 上并不活跃。他回复了以下内容,建议我代表他将其发布在这里,我很高兴为这个问题提供完整的解决方案。


这似乎是一个错误。特定于元素的keep() 选项——即cells() 中的keep()——似乎不适用于包含空格的系数名称。一种解决方法是将elabels 选项与estpost tabulate 一起使用。这可以防止estpost tabulate 尝试从标签中构造系数名称。相反,它使用值并将标签存储在e(labels) 中,如果是双向表,则存储在e(eqlabels) 中。然后可以在estout 中使用这些宏来打印标签。这是一个例子:

. clear all

. sysuse auto
(1978 Automobile Data)

. gen big=(weight>3000)

. label define Big 0 "Not in Big Set" 1 "In Big Set"

. label values big Big

. label variable big "Is Item Found in Big Set?"

. estpost tabulate big foreign, elabels

foreign      |                                            
         big |      e(b)     e(pct)  e(colpct)  e(rowpct)
-------------+--------------------------------------------
0            |                                            
           0 |        15   20.27027   28.84615   42.85714
           1 |        37         50   71.15385   94.87179
       Total |        52   70.27027        100   70.27027
-------------+--------------------------------------------
1            |                                            
           0 |        20   27.02703   90.90909   57.14286
           1 |         2   2.702703   9.090909   5.128205
       Total |        22   29.72973        100   29.72973
-------------+--------------------------------------------
Total        |                                            
           0 |        35    47.2973    47.2973        100
           1 |        39    52.7027    52.7027        100
       Total |        74        100        100        100

row labels saved in macro e(labels)
column labels saved in macro e(eqlabels)

. esttab, tex fragment ///
>     cell(colpct(fmt(2)) b(fmt(g) par keep(Total))) ///
>     collabels(none) unstack noobs nonumber nomtitle ///
>     eqlabels(`e(eqlabels)', lhs("Size Category")) ///
>     varlabels(`e(labels)', blist(Total "\hline "))

Size Category&    Domestic&     Foreign&       Total\\
\hline
Not in Big Set&       28.85&       90.91&       47.30\\
In Big Set  &       71.15&        9.09&       52.70\\
\hline Total       &      100.00&      100.00&      100.00\\
            &        (52)&        (22)&        (74)\\

【讨论】:

  • 哇,谢谢威廉!我已经放弃了为什么这不起作用的实际答案。
  • 作者随后修复了 2016 年 8 月 19 日发布到 SSC 的 3.21 版本中的错误。
【解决方案2】:

好吧,感谢威廉的好提示,我想出了这个解决方案。我仍然对为什么原始代码不起作用一无所知,但这是一种从 keep 获得所需输出的方法以及使用 varlabels 丢失变量标签的解决方法...

clear all
sysuse auto

gen big=(weight>3000)
label variable big "Is Item Found in Big Set?"
compress big  //want it to be byte to match my real data

estpost tabulate big foreign

esttab using myfilename.tex, replace f ///
cell(colpct(fmt(2)) b(fmt(g) par keep(Total))) ///
collabels(none) unstack noobs nonumber nomtitle    ///
eqlabels(, lhs("Size Category"))                     ///
varlabels(0 "Not in Big Set" 1 "In Big Set", blist(Total "\hline "))

这会产生:

Size Category&    Domestic&     Foreign&       Total\\
\hline
Not in Big Set&       28.85&       90.91&       47.30\\
In Big Set  &       71.15&        9.09&       52.70\\
\hline Total       &      100.00&      100.00&      100.00\\
            &        (52)&        (22)&        (74)\\

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 2017-06-10
    • 2013-11-28
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多