搜索
查看: 259|回复: 0

[R] 慧美——R for data science 第19章 使用purrr和broom处理多个模型

[复制链接]

26

主题

27

帖子

224

积分

中级会员

Rank: 3Rank: 3

积分
224
发表于 2018-11-29 18:02:22 | 显示全部楼层 |阅读模式
R for data science   第19章  使用purrr和broom处理多个模型
19.1 简介
  • 使用多个简单模型来更好地理解复杂数据集。
  • 使用列表列在数据框中保存任意数据结构。例如,可以通过这种方法让数据列中包含线
    性模型。
  • 使用 David Robinson 开发的 broom 包将模型转换为整洁数据,可以处理大量模型

19.2 列表列
  • 列表列是隐式定义在数据框中的:数据框是由相同长度的向量组成的命名列表。一个列表就是一个向量,因此将列表作为数据框的一列是完全合理的。
  • 在 R 基础包中创建列表列是非常困难的,而且 data.frame() 函数是将列表作为列的列表来处理的
  • 列表列的最大用处是作为一种中间数据结构。要想直接处理列表列是比较困难的,因为大多数 R 函数只能处理原子向量或数据框。但列表列可以将相关项目统一保存在一个数据框中
  • 要想有效地使用列表列,需要 3 个步骤
    • 3 种方法之一来创建列表列。这 3 种方法是:nest()、summarize() + list() 以及 mutate() + 映射函数
    • 通过使用 map()、map2() 或 pmap() 函数转换现有列表列,创建一个中间列表列。
    • 将列表列简化还原成数据框或原子向量。


19.3 创建列表列
  • 使用以下 4 种方法之一,根据普通列进行创建。
    • 使用 tidyr::nest() 函数将分组数据框转换为嵌套数据框,嵌套数据框中会包含数据框列表列。
    • 使用 mutate() 函数以及能够返回列表的向量化函数。
    • 使用 summarize() 函数以及能够返回多个结果的摘要函数。
    • 还可以使用 tibble::enframe() 函数根据命名列表来创建列表列

  • 在创建列表列时,应该确保这些列是同质的,即列中的每个元素都包含同样类型的内容。
  • 使用嵌套
    • 可以使用 nest() 函数创建嵌套数据框,即带有数据框列表列的数据框。在嵌套数据框中,每行都是一个元观测:除列表列外的列给出了定义观测的变量,数据框中的列表列则给出了组成元观测的具体观测。
    • nest() 函数有两种使用方式。
      • 当用于分组数据框时,nest() 函数会保留用于分组的列,而将其他所有数据归并到列表列中。
      • 还可以在未分组数据框上使用 nest(),此时需要指定嵌套哪些列。


  • 使用向量化函数
    • 有些常用函数接受一个原子向量并返回一个列表。
      • stringr::str_split() 函数,它接受一个字符向量,并返回字符向量的一个列表。如果在mutate() 函数中使用这个函数,那么就会得到一个列表列
      • 使用向量化函数创建列表列的另一个示例是使用 purrr 包中的 map()、map2() 和 pmap() 函数。


  • 使用多值摘要
    • summarize() 函数的一个局限性是,只能使用返回单一值的摘要函数。这意味着我们不能使用像 quantile() 这样的函数,因为它会返回任意长度的向量
    • 然而,你可以将结果包装在一个列表中!这是符合 summarize() 函数的约定的,因为这样每个摘要结果就是一个长度为 1 的列表(向量)了
    • 要想让 unnest() 函数的结果更可用,我们还需要表示出概率
    • 使用命名列表
      • 带有列表列的数据框可以解决一种常见问题:如何同时对列表的元素及元素内容进行迭代?相对于将所有元素内容塞进一个对象,更容易的一种方法是创建一个数据框:一列包含元素名称,另一列包含元素中的列表内容。创建这种数据框的一种简单方法是使用tibble::enframe() 函数
      • 如果想要同时对名称和值进行迭代,那么可以使用 map2() 函数



19.4 简化列表列
  • 在将列表列还原为简单结构时,根据想要将列表列的一个元素转换为单个值还是多个值,再决定使用哪种技术。
    • 如果想要得到单个值,就使用 mutate() 以及 map_lgl()、map_int()、map_dbl() 和 map_ chr() 函数来创建一个原子向量。
    • 如果想要得到多个值,就使用 unnest() 函数将列表列还原为普通列,这样可以按需要 将行多次重复。

  • 可以使用 map_*() 快捷方式,例如,你可以使用 map_chr(x, "apple") 从 x的每个元素中提取变量 中的内容。这种方法可以提取嵌套列表中的一部分,并使结果成为普通列。如果元素中有缺失值,还可以使用 .null 参数提供一个返回值(而不是返回 NULL)
  • 嵌套还原
    • unnest() 函数对列表列中的每个元素都重复一次普通列。


19.5 使用broom生成整洁数据
broom 包提供了 3 种常用工具,用于将模型转换为整洁数据框。
  • broom::glance(model) 为每个模型返回一行数据,其中每一列都是模型的一个摘要统计 量:要么是模型质量的度量方式,要么是模型复杂度,又或者是二者的组合。
  • broom::tidy(model) 为模型的每个系数返回一行数据,其中每一列都是系数的估计值或变异指标。
  • broom::augment(model, data)返回data中的每一行,但会添加一些额外信息,如残差 以及其他一些有影响的统计量。





上一篇:慧美——R for data science 第18章 模型构建
下一篇:第18章
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树    

GMT+8, 2019-2-19 03:27 , Processed in 0.029554 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.