gpt4 book ai didi

滚动平方根和其他功能

转载 作者:行者123 更新时间:2023-12-02 02:39:21 24 4
gpt4 key购买 nike

我很想创建一系列滚动误差函数。我有以下数据:

dat <- data.frame(
date <- seq.Date(from = as.Date("2010-01-01"), by = 1, length.out = 100),
pred <- sample(1000, 100, replace = FALSE),
actual <- sample(1000, 100, replace = FALSE)
) %>%
setNames(c("date", "pred", "actual"))

看起来像:

          date pred actual
1 2010-01-01 99 835
2 2010-01-02 429 779
3 2010-01-03 726 581

我想使用 rollapply 函数来创建滚动平方误差。我可以使用以下内容来创建滚动方式

window_size = 30 + 1 -1
dat %>%
arrange(desc(date)) %>%
mutate(
error = (pred - actual),
squared_error = error**2,

#rolling calcs
rolling_mean_error = c(rollapply(error, width = window_size, by = 1, FUN = mean), rep(NA, window_size - 1))
)

但是,我想使用 squared_error 函数。

squared_function <- function(err){
err**2
}


dat %>%
arrange(desc(date)) %>%
mutate(
error = (pred - actual),
squared_error = error**2,

#rolling calcs
rolling_mean_error = c(rollapply(error, width = window_size, by = 1, FUN = mean), rep(NA, window_size - 1)),
rolling_squared_error = c(rollapply(error, width = window_size, by = 1, FUN = squared_function), rep(NA, window_size - 1))
)

但是,它失败并出现以下错误:

Error: mutate() argument rolling_squared_error must be recyclable. ℹ rolling_squared_error is c(...). x rolling_squared_error can't be recycled to size 100. ℹ rolling_squared_error must be size 100 or 1, not 2159

编辑:

图书馆:

library(dplyr)
library(zoo)

最佳答案

您的squared_function 应返回单个数字,而不是与输入长度相同的向量。我怀疑您需要 sum(err**2)(平方和)或 sqrt(sum(err**2))

试试这个:


set.seed(42)
dat <- tibble(
date = seq.Date(from = as.Date("2010-01-01"), by = 1, length.out = 100),
pred = sample(1000, 100, replace = FALSE),
actual = sample(1000, 100, replace = FALSE)
) %>%
setNames(c("date", "pred", "actual"))

window_size <- 30 + 1 -1

squared_function <- function(err) sum(err**2)

dat2 <- dat %>%
arrange(desc(date)) %>%
mutate(
error = (pred - actual),
squared_error = error**2,
rolling_mean_error = zoo::rollapply(
error, width = window_size, by = 1, FUN = mean,
align = "left", fill = NA),
rolling_squared_error = zoo::rollapply(
error, width = window_size, by = 1, FUN = squared_function,
align = "left", fill = NA)
)
dat2
# # A tibble: 100 x 7
# date pred actual error squared_error rolling_mean_error rolling_squared_error
# <date> <int> <int> <int> <dbl> <dbl> <dbl>
# 1 2010-04-10 558 659 -101 10201 -93.7 5334540
# 2 2010-04-09 672 671 1 1 -88.6 5326839
# 3 2010-04-08 466 102 364 132496 -70.7 5616282
# 4 2010-04-07 302 481 -179 32041 -67.0 5711315
# 5 2010-04-06 665 49 616 379456 -66.6 5707835
# 6 2010-04-05 839 66 773 597529 -86.8 5328479
# 7 2010-04-04 954 908 46 2116 -103. 4817975
# 8 2010-04-03 190 118 72 5184 -92.8 4935575
# 9 2010-04-02 1 713 -712 506944 -90.2 4952295
# 10 2010-04-01 608 944 -336 112896 -53.0 4610187
# # ... with 90 more rows

align="left" 的解释。

每次调用 squared_function 时,都会给它 30 个数字并需要返回 1。一个问题:那个数字放在哪里?

让我们看一个人为的例子:

vec <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
zoo::rollapply(vec, 5, FUN = mean)
# [1] 3 4 5 6 7 6 5 4 3 2 3 4 5 6 7 6

结果是 16 长。当我们需要它与原始向量的长度相同时,我们可以使用 fill=NA 将其填充到相同的长度。但这引出了一个问题:每个数字都去了哪里?

zoo::rollapply(vec, 5, FUN = mean, fill = NA)
# 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
# `------. ,--------'
# v
# __, __, __, __, __
# 3, align="left"
# NA, NA, 3 align="right"
# NA, NA, NA, NA, 3 align="right"

关于滚动平方根和其他功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60741135/

24 4 0
文章推荐: Julia 循环包含
文章推荐: java - Textview 文本颜色无法以编程方式工作
文章推荐: java - JavaFX 中的虚线穿过实线
文章推荐: javascript - 使用 中的 SVG 是否允许点击事件传播到父处理程序?