首页 > 解决方案 > 使用 for 循环按组创建时间序列

问题描述

我有一个我想按组运行的 for 循环。我希望它遍历一组数据,为大多数行创建一个时间序列,然后输出组中该行数据的预测(基于该时间点及其前面的时间点)我遇到的问题正在为我的数据中的每个“组”运行该循环。我想避免手动这样做,因为这需要几个小时,而且肯定有更好的方法。

请允许我更详细地解释一下。

我有一个大数据集(160 万行),每一行都有一年,A 国,B 国,以及一些涉及两者之间关系的度量。

到目前为止,我已经成功地将单个(A 国、B 国)关系提取到新表中,并使用 for 循环将必要的预测数据输出到数据集中的新变量中。我想创建一个 for 循环遍历每个(国家 A,国家 B)超过 3 个条目的分组。

数据:

在这里,我将复制一小部分数据,并将包含一个缺失值以确保真实性。

set.seed(2000)  
df <- data.frame(year = rep(c(1946:1970),length.out=50),
                     ccode1 = rep(c("2"), length.out = 50),
                     ccode2 = rep(c("20","31"), each=25),
                     kappavv = rnorm(50,mean = 0, sd=0.25),
                     output = NA)
    df$kappavv[12] <- NA

我做了什么:

注意:我从每组​​的第三个数据点开始预测,但基于预测之前的所有时间点。

for(i in 3:nrow(df)){
    
    dat_ts <- ts(df[, 4], start = c(min(df$year), 1), end = c(df$year[i], 1), frequency = 1)
    dat_ts_corr <- na_interpolation(dat_ts)
    trialseries <- holt(dat_ts_corr, h=1)
    df$output[i] <- trialseries$mean
  }

当我将它应用于 ccode1 和 ccode2 的一对时,当我按年份升序正确排列时,这部分工作并输出我想要的东西。

什么不起作用:

我在通过对 ccode2 进行分组来应用这个 for 循环时遇到了一些严重的问题。我的一些数据是不均匀的:有时组的大小不同,起点/终点不同,并且缺少数据。

我尝试将循环表达为一个函数,使用 group_by() 和管道,使用各种类型的 apply() 函数。

感谢您的帮助。提前致谢。我很高兴回答您的任何澄清问题。

标签: rloopstime-seriesgroupingholtwinters

解决方案


您可以将for循环代码放在一个函数中。

library(dplyr)
library(purrr)

apply_func <- function(df) {
  for(i in 3:nrow(df)){
    
    dat_ts <- ts(df[, 4], start = c(min(df$year), 1), 
                 end = c(df$year[i], 1), frequency = 1)
    dat_ts_corr <- imputeTS::na_interpolation(dat_ts)
    trialseries <- forecast::holt(dat_ts_corr, h=1)
    df$output[i] <- trialseries$mean
  }
  return(df)
}

拆分数据ccode2并应用apply_func

df %>%group_split(ccode2) %>% map_df(apply_func)

#    year ccode1 ccode2 kappavv  output
#   <int> <chr>  <chr>    <dbl>   <dbl>
# 1  1946 2      20     -0.213  NA     
# 2  1947 2      20     -0.0882 NA     
# 3  1948 2      20      0.223   0.286 
# 4  1949 2      20      0.435   0.413 
# 5  1950 2      20      0.229   0.538 
# 6  1951 2      20     -0.294   0.477 
# 7  1952 2      20     -0.485  -0.675 
# 8  1953 2      20      0.524   0.405 
# 9  1954 2      20      0.0564  0.0418
#10  1955 2      20      0.294   0.161 
# … with 40 more rows

推荐阅读