Come ridurre al minimo la somma residua dei quadrati di un adattamento esponenziale?


14

Ho i seguenti dati e vorrei adattare un modello di crescita esponenziale negativo ad esso:

Days <- c( 1,5,12,16,22,27,36,43)
Emissions <- c( 936.76, 1458.68, 1787.23, 1840.04, 1928.97, 1963.63, 1965.37, 1985.71)
plot(Days, Emissions)
fit <- nls(Emissions ~ a* (1-exp(-b*Days)), start = list(a = 2000, b = 0.55))
curve((y = 1882 * (1 - exp(-0.5108*x))), from = 0, to =45, add = T, col = "green", lwd = 4)

Il codice funziona e viene tracciata una linea di adattamento. Tuttavia, la misura visivamente non è l'ideale e la somma residua dei quadrati sembra essere piuttosto grande (147073).

Come possiamo migliorare la nostra forma? I dati consentono un adattamento migliore a tutti?

Non siamo riusciti a trovare una soluzione a questa sfida in rete. Qualsiasi aiuto diretto o collegamento ad altri siti Web / post è molto apprezzato.


1
In questo caso, se si considera un modello di regressione , dove ϵ iN ( 0 , σ ) , si ottengono stimatori simili. Tracciando le aree di confidenza, si può osservare come questi valori sono contenuti nelle regioni di confidenza. Non puoi aspettarti un adattamento perfetto se non interpoli i punti o usi un modello non lineare più flessibile. emissioniio=f(giorniio,un',B)+εioεio~N(0,σ)

Ho cambiato il titolo perché "modello esponenziale negativo" significa qualcosa di diverso da quello descritto nella domanda.
whuber

Grazie per aver chiarito la domanda (@whuber) e grazie per la risposta (@Procrastinator). Come posso calcolare e tracciare le aree di confidenza. E quale sarebbe un modello non lineare più flessibile?
Strohmi,

4
Hai bisogno di un parametro aggiuntivo. Guarda cosa succede con fit <- nls(Emissions ~ a* (1- u*exp(-b*Days)), start = list(a = 2000, b = 0.1, u=.5)); beta <- coefficients(fit); curve((y = beta["a"] * (1 - beta["u"] * exp(-beta["b"]*x))), add = T).
whuber

1
@whuber - forse dovresti pubblicarlo come risposta?
jbowman,

Risposte:


16

Una legge esponenziale (negativa) assume la forma . Quando si consentono cambiamenti di unità nei valori x e y , tuttavia, dire a y = α y + β e x = γ x + δ , quindi la legge sarà espressa comey=-exp(-X)Xyy=αy'+βX=γX'+δ

αy'+β=y=-exp(-X)=-exp(-γX'-δ),

algebricamente equivalente

y=1αexp(γxδ)β=a(1uexp(bx))

usando tre parametri , u = 1 / ( β exp ( δ ) ) e b = γ . Possiamo riconoscere una come parametro di scala per y , b come un parametro di scala per x , ed u come derivanti da una posizione parametro xa=β/αu=1/(βexp(δ))b=γaybxux .

Come regola generale, questi parametri possono essere identificati a colpo d'occhio dalla trama :

  • Il parametro è il valore dell'asintoto orizzontale, un po 'meno di 2000 .a2000

  • Il parametro è la quantità relativa che la curva sale dall'origine al suo asintoto orizzontale. Qui, l'aumento è quindi leggermente inferiore a 2000 - 937 ; relativamente, questo è circa 0,55 dell'asintoto.u20009370.55

  • Poiché , quando x è pari a tre volte il valore di 1 / b la curva dovrebbe essere salita a circa 1 - 0,05 o al 95 % del suo totale. Il 95 % dell'aumento dal 937 a quasi 2000 ci colloca intorno al 1950 ; la scansione della trama indica che sono stati necessari dai 20 ai 25 giorni. Chiamiamolo 24 per semplicità, da cui b 3 / =exp(3)0.05x1/b10.0595%95%93720001950202524 . (Questometodo al 95 % per il bulbo oculare di una scala esponenziale è standard in alcuni campi che usano molto i grafici esponenziali.)b3/24=0.12595%

Vediamo come appare:

plot(Days, Emissions)
curve((y = 2000 * (1 - 0.56 * exp(-0.125*x))), add = T)

Fit bulbo oculare

Non male come inizio! (Anche se si digita 0.56al posto di 0.55, che era comunque un'approssimazione approssimativa.) Possiamo lucidarlo con nls:

fit <- nls(Emissions ~ a * (1- u * exp(-b*Days)), start=list(a=2000, b=1/8, u=0.55))
beta <- coefficients(fit)
plot(Days, Emissions)
curve((y = beta["a"] * (1 - beta["u"] * exp(-beta["b"]*x))), add = T, col="Green", lwd=2)

Vestibilità NLS

L'output di nlscontiene informazioni dettagliate sull'incertezza dei parametri. Ad esempio , un semplice summaryfornisce errori standard di stima:

> summary(fit)

Parameters:
   Estimate Std. Error t value Pr(>|t|)    
a 1.969e+03  1.317e+01  149.51 2.54e-10 ***
b 1.603e-01  1.022e-02   15.69 1.91e-05 ***
u 6.091e-01  1.613e-02   37.75 2.46e-07 ***

Possiamo leggere e lavorare con l'intera matrice di covarianza delle stime, utile per stimare intervalli di confidenza simultanei (almeno per grandi set di dati):

> vcov(fit)
             a             b             u
a 173.38613624 -8.720531e-02 -2.602935e-02
b  -0.08720531  1.044004e-04  9.442374e-05
u  -0.02602935  9.442374e-05  2.603217e-04

nls supporta grafici di profilo per i parametri, fornendo informazioni più dettagliate sulla loro incertezza:

> plot(profile(fit))

un'

Trama del profilo

219451995


res <- residuals(fit); res %*% resu2724147.073

Tutto bene e buono whuber. Ma forse l'OP aveva qualche motivo per scegliere il modello esponenziale (o forse è solo perché è ben noto). Penso che prima i residui debbano essere esaminati per il modello esponenziale. Tracciali contro potenziali covariate per vedere se c'è struttura lì e non solo un grande rumore casuale. Prima di saltare su modelli più sofisticati, prova a vedere se un modello più elaborato potrebbe aiutare.
Michael R. Chernick,

3
X

2
Non stavo criticando la tua risposta! Non ho visto alcun diagramma residuo. Tutto ciò che stavo suggerendo è che le trame di residui vs potenziali covariate dovrebbero essere il primo passo per trovare un modello migliore. Se avessi pensato di avere una risposta da mettere lì avrei dato una risposta piuttosto che sollevare il mio punto di vista come costante. Pensavo avessi dato un'ottima risposta ed ero tra quelli che ti hanno dato +1.
Michael R. Chernick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.