Regression der kleinsten Quadrate für nichtlineare GleichungssystemeHallo, ich habe ein mäßig komplexes Modell für einen physikalischen Prozess (Ionenadsorption für jeden, der weiß, was das bedeutet). Ich habe zwei Startvariablen, x1 und x2, und zwei gemessene Ergebnisse, y1 und y2, die sich mit x1 und x2 ändern, und nicht messbare oder schwer zu messende Variablen, g1,...,gn, die sich nicht ändern. Eines oder beide von x1 und x2 können sich auch für jede Zeile in einer Reihe ändern. Ich habe einen Satz nichtlinearer Gleichungen, s = f(x1, x2, y1,...,y2, g1,...,gn), sowie einige andere Funktionen verschiedener Variablen in f, je nachdem, wie komplex I ist möchte, dass das Modell ist. Beispielgleichungen finden Sie im Anhang.
Typischerweise machen wir das in Matlab mit lsqnonlin. Funktioniert gut, aber es ist schwierig, es zum Laufen zu bringen. Ich hätte viel lieber eine (nicht so einfache) Spaltenformel. Allerdings bin ich mir nicht ganz sicher, wie ich es codieren soll. Die Sache mit der nichtlinearen Regression ist für einzelne Gleichungen konzipiert, und mit den drei Gleichungen, die alle die gleichen s beschreiben, scheint es, als gäbe es eine Menge Rekursion. Ich bin mir auch nicht sicher, wie die Verlustfunktion aussehen würde. In Matlab geben wir Schätzwerte ein, berechnen die kleinsten Quadrate zwischen der Schätzung und dem berechneten Wert, aktualisieren sie, wenn die Summe der quadrierten Differenzen aller Schätzwerte und Gleichungen außerhalb einer gewissen Toleranz liegt, und führen dann eine Schleife durch. Ich gehe davon aus, dass dies intern von der nichtlinearen Plattform erledigt wird, aber ist mein Ziel dann Null, da ich möchte, dass die Summe der quadrierten Differenzen Null ist? Oder wenn nicht, wie stelle ich mehrere Gleichungen auf?
Entschuldigung, wenn das viel einfacher ist, als ich denke.
Erweiterte statistische ModellierungWindowsBetreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeEine Möglichkeit, die ich vorschlage, ist ein alter Trick, bei dem eine geeignete verlorene Funktion definiert wird. In Ihrem Fall kann die verlorene Funktion sein:
(s-f1(...))^2 + (s-f2(...))^2 + (s-f3(...))^2 + ...
Jedes Element ist der quadratische Fehler einer Gleichung in Ihren Systemen. Sie fassen sie zusammen und minimieren den Gesamtfehler. Dieser Ansatz wandelt ein nichtlineares Problem der kleinsten Quadrate in ein Problem der Verlustfunktionsoptimierung um.
In der Zwischenzeit denke ich, dass es immer noch machbar ist, nichtlineare kleinste Quadrate für ein Gleichungssystem zu verwenden. Hier sind die Schritte:
- Erweitern Sie Ihre Datentabelle. Für jede Zeile erstellen Sie Kopien davon, und die Gesamtzahl der Kopien entspricht der Anzahl Ihrer Gleichungen in Ihrem System. Das Add-in könnte für diese Aufgabe nützlich sein. Sie müssen eine Freq-Spalte erstellen, deren Zellenwerte die Anzahl der Gleichungen angeben.
- Jetzt müssen Sie diese nicht ganz so einfache Formelspalte erstellen. Je nachdem, wie Sie die Zeilen aus dem letzten Schritt anordnen, müssen Sie die Formel möglicherweise anders schreiben. Aber das Ziel ist das Folgende. Ordnen Sie jede Kopie der Originalzeile einer Gleichung in Ihrem System zu. Letztendlich ist also jede Kopie einer Zeile einer bestimmten Gleichung in Ihrem System zugeordnet. Sie müssen wahrscheinlich herausfinden, wie Sie die Zeilennummer mit der Gleichungsnummer verknüpfen. Wenn sich die Kopien in aufeinanderfolgenden Zeilen befinden, wie das Ergebnis des obigen Add-Ins ist, benötigen Sie möglicherweise die Funktion „Modulo“, um die Zuordnung vorzunehmen.
Am Ende verwenden Sie das Nichtlineare, wie Sie es kennen, um das Problem der kleinsten Quadrate zu lösen.
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeIch habe einen Code, den ich verwende, um einen Feuchtigkeitsadsorptionsprozess zu modellieren – er sucht nach Gleichgewichtsbedingungen, wie sie durch mehrere physikalische Modelle beschrieben werden – ich werde sehen, ob ich eine generische Version des Codes erstellen kann, die ich hier teilen kann.
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeHallo @peng_liu Vielen Dank für die Antwort und entschuldigen Sie die Verzögerung! Dissertation + 2 Monate altes Baby lassen Sie vergessen, den Dingen nachzugehen.
Was würdest du als s wählen? Ich habe kein s gemessen, und im Matlab-Code erraten wir ein s und aktualisieren es dann. Wie würden Sie dies vorschlagen?
Die Methode der kleinsten Quadrate sieht interessant aus. Haben Sie eine Tabelle, die Sie für ein anderes Projekt erstellt haben, das ich mir ansehen könnte und das eine ähnliche Funktion hat? Bei all meinen Skripten habe ich nicht viel mit zeilenbasierten Formeln gemacht und bin dabei spektakulär gescheitert.
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeHallo @David_Burnham - Ja, wenn Sie eine generische Version davon hätten, wäre das äußerst hilfreich.Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeGlückwunsch!
„s“ ist hier also ein unbekannter Parameter. Schreiben Sie in diesem Fall alle Ihre Gleichungen etwa so um: 0 = f(...) - s.
Oder wenn Ihre Gleichungen bekannte Größen enthalten, verschieben Sie diese auf die linke Seite. Die linke Seite ist Ihr Y, wenn Sie die nichtlineare Plattform verwenden.
Ich habe keine Beispiele, also habe ich mir eines ausgedacht. Anbei: Nonsens-System von eqns.jmp
Es hat
- eine Y-Spalte, bekannte Größen.
- eine Formelspalte, die auf der rechten Seite die Größe Ihrer Gleichungen anzeigt
- Eine Beschriftungsspalte gibt an, dass ungerade Zeilen der ersten Gleichung und gerade Zeilen der zweiten Gleichung entsprechen
- andere bekannte Größen, die Teil der Gleichung auf der rechten Seite sind.
Schauen Sie sich die Formel in der Spalte „Formel“ an, um zu sehen, wie Sie zwei Gleichungen in einer einzigen Spalte verteilen.
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeDanke für die Anleitung @peng_liu !
Ich habe eine Tabelle zusammengestellt und sie scheint zu funktionieren, wenn ich ein paar Zeilen habe, aber wenn ich versuche, mehr als ein paar Zeilen zu erstellen, erhalte ich Folgendes:

Ist das tatsächlich ein Problem, wenn einfach zu viele Zeilen vorhanden sind? Der Fehler scheint bestehen zu bleiben, wenn ich die Zeilen auf das Minimum (in diesem Fall 3) reduziere und eine neue Tabelle erstellen muss. Haben Sie irgendwelche Gedanken dazu? Hier ist der Tisch, den ich mit einer Barebone-Version des Modells erstellt habe, damit er nicht umständlich ist. Außerdem habe ich die Parameter in eigene Spalten (Phi0, Sigma0, pHf) eingeteilt und die Zwischenformeln erweitert, um das Betrachten der Spaltenformel zu erleichtern.
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeIch bin nicht sicher, wie ich die nichtlineare Plattform mit dieser Datentabelle ausführen soll. Was ist Y, was ist X?
Aber wenn die Spalte „Formel“ X ist, glaube ich nicht, dass es funktionieren würde. Die Formel von X muss Parameter und keine Tabellenvariablen verwenden.
Im Folgenden sehen Sie, wie die X-Spalte in dieser „Unsinn-Datentabelle“ aussieht.

In Ihrer Spalte „Formel“ ist unter „Parameter“ nichts aufgeführt.
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeHey @peng_liu - Ja, weil die Parameter die Formel 100-mal länger machten, habe ich sie in die Spalten Phi0, Sigma0 und pHf geschrieben (Spalten 6–8 nach der Spalte mit einem „.“ als Titel) und dann ausgewählt Feld „Zwischenformeln erweitern“ unten auf der nichtlinearen Plattform. Auf diese Weise kann ich die Parameter verwenden, aber sie machen die Arbeit mit der Formelspalte nicht unmöglich, da es für jeden Parameter so viele „erweiterte Kategorien“ gibt.
Ist das sinnvoll?
Der beigefügte Screenshot sollte diese Spalten und ihre Position in der Formel zeigen, falls dies klarer ist.
Betreff: Regression der kleinsten Quadrate für nichtlineare Gleichungssysteme@peng_liu Ich möchte auch sagen, dass ich herausgefunden habe, dass 1) die Option „Nur numerische Ableitungen“ anscheinend dazu führt, dass es zur Hauptplattform durchgeht, und 2) dass es das zu geben scheint, wenn ich Parameter in mehr als einer der Gleichungen habe Fehler. Ich bin mir nicht sicher, ob dir das etwas sagt. Ich kann einfach keinen Hinweis auf diesen Fehler finden und bin daher ratlos.
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeDanke für die Erklärung, @ehchandler Ich verstehe, was Sie jetzt tun. Was Sie tun, ist ein schöner Trick für ein so kompliziertes Problem. Etwas Neues für mich!
Ich habe mir die Fehlermeldung angesehen. Sie müssen „Nur numerische Ableitungen“ aktivieren.

Sie haben mehr als 300 Parameter, das zugrunde liegende symbolische Derivat stößt an eine Grenze.
Ich sehe, Sie haben 337 Zeilen, aber 339 Parameter. Diese Teilmenge erhält keine Lösung. Ich hoffe, bei Ihrem kompletten Set tritt das Problem nicht auf.
Während ich mir unterdessen Ihr Setup ansehe, fällt mir etwas Interessantes auf. Ich kenne Ihr Thema nicht. Aber in Ihrem Setup sind Phi0, Sigma0 und pHf diskrete Funktionen von pH0. Sind die Beziehungen zwischen den dreien und pH0 bekannt? Wenn zwischen ihnen kontinuierliche Beziehungen (mit weniger unbekannten Parametern) bekannt sind, können Sie die Anzahl der Parameter erheblich reduzieren.
Betreff: Regression der kleinsten Quadrate für nichtlineare Gleichungssysteme@peng_liu ok, das macht mehr Sinn. Kennen Sie zufällig die Begrenzung der Anzahl von Termen oder Parametern im symbolischen Ableitungscode? Weil ich denke, ich könnte einfach eine Spalte mit ein paar Zahlen haben und die Berechnung dann mit der Funktion „nach“ segmentieren. Die symbolische Ableitung ist einfach viel schneller.
Und hmmm. Ich bin mir nicht sicher, woher die neuen Parameter stammen. Ich werde es überprüfen, wenn ich reinkomme. Danke, dass du das bemerkt hast. Drei verwandte Fragen: 1) Wie haben Sie die Anzahl der Parameter gesehen und 2) Gibt es eine Möglichkeit, Parameter im Spaltenformelmenü in großen Mengen zu löschen? Soweit ich das beurteilen kann, müssen Sie mit der rechten Maustaste klicken und nacheinander auf „Löschen“ klicken. 3) Gibt es eine Möglichkeit, eine Tabelle zur Eingabe der Parameter und ihrer Grenzen zu verwenden? Das würde die Geschwindigkeit wirklich verbessern.
Danke!
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeDie Grenze liegt nicht in der Anzahl der Parameter. Aber die Anzahl der Parameter ist in Ihrem Fall ein Faktor. Man muss also versuchen, es zu sehen.
Ich sehe, dass Ihr System drei verschiedene Arten von Parametern hat: Phi, Sigma, pHf. Sie sind alle auf den pH-Wert 0 angewiesen. Daher sind die Parameter bei unterschiedlichem pH0 unabhängig. Sie haben also Recht, eine „By“-Anpassung kann die Komplexität reduzieren.
PS „By“ funktioniert nicht wie gewünscht. Alle Zeilen sehen alle Parameter in der Spalte. Ich sehe nicht, dass es möglich ist, einzelne Zeilen in „By“ zuzulassen, um nur eine Teilmenge der Parameter anzuzeigen.
Ich sehe die Anzahl der Parameter nach dem Start von Nonlinear. Es gibt eine Reihe von Parametern. Ich klicke mit der rechten Maustaste und erstelle daraus eine Tabelle, zähle die Zeilen. Für die letzten beiden Zeilen würde ich vorschlagen, einfach die JSL-Formel zu bearbeiten. Öffnen Sie den Formeleditor der Spalte. Kopieren Sie es und fügen Sie es in einen JSL-Editor ein. Nach der Bearbeitung kopieren und wieder einfügen. Auf diese Weise können Sie die Liste der Parameter bearbeiten:
Der Abschnitt „1“ ist Ihre Parameterliste. Die „2“ ist die eigentliche Formel.

Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeInformieren Sie sich über die Verwendung von „By“.
Es scheint, dass es eine Möglichkeit gibt, By zu verwenden und die Anzahl der Parameter zu reduzieren, um die Unabhängigkeit zwischen Zeilen zu nutzen.
Ich hänge Version 2 des „Unsinn-Systems“ an. Erkläre zunächst, was ich eingerichtet habe.

Ich habe zwei lineare Gleichungssysteme aufgestellt. Zeile 1 und 2 sind System „a“, die Gruppenspalte. Und Zeile 3 und 4 sind System „b“.
Jedes lineare System hat zwei Parameter „b0“ und „b1“, die jedoch von System zu System unterschiedlich sind. Und ich verwende die Parameter x1 und x2, um „SimY“ zu erzeugen. Für meine Analyse kopiere ich SimY nach Y.
Schauen Sie sich nun die Spalte „Formel“ an. Ich unterscheide nicht zwischen „b0“ und „b1“ nach Gruppe.

Führen Sie nun Nonlinear mit By = Group aus. Und hier ist der Bericht:

Es findet separate, richtige Lösungen für die jeweiligen Systeme.
Betreff: Regression der kleinsten Quadrate für nichtlineare Gleichungssysteme@peng_liu Ja, ich war auch auf das By-Problem gestoßen. Deine Lösung sieht gut aus! Wenn ich jedoch versuche, es auf meine Tabelle anzuwenden, tritt ein Fehler auf. Sehen Sie in der beigefügten Tabelle ein eklatantes Problem? Phi0, Sigma0 und pHf sind alle gleich wie zuvor. Ich habe jedoch eine Spalte „zyklische Kategorisierung“ für die von Ihnen erwähnte Methode „nach“ erstellt, habe dann aber eine Spalte „Parameter nach Spalte“. Ich verwende die Ebenen dieser Spalte, um Parameter nach Kategorien zu erweitern. Da :Cyclic Categorization und :Parameter by Column orthogonal sind (oder wie auch immer das richtige Wort lautet), sollte dies ermöglichen, dass die Parameter mit leichten Versätzen über die gesamte Kurve iterieren (pH0 ist die x-Achse), und dann kann ich sie einfach zusammenfügen noch einmal am Ende. Allerdings schlägt es, wie gesagt, fehl und aktualisiert nur eine der Ebenen der Parameter, und ich weiß nicht, warum.
Könnte dies ein Problem bei der Interaktion von by mit um Kategorien erweiterten Parametern sein?
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeIn Spalte 3 fehlen Werte, was erklärt, warum nur eine Gruppe ein Ergebnis hat. Aber die „Formel“ ist nicht so aufgebaut, wie ich es empfohlen habe. Zur Veranschaulichung füge ich test.v2 bei. Mit diesem Ansatz benötigen Sie Phi0, Sigma0 und pHf in der Mitte nicht mehr.
Betreff: Regression der kleinsten Quadrate für nichtlineare Gleichungssysteme@peng_liu Oh duh. Ich bin mir nicht sicher, wie ich so viele fehlende Zeilen übersehen habe. Danke, dass du das bemerkt hast.
Vielleicht verstehe ich das falsch, aber da pH0 meine x-Achse ist, bedeutet Ihre Lösung dann nur, dass die by-Spalte die x-Spalte ist? Wenn Sie beispielsweise 100 x-Werte haben, haben Sie sozusagen 100 „Gruppen“?
Wenn ja, wäre die Version zum Erweitern nach Spalten nicht besser, da Sie den Fehler über mehrere Punkte hinweg minimieren und nicht nur eine eigenständige Minimierung für jeden einzelnen Punkt? Oder ist es Punkt für Punkt besser, mit Verlustfunktionen umzugehen? Ich passe gerade den Matlab-Code, den ich hatte, an JMP an, habe aber nicht wirklich Erfahrung mit Minimierungsalgorithmen, also bin ich auf der Suche nach der besten Technik.
PS Und vielleicht habe ich es nicht klargestellt, aber es sollte für jeden pH0-Wert (der die abhängige Variable ist) einen eindeutigen Wertesatz für jeden Parameter geben. Deshalb dachte ich, ich müsste nach Kategorien erweitern.
Danke!
Betreff: Regression der kleinsten Quadrate für nichtlineare GleichungssystemeIch sehe, dass Ihre Spalte „Formel“ in der Originaltabelle vom pH-Wert abhängt. Aber die Spalte „Formel“ in Ihrer test.jmp hängt nicht von pH0 ab. Ich schätze, das ist ein Missverständnis zwischen uns. Lassen Sie mich weiterhin Ihre Originaldaten verwenden, sodass Phi0, Sigma0 und pHf von pH0 abhängen und nicht von „Parameter nach Spalte“.
Schauen wir uns die ersten drei Zeilen an:

Ihr pH0 = 0,2. Aus diesem Grund kann die Formel der ersten Zeile wie folgt bezeichnet werden:
f1(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2).
Die Formeln für die 2. und 3. Zeile lauten:
f2(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2) und
f3(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2). Die drei Reihen bilden Gruppe 1.
Schauen Sie sich nun die Reihe 4, 5, 6 an. Ihr pH0 = 0,3. Die drei Formeln lauten also:
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) und
f3(Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3). Die drei Reihen bilden Gruppe 2.
Gruppe1 und Gruppe2 haben nicht denselben Parametersatz. Sie sind unabhängig. Die Fehlerminimierung für Gruppe1 hat nichts mit der Fehlerminimierung für Gruppe2 zu tun. So können wir Gruppe für Gruppe optimieren.
Wenn Sie die Parameter in den drei Zwischenspalten als Phi0_pH0_0.2, Phi0_pH0_0.3, Phi0_pH0_0.4 usw. eingestellt lassen, werden in jeder Zeile alle angezeigt. Sie können sehen, dass, wenn Sie Nonlinear by pH0 ausführen, in jeder Gruppe Hunderte von Parametern aufgelistet sind. Davon sind jedoch nur drei für jede Zeile relevant, und zwar alle drei Zeilen.
Ich habe nur drei Parameter innerhalb der Spalte „Formel“ erstellt. Ich habe sie paramPhi0, paramSigma0, parampHf genannt. Auch wenn es nur drei sind, erstellt die Plattform, wenn wir Nonlinear mit „pH0“ ausführen, unterschiedliche Sätze der drei Parameter mit „pH0“. Es erstellt im wahrsten Sinne des Wortes Hunderte von Parametern für Sie mit „pH0“. Und jeder kleine Nichtlineare von pH0 muss sich nur um drei Parameter kümmern.