自变量的 Box-Cox 变换?

机器算法验证 r 回归 数据转换 正态假设
2022-02-05 06:02:48

自变量是否有类似 Box-Cox 的转换?也就是说,优化变量的转换,以便更合理地拟合线性模型?xy~f(x)

如果是这样,是否有执行此操作的功能R

3个回答

John Tukey 提倡他的“三点法”来寻找变量的重新表达以使关系线性化。

我将用他的书中的一个练习来说明,探索性数据分析这些是来自改变温度并测量蒸气压的实验的汞蒸气压数据。

pressure <- c(0.0004, 0.0013, 0.006, 0.03, 0.09, 0.28, 0.8, 1.85, 4.4, 
              9.2, 18.3, 33.7, 59, 98, 156, 246, 371, 548, 790) # mm Hg
temperature <- seq(0, 360, 20) # Degrees C

该关系是强非线性的:请参见插图中的左侧面板。

情节

因为这是一个探索性的练习,我们希望它是交互式的。分析员被要求首先确定图中的三个“典型”点:一个靠近两端,一个在中间。我在这里这样做了,并用红色标记了它们。(当我很久以前第一次做这个练习时,我使用了一组不同的点,但得到了相同的结果。)

在三点法中,人们通过蛮力或其他方式搜索 Box-Cox 变换,当应用于其中一个坐标(y 或 x)时,将 (a) 将典型点近似地放置在线和(b)使用“不错”的权力,通常从分析师可能解释的权力“阶梯”中选择。

出于稍后将变得显而易见的原因,我通过允许“偏移”扩展了 Box-Cox 族,以便转换的形式为

x(x+α)λ1λ.

这是一个快速而肮脏的R实现。它首先找到一个最优的(λ,α)解决方案,然后回合λ到梯子上最接近的值,并根据该限制进行优化α(在合理范围内)。它非常快,因为所有计算都基于原始数据集中的这三个典型点。(你甚至可以用铅笔和纸来做,这正是 Tukey 所做的。)

box.cox <- function(x, parms=c(1,0)) {
  lambda <- parms[1]
  offset <- parms[2]
  if (lambda==0) log(x+offset) else ((x+offset)^lambda - 1)/lambda
}
threepoint <- function(x, y, ladder=c(1, 1/2, 1/3, 0, -1/2, -1)) {
  # x and y are length-three samples from a dataset.
  dx <- diff(x)
  f <- function(parms) (diff(diff(box.cox(y, parms)) / dx))^2
  fit <- nlm(f, c(1,0))
  parms <- fit$estimate #$
  lambda <- ladder[which.min(abs(parms[1] - ladder))]
  if (lambda==0) offset = 0 else {
    do <- diff(range(y))
    offset <- optimize(function(x) f(c(lambda, x)), 
                       c(max(-min(x), parms[2]-do), parms[2]+do))$minimum    
  }
  c(lambda, offset)
}

当三点法应用于汞蒸气数据集中的压力 (y) 值时,我们获得了图表的中间面板。

data <- cbind(temperature, pressure)
n <- dim(data)[1]
i3 <- c(2, floor((n+1)/2), n-1)
parms <- threepoint(temperature[i3], pressure[i3])
y <- box.cox(pressure, parms)

在这种情况下,parms结果等于(0,0):该方法选择对压力进行对数转换。

我们已经达到了与问题上下文类似的一点:无论出于何种原因(通常是为了稳定残差方差),我们重新表达了变量,但我们发现与自变量的关系是非线性的。所以现在我们转向重新表达自变量以使关系线性化。这以相同的方式完成,只是颠倒了 x 和 y 的角色:

parms <- threepoint(y[i3], temperature[i3])
x <- box.cox(temperature, parms)

parms发现自变量(温度)的值是(1,253.75):换句话说,我们应该将温度表示为摄氏度以上254C 并使用它的倒数1力量)。(出于技术原因,Box-Cox 变换进一步增加了1结果。)结果关系显示在右侧面板中。


到目前为止,任何具有最少科学背景的人都已经认识到数据“告诉”我们使用绝对温度——偏移量在哪里273代替254——因为这些在物理上是有意义的。(当使用偏移量重新绘制最后一个图时273代替254,几乎没有可见的变化。然后,物理学家会将 x 轴标记为1/(1x):即绝对温度的倒数。)

这是一个很好的例子,说明统计探索需要如何与对调查主题的理解相互作用事实上,倒数的绝对温度一直出现在物理定律中。因此,仅使用简单的 EDA 方法来探索这个具有百年历史的简单数据集,我们重新发现了克劳修斯-克拉佩龙关系:蒸汽压的对数是绝对温度倒数的线性函数。不仅如此,我们对绝对零的估计还不错(254摄氏度),从右图的斜率,我们可以计算出比汽化焓,而且——事实证明——对残差的仔细分析确定了一个异常值(温度为0摄氏度),向我们展示了汽化焓如何(非常轻微地)随温度变化(从而违反了理想气体定律),最终可以为我们提供有关汞气体分子有效半径的准确信息!所有这些都来自 19 个数据点和 EDA 中的一些基本技能。

看看这些由 John Fox撰写的关于“回归诊断”的幻灯片(可从此处获得,并附有参考资料),其中简要讨论了转换非线性的问题。它涵盖了 Tukey 用于选择幂变换的“膨胀规则”(由公认的答案解决),但也提到了 Box-Cox 和 Yeo-Johnson 变换族。请参阅幻灯片的第 3.6 节。对于同一作者的更正式的看法,请参阅J. Fox,应用回归分析和广义线性模型,第二版(Sage,2008)

至于对此有帮助的实际 R 包,请务必查看由 J. Fox 和 S. Weisberg 编写的汽车包。此软件包随附J. Fox 和 S. Weisberg,An R Companion to Applied Regression, Second Edition, (Sage, 2011),另一个必读。使用该软件包,您可以从basicPower()(简单的幂变换)、bcPower()(Box-Cox 变换)和yjPower()(Yeo-Johnson 变换)开始。还有powerTransform()

函数 powerTransform 用于估计单变量或多变量随机变量的归一化变换。

有关这些转换背后的理论和计算方法的更多详细信息,请查看这两本书。

将协变量变换的估计作为估计过程的正式部分有许多优点。这将识别所涉及的参数数量并产生良好的置信区间覆盖率和 I 类错误保留。回归样条是一些最好的方法。样条曲线将适用于零和负值X与对数方法不同。