【问题标题】:Output each factor level as dummy variable in stargazer summary statistics table将每个因子水平输出为观星者汇总统计表中的虚拟变量
【发布时间】:2014-11-13 15:55:12
【问题描述】:

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

> library(car)
> library(stargazer)
> data(Blackmore)
> stargazer(Blackmore[, 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
------------------------------------------

但我试图获得一个额外的行来显示每组的百分比(在这些数据中,控制百分比和/或患者百分比)。我敢肯定这只是stargazer中的一个选项,但我找不到它。有人知道是什么吗?

编辑:car::Blackmoor 已将拼写更新为 car::Blackmore

【问题讨论】:

  • Stargazer 无法自动执行此操作。也看到这个问题:stackoverflow.com/questions/25473689/…
  • 但是你可以建立自己的汇总表,然后使用 pander 或 xtable 将其转换为 Markdown、Word、LaTeX、HTML 或其他任何你想要的。
  • 谢谢。太糟糕了,他们还没有这个选项。您的解决方法与我正在寻找的方法接近,但我想在控制条件下和患者条件下进行 %。我也会发布我的解决方法。

标签: r regression stargazer


【解决方案1】:

由于 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
------------------------------------------------------

【讨论】:

    【解决方案2】:

    另一种解决方法是使用model.matrix 在单独的步骤中创建虚拟变量,然后使用stargazer 从中创建一个表。用例子来说明这一点:

    > library(car)
    > library(stargazer)
    > data(Blackmore)
    > 
    > options(na.action = "na.pass")  # so that we keep missing values in the data
    > X <- model.matrix(~ age + exercise + group - 1, data = Blackmore)
    > 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   
    ---------------------------------------------
    

    编辑:car::Blackmoor 已将拼写更新为 car::Blackmore

    【讨论】:

    • 您的回答在 6 年后仍在帮助人们!我想知道你能不能告诉我为什么我们使用names(X) &lt;- colnames(X)这一行?
    • 另外,当我使用您的方法创建一个包含多个因子变量的汇总表时,例如不仅仅是group,其他因素变量似乎排除了基本情况——这对于避免虚拟变量陷阱非常有用,但对于生成我想要得到的汇总表来说并不是那么好。我想知道你有没有建议?我应该打开一个新问题吗?
    • 我在这里提出了一个新问题:stackoverflow.com/questions/62315073/…
    【解决方案3】:

    tables 可用于此任务。

    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
    

    然后直接输出到 LaTeX:

    > latex(x)
    \begin{tabular}{lcc}
    \hline
      & n & \multicolumn{1}{c}{Pct} \\ 
    \hline
    control  & $359.00$ & $\phantom{0}37.99$ \\
    patient  & $586.00$ & $\phantom{0}62.01$ \\
    \hline 
    \end{tabular}
    

    【讨论】:

      【解决方案4】:

      这对我来说是一场斗争。我喜欢 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")
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多