La transformación ILR (Isometric Log-Ratio) se utiliza en el análisis de datos de composición. Cualquier observación dada es un conjunto de valores positivos que suman la unidad, como las proporciones de productos químicos en una mezcla o las proporciones del tiempo total dedicado a diversas actividades. La invariante de suma a la unidad implica que aunque puede haber k ≥ 2 componentes en cada observación, solo hay k - 1 valores funcionalmente independientes. (Geométricamente, las observaciones se encuentran en un k - 1 -dimensional simplex en k -dimensional euclidean space Rk. Esta naturaleza simplicial se manifiesta en las formas triangulares de los diagramas de dispersión de los datos simulados que se muestran a continuación).
Típicamente, las distribuciones de los componentes se vuelven "más agradables" cuando se transforma el registro. Esta transformación se puede escalar dividiendo todos los valores en una observación por su media geométrica antes de tomar los registros. (De manera equivalente, los registros de los datos en cualquier observación se centran restando su media). Esto se conoce como la transformación "Relación de log centrada", o CLR. Los valores resultantes aún se encuentran dentro de un hiperplano en Rk , porque la escala causa que la suma de los registros sea cero. El ILR consiste en elegir cualquier base ortonormal para este hiperplano: las coordenadas k - 1 de cada observación transformada se convierten en sus nuevos datos. De manera equivalente, el hiperplano se gira (o se refleja) para coincidir con el plano con k desapareciendokth coordenada y uno usa las primerask - 1 coordenadas. (Debido a que las rotaciones y los reflejos preservan la distancia, sonisometrías, de ahí el nombre de este procedimiento).
Tsagris, Preston y Wood afirman que "una elección estándar de [la matriz de rotación] H es la submatriz Helmert obtenida al eliminar la primera fila de la matriz Helmert".
La matriz Helmert de orden k se construye de manera simple (ver Harville p. 86 por ejemplo). Su primera fila es todo 1 s. La siguiente fila es una de las más simples que se puede hacer ortogonal a la primera fila, a saber ( 1 , - 1 , 0 , … , 0 ) . La fila j es una de las más simples que es ortogonal a todas las filas anteriores: sus primeras entradas j - 1 son 1 s, lo que garantiza que es ortogonal a las filas 2 , 3 , ... , j - 1, y su entrada número jth se establece en 1 - j para que sea ortogonal a la primera fila (es decir, sus entradas deben sumar cero). Todas las filas se reescalan a la longitud de la unidad.
Aquí, para ilustrar el patrón, está la matriz Helmert 4 × 4 antes de que sus filas hayan sido reescaladas:
⎛⎝⎜⎜⎜11111- 11110 0- 2110 00 0−3⎞⎠⎟⎟⎟.
(Edición agregada en agosto de 2017) Un aspecto particularmente agradable de estos "contrastes" (que se leen fila por fila) es su interpretación. La primera fila se descarta, dejando k - 1 filas restantes para representar los datos. La segunda fila es proporcional a la diferencia entre la segunda variable y la primera. La tercera fila es proporcional a la diferencia entre la tercera variable y las dos primeras. En general, la fila j ( 2 ≤ j ≤ k ) refleja la diferencia entre la variable j y todas las que la preceden, las variables 1 , 2 , ... , j - 1. Esto deja la primera variable j = 1 como una "base" para todos los contrastes. He encontrado útiles estas interpretaciones cuando sigo el ILR por Análisis de Componentes Principales (PCA): permite que las cargas se interpreten, al menos aproximadamente, en términos de comparaciones entre las variables originales. He insertado una línea en la R
implementación de ilr
abajo que da a las variables de salida nombres adecuados para ayudar con esta interpretación. (Fin de la edición).
Dado que R
proporciona una función contr.helmert
para crear tales matrices (aunque sin la escala, y con filas y columnas negadas y transpuestas), ni siquiera tiene que escribir el código (simple) para hacerlo. Usando esto, implementé el ILR (ver más abajo). Para ejercitarlo y probarlo, generé 1000 sorteos independientes de una distribución de Dirichlet (con los parámetros 1 , 2 , 3 , 4 ) y tracé su matriz de diagrama de dispersión. Aquí, k = 4 .
Todos los puntos se agrupan cerca de las esquinas inferiores izquierdas y llenan parches triangulares de sus áreas de trazado, como es característico de los datos de composición.
Su ILR tiene solo tres variables, nuevamente trazadas como una matriz de diagrama de dispersión:
De hecho, esto se ve mejor: los diagramas de dispersión han adquirido formas de "nube elíptica" más características, más adecuadas para análisis de segundo orden como la regresión lineal y PCA.
Tsagris y col. generalice el CLR utilizando una transformación Box-Cox, que generaliza el logaritmo. (El registro es una transformación de Box-Cox con el parámetro 0 0 ). Es útil porque, como argumentan los autores (correctamente en mi humilde opinión), en muchas aplicaciones los datos deberían determinar su transformación. Para estos datos Dirichlet un parámetro de 1 / 2 (que está a medio camino entre la ausencia de transformación y una transformación logarítmica) funciona de maravilla:
1 / 2
Esta generalización se implementa en la ilr
función a continuación. El comando para producir estas variables "Z" era simplemente
z <- ilr(x, 1/2)
Una ventaja de la transformación Box-Cox es su aplicabilidad a las observaciones que incluyen ceros verdaderos: todavía se define siempre que el parámetro sea positivo.
Referencias
Michail T. Tsagris, Simon Preston y Andrew TA Wood, una transformación de potencia basada en datos para datos de composición . arXiv: 1106.1451v2 [stat.ME] 16 de junio de 2011.
David A. Harville, Álgebra matricial desde la perspectiva de un estadístico . Springer Science & Business Media, 27 de junio de 2008.
Aquí está el R
código.
#
# ILR (Isometric log-ratio) transformation.
# `x` is an `n` by `k` matrix of positive observations with k >= 2.
#
ilr <- function(x, p=0) {
y <- log(x)
if (p != 0) y <- (exp(p * y) - 1) / p # Box-Cox transformation
y <- y - rowMeans(y, na.rm=TRUE) # Recentered values
k <- dim(y)[2]
H <- contr.helmert(k) # Dimensions k by k-1
H <- t(H) / sqrt((2:k)*(2:k-1)) # Dimensions k-1 by k
if(!is.null(colnames(x))) # (Helps with interpreting output)
colnames(z) <- paste0(colnames(x)[-1], ".ILR")
return(y %*% t(H)) # Rotated/reflected values
}
#
# Specify a Dirichlet(alpha) distribution for testing.
#
alpha <- c(1,2,3,4)
#
# Simulate and plot compositional data.
#
n <- 1000
k <- length(alpha)
x <- matrix(rgamma(n*k, alpha), nrow=n, byrow=TRUE)
x <- x / rowSums(x)
colnames(x) <- paste0("X.", 1:k)
pairs(x, pch=19, col="#00000040", cex=0.6)
#
# Obtain the ILR.
#
y <- ilr(x)
colnames(y) <- paste0("Y.", 1:(k-1))
#
# Plot the ILR.
#
pairs(y, pch=19, col="#00000040", cex=0.6)