r matrix matrix-multiplication

R: Cómo reescalar mi matriz por columna



matrix matrix-multiplication (2)

Tengo una matriz de estados de enfermedad states0CommercialA , donde las columnas son estados (es decir, "sin enfermedad", "enfermedad", "muerto") y las filas son ciclos modelo (es decir, 1, 2, 3, 4, etc.) .

Estoy tratando de multiplicar esto por un vector de costos commercialMedExp , en el que cada costo corresponde a un estado de enfermedad. He intentado lo siguiente:

commercialMedExp * states0CommercialA

pero parece que la multiplicación ocurre en columnas en lugar de en filas. ¿Podría alguien ayudarme con la sintaxis correcta?


Algo como

commercialMedExp0A <- t(apply(states0CommercialA, 1, function(x){ x * commercialMedExp}))

debería funcionar siempre que el número de columnas en states0CommericialA tenga la misma longitud que commercialMedExp . Si no es así, tendría que subconjugar los datos. Por ejemplo, si los estados de enfermedad están en las columnas 13 a 18

commercialMedExp0A <- t(apply(states0CommercialA[,c(13:18)], 1, function(x){ x * commercialMedExp}))


El reescalamiento de columna / fila es una operación común en el cálculo matricial. Está buscando reescalar columnas, pero ofreceré soluciones para ambos.

Reescalado de fila

A <- matrix(1:20, nrow = 5); x <- 1:5 ## Any method below is much more efficient than `diag(x) %*% A` ## method 1: recycling A * x ## method 2: `sweep()` sweep(A, 1L, x, "*")

Reescalado de columna

A <- matrix(1:20, nrow = 5); y <- 1:4 ## Any below method is much more efficient than `A %*% diag(y)` ## method 1: transpose + row rescaling t(y * t(A)) ## method 2: `sweep()` sweep(A, 2L, y, "*") ## method 3: pairwise multiplication A * rep(y, each = nrow(A))

Lo que puedes hacer

states0CommercialA * rep(commercialMedExp, each = nrow(states0CommercialA))