我们编程找出寿命增长不稳定的国家。 这部分内容与作图关系不大,可以跳过。 对每个国家做线性回归, 以期望寿命为因变量, 以年份为自变量, 找出残差方差很大的,以及直线斜率为负的国家。
library(tidyverse)extract_lmr<- function(lmr){summ= summary(lmr) tibble(sigma = summ$sigma,rate = lmr$coefficients[2] )}lmres <- gapminder %>%select(country, year, lifeExp) %>% group_by(country) %>% nest(data = c(year, lifeExp)) %>%mutate(lmr = map(data,~ lm(lifeExp~ year,data = .x))) %>%mutate(info= map(lmr, extract_lmr)) %>%select(-data, -lmr) %>%unnest(info) %>% arrange(desc(sigma))summary(lmres)
这里的代码我的理解是定义一个函数extract_lmr,使用summary函数获得描述性统计量,将sigma和系数并表。之后从gapminder里选取country,year,lifeExp的数据,用country分组,生成每个组的子数据框,用map函数将回归建模的函数作用到data里的每个元素, 用mutate保存到列表类型的lmr列中,用mutate为数据框计算新变量, 返回含有新变量以及原变量的新数据框。之后调用定义的extract_lmr,获得sigma和系数。使用select扣除data和lmr列,用unnest将每个组提取的回归结果转换为普通的数据框列,用desc对sigma降序排序,最后获取lmres的描述性统计量。以上如有不对还请多多指正。
## country sigma rate ## Afghanistan: 1 Min. :0.2118 Min. :-0.09302 ## Albania : 1 1st Qu.:0.7111 1st Qu.: 0.20832 ## Algeria : 1 Median :1.2843 Median : 0.32145 ## Angola : 1 Mean :1.6587 Mean : 0.32590 ## Argentina : 1 3rd Qu.:1.9272 3rd Qu.: 0.44948 ## Australia : 1 Max. :7.2054 Max. : 0.77218 ## (Other) :136
head(lmres, 10)
## # A tibble: 10 x 3## # Groups: country [142]## country sigma rate## <fct> <dbl> <dbl>## 1 Zimbabwe 7.21 -0.0930## 2 Swaziland 6.64 0.0951## 3 Rwanda 6.56 -0.0458## 4 Botswana 6.11 0.0607## 5 Lesotho 5.93 0.0956## 6 Cambodia 5.63 0.396 ## 7 Namibia 4.96 0.231 ## 8 South Africa 4.74 0.169 ## 9 Zambia 4.53 -0.0604## 10 Kenya 4.38 0.207
这些排名靠前的国家都是期望寿命增长不稳定的。