如何创建一个循环:将 4 个月的错误项相加,然后除以 r 中等效的 4 个月真实数字的总和?

Posted

技术标签:

【中文标题】如何创建一个循环:将 4 个月的错误项相加,然后除以 r 中等效的 4 个月真实数字的总和?【英文标题】:How to create a loop that: sums an error term for 4 months, and divide with the sum of the equivalent 4 months' true numbers, in r? 【发布时间】:2021-12-07 07:31:37 【问题描述】:

我正在研究一个预测问题,其目标是预测公司在未来 9 个月内应购买的库存商品数量。我的数据是每月的,但我被要求创建一个 4 个月内的“移动/滚动错误率”。我尝试过:ma(me/outsamp*100, order = 4, center =FALSE)。但是我意识到,平均 4 个月的百分比误差不等于:4 个月预测的总和 / 给定 4 个月期间的总和 * 100 ((prediction_1+p_2+p_3+p_4)/(实际售出物品数量_1 +a_2+a_3+a_4) * 100.) 测试集由 2021 年的前 9 个月组成。因此,我想创建一个解决方案,其中计算第 1+2+3 个月的误差+4,其次是 2+3+4+5,然后向前直到 6+7+8+9(可能是一个 for 循环)。

样本数据,(和错误(4)在excel中计算,然后导入r,以便在这里上传。)

df<-data.frame(predictions = c(393.4, 511.4, 471.7, 679.2, 613.9, 
                           456.2, 603.2, 668.2, 512.4), 
           outsamp = c(662, 416, 594, 495, 442, 480, 263, 464, 507),
           ME = c(268.6, -95.4, 122.3, -184.2, -171.9, 23.8, -340.2, -204.2, -5.4),
           `error (4)` = c(NA, 0.0513613290263037, -0.169080636877247, -0.104425658876181, 0.400297619047619, -0.419951485748939, 
                          -0.306884480746791, NA, NA),
           `error (5)` = c(NA, NA, -0.0232272901494825,-0.125834363411619, -0.241952506596306, -0.408908582089552, -0.323701298701299, NA, NA), 
           `error (6)` = c(NA, NA, -0.0119132405309161, -0.24,-0.275529583637692, -0.332742361373067, NA, NA, NA))

excel中的计算显示在下面excel calculations

【问题讨论】:

可以共享您的数据!使用dput(df),假设您的数据名为df,并将结果发布在您问题的代码块中!这样可以更轻松地为您提供帮助。 我刚刚编辑了我的问题,我使用 dput 对吗? 我后来发现了函数'rollsum',结果证明它很有用,除了当窗口不再有4个观察值时它应该停止。以下确实部分解决了这个问题:ma_me_4&lt;-rollsum(df.error2.2$me,k =4) / rollsum(df.error2.2$outsamp,k =4) * 100 【参考方案1】:

您可以使用行索引通过循环计算滚动总和:

df <- data.frame(
   predictions.2.2 = c(393.4, 511.41,  471.6, 679.1, 613.9, 456.1,  603.1, 668.1, 512.4),
   outsamp = c(662,  416, 594, 495, 442, 480, 263, 464, 507),
   me = c(268.5,  -95.4, 122.3, -184.1, -171.9,  23.8, -340.1, -204.1, -5.4 ),
   mae = c(268.5, 95.4, 122.3,  184.1, 171.9, 23.8, 340.1,  204.1, 5.4))

for(i in 1:nrow(df))
   df[i,"me_rsum"] <- sum(df[i:(i+3),"me"])
   df[i,"outsamp_rsum"] <- sum(df[i:(i+3),"outsamp"])

df$percent_diff <- (df$me_rsum / df$outsamp_rsum) * 100
df
  predictions.2.2 outsamp     me   mae me_rsum outsamp_rsum percent_diff
1          393.40     662  268.5 268.5   111.3         2167     5.136133
2          511.41     416  -95.4  95.4  -329.1         1947   -16.902928
3          471.60     594  122.3 122.3  -209.9         2011   -10.437593
4          679.10     495 -184.1 184.1  -672.3         1680   -40.017857
5          613.90     442 -171.9 171.9  -692.3         1649   -41.983020
6          456.10     480   23.8  23.8  -525.8         1714   -30.676779
7          603.10     263 -340.1 340.1      NA           NA           NA
8          668.10     464 -204.1 204.1      NA           NA           NA
9          512.40     507   -5.4   5.4      NA           NA           NA

或者,矢量化:

sapply(1:nrow(df), function(i) sum(df[i:(i+3),"me"]) / sum(df[i:(i+3),"outsamp"]) * 100)
[1]   5.136133 -16.902928 -10.437593 -40.017857 -41.983020 -30.676779
[7]         NA         NA         NA

【讨论】:

不客气。我很乐意提供帮助。祝你好运 在兴奋中我可能超越了自己......这个解决方案复制了我的第 4 行,作为 me_rsum 第 1 行的解决方案。然后它系统地继续这样下去。 是的,很抱歉有一个错字。它应该是i:i+3 而不是i+3。我更新了我的答案。很抱歉! 嗨@ChristofferNielsen-jasa,你能解决这个问题吗? 嗨@Skaqqs,很抱歉回答迟了。我有一年半以来的第一个假期,所以它是免费的。但回到正题。您的更新现在给出的结果与我自己在 Excel 中的计算结果相同。所以是的,我让它工作了,再次感谢你。

以上是关于如何创建一个循环:将 4 个月的错误项相加,然后除以 r 中等效的 4 个月真实数字的总和?的主要内容,如果未能解决你的问题,请参考以下文章

ABAP 如何使用select实现多值和输出 比如 十二个月的余额 输出为一年的余额

如何在不使用for循环的情况下合并需要提前3个月的列上的两个数据框

UML精粹2 - 开发过程

如何在 .net 中创建 13 个月的基于月球的日历

python学习--练习题678--九九乘法表,前两项相加问题,素数输出问题

如何在swiftUI中的Foreach循环上显示除一项之外的图像?