首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模型摘要/kableExtra回归表具有相同名称的模型

模型摘要/kableExtra回归表具有相同名称的模型
EN

Stack Overflow用户
提问于 2020-06-27 20:50:54
回答 2查看 698关注 0票数 1

我使用modelsummary()kableExtra()在Rmd文件中生成一个回归表(最终输出格式: LaTex和HTML)。

我对几个变量组合和模型规范运行回归。通过kable::add_header_above()将回归按变量组合分组到表中。

对于不同的变量组合,我运行相同的模型(例如OLS & Poisson或其他)。因此,为了提高可读性,我想简单地命名模型,例如

代码语言:javascript
复制
names(models) <- c("OLS", "Poisson", "OLS", "Poisson", ...)

而不是

代码语言:javascript
复制
names(models) <- c("OLS 1", "Poisson 1", "OLS 2", "Poisson 2", ...)

但是,modelsummary()以某种方式不允许将回归命名为相同的名称,从而导致以下错误:

代码语言:javascript
复制
Error: Can't bind data because some arguments have the same name
Backtrace:
  1. modelsummary::msummary(...)
  2. modelsummary::extract(...)
 10. dplyr::mutate(., group = "gof")
 12. dplyr:::mutate_cols(.data, ...)
 13. DataMask$new(.data, caller_env())
 14. .subset2(public_bind_env, "initialize")(...)
 17. rlang::env_bind_lazy(...)
 18. rlang:::env_bind_impl(.env, exprs, "env_bind_lazy()", TRUE, binder)

代码语言:javascript
复制
 Error in htmlTable_add_header_above(kable_input, header, bold, italic,  : 
 The new header row you provided has a different total number of columns with the original `kabel()` output.

MWE:

代码语言:javascript
复制
library(modelsummary)
library(kableExtra)

url <- 'https://vincentarelbundock.github.io/Rdatasets/csv/HistData/Guerry.csv'
dat <- read.csv(url)

models <- list()
models[['OLS']] <- lm(Crime_prop ~ Literacy, data = dat)
models[['Poisson']] <- glm(Crime_prop ~ Literacy + Clergy, family = poisson, data = dat)
models[['OLS']] <- lm(Crime_pers ~ Literacy, data = dat)
models[['Poisson']] <- glm(Crime_pers ~ Literacy + Clergy, family = poisson, data = dat)

# build table with `modelsummary` 
cm <- c( '(Intercept)' = 'Constant', 'Literacy' = 'Literacy (%)', 'Clergy' = 'Priests/capita')
cap <- 'A modelsummary table customized with kableExtra'

tab <- msummary(models, output = 'kableExtra',
                coef_map = cm, stars = TRUE,
                title = cap, gof_omit = 'IC|Log|Adj')

# customize table with `kableExtra`
tab %>%
  
  # column labels
  add_header_above(c(" " = 1, "Crimes (property)" = 2, "Crimes (person)" = 2))

AddOn:

一种解决方法是在使用modelsummary构建表之前,在模型名称中添加一个空间" "

代码语言:javascript
复制
names(models) <- c("OLS", "Poisson", "OLS ", "Poisson ", ...)

手动这对于很少的模型规格和变量组合是很容易实现的。然而,可以动态地适应给定设置的解决方案将是优选的,即也适合如下情况:

代码语言:javascript
复制
names(models) <- c("OLS", "Poisson", "GLM", "Poisson", ...)

而不是

代码语言:javascript
复制
names(models) <- c("OLS 1", "Poisson 1", "GLM 2", "Poisson 2", ...)

更新:

有了@Vincent提供的更新的包版本,具有相同名称的模型的回归表也可以很容易地为存储在嵌套列表中的模型实现,例如,如果它们被添加到循环中的子列表或通过lapply(...,FUN)。

代码语言:javascript
复制
models <- NA
models <- list()
models[["a"]][["OLS"]] <- lm(Crime_prop ~ Literacy, data = dat)
models[["a"]][["Poisson"]] <- glm(Crime_prop ~ Literacy + Clergy, family = poisson, data = dat)
models[["b"]][["OLS"]] <- lm(Crime_pers ~ Literacy, data = dat)
models[["b"]][["Poisson"]] <- glm(Crime_pers ~ Literacy + Clergy, family = poisson, data = day)
# ...

models_unlisted <- unlist(models, recursive=FALSE)
names(models_unlisted) <- c('ols', 'poisson', 'ols', 'poisson')

cm <- c( '(Intercept)' = 'Constant', 'Literacy' = 'Literacy (%)', 'Clergy' = 'Priests/capita')

msummary(models_unlisted, output = 'kableExtra', statistic_vertical = FALSE,
         coef_map = cm, stars = TRUE, gof_omit = 'IC|Log|Adj') %>%
  add_header_above(c(" " = 1, "Crimes (property)" = 2, "Crimes (person)" = 2))

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-29 20:37:48

谢谢你的问题。另一个帖子是对的:你在MWE下的解决方案永远不会起作用,因为它涉及到R语言的一个基本特性。为列表中的相同名称赋值会覆盖先前的值。请参见:

代码语言:javascript
复制
a <- list()
a['blah'] <- 1
a['blah'] <- 2
a

我知道的最简单的技巧是已经提出的:在名字后面添加一个空格。这有一个主要的缺点:它使得使用按名称选择列来通过gtkableExtra对它们进行自定义变得更加困难。但除此之外,它是非常无害的,因为所有的制表软件包在显示表格之前都去掉了空白。

在阅读了您的问题之后,我在modelsummary中添加了一行代码来自动“填充”模型名称。如果你从Github安装(我很快就会发布到CRAN ),你应该能够运行:

代码语言:javascript
复制
library(remotes)
install_github('vincentarelbundock/modelsummary')

library(modelsummary)
library(kableExtra)

url <- 'https://vincentarelbundock.github.io/Rdatasets/csv/HistData/Guerry.csv'
dat <- read.csv(url)

models <- list()
models[[1]] <- lm(Crime_prop ~ Literacy, data = dat)
models[[2]] <- glm(Crime_prop ~ Literacy + Clergy, family = poisson, data = dat)
models[[3]] <- lm(Crime_pers ~ Literacy, data = dat)
models[[4]] <- glm(Crime_pers ~ Literacy + Clergy, family = poisson, data = dat)
names(models) <- c('ols', 'poisson', 'ols', 'poisson')

cm <- c( '(Intercept)' = 'Constant', 'Literacy' = 'Literacy (%)', 'Clergy' = 'Priests/capita')
cap <- 'A modelsummary table customized with kableExtra'

msummary(models, output = 'kableExtra',
         coef_map = cm, stars = TRUE,
         title = cap, gof_omit = 'IC|Log|Adj') %>%
       add_header_above(c(" " = 1, "Crimes (property)" = 2, "Crimes (person)" = 2))

PS:如果你有功能需求,请在Github上打开一个问题:https://github.com/vincentarelbundock/modelsummary/issues

票数 1
EN

Stack Overflow用户

发布于 2020-06-28 00:52:01

目前,MWE中的第3和第4个模型会覆盖前两个模型,因此models列表中只有两个元素,这将导致出现different total number of columns错误。

如果只是为了可读性,你可以在第三个和第四个模型中的名称后面添加一个空格,其余的应该会很好地显示。

代码语言:javascript
复制
models[['OLS ']] <- lm(Crime_pers ~ Literacy, data = dat)
models[['Poisson ']] <- glm(Crime_pers ~ Literacy + Clergy, family = poisson, data = dat)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62610249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档