使用 Stargazer 包按类别变量获取单独的汇总统计
Posted
技术标签:
【中文标题】使用 Stargazer 包按类别变量获取单独的汇总统计【英文标题】:Obtaining Separate Summary Statistics by Categorical Variable with Stargazer Package 【发布时间】:2014-10-12 22:09:51 【问题描述】:我想使用stargazer 为分组变量的每个类别生成汇总统计信息。我可以在单独的表格中完成,但我希望将所有内容合二为一——如果这对这个包来说不是不合理的挑战的话。
例如
library(stargazer)
stargazer(ToothGrowth, type = "text")
#>
#> =========================================
#> Statistic N Mean St. Dev. Min Max
#> -----------------------------------------
#> len 60 18.813 7.649 4.200 33.900
#> dose 60 1.167 0.629 0.500 2.000
#> -----------------------------------------
为ToothGrowth
中的 continue 变量提供汇总统计信息。我想用分类变量supp
来拆分这个摘要,也可以在ToothGrowth
中。
关于期望结果的两个建议,
stargazer(ToothGrowth ~ supp, type = "text")
#>
#> ==================================================
#> Statistic N Mean St. Dev. Min Max
#> --------------------------------------------------
#> OJ len 30 16.963 8.266 4.200 33.900
#> dose 30 1.167 0.634 0.500 2.000
#> VC len 30 20.663 6.606 8.200 30.900
#> dose 30 1.167 0.634 0.500 2.000
#> --------------------------------------------------
#>
stargazer(ToothGrowth ~ supp, type = "text")
#>
#> ==================================================
#> Statistic N Mean St. Dev. Min Max
#> --------------------------------------------------
#> len
#> _by VC 30 16.963 8.266 4.200 33.900
#> _by VC 30 1.167 0.634 0.500 2.000
#> _tot 60 18.813 7.649 4.200 33.900
#>
#> dose
#> _by OJ 30 20.663 6.606 8.200 30.900
#> _by OJ 30 1.167 0.634 0.500 2.000
#> _tot 60 1.167 0.629 0.500 2.000
#> --------------------------------------------------
【问题讨论】:
该死,我刚刚在 Google 上搜索了“stargazer 分类变量摘要”,这是第一次点击。 我很欣赏你的问题,并对其进行了赏金以得到更多关注。我想知道您是否自己找到了一个好的解决方案和/或当前的任何回复是否回答了您的问题? 我相信您的赏金似乎有效,以下答案符合我的要求?我想当我最初问这个问题时,我觉得答案并不完全符合我的需求。 【参考方案1】:invisible(lapply(levels(ToothGrowth$supp),stargazer))
会,但如果你想在两者之间单独的 \subsection,你可能应该使用类似的东西
invisible(lapply(levels(ToothGrowth$supp),function(sg)
cat("\\subsectionadd your text here\n")
print(stargazer(sg)
)
【讨论】:
嗯……谢谢!如果我想更改 stargazer() 函数中的各种可能参数怎么办? 只需将其添加到 stargazer(sg) 调用中即可。 感谢您的帮助。我真正想要的是一个带有由分类变量分隔的汇总统计信息的表,而不是创建单独的表。不确定观星者是否有这种能力。 @DieterMenne,我喜欢你的解决方案的简单性。我想知道您是否有兴趣根据上面迈克尔的评论添加您的答案?【参考方案2】:三种可能的解决方案。一个使用reporttools 和xtable,一个使用tidyverse 工具和stargazer,第三个使用base-r 解决方案。
首先,
我想建议你看看reporttools,这有点离开stargazer,但我认为你应该看看它,
# install.packages("reporttools") #Use this to install it, do this only once
require(reporttools)
vars <- ToothGrowth[,c('len','dose')]
group <- ToothGrowth[,c('supp')]
## display default statistics, only use a subset of observations, grouped analysis
tableContinuous(vars = vars, group = group, prec = 1, cap = "Table of 'len','dose' by 'supp' ", lab = "tab: descr stat")
% latex table generated in R 3.3.3 by xtable 1.8-2 package
\begingroup\footnotesize
\beginlongtablellrrrrrrrrrr
\textbfVariable & \textbfLevels & $\mathbfn$ & \textbfMin & $\mathbfq_1$ & $\mathbf\widetildex$ & $\mathbf\barx$ & $\mathbfq_3$ & \textbfMax & $\mathbfs$ & \textbfIQR & \textbf\#NA \\
\hline
len & OJ & 30 & 8.2 & 15.5 & 22.7 & 20.7 & 25.7 & 30.9 & 6.6 & 10.2 & 0 \\
& VC & 30 & 4.2 & 11.2 & 16.5 & 17.0 & 23.1 & 33.9 & 8.3 & 11.9 & 0 \\
\hline
& all & 60 & 4.2 & 13.1 & 19.2 & 18.8 & 25.3 & 33.9 & 7.6 & 12.2 & 0 \\
\hline
dose & OJ & 30 & 0.5 & 0.5 & 1.0 & 1.2 & 2.0 & 2.0 & 0.6 & 1.5 & 0 \\
& VC & 30 & 0.5 & 0.5 & 1.0 & 1.2 & 2.0 & 2.0 & 0.6 & 1.5 & 0 \\
\hline
& all & 60 & 0.5 & 0.5 & 1.0 & 1.2 & 2.0 & 2.0 & 0.6 & 1.5 & 0 \\
\hline
\hline
\captionTable of 'len','dose' by 'supp'
\labeltab: descr stat
\endlongtable
\endgroup
在乳胶中你会得到这个很好的结果,
第二,
使用tidyverse 工具和stargazer、inspired by this SO answer、
# install.packages(c("tidyverse"), dependencies = TRUE)
library(dplyr); library(purrr)
#> ToothGrowth %>% split(. $supp) %>% walk(~ stargazer(., type = "text"))
#> =========================================
#> Statistic N Mean St. Dev. Min Max
#> -----------------------------------------
#> len 30 20.663 6.606 8.200 30.900
#> dose 30 1.167 0.634 0.500 2.000
#> -----------------------------------------
#> =========================================
#> Statistic N Mean St. Dev. Min Max
#> -----------------------------------------
#> len 30 16.963 8.266 4.200 33.900
#> dose 30 1.167 0.634 0.500 2.000
#> -----------------------------------------
#>
第三,
独家base-r
by(ToothGrowth, ToothGrowth$supp, stargazer, type = 'text')
#> =========================================
#> Statistic N Mean St. Dev. Min Max
#> -----------------------------------------
#> len 30 20.663 6.606 8.200 30.900
#> dose 30 1.167 0.634 0.500 2.000
#> -----------------------------------------
#>
#> =========================================
#> Statistic N Mean St. Dev. Min Max
#> -----------------------------------------
#> len 30 16.963 8.266 4.200 33.900
#> dose 30 1.167 0.634 0.500 2.000
#> -----------------------------------------
#> ToothGrowth$supp: OJ
#> [1] ""
#> [2] "========================================="
#> [3] "Statistic N Mean St. Dev. Min Max "
#> [4] "-----------------------------------------"
#> [5] "len 30 20.663 6.606 8.200 30.900"
#> [6] "dose 30 1.167 0.634 0.500 2.000 "
#> [7] "-----------------------------------------"
#> ---------------------------------------------------------------
#> ToothGrowth$supp: VC
#> [1] ""
#> [2] "========================================="
#> [3] "Statistic N Mean St. Dev. Min Max "
#> [4] "-----------------------------------------"
#> [5] "len 30 16.963 8.266 4.200 33.900"
#> [6] "dose 30 1.167 0.634 0.500 2.000 "
#> [7] "-----------------------------------------"
【讨论】:
【参考方案3】:解决方案
library(stargazer)
library(dplyr)
library(tidyr)
ToothGrowth %>%
group_by(supp) %>%
mutate(id = 1:n()) %>%
ungroup() %>%
gather(temp, val, len, dose) %>%
unite(temp1, supp, temp, sep = '_') %>%
spread(temp1, val) %>%
select(-id) %>%
as.data.frame() %>%
stargazer(type = 'text')
结果
=========================================
Statistic N Mean St. Dev. Min Max
-----------------------------------------
OJ_dose 30 1.167 0.634 0.500 2.000
OJ_len 30 20.663 6.606 8.200 30.900
VC_dose 30 1.167 0.634 0.500 2.000
VC_len 30 16.963 8.266 4.200 33.900
-----------------------------------------
说明
这消除了 OP 在对原始答案的评论中提到的问题,“我真正想要的是一个带有由分类变量分隔的汇总统计信息的单个表,而不是创建单独的表。”我看到使用stargazer
做到这一点的最简单方法是使用gather()
、unite()
、spread()
策略创建一个新数据框,其中包含每个组的观察变量。唯一的技巧是通过按组创建唯一标识符并在调用 stargazer()
之前删除该变量来避免重复标识符。
【讨论】:
【参考方案4】:您可以简单地将 subset
与 stargazer 一起使用。 *另外,请确保您的数据是使用 as.data.frame
的数据框,以便 stargazer 生成输出。
library(stargazer)
# Descriptive statistics for Income of Org 1
stargazer(subset(mydata, mydata$org==1),
title="Income for Org 1", type = "html", out="stat_org1.html")
【讨论】:
以上是关于使用 Stargazer 包按类别变量获取单独的汇总统计的主要内容,如果未能解决你的问题,请参考以下文章