R 优化box-cox变换,无法在初始参数处计算函数
我正在尝试做一个自动的box-cox变换(这对于规范数据的人来说应该很有用),但是在用R的optim可以接受的方式来表达我的优化时遇到了困难。它通常是有效的,但我不清楚是什么原因导致它在极端倾斜的变量上失败 其思想是在box-cox变换中选择Lambda参数,以最小化数据集偏度的绝对值R 优化box-cox变换,无法在初始参数处计算函数,r,optimization,transformation,R,Optimization,Transformation,我正在尝试做一个自动的box-cox变换(这对于规范数据的人来说应该很有用),但是在用R的optim可以接受的方式来表达我的优化时遇到了困难。它通常是有效的,但我不清楚是什么原因导致它在极端倾斜的变量上失败 其思想是在box-cox变换中选择Lambda参数,以最小化数据集偏度的绝对值 library(car) library(moments) xskew <- function(data,par){ abs(skewness(bcPower(data,lambda=par[1]
library(car)
library(moments)
xskew <- function(data,par){
abs(skewness(bcPower(data,lambda=par[1]),na.rm=T)) # minimize abs(skew)
}
boxit <- function(x){
res <- optim(par=c(-5,5), xskew, data=x+1) # find argmin(^) lambda
print(res$par)
return(bcPower(x+1,lambda=res$par[1]))
变成
> skewness(boxit(rbeta(1000,12,3)))
[1] -5.980757e-08
---几乎0度倾斜
但在一个极端扭曲的变量上,我得到:
Error in optim(par = c(-5, 5), xskew, data = x + 1) (from #2) :
function cannot be evaluated at initial parameters
我的想法是,我可能:
哎呀,我使用的是一个2参数的解算器,而不是一个具有显式上下限的1参数解算器。我需要的optim电话是:
optim(par=-2, xskew, x=x, method="Brent", lower=-20, upper=20)
以及对xskew函数调用的轻微重新定义。您能否通过在
boxit(x)
调用中提供x
使示例重现?您能否尝试切换xskew
定义中的参数,即函数(par,data)
而不是函数(data,par)
?
optim(par=-2, xskew, x=x, method="Brent", lower=-20, upper=20)