Tengo una matriz de 5x3 llamada matrixoutput:

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))

Tengo una matriz de 5x1 llamada matrixactual:

matrixactual <- structure(c(743.2, 710.37, 787.77, 721.41, 808), .Dim = c(5L, 
1L))

Estoy tratando de ejecutar un cálculo "MAPE" para cada columna en matrixoutput como tal:

MAPE <- mean(abs((matrixactual-matrixoutput)/matrixactual) * 100)

Sin embargo, esto devuelve el error:

Error en matrixactual - salida de matriz: matrices no conformes

¿Alguna idea de una solución alternativa? Me imagino que hay una solución simple.

1
ZJAY 16 sep. 2018 a las 01:16

4 respuestas

La mejor respuesta
matrixactual <- c(matrixactual)  ## I mean `base::c`
colMeans(abs((matrixactual - matrixoutput) / matrixactual) * 100)

"Regla de reciclaje" funciona detrás de eso "-" y "/".


A veces podemos encontrar situaciones aún más oscuras:

A <- matrix(1:15, 5, 3)
b <- array(1:5, dim = 5)
b
#[1] 1 2 3 4 5

b parece un vector, pero en realidad no lo es. Es una matriz 1D con el atributo "dim". "-" se quejaría de una dimensión no conforme.

A - b
#Error in A - b : non-conformable arrays

Use A - c(b) para usar realmente la "regla de reciclaje".

Además, "%*%" fallaría.

A %*% b
#Error in A %*% b : non-conformable arguments

La solución es A %*% c(b).

La matriz 1D es devuelta por la función table cuando se usa en una sola entrada. Entonces, mi elaboración aquí solo quiere decir: quizás un código robusto debería verificar siempre la dimensión.

1
李哲源 16 sep. 2018 a las 20:43

El problema es matrixactual-matrixoutput. Estás restando una matriz de 5x3 de una matriz de 5x1. La resta de esta manera es una operación uno a uno y requiere objetos de la misma dimensión. Debe usar sweep y colMeans para obtener el número correcto de dimensiones:

MAPE <- colMeans(abs(sweep(matrixoutput,1,matrixactual)))
1
mer 15 sep. 2018 a las 22:30

Tratar

colMeans(abs(sweep(matrixoutput, 1, matrixactual)) / rep(matrixactual,3))

La clave aquí es hacer un seguimiento de la dimensión. Puede restar fácilmente matrices de la misma dimensión entre sí, pero cuando las dimensiones difieren, se vuelve complicado. En su caso, R le dio un mensaje de error cuando intentó restar un vector de una matriz.

Aquí, sweep(a, 1, b) elimina cada valor en b de la fila correspondiente en a. Luego debe dividir con un objeto cuya dimensión esté alineada con matrixoutput, que es el caso si repite matrixactual tres veces.

Una alternativa sería

colMeans((matrixoutput - rep(matrixactual, 3)) / rep(matrixactual,3))
1
coffeinjunky 15 sep. 2018 a las 22:33

Esta: MAPE <- colMeans (abs (-matrixoutput + matrixactual [, 1]))
da: [1] 6.078606 5.632540 5.862956

Que es idéntico al resultado de:
MAPE <- colMeans (abs (barrido (salida de matriz, 1, matrizactual)))

Esto es, creo, más sencillo para el programador no R. Sin embargo, no entiendo por qué es necesario el [, 1].

0
user3604103 4 nov. 2019 a las 10:23