是否存在类似于Box-Cox的自变量转换?就是说,可以优化变量的转换,以便可以更合理地拟合线性模型?y~f(x)
如果是这样,是否有执行此操作的功能R
?
是否存在类似于Box-Cox的自变量转换?就是说,可以优化变量的转换,以便可以更合理地拟合线性模型?y~f(x)
如果是这样,是否有执行此操作的功能R
?
Answers:
约翰·图基(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系列,以使转换形式为
R
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
我们已经达到了与问题的上下文类似的观点:无论出于何种原因(通常是为了稳定残差),我们都重新表达了因变量,但是我们发现与自变量的关系是非线性的。因此,现在我们要重新表达自变量,以使关系线性化。这是通过相同的方式完成的,只是颠倒了x和y的作用:
parms <- threepoint(y[i3], temperature[i3])
x <- box.cox(temperature, parms)
parms
看看这些约翰·福克斯(John Fox)的“回归诊断”幻灯片(可从此处获得,并附带参考文献),其中简要讨论了转换非线性的问题。它涵盖了Tukey用于选择幂变换的“凸出规则”(通过公认的答案解决),还提到了Box-Cox和Yeo-Johnson变换家族。请参阅幻灯片的3.6节。有关同一作者的更正式观点,请参见J. Fox,《应用回归分析和广义线性模型》,第二版(Sage,2008年)。
至于实际的R包,绝对可以看一看由J. Fox和S. Weisberg编写的汽车包。该软件包随附J. Fox和S. Weisberg,《应用回归的R伴侣》第二版(Sage,2011年),这是另一本必读的书。使用该软件包,您可以从basicPower()
(简单的幂变换),bcPower()
(Box-Cox变换)和yjPower()
(Yeo-Johnson变换)开始。还有powerTransform():
函数powerTransform用于估计单变量或多变量随机变量的归一化变换。
查看这两本书,以获取有关这些转换背后的理论和计算方法的更多详细信息。
R
,考虑了一会儿,我不确定到底该怎么做。您将优化哪些标准以确保“最线性”的转换?极具诱惑力,但是,正如我在此处的答案所示,R 2不能单独用来查看模型的线性假设是否得到满足。您有没有想到一些标准?