幂变换可用于理顺简单的单调非线性关系。(简单的非线性关系是指曲率方向不变的关系)。因此,现在我们至少要考虑两个变量,例如一个响应变量和一个(或多个)解释变量。下面的 R 代码可以生成具有非线性关系变量的示例数据集。 (只展示前两个的转换操作作为例子)
数据集 1 和 2:简单且单调的非线性关系示例。
X1 <- X2 <- seq(1,5,by=0.05)
set.seed(1)
Y1 <- (X1 + rnorm(81, sd=0.25))^2
Y2 <- X2^2 + rnorm(81, sd=0.25)
par(mfrow=c(2,2))
scatter.smooth(X1, Y1, pch=16, main="original data",
lpars=list(col = "red", lwd = 2))
plot(lm(Y1 ~ X1), 1)
scatter.smooth(X1^2, Y1, pch=16, main="square transformed data",
lpars = list(col = "red", lwd = 2),
xlab = expression(X1^2))
plot(lm(Y1 ~ I(X1^2)), 1)
对于数据集 1,简单线性模型的残差与拟合值对比图显示出 U 型趋势。残差在拟合值较小和较大时为正值,但在中间为负值。这建议对预测变量X1进行变换。Y1 与 X1 平方的关系图显示出一种直线关系,X1 转换后的残差图有所改善。
对于数据集2, U型趋势也十分明显,但这次的操作是将响应变量Y2进行降幂,开方操作。残差图同样得到了改善。
数据集 3:单调且不简单的非线性关系示例。
X3 <-seq(-6, 6, by=0.25)
set.seed(1)
Y3 <- 1 + 1/(1 + exp(-X3)) + rnorm(length(X3), sd=0.1)
par(mfrow=c(2,1))
scatter.smooth(X3, Y3, pch=16, main="original data",
lpars=list(col = "red", lwd = 2))
plot(lm(Y3 ~ X3), 1)
数据集 4:简单但不单调的非线性关系示例。
X4 <- X3
set.seed(1)
Y4 <- 1 + (X4/6)^2 + rnorm(length(X4), sd=0.1)
par(mfrow=c(2,2))
scatter.smooth(X4, Y4, pch=16, main="original data",
lpars=list(col = "red", lwd = 2))
plot(lm(Y4 ~ X4), 1)
下面介绍逆响应图。
逆响应图考虑了响应变量的幂变换。它考虑了响应值(Y)和拟合值(Yˆ)之间的关系,并估算了 p,以得出最佳拟合方程 Yˆ = β0 + β1Y^p。现在沿用上面的数据集进行展示。
par(mfrow=c(1,1))
irp <- invResPlot(lm(Y1 ~ X1))
# Data Set 2
invResPlot(lm(Y2 ~ X2)) # also suggests a sqrt transformation of the response
# Data Set 3
invResPlot(lm(Y3 ~ X3))
# Data Set 4
invResPlot(lm(Y4 ~ X4))
根据黑色指标的读数,对数据集1,2建议进行平方根变换。对于数据集 3,它几乎没有提供需要转换的证据,而对于数据集 4,建议的转换是极端的。这表明非线性不是简单的单调性,因此不太可能通过幂变换来矫正。
读者可能发现了一个有趣的问题,即对响应变量开方操作和对自变量平方操作是否具备一样的效果?我在这里附上试验代码,可以自己尝试比较结果。
par(mfrow=c(2,2))
scatter.smooth(X1, Y1, pch=16, main="original data",
lpars=list(col = "red", lwd = 2))
plot(lm(Y1 ~ X1), 1)
scatter.smooth(X1, sqrt(Y1), pch=16, main="square transformed data",
lpars = list(col = "red", lwd = 2),
ylab = expression(sqrt(Y1)))
plot(lm(sqrt(Y1) ~ X1), 1)
(未完待续)