gpt4 book ai didi

r - 如何在 R 中使用 Box-Cox 幂变换

转载 作者:行者123 更新时间:2023-12-02 04:56:48 25 4
gpt4 key购买 nike

我需要将一些数据转换为“正常形状”,并且我读到 Box-Cox 可以识别用于转换数据的指数。

据我了解

car::boxCoxVariable(y)

用于线性模型中的响应变量,并且

MASS::boxcox(object)

用于公式或拟合模型对象。所以,因为我的数据是数据框的变量,所以我发现我可以使用的唯一函数是:

car::powerTransform(dataframe$variable, family="bcPower")

这是正确的吗?或者我错过了什么?

第二个问题是我拿到之后该怎么办

Estimated transformation parameters
dataframe$variable
0.6394806

我应该简单地将变量乘以这个值吗?我这样做了:

aaa = 0.6394806
dataframe$variable2 = (dataframe$variable)*aaa

然后我运行 shapiro-wilks 正态性检验,但我的数据似乎不遵循正态分布:

shapiro.test(dataframe$variable2)
data: dataframe$variable2
W = 0.97508, p-value < 2.2e-16

最佳答案

Box 和 Cox(1964)提出了一系列变换,旨在减少线性模型中误差的非正态性。事实证明,这样做通常也会减少非线性。

这里是对原始工作以及此后所做的所有工作的很好的总结:http://www.ime.usp.br/~abe/lista/pdfm9cJKUmFZp.pdf

但是,您会注意到,控制 lambda 幂变换选择的对数似然函数取决于基础模型的残差平方和(SO 上没有 LaTeX - 请参阅引用资料),因此没有变换无需模型即可应用。

典型应用如下:

library(MASS)

# generate some data
set.seed(1)
n <- 100
x <- runif(n, 1, 5)
y <- x^3 + rnorm(n)

# run a linear model
m <- lm(y ~ x)

# run the box-cox transformation
bc <- boxcox(y ~ x)

enter image description here

(lambda <- bc$x[which.max(bc$y)])
[1] 0.4242424

powerTransform <- function(y, lambda1, lambda2 = NULL, method = "boxcox") {

boxcoxTrans <- function(x, lam1, lam2 = NULL) {

# if we set lambda2 to zero, it becomes the one parameter transformation
lam2 <- ifelse(is.null(lam2), 0, lam2)

if (lam1 == 0L) {
log(y + lam2)
} else {
(((y + lam2)^lam1) - 1) / lam1
}
}

switch(method
, boxcox = boxcoxTrans(y, lambda1, lambda2)
, tukey = y^lambda1
)
}


# re-run with transformation
mnew <- lm(powerTransform(y, lambda) ~ x)

# QQ-plot
op <- par(pty = "s", mfrow = c(1, 2))
qqnorm(m$residuals); qqline(m$residuals)
qqnorm(mnew$residuals); qqline(mnew$residuals)
par(op)

enter image description here

正如您所看到的,这并不是 Elixir ——只有一些数据可以有效地转换(通常小于 -2 或大于 2 的 lambda 表示您不应该使用该方法)。与任何统计方法一样,在实现之前请谨慎使用。

要使用两个参数 Box-Cox 变换,请使用 geoR 包查找 lambda:

library("geoR")
bc2 <- boxcoxfit(x, y, lambda2 = TRUE)

lambda1 <- bc2$lambda[1]
lambda2 <- bc2$lambda[2]

编辑:已修复 @Yui-Shiuan 指出的 Tukey 和 Box-Cox 实现的合并。

关于r - 如何在 R 中使用 Box-Cox 幂变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33999512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com