¿Cómo interpolar puntos entre dos conjuntos de datos irregulares?

Lo siento por el título un tanto confuso, pero no estaba seguro de cómo resumir esto más claramente.

Tengo dos conjuntos de datos X, Y, cada conjunto corresponde a un valor general general. Se muestrean bastante densamente a partir de los datos en bruto. Lo que estoy buscando es una forma de encontrar una X interpolada para cualquier Y dada para un valor entre los conjuntos que ya tengo.

El gráfico lo hace más claro:

En este caso, la línea roja es de un conjunto correspondiente a 100, la línea amarilla es de un conjunto correspondiente a 50.

Quiero poder decir, asumiendo que estos conjuntos corresponden a un gradiente de valores (aunque están claramente formados por mediciones discretas de X, Y), ¿cómo puedo encontrar, digamos, dónde estaría la X si la Y fuera 500? ¿Para un conjunto que correspondía a un valor de 75?

En el ejemplo aquí, esperaría que mi punto deseado estuviera en algún lugar por aquí:

No necesito que esta función sea demasiado sofisticada: puede ser una simple interpolación lineal de puntos de datos. Solo estoy teniendo problemas para pensarlo.

Tenga en cuenta que ni la X ni la Y de los dos conjuntos se superponen perfectamente. Sin embargo, es bastante trivial decir: "dónde están los puntos X más cercanos que comparten estos conjuntos" o "dónde están los puntos Y más cercanos que comparten estos conjuntos".

He usado una interpolación simple entre valores conocidos (por ejemplo, encontrar la X para las Y correspondientes para los conjuntos "50" y "100", luego promediarlos para obtener "75") y termino con algo así como este:

Claramente estoy haciendo algo mal aquí. Obviamente, en este caso, X regresa (correctamente) como 0 para todos aquellos casos en los que Y es más alto que el Y máximo del conjunto "más bajo". Las cosas comienzan bien, pero en algún lugar cuando uno comienza a acercarse a la máxima Y para el conjunto más bajo, comienza a volverse loco.

Es fácil ver por qué la mía va mal. Aquí hay otra manera de ver el problema:

En la versión "correcta", X debería ser aproximadamente 250. En su lugar, lo que estoy haciendo es esencialmente un promedio de 400 y 0, por lo que X es 200. ¿Cómo resuelvo para X en una situación así? Estaba pensando que la interpolación bilineal podría ser la respuesta, pero nada de lo que he podido encontrar me ha dejado en claro cómo me gustaría abordar este tipo de cosas, porque todas parecen estar estructuradas para problemas algo diferentes.

Gracias por tu ayuda. Tenga en cuenta que aunque obviamente he graficado los datos anteriores en R para que sea más fácil ver de qué estoy hablando, el trabajo final para esto es en Javascript y PHP. No estoy buscando algo pesado; simple es mejor.

Respuestas a la pregunta(1)

Su respuesta a la pregunta