Permítanme ofrecerles la solución más general y coherente con los requisitos: que le dará la mayor flexibilidad para elegir y optimizar.
Podemos interpretar "en forma de S" como un monotónicamente creciente curva (porque la transformación debe ser unívoca) formada por una parte cóncava hacia arriba y otra cóncava hacia abajo. Podemos centrarnos en que la mitad izquierda sea cóncava hacia abajo, porque el otro tipo (con la mitad izquierda cóncava hacia arriba) se obtiene invirtiendo dichas transformaciones.
Dado que la transformación $f$ se supone que es diferenciable, por lo que debe tener una derivada decreciente $f^\prime$ en la mitad izquierda y una derivada creciente en la mitad derecha. En cualquier caso, la derivada debe ser no negativa y sólo puede ser cero en un punto aislado (si es que lo es: el valor mínimo de la derivada da la menor pendiente de la transformación).
No se requiere que la derivada sea diferenciable, pero como cuestión práctica podemos suponer que es diferenciable en casi todas partes con derivada $f^{\prime\prime}$ .
Esta segunda derivada puede hacer prácticamente cualquier cosa : todo lo que necesitamos es que
-
es integrable,
-
es menor o igual que cero para todos los valores de algún intervalo de la izquierda $[0, k)$ y
-
es mayor o igual que cero para todos los valores del intervalo de la derecha $(k, 1]$ .
Estas funciones $f^{\prime\prime}$ (y sus inversos) parametrizan el conjunto de todas las soluciones. (Hay cierta redundancia: de ella se encarga un paso final de normalización que se describe más adelante).
El Teorema Fundamental del Cálculo nos permite recuperar $f$ de tout dicha especificación. Es decir,
$$f^\prime(x) = \int_0^x f^{\prime\prime}(t) dt$$
y
$$f(x) = \int_0^x f^\prime(t) dt.$$
Las condiciones de $f^{\prime\prime}$ garantizan que $f$ aumenta monotónicamente desde su mínimo $f(0)$ hasta un máximo $f(1) = C$ . Por último, normalice $f$ dividiendo los valores de la integral anterior por $C$ .
He aquí una ilustración que comienza con una versión de un paseo aleatorio para la segunda derivada. En ella, las derivadas no se han normalizado, pero la transformación $f$ ha sido.
Para aplicar este enfoque, puede comenzar con una expresión analítica para $f^{\prime\prime}$ que puede variar en función de un número finito de parámetros. También se puede especificar dando algunos puntos a lo largo de su gráfica e interpolando entre ellos--siempre que el interpolador respete la negatividad de los valores en $[0,k)$ y la positividad en $(k,1]$ . Este último es el método utilizado para generar la ilustración. El correspondiente R
(más abajo) proporciona los detalles del cálculo.
Este enfoque le permite diseñar cualquier transformación que desee. Podrías empezar dibujando la curva en S, estimando sus pendientes (relativas) $f^\prime$ y a partir de ahí estimar sus pendientes. Especificar algunas $f^{\prime\prime}$ para que coincida con esta última imagen, y luego proceder a calcular $f^\prime$ y luego $f$ .
Tenga en cuenta que $f$ que primero son cóncavas hacia arriba y luego cóncavas hacia abajo también se pueden obtener negando $f^{\prime\prime}$ desde el principio. La condición crítica para crear una curva en forma de S es que (aparte de posibles excursiones en un conjunto de medida cero) $f^{\prime\prime}$ puede cruz cero como máximo una vez.
Por cierto, la solución $f(x)=x$ surge al establecer $f^{\prime\prime}(x)=0$ casi en todas partes, haciendo $f^\prime$ constante y positiva, de donde $f$ es lineal; la normalización asegura que la pendiente es $1$ y el intercepto es $0$ . (Hacer $f^\prime$ constante y negativa produce la solución $f(x)=1-x$ .)
n <- 51 # Number of interpolation points
k.1 <- floor(n * 2/3) # Width of the left-hand interval
k.2 <- n - k.1 # ............ right-hand interval
x <- seq(0, 1, length.out=n) # x coordinates
set.seed(17)
# Generate random values of the second derivative that are first negative,
# then positive. Modify to suit.
y.2 <- (c(runif(k.1, -1, 0), 0.5*runif(k.2, 0, 1))) *
abs(cos(3*pi * x)) +
c(rep(-.1, k.1), rep(.5,k.2))
# Recover the first derivative and then the transformation.
# Control the
# minimum slope of the transformation.
y.1 <- cumsum(y.2)
y.1 <- y.1 - min(y.1) + 0.005 * diff(range(y.1))
y <- cumsum(y.1)
y <- (y - y[1]) / (y[n] - y[1]) # Normalize the
# transformation
#
# Plot the graphs.
par(mfrow=c(1,3))
plot(x, y.2, type="l", bty="n", main="Second derivative")
points(x, y.2, pch=20, cex=0.5)
abline(h=0, col="Red", lty=3)
plot(x, y.1, type="l", bty="n", lwd=2, main="First
derivative")
abline(h=0, col="Red", lty=3)
plot(x, y, type="l", lwd=2, main="Transformation")