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.

La respuesta aceptada usandopolyroot 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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta