使用 for 循环和滞后函数对神经网络时间序列进行数据格式化

Data formatting using for loops and lag function for time series with neural net

我正在寻找构建用于预测的神经网络模型。我试图让我的数据采用图像中显示的格式。我正在使用滞后函数来滞后时间序列的数据,并且还使用 2 个 for 循环来尝试以这种格式设置数据,但我很困惑并且为此苦苦挣扎了一段时间。我如何使用 2 个 for 循环和滞后函数来为神经网络预测设置这样的数据?

格式:

当前代码:

data <-
  structure(
    list(
      `USD/EUR` = c(
        1.373,
        1.386,
        1.3768,
        1.3718,
        1.3774,
        1.3672,
        1.3872,
        1.3932,
        1.3911,
        1.3838,
        1.4171,
        1.4164,
        1.3947,
        1.3675,
        1.3801,
        1.3744,
        1.3759,
        1.3743,
        1.3787,
        1.3595,
        1.3599,
        1.3624,
        1.3523,
        1.3506,
        1.3521
      )
    ),
    row.names = c(NA,-25L),
    class = c("tbl_df",
              "tbl", "data.frame")
  )

#Lag the data using lag function
lagData <- c(lag(data$`USD/EUR`,k = 0))
lagData

Store <- numeric(4)
for(i in data){
  for(j in 1:4){
    Store[j] = i[j]
  }
}

Store

您实际上不需要使用 for 循环。

在基数 R 中:

    matrix(lag(data$`USD/EUR`), nrow = 6, byrow = TRUE)
       [,1]   [,2]   [,3]   [,4]
[1,]     NA 1.3730 1.3860 1.3768
[2,] 1.3718 1.3774 1.3672 1.3872
[3,] 1.3932 1.3911 1.3838 1.4171
[4,] 1.4164 1.3947 1.3675 1.3801
[5,] 1.3744 1.3759 1.3743 1.3787
[6,] 1.3595 1.3599 1.3624 1.3523

然后重命名列等...

或者你,如果你想以 tidyverse 的方式做到这一点。

library(dplyr)
library(tidyr)

data %>% 
  mutate(id = sort(rep(seq(1:6), 4))) %>%  # Add ID column
  mutate(time = rep(c("2d", "1d", "today", "pred"), 6)) %>% 
  pivot_wider(names_from = time, values_from = `USD/EUR`)

# A tibble: 6 x 5
     id  `2d`  `1d` today  pred
  <int> <dbl> <dbl> <dbl> <dbl>
1     1  1.37  1.39  1.38  1.37
2     2  1.38  1.37  1.39  1.39
3     3  1.39  1.38  1.42  1.42
4     4  1.39  1.37  1.38  1.37
5     5  1.38  1.37  1.38  1.36
6     6  1.36  1.36  1.35  1.35

还有一个tidy lag function。仅供参考,您提供的数据不是 4 的倍数,所以我删除了一个观察结果。

您可以使用 dplyr::lead:

library(dplyr)

df <- data %>% 
  mutate(
    `2 days ago` = `USD/EUR`,
    `1 day ago` = lead(`USD/EUR`, n=1L),
    today = lead(`USD/EUR`, n=2L),
    predict = lead(`USD/EUR`, n=3L)
  ) %>% 
  drop_na()

df
# A tibble: 22 x 5
#    `USD/EUR` `2 days ago` `1 day ago` today predict
#        <dbl>        <dbl>       <dbl> <dbl>   <dbl>
#  1      1.37         1.37        1.39  1.38    1.37
#  2      1.39         1.39        1.38  1.37    1.38
#  3      1.38         1.38        1.37  1.38    1.37
#  4      1.37         1.37        1.38  1.37    1.39
#  5      1.38         1.38        1.37  1.39    1.39
#  6      1.37         1.37        1.39  1.39    1.39
#  7      1.39         1.39        1.39  1.39    1.38
#  8      1.39         1.39        1.39  1.38    1.42
#  9      1.39         1.39        1.38  1.42    1.42
# 10      1.38         1.38        1.42  1.42    1.39
# ... with 12 more rows

这些数字实际上并没有四舍五入,只是这样打印出来的。