在stargazer摘要统计表中将每个因子级别输出为虚拟变量

时间:2014-11-13 15:55:13

标签: r regression stargazer

我使用R包stargazer创建高质量的回归表,我想用它来创建摘要统计表。我的数据中有一个因子变量,我希望汇总表能够显示每个因子类别中的百分比 - 实际上,将因子分成一组互斥的逻辑(虚拟)变量,然后显示表中的那些人。这是一个例子:

> library(car)
> library(stargazer)
> data(Blackmoor)
> stargazer(Blackmoor[, c("age", "exercise", "group")], type = "text")

==========================================
Statistic  N   Mean  St. Dev.  Min   Max  
------------------------------------------
age       945 11.442  2.766   8.000 17.920
exercise  945 2.531   3.495   0.000 29.960
------------------------------------------

但是我试图获得一个额外的行,显示每组中的百分比(%控制和/或%患者,在这些数据中)。我确定这只是观星者的一个选择,但我无法找到它。有谁知道它是什么?

4 个答案:

答案 0 :(得分:4)

由于Stargazer不能直接执行此操作,您可以创建自己的汇总表作为数据框,并使用pander,xtable或任何其他包输出。例如,以下是如何使用dplyr和tidyr创建汇总表的方法:

library(dplyr)
library(tidyr)

fancy.summary <- Blackmoor %>%
  select(-subject) %>%  # Remove the subject column
  group_by(group) %>%  # Group by patient and control
  summarise_each(funs(mean, sd, min, max, length)) %>%  # Calculate summary statistics for each group
  mutate(prop = age_length / sum(age_length)) %>%  # Calculate proportion
  gather(variable, value, -group, -prop) %>%  # Convert to long
  separate(variable, c("variable", "statistic")) %>%  # Split variable column
  mutate(statistic = ifelse(statistic == "length", "n", statistic)) %>%
  spread(statistic, value) %>%  # Make the statistics be actual columns
  select(group, variable, n, mean, sd, min, max, prop)  # Reorder columns

如果使用pander,会导致这种情况:

library(pander)

pandoc.table(fancy.summary)

------------------------------------------------------
 group   variable   n   mean   sd    min   max   prop 
------- ---------- --- ------ ----- ----- ----- ------
control    age     359 11.26  2.698   8   17.92 0.3799

control  exercise  359 1.641  1.813   0   11.54 0.3799

patient    age     586 11.55  2.802   8   17.92 0.6201

patient  exercise  586 3.076  4.113   0   29.96 0.6201
------------------------------------------------------

答案 1 :(得分:1)

另一种解决方法是使用model.matrix在单独的步骤中创建虚拟变量,然后使用stargazer从中创建表。要通过示例显示:

> library(car)
> library(stargazer)
> data(Blackmoor)
> 
> options(na.action = "na.pass")  # so that we keep missing values in the data
> X <- model.matrix(~ age + exercise + group - 1, data = Blackmoor)
> X.df <- data.frame(X)  # stargazer only does summary tables of data.frame objects
> names(X) <- colnames(X)
> stargazer(X.df, type = "text")

=============================================
Statistic     N   Mean  St. Dev.  Min   Max  
---------------------------------------------
age          945 11.442  2.766   8.000 17.920
exercise     945 2.531   3.495   0.000 29.960
groupcontrol 945 0.380   0.486     0     1   
grouppatient 945 0.620   0.486     0     1   
---------------------------------------------

答案 2 :(得分:1)

from stl import stl import inspect print inspect.getmodule(stl.BaseStl).__file__ 对此任务非常有用。

tables

然后将它输出到LaTeX很简单:

library(car)
library(tables)
data(Blackmore)

# percent only:
(x <- tabular((Factor(group, "") ) ~ (Pct=Percent()) * Format(digits=4), 
    data=Blackmore))
##              
##         Pct  
## control 37.99
## patient 62.01

# percent and counts:
(x <- tabular((Factor(group, "") ) ~ ((n=1) + (Pct=Percent())) * Format(digits=4), 
    data=Blackmore))
##                      
##         n      Pct   
## control 359.00  37.99
## patient 586.00  62.01

答案 3 :(得分:0)

这对我来说是一场斗争。我喜欢 Stargazer 的外观,但不喜欢它不生成每个级别的因子变量汇总统计数据的方式。这对我有用,希望它可以避免将来有人头疼。

您必须快速创建虚拟变量才能执行此操作。我使用 fastDummies 包。然后,您还必须为那些是因子的变量和那些不是因子的变量创建两个列列表。

library('stargazer')
library('fastDummies')

factor_cols <- c("x", "y", "z")
nonfactor_cols <- c("u", "v")
df <- dummy_cols(df[, c(factorcols, nonfactor_cols)])
df <- df[, !names(df) %in% factor_cols]        # This will remove the duplicate columns that were created.
stargazer(df, 
          type = "html",
          out = "summary.htm")

请注意变量标签在最终输出中变得混乱。但是我通常在最后手动更改协变量名称,所以没问题。