如何处理和变换变量?(四)

文章介绍了如何通过幂变换处理简单的单调非线性关系,通过R代码示例展示了数据集中的转换操作,如平方和开方。分析了不同数据集的残差图和逆响应图,提出对数据集1和2进行平方根变换,而数据集3无需转换,数据集4则建议极端变换,强调非线性的复杂性需谨慎处理。
摘要由CSDN通过智能技术生成

幂变换可用于理顺简单的单调非线性关系。(简单的非线性关系是指曲率方向不变的关系)。因此,现在我们至少要考虑两个变量,例如一个响应变量一个(或多个)解释变量。下面的 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)

(未完待续) 

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值