get x-value dado valor y: búsqueda general de raíz para la función de interpolación lineal / no lineal
stoy interesado en un problema general de búsqueda de raíz para una función de interpolación.
Supongo que tengo la siguiente(x, y)
datos:
set.seed(0)
x <- 1:10 + runif(10, -0.1, 0.1)
y <- rnorm(10, 3, 1)
así como una interpolación lineal y una interpolación spline cúbica:
f1 <- approxfun(x, y)
f3 <- splinefun(x, y, method = "fmm")
Cómo puedo encontrarx
-valores donde estas funciones de interpolación cruzan una línea horizontaly = y0
? La siguiente es una ilustración gráfica cony0 = 2.85
.
par(mfrow = c(1, 2))
curve(f1, from = x[1], to = x[10]); abline(h = 2.85, lty = 2)
curve(f3, from = x[1], to = x[10]); abline(h = 2.85, lty = 2)
Conozco algunos hilos anteriores sobre este tema, como
predict x valores de ajuste simple y anotarlo en la tramaPredict valor X del valor Y con un modelo ajustado Se sugiere que simplemente invirtamosx
yy
, hacer una interpolación para(y, x)
y calcule el valor interpolado eny = y0
.
Sin embargo, esta es una idea falsa. Dejary = f(x)
sea una función de interpolación para(x, y)
, esta idea solo es válida cuandof(x)
es una función monotónica dex
así que esof
es invertible. De lo contrariox
no es una función dey
e interpolando(y, x)
no tiene sentido
Tomando la interpolación lineal con mis datos de ejemplo, esta falsa idea da
fake_root <- approx(y, x, 2.85)[[2]]
# [1] 6.565559
En primer lugar, el número de raíces es incorrecto. Vemos dos raíces de la figura (a la izquierda), pero el código solo devuelve una. En segundo lugar, no es una raíz correcta, ya que
f1(fake_root)
#[1] 2.906103
no es 2.85.
He hecho mi primer intento en este problema general en Cómo estimar el valor x a partir de la entrada del valor y después de aproxfun () en R. La solución resulta estable para la interpolación lineal, pero no necesariamente estable para la interpolación no lineal. Ahora estoy buscando una solución estable, especialmente para una spline de interpolación cúbica.
¿Cómo puede ser útil una solución en la práctica?A veces después de una univariante regresión linealy ~ x
o un univariante regresión no linealy ~ f(x)
queremos resolver por detrásx
para un objetivoy
. Este Q & A es un ejemplo y ha atraído muchas respuestas: Resuelva el polinomio de mejor ajuste y las líneas desplegables de trazado, pero ninguno es realmente adaptable o fácil de usar en la práctica.
polyroot
solo funciona para una regresión polinómica simple; Las respuestas que usan la fórmula cuadrática para una solución analítica solo funcionan para un polinomio cuadrático;Mi respuesta usandopredict
yuniroot
funciona en general, pero no es conveniente, como en la práctica usandouniroot
necesita interacción con los usuarios (ver Solución Uniroot en R para más información sobreuniroot
).ería realmente bueno si hubiera una solución adaptativa y fácil de usar.