使用 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
这些数字实际上并没有四舍五入,只是这样打印出来的。
我正在寻找构建用于预测的神经网络模型。我试图让我的数据采用图像中显示的格式。我正在使用滞后函数来滞后时间序列的数据,并且还使用 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
这些数字实际上并没有四舍五入,只是这样打印出来的。