第19章 使用purrr和broom处理多个模型

前一章写了单一模型如何构建,这一章主要介绍如何解决大量模型数据

本章将介绍 3 种功能强大的方法来帮助我们游刃有余地处理大量模型。
• 使用多个简单模型来更好地理解复杂数据集。
• 使用列表列在数据框中保存任意数据结构。例如,可以通过这种方法让数据列中包含线
性模型。
• 使用 David Robinson 开发的 broom 包将模型转换为整洁数据。这是一种非常强大的技术,
可以处理大量模型,因为一旦有了整洁数据,我们在本书前面学到的所有技术就有用武
之地了。

以下各节将详细介绍本章要使用的各种技术。
• 19.2 节将介绍关于列表列的数据结构知识,以及可以将列表放在数据框中的原因。
• 19.3 节将介绍创建列表列的 3 种主要方法。
• 19.4 节将介绍如何将列表列还原为常用的原子向量(或原子向量集合),以便更容易进
行处理。
• 19.5 节将介绍由 broom 包提供的一整套工具,以及它们在其他类型数据结构上的使用
方法。

本读书笔记也将围绕着书中的结构进行记录。

我的数学、统计学、R语言都不好..所以这章对我来说很难理解。但是就像书中所写的那样本章属于进阶内容,如果本书是你的第一本 R 语言书, 那么本章将是一个严峻挑战。它需要你对建模、数据结构和迭代都有深刻理解。因此,如果看不懂本章内容,也不要担心——先将它放在一边,如果几个月后想做做思维训练,就再来读读看。哈哈哈哈 加油

准备工作

加载用于数据分析的tidyverse包和用于构建模型的modelr包

library(modelr)
library(tidyverse)

gapminder

The gapminder data summarizes the progression of countries over time, looking at statistics like life expectancy and GDP. The data is easy to access in R, thanks to Jenny Bryan, who created the gapminder package

世界经济情况介绍

In this case study, we’re going to focus on just three variables to answer the question “How does life expectancy (lifeExp) change over time (year) for each country (country)?”
country: factor with 142 levels
continent: factor with 5 levels
year: ranges from 1952 to 2007 in increments of 5 years
lifeExp:life expectancy at birth, in years
pop:population
gdpPercap:GDP per capita (US$, inflation-adjusted)

gapminder %>%
ggplot(aes(year, lifeExp, group = country)) + # 设置线条分组
geom_line(alpha = 1/3) #设置线和透明图
==
ggplot (data = gapminder, mapping= aes (year, lifeExp, group = country))) +
geom_line(alpha = 1/3)
预期寿命随年份变化图

This is a small dataset: it only has ~1,700 observations and 3 variables. But it’s still hard to see what’s going on! 下面将重点关注一下线性关系

nz <- filter(gapminder, country == "New Zealand")
nz %>%
ggplot(aes(year, lifeExp)) +
geom_line() +
ggtitle("Full data = ")
nz_mod <- lm(lifeExp ~ year, data = nz)
nz %>%
add_predictions(nz_mod) %>%
ggplot(aes(year, pred)) +
geom_line() +
ggtitle("Linear trend + ")
nz %>%
add_residuals(nz_mod) %>%
ggplot(aes(year, resid)) +
geom_hline(yintercept = 0, color = "white", size = 3) +
geom_line() +
ggtitle("Remaining pattern")

全数据= 预期值 +残差

这是知道一个国家 可以筛选出来符合标准的 但是How can we easily fit that model to every country?

嵌套数据

https://campus.datacamp.com/courses/exploratory-data-analysis-in-r-case-study/tidy-modeling-with-broom?ex=10

可以跟着这个练习 也不错

Extract out the common code with a function and repeat using a map function from purrr.

by_country <- gapminder %>%
group_by(country, continent) %>%
nest()
嵌套数据

运用nest函数创建了一个按照contry和continent分组的多个list数据组成的data.frame

列表列

列表列是隐式定义在数据框中的:数据框是由相同长度的向量组成的命名列表。一个列表就是一个向量,因此将列表作为数据框的一列是完全合理的。


数据结构
country_model <- function(df) {
lm(lifeExp ~ year, data = df)
}
models <- map(by_country$data, country_model)

In other words, instead of creating a new object in the global envi‐ ronment, we’re going to create a new variable in the by_country data frame. That’s a job for dplyr::mutate():

by_country <- by_country %>%
mutate(model = map(data, country_model))
by_country
#> # A tibble: 142 × 4
#> country continent data model
#> <fctr> <fctr> <list> <list>
#> 1 Afghanistan Asia <tibble [12 × 4]> <S3: lm>
#> 2 Albania Europe <tibble [12 × 4]> <S3: lm>
#> 3 Algeria Africa <tibble [12 × 4]> <S3: lm>

摘要函数

summarize() 函数的一个局限性是,只能使用返回单一值的摘要函数。这意味着我们不能使用像 quantile() 这样的函数,因为它会返回任意长度的向量

嵌套还原

还原前

还原后
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,156评论 6 529
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,866评论 3 413
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 174,880评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,398评论 1 308
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,202评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,743评论 1 320
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,822评论 3 438
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,962评论 0 285
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,476评论 1 331
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,444评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,579评论 1 365
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,129评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,840评论 3 344
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,231评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,487评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,177评论 3 388
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,568评论 2 370

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,474评论 0 13
  • 完整看了华夏幸福对大连一方全场,收获了滿满的兴奋,人民币四十元也进了微信。过程是一波三折,结局是滿意的。 ...
    赵直说阅读 471评论 0 1
  • (作业9.5) 农夫的豪宅里,养了一只猫和一条狗。院子里时而也有一只老鼠转来转去,当然老鼠不是农夫养的,只是其不请...
    宏波_阅读 451评论 2 2