gpt4 book ai didi

r - 使用循环计算两个数据矩阵的误差

转载 作者:行者123 更新时间:2023-12-04 07:23:54 27 4
gpt4 key购买 nike

我有两个相同维度的数据矩阵,让一个矩阵表示为 另一个用表示乙 有维度 24*365 其中 24 表示小时数,365 表示天数(意味着每个矩阵具有一年的每小时数据)。假设我选择一天,例如,星期日,假设它在两个矩阵的第 3 列中。同样,我从两个矩阵中选择周日的所有剩余列,因此我从每个矩阵中获得两个子矩阵 星期日的。然后我将每个子矩阵作为一个向量,并从这两个向量计算均方误差和百分比均方误差。类似地,对一周的剩余天数重复相同的过程。我的问题是任何人都可以使用循环来完成整个过程,每天从两个矩阵中选择子矩阵的循环一个 .然后将每个子矩阵作为一个向量,分别计算每一天的均方误差和均方误差百分比。
我尝试用一​​个例子来手动解释我的问题,这个例子是用 表示的任意两个矩阵。 C D ,但是由于我的原始数据矩阵的维数很大,因此有更多的子矩阵,这使得我们手动执行此操作非常耗时。

C <- matrix(16:155, ncol=14, byrow=T)
D<- matrix(50:189,ncol=14, byrow=T)
sub_C1 <- C[,c(1+(0:6)*2)]
sub_D1 <- D[,c(1+(0:6)*2)]
sub_C2 <- C[,c(2+(0:6)*2)]
sub_D2 <- D[,c(2+(0:6)*2)]
sub_C3 <- C[,c(1+(0:4)*3)]
sub_D3 <- D[,c(1+(0:4)*3)]
################mean square error################
mse_1 <- mean(abs(as.vector(sub_C1)-as.vector(sub_D1)))
mse_2 <- mean(abs(as.vector(sub_C2)-as.vector(sub_D2)))
mse_3 <- mean(abs(as.vector(sub_C3)-as.vector(sub_D3)))
################## mean percentage absolute error############
mape_1 <- mean(abs(as.vector(sub_C1)-as.vector(sub_D1))/as.vector(sub_C1))
mape_2 <- mean(abs(as.vector(sub_C2)-as.vector(sub_D2))/as.vector(sub_C2))
mape_3 <- mean(abs(as.vector(sub_C3)-as.vector(sub_D3))/as.vector(sub_C3))
#############################################################
有人可以帮助通过循环从每个矩阵中选择相同的子矩阵 C D ,并分别计算每个子矩阵的误差。

最佳答案

由于许多自称作者/开发人员经常说 as R is vectorised, loops in R are mostly avoidable .这里也不需要使用循环。还有一件事 - 二元运算,例如 +-已经向量化,因此您不需要将矩阵转换为向量 as.vector他们明确。
我想你可以用 purrr::map_df如下详述,这将为您提供所有 7 天的数据框结构。然而,第一行将对应于一年中的第一天(矩阵)。
策略说明——

  • 存储您想要的 n在变量 n 中.这里有你想要的7分区,所以我已经存储 n <- 7
  • 生成一个序列 0 到 n-1所以我用了seq(n) - 1作为第一个论点。
  • 现在对列号使用模除法 %%得到每个 n每次迭代中的第 th 行。例如8 %% 71和类似 15 %% 7还给 1所以每7第 1 行将出现在各自的分区中。
  • 对于分区,我们使用 C[, seq(ncol(C)) %% n == .x]两者的表达式/公式 CD分别。 .xmap 中的第一个参数功能。这将生成 7 个分区。
  • 检查这个
  • C[, seq(ncol(C)) %% 7 == 2]
    [,1] [,2]
    [1,] 17 24
    [2,] 31 38
    [3,] 45 52
    [4,] 59 66
    [5,] 73 80
    [6,] 87 94
    [7,] 101 108
    [8,] 115 122
    [9,] 129 136
    [10,] 143 150
  • 您会注意到第 2 行和第 8 行已由该表达式分区。
  • 将这些中间分区存储在临时变量中(在 {} 内)x1x2 (每个矩阵一个)
  • 在另外两个中间变量中说 y1y2计算 msemape根据给定的公式(此处使用 x1 和 x2)
  • 由于我们正在生成数据帧作为输出,我们需要 setNames在这里,最后在 {}

  • 我希望语法现在已经很清楚了。
    library(tidyverse)

    C <- matrix(16:155, ncol=14, byrow=T)
    D <- matrix(50:189,ncol=14, byrow=T)

    #number of partitions you desire
    n <- 7 # every 7th column

    purrr::map_df(seq(n) - 1, ~{x1 <- C[, seq(ncol(C)) %% n == .x]; x2 <- D[, seq(ncol(D)) %% n == .x];
    y1 <- mean(abs(x1 - x2)); y2 <- mean(abs(x1 - x2)/x1);
    setNames(c(.x+1, y1, y2), c('day', 'mse', 'mape'))})

    #> # A tibble: 7 x 3
    #> day mse mape
    #> <dbl> <dbl> <dbl>
    #> 1 1 34 0.520
    #> 2 2 34 0.604
    #> 3 3 34 0.588
    #> 4 4 34 0.572
    #> 5 5 34 0.558
    #> 6 6 34 0.545
    #> 7 7 34 0.532

    但是,如果您只想使用 baseR,您可以将以下列表作为具有 7 个元素的输出,每个元素每天 1 个。语法解释。
  • 策略类似于purrr又是在这里。这里公式和输入向量参数交换了位置(根据这些函数的设计)。
  • 由于我们正在生成列表作为输出,因此我们将在 {} 之外使用 `setNames(),即函数/公式参数。

  • C <- matrix(16:155, ncol=14, byrow=T)
    D <- matrix(50:189,ncol=14, byrow=T)

    #number of partitions you desire
    n <- 7 # every 7th column

    Map(\(.x) {x1 <- C[, seq(ncol(C)) %% n == .x]; x2 <- D[, seq(ncol(D)) %% n == .x];
    y1 <- mean(abs(x1 - x2)); y2 <- mean(abs(x1 - x2)/x1);
    setNames(c( y1, y2), c('mse', 'mape'))}, seq(n) - 1) |> setNames(paste0('Day', seq(n)))

    #> $Day1
    #> mse mape
    #> 34.0000000 0.5202581
    #>
    #> $Day2
    #> mse mape
    #> 34.0000000 0.6044914
    #>
    #> $Day3
    #> mse mape
    #> 34.0000000 0.5878023
    #>
    #> $Day4
    #> mse mape
    #> 34.00000 0.57236
    #>
    #> $Day5
    #> mse mape
    #> 34.0000000 0.5580051
    #>
    #> $Day6
    #> mse mape
    #> 34.0000000 0.5446064
    #>
    #> $Day7
    #> mse mape
    #> 34.0000000 0.5320546
    温馨提示- As 1 %% 7 = 1 (and not 0)第二列将被视为第 1 天,第七列将被视为第 1 天,第一列将被视为第 7 天

    关于r - 使用循环计算两个数据矩阵的误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68319817/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com