R 优化box-cox变换,无法在初始参数处计算函数

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]

我正在尝试做一个自动的box-cox变换(这对于规范数据的人来说应该很有用),但是在用R的optim可以接受的方式来表达我的优化时遇到了困难。它通常是有效的,但我不清楚是什么原因导致它在极端倾斜的变量上失败

其思想是在box-cox变换中选择Lambda参数,以最小化数据集偏度的绝对值

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
我的想法是,我可能:

  • 未捕获bcPower函数如何处理接近零或无穷大的值
  • 滥用optim
  • 也许做了一些更愚蠢的事情,因为我正在构建一些不可能收敛的东西

  • 哎呀,我使用的是一个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)