如何创建最佳函数更好?

How to create a function for optimum is better?

我想为“最优更好”的关系创建一个函数,如下图所示

我可以为“越多越好”和“越少越好”创建函数,例如

normalize <- function(x, na.rm=na.rm, relation=relation) {
  if (relation == "More is better") {
    normalize <- ((x - min(x, na.rm=na.rm))/
                    (max(x, na.rm=na.rm) - min(x, na.rm=na.rm)))
  } else {
    normalize <- 1 - ((x - min(x, na.rm=na.rm))/
                        (max(x, na.rm=na.rm) - min(x, na.rm=na.rm)))
  }
  return(normalize)
}

这里是一个小数据

set.seed(123)
value <- runif(50, min=3, max=8.5)

“最佳是更好”应该取“越多越好”到一个范围或点(例如当前数据为 6.5-7.5),在最佳范围内归一化值应为 1,超出范围或点它应该被计算为“越少越好”。我如何在 R 中实现这一点?

此函数以输出始终介于 0 和 1 之间的方式对 value 进行归一化。它 returns 恰好为 1,前提是该值在最佳范围 [a,b] 内。它 returns 最小最大缩放 iff 值 < a(“越高越好”)并且 1 - 最小-最大缩放它大于 b(“越低越好”)

library(tidyverse)

normalize <- function(value, a = 6.5, b = 7.5) {
  min_max_scaled <- (value - min(value)) / max(value)
  
  case_when(
    # before the range
    value < a ~ min_max_scaled,
    # within the range
    value >= a & value <= b ~ 1,
    # beyoned the range
    value > b ~ 1 - min_max_scaled
  )
}

实际上你可以只转换子集。

FUN <- function(x, lower, upper, ...) {
  normalize <- function(x, ...) (x - min(x, ...))/(max(x, ...) - min(x, ...))
  x[x < lower] <- normalize(x[x < lower], ...)
  x[x > upper] <- 1 - normalize(x[x > upper], ...)
  x[x >= lower & x <= upper] <- 1 
  return(x)
}

lower <- 6.5; upper <- 7.5
value.star <- FUN(value, lower, upper, na.rm=TRUE)

plot(value, value.star, pch=20)
abline(v=c(lower, upper), lty=2)


数据

set.seed(123)
value <- runif(2.5e2, min=3, max=8.5)