Ho dati nella forma . Per la stima di a uso le formule di questo documento: John Fox - Regressione non lineare e minimi quadrati non lineari In questo documento, è stimato guardando i dati. Se lo faccio, funziona benissimo, anche se ho solo tre punti. Da ciò posso calcolare gli altri due. Ho testato i miei parametri con nls () in R e LevenbergMarquardt in C #. I modelli restituiti da loro sono soddisfacenti. β1β3β1
Il problema è che non voglio guardare i dati per ottenere un buon stimatore per , voglio che il mio programma li calcoli. Per qualche tempo ho usato valori un po 'più alti del massimo dei miei valori (qualcosa tra e \ max * 1.5 . Funzionava bene fintanto che i punti coprivano la maggior parte della funzione. Funzionava anche bene se il i punti dati erano da qualche parte dalla "cima" della curva, ma quando provenivano tutti dall'area "sotto" il punto di flesso, questo stimatore era decisamente più basso di quanto dovrebbe essere e non potrei adattarmi al modello. Se uso qualcosa che è decisamente superiore al punto massimo (moltiplicandolo con valori ridicolmente alti) il modello non si adatta in alcun modo utile.
Le misure potrebbero apparire così:
x = (40, 50, 60, 70), y = (1000, 950, 400, 200) -> facile da stimare
x = (40, 50, 60, 70), y = (1000, 950, 800, 100) -> facile da stimare
x = (40, 50, 60, 70), y = (500, 200, 100, 50) -> non così facile da stimare
Immagino di poter scoprire dove sono nella funzione (in "fondo", in "alto", in pendenza) calcolando i delta nei punti dati e calcolare un limite superiore in base a quello. Qualcuno ha un suggerimento per una soluzione migliore? Informazioni aggiuntive: se non è possibile, è più importante per me che le misure che possono essere adattate siano le migliori possibili e accetto che alcune misure non possano essere adattate a tutti.
(anche se voglio un'implementazione in C # l'ho pubblicato qui, non credo che il problema dipenda dalla lingua)
aggiornamento (Applicazione di questo):
x sono i valori di temperatura e le misurazioni corrispondenti. Per natura si suppone che dovrebbe apparire come una curva logistica con valori y più alti a temperature più basse e viceversa. Il punto di fusione è uguale al punto di flesso della curva, che cambia molto con piccole modifiche dei parametri del modello.
aggiornamento (alcuni dati inventati con 7 punti dati e punto di flesso noto a 60):
//first I made up some data without any noise and enough (13) points
double[] x17 = { 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90 };
double[] y17 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 59.642....
//Then I took three different parts of that data
(to simulate how much data I will have in the real world)
double[] x18 = { 30, 35, 40, 45, 50, 55, 60 };
double[] y18 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000 };
//calculated inflection point: 59.263.... is ok!
double[] x19 = { 60, 65, 70, 75, 80, 85, 90 };
double[] y19 = { 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 53.447.... to small!
double[] x20 = { 45, 50, 55, 60, 65, 70, 75 };
double[] y20 = { 1700, 1500, 1280, 1000, 720, 500, 300 };
//calculated inflection point: 59.868... almost perfect!
Il mio approccio attuale per una stima del limite superiore è y0 * y0 / y1. In questo modo spero di tener conto del fatto che potrei non avere sempre un valore vicino al massimo.
aggiornamento: i valori xey non saranno mai negativi. x sarà sempre {40, 45, 50, 55, 60, 65, 70} a meno che non si perda un punto dati.
aggiornamento: ho fatto molti, molti test con dati simulati che dovrebbero essere facili da adattare (scelgo punti di dati che erano esattamente sulla curva = senza alcun rumore) e vedo che funziona bene, a meno che il primo o il secondo punto di dati (dove x = 40 o x = 45) mancante. Immagino che dovrò scartare tali misurazioni e l'utente dovrà conviverci.