如何在R中使用Box-Cox功率变换
我需要将一些数据转换成“正常形状”,我读到Box Cox可以识别用于转换数据的指数 据我所知如何在R中使用Box-Cox功率变换,r,regression,transformation,R,Regression,Transformation,我需要将一些数据转换成“正常形状”,我读到Box Cox可以识别用于转换数据的指数 据我所知 car::boxCoxVariable(y) 用于线性模型中的响应变量,以及 MASS::boxcox(object) 用于公式或拟合模型对象。因此,因为我的数据是dataframe的变量,所以我发现唯一可以使用的函数是: car::powerTransform(dataframe$variable, family="bcPower") 对吗?还是我遗漏了什么 第二个问题是关于在我获得 Estim
car::boxCoxVariable(y)
用于线性模型中的响应变量,以及
MASS::boxcox(object)
用于公式或拟合模型对象。因此,因为我的数据是dataframe的变量,所以我发现唯一可以使用的函数是:
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
shapiro.test(数据帧$variable2)
数据:数据帧$variable2
W=0.97508,p值<2.2e-16
Box和Cox(1964)提出了一系列变换,旨在减少线性模型中误差的非正态性。事实证明,在这样做时,它通常也会减少非线性
以下是对原始工作以及自那时以来所做的所有工作的一个很好的总结:
但是,您会注意到,控制lambda幂变换选择的对数似然函数取决于基础模型的剩余平方和(没有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)
编辑:Tukey和Box-Cox实现的合并,正如@Yui Shiuan所指出的固定。根据George E.p.在纸盒中的Box-Cox转换公式。;考克斯,D.R.(1964年)。“转换分析”,我认为mlegge的帖子可能需要稍微编辑一下。转换后的y应该是(y^(lambda)-1)/lambda,而不是y^(lambda)。(实际上,y^(lambda)被称为Tukey转换,这是另一个不同的转换公式。)
因此,代码应该是:
(trans <- bc$x[which.max(bc$y)])
[1] 0.4242424
# re-run with transformation
mnew <- lm(((y^trans-1)/trans) ~ x) # Instead of mnew <- lm(y^trans ~ x)
(trans将BoxCox变换应用于数据,而不需要任何底层模型,目前可以使用该软件包完成。具体而言,您可以使用函数boxcoxfit()查找最佳参数,然后使用函数BCtransform()预测变换后的变量.如果我只想传递响应变量y,而不是指定了x的线性模型,例如我想传递/规范化数据列表,我可以取1表示x,那么对象将成为线性模型:
library(MASS)
y = rf(500,30,30)
hist(y,breaks = 12)
result = boxcox(y~1, lambda = seq(-5,5,0.5))
mylambda = result$x[which.max(result$y)]
mylambda
y2 = (y^mylambda-1)/mylambda
hist(y2)
您可能会指出,使用MASS
通过使用模型lm(y~1)
可以得到相同的答案(在这种情况下,bc是一个很好的答案!我想问一下,您为什么在回答的开头强调“错误”?这是因为要转换响应变量(例如y~x_1+x_2中的y)而不是协变量吗(x_1或x_2),或者一个人也可以转换协变量吗?谢谢你指出这一点(有很好的文档!)。我更新了我的答案,试图解决这个问题。我发现这是一个很好的文档,有清晰的R代码和示例(以及其他转换)手册中的章节@Valentin在书中提供了非常好的解释。非常感谢!有4个不同的变量,所有4个直方图都显示非正态分布,这个解决方案帮助我将它们分别带到正态分布。
(trans <- bc$x[which.max(bc$y)])
[1] 0.4242424
# re-run with transformation
mnew <- lm(((y^trans-1)/trans) ~ x) # Instead of mnew <- lm(y^trans ~ x)
library(MASS)
y = rf(500,30,30)
hist(y,breaks = 12)
result = boxcox(y~1, lambda = seq(-5,5,0.5))
mylambda = result$x[which.max(result$y)]
mylambda
y2 = (y^mylambda-1)/mylambda
hist(y2)