我有一个名为matrixoutput
的5x3矩阵:
matrixoutput <- structure(c(755.012517738809, 713.680227809506, 796.559832334474,
720.586278415567, 813.656728335122, 747.228849872966, 716.763851131365,
790.005405393554, 719.099072835892, 794.80633176412, 747.924859415065,
714.405749195011, 792.123774606548, 719.75129988389, 793.458302292789
), .Dim = c(5L, 3L))
我有一个名为matrixactual
的5x1矩阵:
matrixactual <- structure(c(743.2, 710.37, 787.77, 721.41, 808), .Dim = c(5L,
1L))
我正在尝试对matrixoutput
中的每一列进行“ MAPE”计算,如下所示:
MAPE <- mean(abs((matrixactual-matrixoutput)/matrixactual) * 100)
但是这将返回错误:
matrixactual中的错误-matrixoutput:不合格数组
有任何解决方法的想法吗?我想有一个简单的解决方法。
答案 0 :(得分:1)
尝试
colMeans(abs(sweep(matrixoutput, 1, matrixactual)) / rep(matrixactual,3))
此处的关键是跟踪尺寸。您可以轻松地将相同维数的矩阵彼此相减,但是当维数不同时,它将变得很棘手。在您的情况下,当您尝试从矩阵中减去向量时,R给您一条错误消息。
此处,sweep(a, 1, b)
从b
的相应行中删除a
中的每个值。然后,您需要用一个尺寸与matrixoutput
对齐的对象进行划分,如果重复三次matrixactual
,就是这种情况。
一种替代方法
colMeans((matrixoutput - rep(matrixactual, 3)) / rep(matrixactual,3))
答案 1 :(得分:1)
问题是matrixactual-matrixoutput
。您正在从5x1矩阵中减去5x3矩阵。以这种方式进行减法是一对一的操作,需要相同尺寸的对象。您应该使用sweep
和colMeans
来获取正确的尺寸数:
MAPE <- colMeans(abs(sweep(matrixoutput,1,matrixactual)))
答案 2 :(得分:1)
matrixactual <- c(matrixactual) ## I mean `base::c`
colMeans(abs((matrixactual - matrixoutput) / matrixactual) * 100)
"Recycling rule"在"-"
和"/"
之后工作。
有时候我们可能会遇到更加模糊的情况:
A <- matrix(1:15, 5, 3)
b <- array(1:5, dim = 5)
b
#[1] 1 2 3 4 5
b
看起来像矢量,但实际上不是。它是具有“ dim”属性的一维数组。 "-"
会抱怨尺寸不一致。
A - b
#Error in A - b : non-conformable arrays
使用A - c(b)
来实际使用“回收规则”。
此外,"%*%"
也会失败。
A %*% b
#Error in A %*% b : non-conformable arguments
解决方案是A %*% c(b)
。
一维数组在单个输入上使用时由table
函数返回。因此,我在这里只想说一句:也许健壮的代码段应始终检查维度。
答案 3 :(得分:0)
此:
MAPE <-colMeans(abs(-matrixoutput + matrixactual [,1]))
给出:[1] 6.078606 5.632540 5.862956
与以下内容的输出相同:
MAPE <-colMeans(abs(sweep(matrixoutput,1,matrixactual))
我认为,这对于非R程序员来说更直接。 但是,我不明白为什么[,1]是必需的。