ILR(等距对数比)转换用于成分数据分析。任何给定的观察值都是一组合计为一个正值的正值,例如混合物中化学物质的比例或用于各种活动的总时间的比例。总和不变表示每个观察可能有分量,但只有功能独立的值。(在几何上,观测值位于维欧氏空间的维单形上。这种简单性体现在下面显示的模拟数据散点图的三角形中。)k≥2k−1k−1kRk
典型地,组分的分布变得“更好”,当对数转换。在取对数之前,可以通过将观察值中的所有值除以其几何平均值来缩放此转换。(等效地,任何观察中数据的对数通过减去它们的均值来居中。)这称为“居中对数比”转换或CLR。结果值仍位于的超平面内,因为缩放导致对数之和为零。所述ILR包括选择该超平面的任何正交基础的:所述的每个变换观测坐标成为其新的数据。等价地,超平面被旋转(或反射的),以重合与平面具有消失Rkk−1kth k−1坐标,然后使用第一个坐标。(由于旋转和反射保留了距离,因此它们是等距的,因此此程序为该名称。)k−1
Tsagris,普雷斯顿和伍德状态“下的标准选择[旋转矩阵]是通过从矩阵赫尔默特去除第一行得到的赫尔默特子矩阵”。H
阶Helmert矩阵以简单的方式构造(例如,参见Harville p。86)。它的第一行都是 s。下一行是与第一行正交的最简单的一行,即。第行是与所有先前行正交的最简单的行:它的前个条目为 s,这保证了它与第行正交k1(1,−1,0,…,0)jj−112,3,…,j−1及其项设置为,使之正交于所述第一行(即,其条目总和必须为零)。然后将所有行重新缩放为单位长度。jth1−j
在这里,为了说明这种模式,在重新缩放行之前是 × Helmert矩阵:4×4
⎛⎝⎜⎜⎜11111−11110−21100−3⎞⎠⎟⎟⎟.
(编辑于2017年8月添加)这些“对比”(逐行读取)的一个特别好的方面是它们的可解释性。删除第一行,剩下剩余行代表数据。第二行与第二个变量和第一个变量之间的差成比例。第三行与第三变量和前两个变量之间的差成比例。通常,第行()反映了变量与变量之前的所有变量之间的差k−1j2≤j≤kj1,2,…,j−1。剩下第一个变量j=1作为所有对比的“基础”。下面通过主成分分析(PCA)的ILR时,我发现这些解释有帮助的:它使负荷来解释,至少粗略,在原始变量之间的比较方面。我R
在ilr
下面的实现中插入了一行,为输出变量指定了适当的名称以帮助进行这种解释。(结束编辑的。)
由于R
提供了一个函数contr.helmert
来创建这样的矩阵(尽管没有缩放,并与行和列的否定和移位的),你甚至不用写的(简单)的代码来做到这一点。使用此方法,我实现了ILR(请参见下文)。为了进行测试,我从Dirichlet分布(参数)生成了独立绘图,并绘制了散点图矩阵。在此,。10001,2,3,4k=4
这些点都聚集在左下角附近,并填充了其绘制区域的三角形斑块,这是成分数据的特征。
他们的ILR只有三个变量,再次绘制为散点图矩阵:
这确实看起来更好:散点图已获得更多特征性的“椭圆云”形状,更适合于二阶分析,例如线性回归和PCA。
Tsagris 等。通过使用Box-Cox变换,推广了数概括CLR。(日志为Box-Cox变换与参数)。它是有用的,因为,正如作者(正确恕我直言)认为,在众多的数据应该确定其转化应用。对于这些狄利克雷数据的参数(这是不中途转换和对数变换之间)精美作品:01/2
“美丽”是指这张图片所允许的简单描述:不必指定每个点云的位置,形状,大小和方向,我们只需要观察(非常近似)所有云都是具有相似半径的圆形即可。实际上,CLR简化了将至少需要16个数字的初始描述简化为仅需要12个数字的描述,而ILR已将其简化为仅四个数字(三个单变量位置和一个半径),其代价是指定了ILR参数为 --a第五数目。当这种戏剧性的简化与真实数据发生,我们通常计算我们到的东西:我们已经取得了发现或获得的洞察力。1/2
在ilr
下面的函数中实现了这种概括。产生这些“ Z”变量的命令很简单
z <- ilr(x, 1/2)
Box-Cox变换的优点之一是它适用于包含真零的观测值:只要参数为正,它仍然可以定义。
参考文献
Michail T. Tsagris,Simon Preston和Andrew TA Wood,基于数据的成分数据功率转换。 arXiv:1106.1451v2 [stat.ME] 2011年6月16日。
David A. Harville,从统计学家的角度看矩阵代数。施普林格科学与商业媒体,2008年6月27日。
这是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)