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