Преобразование ILR (Isometric Log-Ratio) используется при анализе композиционных данных. Любое данное наблюдение представляет собой набор положительных значений, суммирующих единицу, таких как пропорции химических веществ в смеси или пропорции общего времени, потраченного на различные виды деятельности. Инвариант суммы к единице подразумевает, что, хотя в каждом наблюдении может быть k≥2 компонентов, существует только k−1 функционально независимых значений. (Геометрически наблюдения лежат на k−1 мерном симплексе в k мерном евклидовом пространстве Rk, Эта симплициальная природа проявляется в треугольных формах диаграмм рассеяния смоделированных данных, показанных ниже.)
Как правило, распределение компонентов становится «приятнее» при преобразовании журнала. Это преобразование может быть масштабировано путем деления всех значений в наблюдении на их среднее геометрическое значение, прежде чем брать записи. (Эквивалентно, журналы данных в любом наблюдении центрируются путем вычитания их среднего значения.) Это известно как преобразование «Центрированное логарифмическое отношение», или CLR. Результирующие значения все еще лежат в гиперплоскости в Rk , потому что масштабирование приводит к тому, что сумма лог-файлов равна нулю. ILR состоит из выбора любого ортонормированного базиса для этой гиперплоскости:k−1координаты k - 1 каждого преобразованного наблюдения становятся его новыми данными. Эквивалентно, гиперплоскость поворачивается (или отражается), чтобы совпадать с плоскостью с исчезающимkth координата использует первыеk−1 координаты. (Поскольку вращения и отражения сохраняют расстояние, они являютсяизометриями, отсюда и название этой процедуры.)
Цагрис, Престон и Вуд утверждают, что «стандартный выбор [матрицы вращения] H - это подматрица Гельмерта, полученная путем удаления первой строки из матрицы Гельмерта».
Матрица Гельмерта порядка k строится простым образом (см., Например, Harville p. 86). Его первый ряд - все 1 с. Следующая строка является одной из самых простых, которые можно сделать ортогональными к первой строке, а именно (1,−1,0,…,0) . Строка j является одной из самых простых, которая ортогональна всем предыдущим строкам: ее первые j−1 записи равны 1 с, что гарантирует ее ортогональность строкам 2,3,…,j−1и его jth запись установлена в 1−j чтобы сделать ее ортогональной первой строке (то есть ее записи должны суммироваться до нуля). Все строки затем изменяются на единицу длины.
Здесь, чтобы проиллюстрировать шаблон, это 4×4матрица Гельмерта 4 до того, как ее строки были перемасштабированы:
⎛⎝⎜⎜⎜11111- 11110- 21100- 3⎞⎠⎟⎟⎟,
(Редактирование добавлено в августе 2017 г.) Одним из особенно приятных аспектов этих «контрастов» (которые читаются построчно) является их интерпретируемость. Первая строка удаляется, оставляя к - 1 оставшихся строк для представления данных. Второй ряд пропорционален разнице между второй переменной и первой. Третий ряд пропорционален разнице между третьей переменной и первыми двумя. Обычно строка J ( 2 ≤ j ≤ k ) отражает разницу между переменной J и всеми предшествующими ей переменными 1 , 2 , … , j - 1, Это оставляет первую переменную J = 1 в качестве «основы» для всех контрастов. Я нашел эти интерпретации полезными, когда следовал ILR анализом главных компонентов (PCA): он позволяет интерпретировать нагрузки, по крайней мере, приблизительно, с точки зрения сравнений между исходными переменными. Я вставил строку в R
реализацию ilr
ниже, которая дает выходным переменным подходящие имена, чтобы помочь с этой интерпретацией. (Конец редактирования.)
Поскольку R
предоставляет функцию contr.helmert
для создания таких матриц (хотя и без масштабирования, а строки и столбцы обнуляются и транспонируются), вам даже не нужно писать (простой) код для этого. Используя это, я реализовал ILR (см. Ниже). Чтобы проверить и протестировать его, я сгенерировал 1000 независимых отрисовок из распределения Дирихле (с параметрами 1 , 2 , 3 , 4 ) и нанес на график их матрицу рассеяния. Здесь к = 4 .
Все точки слипаются около нижних левых углов и заполняют треугольные участки их областей построения, что характерно для композиционных данных.
Их ILR имеет только три переменные, опять же построенные в виде матрицы рассеяния:
Это действительно выглядит лучше: диаграммы рассеяния приобрели более характерные формы «эллиптического облака», лучше поддающиеся анализам второго порядка, таким как линейная регрессия и PCA.
Цагрис и соавт. обобщить CLR, используя преобразование Бокса-Кокса, которое обобщает логарифм. (Журнал представляет собой преобразование Бокса-Кокса с параметром 0 ) Это полезно, поскольку, как утверждают авторы (правильно ИМХО), во многих приложениях данные должны определять их преобразование. Для этих данных Дирихля параметр 1 / 2 (который находится на полпути между отсутствием трансформации и преобразованием журнала) прекрасно работает:
1 / 2 или достигли понимания.
Это обобщение реализовано в ilr
функции ниже. Команда для создания этих «Z» переменных была просто
z <- ilr(x, 1/2)
Одним из преимуществ преобразования Бокса-Кокса является его применимость к наблюдениям, которые содержат истинные нули: он все еще определяется, если параметр положительный.
Ссылки
Михаил Т. Цагрис, Саймон Престон и Эндрю Т.А. Вуд. Преобразование мощности на основе данных для композиционных данных . arXiv: 1106.1451v2 [stat.ME] 16 июня 2011 г.
Дэвид А. Харвилл, Матричная алгебра с точки зрения статистики . Springer Science & Business Media, 27 июня 2008 г.
Вот R
код
#
# 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)