Regressione dei minimi quadrati per sistemi di equazioni non lineariCiao, ho un modello moderatamente complesso per un processo fisico (adsorbimento di ioni per chiunque sappia cosa significhi). Ho due variabili iniziali, x1 e x2, e due risultati misurati, y1 e y2 che cambiano con x1 e x2, e variabili non misurabili o difficili da misurare, g1,...,gn che non cambiano. Uno o entrambi x1 e x2 possono anche cambiare per ciascuna riga di una serie. Ho un insieme di equazioni non lineari, s = f(x1, x2, y1,...,y2, g1,...,gn), così come alcune altre funzioni di variabili diverse in f, a seconda della complessità che ho vuoi che il modello sia. Vedi l'allegato per le equazioni di esempio.
Il modo tipico in cui lo facciamo è in Matlab con lsqnonlin. Funziona bene, ma è un orso correre. Preferirei di gran lunga avere una formula di colonna (non così semplice). Tuttavia, non sono del tutto sicuro di come codificarlo. La regressione non lineare è costruita per singole equazioni e, con le tre equazioni che descrivono tutte le stesse s, sembra che la ricorsione abbonderebbe. Inoltre, non sono sicuro di quale sarebbe la funzione di perdita. In matlab, inseriamo i valori ipotizzati, calcoliamo i minimi quadrati tra l'ipotesi e il valore calcolato, lo aggiorniamo se la somma delle differenze quadrate di tutte le ipotesi e le equazioni non rientra in una certa tolleranza, quindi eseguiamo il loop. Presumo che ciò venga fatto internamente dalla piattaforma non lineare, ma il mio obiettivo è zero poiché voglio che la somma delle differenze quadrate sia zero? Oppure, in caso contrario, come posso eseguire più equazioni?
Mi scuso se è molto più semplice di quanto penso.
Modellazione statistica avanzatafinestreRe: Regressione dei minimi quadrati per sistemi di equazioni non lineariUn modo che suggerisco è un vecchio trucco definendo un'appropriata funzione perduta. Nel tuo caso la funzione persa può essere:
(s-f1(...))^2 + (s-f2(...))^2 + (s-f3(...))^2 + ...
Ogni elemento è l'errore quadrato di un'equazione nei tuoi sistemi. Li riassumi e riduci al minimo l'errore complessivo. Questo approccio converte un problema dei minimi quadrati non lineare in un problema di ottimizzazione della funzione di perdita.
Nel frattempo, penso che sia ancora fattibile utilizzare i minimi quadrati non lineari per un sistema di equazioni. Ecco i passaggi:
- Espandi la tua tabella dati. Per ogni riga, ne fai delle copie e il numero totale di copie è uguale al numero di equazioni nel tuo sistema. Questo aggiungere potrebbe essere utile per questo compito. È necessario creare una colonna Freq, i cui valori di cella rappresentano il numero di equazioni.
- Ora devi creare quella colonna formula non così semplice. A seconda di come disponi le righe dall'ultimo passaggio, potrebbe essere necessario scrivere la formula in modo diverso. Ma l'obiettivo è il seguente. Per ogni copia della riga originale, assegnala a un'equazione nel tuo sistema. Quindi, alla fine, ogni copia di una riga è associata a un'equazione distinta nel tuo sistema. Probabilmente dovrai capire come associare il numero di riga al numero di equazione. Se le copie sono in righe consecutive, come risultato del componente aggiuntivo precedente, potrebbe essere necessaria la funzione "Modulo" per effettuare la mappatura.
Alla fine, usa il metodo non lineare come sai per risolvere il problema dei minimi quadrati.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariHo del codice che utilizzo per modellare un processo di assorbimento dell'umidità - cerca condizioni di equilibrio come descritto da più modelli fisici - vedrò se riesco a creare una versione generica del codice che posso condividere qui.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariCIAO @peng_liu grazie per la risposta e scusate il ritardo nella risposta! La tesi + il bambino di 2 mesi ti fanno dimenticare di dare seguito alle cose.
Cosa sceglieresti come s? Non ho misurato alcuna s e nel codice matlab indoviniamo una s e quindi aggiorniamo. Come suggeriresti di farlo?
Per quanto riguarda il metodo dei minimi quadrati, sembra interessante. Hai un tavolo che hai realizzato per un altro progetto che potrei guardare che fa una cosa simile? Nonostante tutti i miei script, non ho fatto molto con le formule basate su righe e ho fallito in modo spettacolare quando l'ho fatto.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariCIAO @David_Burnham - sì, se ne avessi una versione generica, sarebbe estremamente utile.Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariCongratulazioni!
Quindi, "s" è un parametro sconosciuto qui. In tal caso, riscrivi tutte le tue equazioni in qualcosa del genere: 0 = f(...) - s.
Oppure, se nelle tue equazioni sono presenti quantità note, spostale sul lato sinistro. Il lato sinistro sarà la tua Y quando utilizzi la piattaforma non lineare.
Non ho esempi, quindi ne ho inventato uno. In allegato: sistema senza senso di eqns.jmp
Esso ha
- una colonna Y, quantità note.
- una colonna formula, gli elementi sulla dimensione della mano destra delle tue equazioni
- una colonna di etichetta indica che le righe dispari corrispondono alla prima equazione e le righe pari corrispondono alla seconda equazione
- altre quantità note che fanno parte dell'equazione sul lato destro.
Guarda la formula nella colonna "formula" per vedere come inviare due equazioni in una singola colonna.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariGrazie per la guida @peng_liu !
Ho messo insieme una tabella e sembra funzionare se ho un paio di righe, ma se provo a farne più di alcune, mi dà questo:

È davvero un problema avere troppe righe? L'errore sembra persistere se riduco le righe al minimo (3 in questo caso) e devo creare una nuova tabella. Hai qualche opinione al riguardo? Ecco il tavolo che ho realizzato con una versione barebone del modello, quindi non è ingombrante. Ho anche inserito i parametri nelle rispettive colonne (Phi0, sigma0, pHf) e formule intermedie ampliate per facilitare la visualizzazione della formula della colonna.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariNon sono sicuro di come eseguire la piattaforma non lineare utilizzando questa tabella dati. Qual è Y, qual è X?
Ma se la colonna "Formula" è X, non penso che funzionerebbe. La formula di X deve utilizzare parametri, non variabili di tabella.
Quello che segue è l'aspetto della colonna X in quella "tabella dati senza senso".

La colonna "Formula" non ha nulla elencato in Parametri.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariEHI @peng_liu - Sì, poiché i parametri rendevano la formula 100 volte più lunga, li ho inseriti nelle colonne Phi0, sigma0 e pHf (colonne 6-8 dopo la colonna con un "." come titolo), quindi ho selezionato il Casella "Espandi formule intermedie" nella parte inferiore della piattaforma non lineare. In questo modo posso utilizzare i parametri ma non rendono impossibile lavorare con la colonna formula, poiché ci sono così tante "categorie espanse" per ciascun parametro.
Ha senso?
Lo screenshot allegato dovrebbe mostrare quelle colonne e la loro posizione nella formula, nel caso ciò lo renda più chiaro.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineari@peng_liu Dirò anche che ho scoperto che 1) l'opzione Solo derivate numeriche sembra riuscire a passare alla piattaforma principale e 2) che quando ho parametri in più di una delle equazioni, sembra che lo dia errore. Non sono sicuro che questo ti dica qualcosa. Non riesco proprio a trovare un riferimento a quell'errore, quindi sono perplesso.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariGrazie per la spiegazione, @ehchandler Capisco cosa stai facendo adesso. Quello che stai facendo è un bel trucco per un problema così complicato. Qualcosa di nuovo per me!
Ho guardato il messaggio di errore. È necessario selezionare "Solo derivati numerici".

Hai più di 300 parametri, la derivata simbolica sottostante sta raggiungendo un limite.
Vedo che hai 337 righe, ma 339 parametri. Questo sottoinsieme non otterrà una soluzione. Spero che il tuo set completo non presenti il problema.
Nel frattempo, mentre guardo la tua configurazione, qualcosa è interessante. Non conosco il tuo argomento. Ma nella tua configurazione, Phi0, sigma0 e pHf sono funzioni discrete di pH0. Sono note le relazioni tra i tre e il pH0? Se tra loro si conoscono relazioni continue (con meno parametri sconosciuti), è possibile ridurre notevolmente il numero di parametri.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineari@peng_liu ok così ha più senso. Conosci il limite al numero di termini o parametri nel codice derivato simbolico? Perché penso che posso semplicemente avere una colonna con alcuni numeri e quindi segmentare il calcolo utilizzando la funzione "per". La derivata simbolica è semplicemente molto più veloce.
E hmmm. Non sono sicuro da dove provengano i nuovi parametri. Lo controllerò quando entro. Grazie per averlo notato. Tre domande correlate: 1) come hai visto il numero di parametri e 2) esiste un modo per eliminare in blocco i parametri nel menu della formula di colonna? Per quanto ne so, devi fare clic con il pulsante destro del mouse, fare clic su Elimina uno per uno. 3) esiste un modo per utilizzare una tabella per inserire i parametri e i relativi limiti? Questo aiuterebbe davvero la velocità.
Grazie!
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariIl limite non è in termini di numero di parametri. Ma il numero di parametri è un fattore nel tuo caso. Quindi, devi provare a vedere.
Vedo che il tuo sistema ha tre tipi distinti di parametri: Phi, sigma, pHf. Sono tutti condizionati dal valore di pH0. Pertanto i parametri sono indipendenti dal diverso pH0. Quindi hai ragione, eseguire un adattamento "Per" può ridurre la complessità.
PS "By" non funziona come avrei voluto. Tutte le righe visualizzano tutti i parametri nella colonna. Non vedo che sia possibile consentire a singole righe di vedere solo un sottoinsieme di parametri.
Vedo il numero di parametri dopo aver avviato Non lineare. C'è una gamma di parametri. Faccio clic con il pulsante destro del mouse e ne creo una tabella, conto le righe. Per le ultime due righe, suggerirei semplicemente di modificare la formula JSL. Apri l'editor delle formule della colonna. Copialo e incollalo in un editor JSL. Dopo la modifica, copia e incolla di nuovo. In questo modo è possibile modificare l'elenco dei parametri:
La sezione "1" è l'elenco dei parametri. Il "2" è la formula vera e propria.

Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariSegui come utilizzare "By".
Sembra che ci sia un modo per utilizzare By e ridurre il numero di parametri per sfruttare l'indipendenza tra le righe.
Allego la v2 del "sistema nonsense". Per prima cosa spiego cosa ho impostato.

Ho impostato due sistemi di equazioni lineari. Le righe 1 e 2 sono il sistema "a", la colonna Gruppo. E le righe 3 e 4 sono il sistema "b".
Ogni sistema lineare ha due parametri "b0" e "b1", ma sono diversi tra i sistemi. E utilizzo i parametri x1 e x2 per produrre "SimY". Copio SimY in Y per la mia analisi.
Ora guarda la colonna "formula", non distinguo "b0" e "b1" per gruppo.

Ora esegui Non lineare con By = Group. Ed ecco il resoconto:

Trova soluzioni separate e corrette per i rispettivi sistemi.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineari@peng_liu Sì, anch'io mi ero imbattuto nel problema in questione. La tua soluzione sembra buona! Tuttavia, quando provo ad applicarlo alla mia tabella, si verifica un errore. Vedete un problema evidente nella tabella allegata? Phi0, sigma0 e pHf sono tutti uguali a prima. Tuttavia, ho creato una colonna di "categorizzazione ciclica" per il metodo "per" che hai menzionato, ma poi ho un "parametro per colonna". Utilizzo i livelli di questa colonna per espandere i parametri per categorie. Poiché :Categorizzazione ciclica e :Parametro per colonna sono ortogonali (o qualunque sia la parola corretta), ciò dovrebbe consentire ai parametri di scorrere sull'intera curva con leggeri offset (pH0 è l'asse x), e quindi posso semplicemente metterli insieme di nuovo alla fine. Tuttavia, come ho detto, non funziona e aggiorna solo uno dei livelli dei parametri e non so perché.
Potrebbe trattarsi di un problema con il modo in cui interagisce con i parametri espansi per categorie?
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariSono presenti valori mancanti nella colonna3, il che spiega perché solo un gruppo ha un risultato. Ma la "formula" non è impostata come avevo raccomandato. Allego test.v2 per illustrare. Con questo approccio non sono più necessari Phi0, sigma0 e pHf nel mezzo.
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineari@peng_liu Oh sì. Non sono sicuro di come mi sono perso così tante righe mancanti. Grazie per averlo notato.
Quindi forse ho frainteso, ma poiché pH0 è il mio asse x, la tua soluzione significa semplicemente che la colonna by è la colonna x? come se avessi 100 valori x, hai 100 "gruppi" per così dire?
In tal caso, la versione con espansione per colonne non sarebbe migliore poiché stai riducendo al minimo l'errore su più punti anziché semplicemente una minimizzazione autonoma per ciascuno di essi? Oppure punto per punto è un modo migliore per gestire le funzioni di perdita? In un certo senso sto semplicemente adattando il codice Matlab che avevo a JMP, ma non ho molta esperienza negli algoritmi di minimizzazione, quindi qualunque sia la tecnica migliore, sono d'accordo.
PS E forse non sono stato chiaro, ma dovrebbe esserci un insieme unico di valori di ciascuno dei parametri per ciascun valore di pH0 (che è la variabile dipendente). Ecco perché ho pensato di dover espandere per categorie.
Grazie!
Re: Regressione dei minimi quadrati per sistemi di equazioni non lineariVedo che la colonna "formula" nella tabella originale dipende dal pH0. Ma la colonna "formula" nel tuo test.jmp non dipende dal pH0. Immagino che ci sia un malinteso tra noi. Permettimi di utilizzare ancora i tuoi dati originali, quindi Phi0, sigma0, pHf dipendono da pH0, non da "Parametro per colonna".
Diamo un'occhiata alle prime tre righe:

Il loro pH0 = 0,2. Per questo motivo, la formula della prima riga può essere denotata da:
f1(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2).
Le formule della 2a e 3a riga sono:
f2(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2) e
f3(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2). Le tre file formano il Gruppo 1.
Ora guarda le righe 4, 5, 6. Il loro pH0 = 0,3. Quindi le tre formule sono:
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) e
f3(Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3). Le tre file formano il Gruppo 2.
Gruppo1 e Gruppo2 non condividono lo stesso set di parametri. Sono indipendenti. La riduzione al minimo degli errori per il Gruppo1 non ha nulla a che fare con la riduzione al minimo degli errori per il Gruppo2. Quindi, possiamo ottimizzare gruppo per gruppo.
Se mantieni i parametri impostati nelle tre colonne intermedie come Phi0_pH0_0.2, Phi0_pH0_0.3, Phi0_pH0_0.4, ecc. ogni riga li vede tutti. Puoi vederlo se esegui Non lineare da pH0 e ogni gruppo avrà centinaia di parametri elencati. Ma tra questi, solo tre sono rilevanti per ogni riga e ogni tre righe.
Quello che ho fatto è creare solo tre parametri, all'interno della colonna "formula". Li ho chiamati paramPhi0, paramSigma0, parampHf. Anche se ce ne sono solo tre, quando eseguiamo Non lineare con "pH0", la piattaforma creerà diversi set di tre parametri con "pH0". Crea letteralmente centinaia di parametri per te tramite "pH0". E ogni piccolo Non lineare di pH0 deve solo preoccuparsi di tre parametri.