【问题标题】:map() model output to a dataframemap() 模型输出到数据框
【发布时间】:2019-10-27 09:47:52
【问题描述】:

我一直在使用 map() 从多个 lm() 模型中计算和提取某些统计数据。

举一个可重复的例子,使用 mtcars 数据集,我从一个输入向量开始,该向量要使用lm() 模型进行估计:

library(tidyverse)
df <- mtcars
input_char <- c("mpg ~ disp",
                "mpg ~ disp + hp")
input_formula <- map(input_char, formula)

然后我有一个函数可以计算和提取每个模型的相关统计数据。为了简单和可重复性,这里有一个简化的函数,它只提取模型的 R 平方。

get_rsquared <- function(a_formula) {
  model1 <- lm(a_formula, data = df)
  rsquared <- summary(model1)$r.squared
  c(model = a_formula, rsquared = rsquared)
}

然后我使用map 遍历公式并从每个模型中提取 R 平方。

models <- map(input_formula, get_rsquared)
models

给出输出:

[[1]]
[[1]]$model
mpg ~ disp
<environment: 0x7f98987f4000>

[[1]]$rsquared
[1] 0.7183433


[[2]]
[[2]]$model
mpg ~ disp + hp
<environment: 0x7f98987f4000>

[[2]]$rsquared
[1] 0.7482402

我的问题是关于输出是一个列表。

有没有一种简单的方法可以使输出成为数据帧?

我想要的输出是:


#>             model  rsquared
#> 1      mpg ~ disp 0.7183433
#> 2 mpg ~ disp + hp 0.7482402

【问题讨论】:

    标签: r tidyverse purrr


    【解决方案1】:

    将公式保留为字符串并将as.formula() 用作get_rsquared() 函数的一部分,因为将它们作为字符串处理比使用公式对象更容易。

    library(purrr)
    library(dplyr)
    
    df <- mtcars
    input_char <- c("mpg ~ disp",
                    "mpg ~ disp + hp")
    
    get_rsquared <- function(a_formula) {
      model1 <- lm(as.formula(a_formula), data = df)
      rsquared <- summary(model1)$r.squared
      list(model = a_formula, rsquared = rsquared)
    }
    
    map_df(input_char, get_rsquared)
    
    # A tibble: 2 x 2
      model           rsquared
      <chr>              <dbl>
    1 mpg ~ disp         0.718
    2 mpg ~ disp + hp    0.748
    

    【讨论】:

    • 以防万一将来有人读到这篇文章,@h-1 确定了 map_df 以前没有为我工作过的原因:因为我的 input_char 向量已转换为向量的公式,它不能很好地输入map_df,而 char 的向量效果很好,如@h-1 的优雅解决方案所示。
    • @JeremyK。只是补充一下-您不能拥有公式向量,因为公式是未计算的表达式,其中基础对象包含两个或三个组件。看看fm &lt;- y ~ x + z; length(fm); as.character(fm)的输出。
    • 我发现您提供的代码示例非常有帮助。您是否建议将公式存储为char 的向量,然后在必要时使用as.formula() 进行转换? (看到公式转换为字符并不容易?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2021-09-20
    • 2014-07-16
    相关资源
    最近更新 更多