Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesHola, tengo un modelo moderadamente complejo para un proceso físico (adsorción de iones para cualquiera que sepa lo que eso significa). Tengo dos variables iniciales, x1 y x2, y dos resultados medidos, y1 e y2 que cambian con x1 y x2, y variables no mensurables o difíciles de medir, g1,...,gn que no cambian. Uno o ambos de x1 y x2 también pueden cambiar para cada fila de una serie. Tengo un conjunto de ecuaciones no lineales, s = f(x1, x2, y1,...,y2, g1,...,gn), así como algunas otras funciones de diferentes variables en f, dependiendo de cuán compleja sea. quiero que sea el modelo. Consulte el archivo adjunto para ver ejemplos de ecuaciones.
La forma típica de hacer esto es en Matlab con lsqnonlin. Funciona bien, pero es un oso empezar a funcionar. Preferiría tener una fórmula de columna (no tan simple). Sin embargo, no estoy del todo seguro de cómo codificarlo. La regresión no lineal está diseñada para ecuaciones únicas, y con las tres ecuaciones que describen las mismas s, parece que abundaría la recursividad. Tampoco estoy seguro de cuál sería la función de pérdida. En matlab, ingresamos valores aproximados, calculamos los mínimos cuadrados entre el valor estimado y el calculado, lo actualizamos si la suma de las diferencias al cuadrado de todos los estimados y ecuaciones queda fuera de cierta tolerancia y luego realizamos un bucle. Supongo que esto lo hace internamente la plataforma no lineal, pero ¿mi objetivo es cero ya que quiero que la suma de las diferencias al cuadrado sea cero? O si no, ¿cómo hago ecuaciones múltiples?
Se disculpa si esto es mucho más simple de lo que pienso.
Modelado estadístico avanzadoventanasRe: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesUna forma que sugiero es un viejo truco que consiste en definir una función perdida apropiada. En su caso la función perdida puede ser:
(s-f1(...))^2 + (s-f2(...))^2 + (s-f3(...))^2 + ...
Cada elemento es el error al cuadrado de una ecuación en sus sistemas. Los resume y minimiza el error general. Este enfoque convierte un problema de mínimos cuadrados no lineal en un problema de optimización de función de pérdida.
Mientras tanto, creo que todavía es factible utilizar mínimos cuadrados no lineales para un sistema de ecuaciones. Aquí están los pasos:
- Expande tu tabla de datos. Para cada fila, haces copias y el número total de copias es el mismo que el número de ecuaciones en tu sistema. Este complemento podría resultar útil para esta tarea. Necesita crear una columna Freq, cuyos valores de celda sean el número de ecuaciones.
- Ahora necesitas crear esa columna de fórmula no tan simple. Dependiendo de cómo hayas organizado las filas del último paso, es posible que tengas que escribir la fórmula de manera diferente. Pero el objetivo es el siguiente. Para cada copia de la fila original, asígnala a una ecuación en tu sistema. Entonces, al final, cada copia de una fila está asociada con una ecuación distinta en su sistema. Probablemente necesites descubrir cómo asociar el número de fila con el número de ecuación. Si las copias están en filas consecutivas, como resultado del complemento anterior, es posible que necesite la función "Módulo" para realizar el mapeo.
Al final, utiliza el método no lineal como ya sabes para resolver el problema de mínimos cuadrados.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesTengo un código que uso para modelar un proceso de adsorción de humedad (busca condiciones de equilibrio descritas por múltiples modelos físicos). Veré si puedo hacer una versión genérica del código que pueda compartir aquí.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesHola @peng_liu ¡Gracias por la respuesta y perdón por la demora en responder! La disertación + el bebé de 2 meses te hacen olvidar el seguimiento de las cosas.
¿Cuál elegirías como s? No tengo ninguna s medida y en el código de Matlab, adivinamos una s y luego la actualizamos. ¿Cómo sugerirías hacer esto?
En cuanto al método de mínimos cuadrados, parece interesante. ¿Tiene una mesa que haya hecho para otro proyecto que pueda ver y que haga algo similar? A pesar de todos mis scripts, no he hecho mucho con fórmulas basadas en filas y he fallado espectacularmente cuando lo he hecho.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesHola @David_Burnham - Sí, si tuvieras una versión genérica de eso, sería de gran ayuda.Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no lineales¡Felicidades!
Entonces, "s" es un parámetro desconocido aquí. En ese caso, reescribe todas tus ecuaciones a algo como esto: 0 = f(...) - s.
O si tienes cantidades conocidas en tus ecuaciones, muévelas hacia el lado izquierdo. El lado izquierdo será tu Y cuando uses la plataforma no lineal.
No tengo ejemplos, así que inventé uno. Adjunto: sistema sin sentido de eqns.jmp
Tiene
- una columna Y, cantidades conocidas.
- una columna de fórmula, los elementos del tamaño derecho de tus ecuaciones
- una columna de etiqueta indica que las filas impares corresponden a la primera ecuación y las filas pares corresponden a la segunda ecuación
- otras cantidades conocidas que forman parte de la ecuación del lado derecho.
Mire la fórmula en la columna "fórmula" para ver cómo distribuir dos ecuaciones en una sola columna.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesGracias por la orientación @peng_liu !
He armado una tabla y parece funcionar si tengo un par de filas, pero si intento hacer más de unas pocas, me da esto:

¿Es esto realmente un problema por tener demasiadas filas? El error parece persistir si reduzco las filas al mínimo (3 en este caso) y tengo que crear una nueva tabla. ¿Tiene alguna idea sobre esto? Aquí está la mesa que hice con una versión básica del modelo para que no sea engorrosa. También puse los parámetros en sus propias columnas (Phi0, sigma0, pHf) y amplié fórmulas intermedias para facilitar la visualización de la fórmula de la columna.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesNo estoy seguro de cómo ejecutar una plataforma no lineal utilizando esta tabla de datos. ¿Cuál es Y, cuál es X?
Pero si la columna "Fórmula" es X, no creo que funcione. La fórmula de X debe utilizar parámetros, no variables de tabla.
A continuación se muestra cómo se ve la columna X en esa "tabla de datos sin sentido".

Su columna "Fórmula" no tiene nada listado en Parámetros.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesEy @peng_liu - Sí, debido a que los parámetros hacían que la fórmula fuera 100 veces más larga, los arrojé en las columnas Phi0, sigma0 y pHf (columnas 6 a 8 después de la columna con un "." como título) y luego seleccioné el Cuadro "Expandir fórmulas intermedias" en la parte inferior de la plataforma no lineal. De esa manera puedo usar los parámetros, pero no hacen que sea imposible trabajar con la columna de fórmula, ya que hay muchas "categorías ampliadas" para cada parámetro.
¿Tiene sentido?
La captura de pantalla adjunta debería mostrar esas columnas y su ubicación en la fórmula, en caso de que quede más claro.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no lineales@peng_liu También diré que descubrí que 1) la opción de derivadas numéricas únicas parece hacer que pase a la plataforma principal, y 2) que cuando tengo parámetros en más de una de las ecuaciones, parece dar eso error. No estoy seguro si eso te dice algo. Simplemente no puedo encontrar una referencia a ese error, así que estoy perplejo.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesGracias por la explicación, @ehchandler Entiendo lo que estás haciendo ahora. Lo que estás haciendo es un buen truco para un problema tan complicado. ¡Algo nuevo para mí!
Miré el mensaje de error. Debe marcar "Sólo derivados numéricos".

Tiene más de 300 parámetros, el derivado simbólico subyacente está alcanzando un límite.
Veo que tienes 337 filas, pero 339 parámetros. Este subconjunto no obtendrá una solución. Espero que tu conjunto completo no tenga el problema.
Mientras tanto, mientras observo tu configuración, hay algo interesante. No conozco tu tema. Pero en su configuración, Phi0, sigma0 y pHf son funciones discretas de pH0. ¿Se conocen las relaciones entre los tres y el pH0? Si se conocen relaciones continuas (con menos parámetros desconocidos) entre ellos, se podría reducir en gran medida el número de parámetros.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no lineales@peng_liu Ok, eso tiene más sentido. ¿Conoce el límite de número de términos o parámetros en el código derivado simbólico? Porque estoy pensando que puedo tener una columna con algunos números y luego segmentar el cálculo usando la función "por". La derivada simbólica es mucho más rápida.
Y mmmmm. No estoy seguro de dónde vinieron los nuevos parámetros. Lo comprobaré cuando entre. Gracias por notarlo. Tres preguntas relacionadas: 1) ¿cómo vio la cantidad de parámetros y 2) hay alguna manera de eliminar parámetros de forma masiva en el menú de fórmulas de columna? Por lo que puedo decir, debes hacer clic derecho y hacer clic en eliminar uno por uno. 3) ¿hay alguna manera de utilizar una tabla para ingresar los parámetros y sus límites? Esto realmente ayudaría a acelerar.
¡Gracias!
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesEl límite no está en términos de número de parámetros. Pero la cantidad de parámetros es un factor en su caso. Entonces, tienes que intentarlo y ver.
Veo que su sistema tiene tres tipos distintos de parámetros: Phi, sigma, pHf. Todos están condicionados al valor de pH0. Por tanto, los parámetros son independientes por diferentes pH0. Entonces, tienes razón, hacer un ajuste "Por" puede reducir la complejidad.
PD: "Por" no funciona como deseaba. Todas las filas ven todos los parámetros de la columna. No veo que sea posible permitir que filas individuales en By vean solo un subconjunto de parámetros.
Veo la cantidad de parámetros después de iniciar Nonlinear. Hay una capacidad de parámetros. Hago clic derecho y creo una tabla a partir de ella, cuento filas. Para las dos últimas filas, sugeriría simplemente editar la fórmula JSL. Abra el editor de fórmulas de la columna. Cópielo y péguelo en un editor JSL. Después de editar, copie y pegue nuevamente. De esta manera, puede editar la lista de parámetros:
La sección "1" es su lista de parámetros. El "2" es la fórmula real.

Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesHaga un seguimiento de cómo utilizar "Por".
Parece que hay una manera de usar By y reducir la cantidad de parámetros para aprovechar la independencia entre filas.
Adjunto v2 del "sistema sin sentido". Primero explique lo que configuré.

Configuré dos sistemas de ecuaciones lineales. Las filas 1 y 2 son el sistema "a", la columna Grupo. Y las filas 3 y 4 son el sistema "b".
Cada sistema lineal tiene dos parámetros "b0" y "b1", pero son diferentes entre sistemas. Y uso los parámetros x1 y x2 para producir "SimY". Copio SimY a Y para mi análisis.
Ahora mire la columna "fórmula", no distingo "b0" y "b1" por grupo.

Ahora ejecute No lineal con Por = Grupo. Y aquí está el informe:

Encuentra soluciones separadas y correctas para los respectivos sistemas.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no lineales@peng_liu Sí, también me encontré con el problema. ¡Tu solución se ve bien! Sin embargo, cuando intento aplicarlo a mi tabla, aparece un error. ¿Ves algún problema evidente en la tabla adjunta? Phi0, sigma0 y pHf son todos iguales que antes. Sin embargo, hice una columna de "categorización cíclica" para el método "por" que mencionaste, pero luego tengo un "parámetro por columna". Utilizo los niveles de esta columna para expandir los parámetros por categorías. Dado que :Cyclic Categorization y :Parameter by column son ortogonales (o cualquiera que sea la palabra correcta), esto debería permitir que los parámetros se iteren sobre toda la curva con ligeras compensaciones (pH0 es el eje x), y luego puedo juntarlos nuevamente al final. Sin embargo, como dije, falla y solo actualiza uno de los niveles de los parámetros, y no estoy seguro de por qué.
¿Podría ser esto un problema con la forma en que interactúa con los parámetros expandidos por categorías?
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesLe faltan valores en la Columna 3, lo que explica por qué solo un grupo tiene resultados. Pero la "fórmula" no está configurada como recomendé. Adjunto test.v2 para ilustrar. Con este enfoque, ya no necesita Phi0, sigma0 y pHf en el medio.
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no lineales@peng_liu Ah, claro. No estoy seguro de cómo me perdí tantas filas faltantes. Gracias por notarlo.
Entonces tal vez estoy entendiendo mal, pero dado que pH0 es mi eje x, ¿su solución simplemente significa que la columna by es la columna x? ¿Si tienes 100 valores x, tienes 100 "grupos", por así decirlo?
Si es así, ¿no sería mejor la versión de expansión por columnas, ya que está minimizando el error en varios puntos en lugar de simplemente una minimización independiente para cada uno? ¿O es punto por punto una mejor manera de abordar las funciones de pérdida? Estoy un poco adaptando el código de Matlab que tenía a JMP, pero realmente no tengo experiencia en algoritmos de minimización, así que cualquiera que sea la mejor técnica, estoy dispuesto a hacerlo.
PD Y tal vez no lo dejé claro, pero debería haber un conjunto único de valores de cada uno de los parámetros para cada valor de pH0 (que es la variable dependiente). Por eso pensé que necesitaba expandirme por categorías.
¡Gracias!
Re: Regresión de mínimos cuadrados para sistemas de ecuaciones no linealesVeo que su columna "fórmula" en la tabla original depende del pH0. Pero la columna "fórmula" en su test.jmp no depende del pH0. Supongo que es un malentendido entre nosotros. Permítame seguir usando sus datos originales, por lo que Phi0, sigma0, pHf dependen de pH0, no del "Parámetro por columna".
Veamos las tres primeras filas:

Su pH0 = 0,2. Por eso, la fórmula de la primera fila se puede denotar como:
f1(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2).
Las fórmulas de la segunda y tercera fila son:
f2(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2) y
f3(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2). Las tres filas forman el Grupo 1.
Ahora mira las filas 4, 5, 6. Su pH0 = 0,3. Entonces las tres fórmulas son:
f1(Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3),
f2(Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3), y
f3(Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3). Las tres filas forman el Grupo 2.
Grupo1 y Grupo2 no comparten el mismo conjunto de parámetros. Son independientes. Minimizar errores para el Grupo1 no tiene nada que ver con minimizar errores para el Grupo2. Entonces, podemos optimizar grupo por grupo.
Si mantiene el parámetro configurado en las tres columnas intermedias como Phi0_pH0_0.2, Phi0_pH0_0.3, Phi0_pH0_0.4, etc., cada fila los ve todos. Puede ver que si ejecuta No lineal con pH0, cada grupo tendrá cientos de parámetros enumerados. Pero entre ellos, sólo tres son relevantes para cada fila y cada tres filas.
Lo que hice fue crear sólo tres parámetros, dentro de la columna "fórmula". Los llamé paramPhi0, paramSigma0, parampHf. Incluso si solo hay tres, cuando ejecutamos No lineal con "pH0", la plataforma creará diferentes conjuntos de los tres parámetros con "pH0". Literalmente crea esos cientos de parámetros mediante "pH0". Y cada pequeño No lineal por pH0 solo necesita preocuparse por tres parámetros.