正确的代码匹配

时间:2014-11-14 11:38:19

标签: r lambda match transform time-series

我正在执行box-cox测试并获得lambda值。然后我想将它舍入到5d.p并将其设置为if:

λ< 0.25转换将设置为log

0.25≤λ< 0.75转换将设置为sqrt

0.75≤λ不会有转变

这是我写的代码:

Data.col<-c(5403.676,6773.505, 7231.117, 7835.552, 5236.710, 5526.619, 6555.782,11464.727, 7210.069, 7501.610, 8670.903,10872.935, 8209.023, 8153.393,10196.448,13244.502, 8356.733,10188.442,10601.322,12617.821, 11786.526,10044.987,11006.005,15101.946,10992.273,11421.189,10731.312)
transform.method <- format(round(BoxCox.lambda(Data.col, method = "loglik"), 5),nsmall=5)

log.values <- seq(0, 0.24999, by = 0.00001)
sqrt.values <- seq(0.25, 0.74999, by = 0.00001)

which.transform.log <- transform.method %in% log.values
which.transform.sqrt <- transform.method %in% sqrt.values

if (which.transform.log == "TRUE"){
  as.log <- "log"
  Data.new <- log(Data.col)
} else {
  if (which.transform.sqrt == "TRUE"){
    as.log <- "sqrt"
    Data.new <- sqrt(Data.col)
  } else {
    as.log <- "no"
    Data.new <- Data.col
  }
}

然而lambda说它是0.60000但是which.transform输出“FALSE”表示sqrt.values中没有匹配

你能看到出了什么问题,还有更简单的方法吗?

编辑: 我已经尝试将transform.method设置为0.1,它在log.values中得到TRUE作为匹配...所以我不明白为什么它不适用于0.6

谢谢你:)

1 个答案:

答案 0 :(得分:1)

如下:

trans<- round(BoxCox.lambda(Data.col, method = "loglik"),5)
categ<-as.character( c(cut(trans,c(0,0.25,0.75,Inf),right=FALSE)) )
Data.new<-switch(categ,
    "1"=log(Data.col),
    "2"=sqrt(Data.col),
    "3"=Data.col
)

然后您可以通过更多转换轻松扩展。随意删除四舍五入。

如果你想检查你总是可以使用的转换:

c("log","sqrt","non")[as.numeric(categ)]

关于您的代码,您还需要格式化序列,例如:

log.values <- format( seq(0, 0.24999, by = 0.00001),nsmall=5)
sqrt.values <- format(seq(0.25, 0.74999, by = 0.00001),nsmall=5)

但我强烈建议你这样做,就像我建议的那样。