r - 在管道中使用 dplyr 中的 group_by() 和 predict.lm 和 do() 进行年份线性外推

标签 r dplyr

我想在管道内应用一年的线性外推法。我想做的与此非常相似 simple example without grouping .但是在管道内并使用 dplyr::group_by()。有一些例子like this one , this onethis one .但我无法获得理想的输出。

可重现的例子:

test.frame <- data.frame(Country = 
rep(c("Austria", "Brazil", "Canada"), each = 3, times = 3), 
  Entity = rep(c("CO2","CH4","N2O"), times = 9),
  Year = rep(c(1990:1992), each = 9),
  value = runif(27, 1,5))

test.frame2 <- data.frame(Country = 
rep(c("Austria", "Brazil", "Canada"), each = 3), 
    Entity =  rep(c("CO2","CH4","N2O"), times = 3),
    Year = rep(c(1993), each = 3),
    value = 0)

results_frame <- test.frame %>% 
  dplyr::bind_rows(test.frame2)

我有两个分组类别(国家和实体),我想使用 1990 年到 1992 年的值来使用线性外推法填充 1993 年的值。 在this的基础上,我可以估计线性模型:

linear_model <- test.frame %>%  
dplyr::group_by(Country, Entity) %>% 
lm(value ~ Year, data=.)

results <- predict.lm(linear_model, test.frame2)

但是,results 并未显示所需的输出。所以下面提出解决方案here我尝试以下操作:

results_frame <- test.frame %>%
  dplyr::group_by(Country, Entity) %>% 
  do(lm( value ~ Year , data = test.frame)) %>%
  predict.lm(linear_model, test.frame2) %>% 
  bind_rows(test.frame)

但它不起作用,相反我得到了

Error: Results 1, 2, 3, 4, 5, ... must be data frames, not lm

非常感谢任何帮助!

最佳答案

在拟合和预测时必须小心使用正确的数据:

library(dplyr)
set.seed(42)
test.frame <- tibble(Country = rep(c("Austria", "Brazil", "Canada"), each = 3, times = 3), 
                         Entity = rep(c("CO2","CH4","N2O"), times = 9),
                         Year = rep(c(1990:1992), each = 9),
                         value = runif(27, 1,5))

test.frame %>%
  group_by(Country, Entity) %>% 
  do(lm( value ~ Year , data = .) %>% 
       predict(., tibble(Year = 1993)) %>%
       tibble(Year = 1993, value = .)) %>%
  bind_rows(test.frame)
#> # A tibble: 36 x 4
#> # Groups:   Country, Entity [9]
#>    Country Entity  Year value
#>    <fct>   <fct>  <dbl> <dbl>
#>  1 Austria CH4     1993 2.10 
#>  2 Austria CO2     1993 2.03 
#>  3 Austria N2O     1993 6.02 
#>  4 Brazil  CH4     1993 4.90 
#>  5 Brazil  CO2     1993 0.771
#>  6 Brazil  N2O     1993 5.28 
#>  7 Canada  CH4     1993 4.69 
#>  8 Canada  CO2     1993 0.729
#>  9 Canada  N2O     1993 1.49 
#> 10 Austria CO2     1990 4.66 
#> # ... with 26 more rows

关于r - 在管道中使用 dplyr 中的 group_by() 和 predict.lm 和 do() 进行年份线性外推,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51677597/

相关文章:

r - R中的单向哈希函数

r - dplyr::select 函数与 MASS::select 冲突

R:使用链接在 select() 之后使用 mutate() 和 apply

从 RasterBrick R 中删除 "time"维度

R:使用 getURL() 提取地址

r - 循环遍历 tibble 列时获取 map-loop-element 的名称

重复行并在 dplyr 中相应地生成新列

r - 获取一段时间内的累积值计数

shell - 使用非 R 代码块进行 SWeave?

r - 通过R中的sf将经纬度序列转换为多边形