我正在执行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
谢谢你:)
答案 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)
但我强烈建议你这样做,就像我建议的那样。