Errore gradiente singolare in nls con valori iniziali corretti


19

Sto cercando di adattare una linea + curva esponenziale ad alcuni dati. Per cominciare, ho provato a farlo su alcuni dati artificiali. La funzione è:

y=un'+Br(X-m)+cX
È effettivamente una curva esponenziale con una sezione lineare, nonché un ulteriore parametro di spostamento orizzontale ( m ). Tuttavia, quando uso la nls()funzione di R ottengo il temuto errore " matrice gradiente singolare alle stime iniziali dei parametri ", anche se uso gli stessi parametri che ho usato per generare i dati in primo luogo.
Ho provato i diversi algoritmi, i diversi valori iniziali e ho cercato di utilizzare optimper ridurre al minimo la somma residua dei quadrati, il tutto inutilmente. Ho letto che una possibile ragione di ciò potrebbe essere una parametrizzazione eccessiva della formula, ma non penso che sia (vero?)
Qualcuno ha un suggerimento per questo problema? O è solo un modello imbarazzante?

Un breve esempio:

#parameters used to generate the data
reala=-3
realb=5
realc=0.5
realr=0.7
realm=1
x=1:11 #x values - I have 11 timepoint data
#linear+exponential function
y=reala + realb*realr^(x-realm) + realc*x
#add a bit of noise to avoid zero-residual data
jitter_y = jitter(y,amount=0.2)
testdat=data.frame(x,jitter_y)

#try the regression with similar starting values to the the real parameters
linexp=nls(jitter_y~a+b*r^(x-m)+c*x, data=testdat, start=list(a=-3, b=5, c=0.5, r=0.7, m=1), trace=T)

Grazie!


2
Suggerimento: osserva il coefficiente di (per una r fissa ) e nota che b r - m = costante ha una famiglia unidimensionale di soluzioni ( b , m ) con b = r mcostante . rxrbrm=costante(b,m)B=rmcostante
whuber

1
Questo non è un modello identificato, a meno che o r siano in qualche modo vincolati. Penso che richiedere r ( 0 , 1 ) farebbe il lavoro. Brr(0,1)
Macro,

Risposte:


16

Mi sono morso di recente. Le mie intenzioni erano le stesse, realizzare un modello artificiale e testarlo. Il motivo principale è quello dato da @whuber e @marco. Tale modello non è stato identificato. Per vederlo, ricorda che NLS minimizza la funzione:

Σio=1n(yio-un'-BrXio-m-cXio)2

Supponiamo che sia ridotto al minimo dall'insieme di parametri (un',B,m,r,c) . Non è difficile vedere che l'insieme di parametri (un',Br-m,0,r,c) darà lo stesso valore della funzione da minimizzare. Quindi il modello non è identificato, cioè non esiste una soluzione unica.

Inoltre, non è difficile capire perché il gradiente sia singolare. Denota

f(un',B,r,m,c,X)=un'+BrX-m+cX

Poi

fB=rX-m

fm=-BlnrrX-m

e lo otteniamo per tutti X

BlnrfB+fm=0.

Da qui la matrice

(f(X1)f(Xn))

non sarà di rango massimo ed è per questo nlsche darà il messaggio di gradiente singolare.

Ho trascorso più di una settimana a cercare bug nel mio codice altrove fino a quando ho notato che il bug principale era nel modello :)


2
Questa è vecchiaia lo so, ma mi chiedo, questo significa che nls non può essere usato su modelli che non sono identificabili? Ad esempio, una rete neurale?
Conta Zero il

grossa possibilità, lo so, ma potresti scomporlo per meno gente che ricorda il calc? :). inoltre, qual è la soluzione al problema del PO, allora? Rinunciare e tornare a casa?
theforestecologist

2
BrX-mβrXmββ=Br-m

@CountZero, sostanzialmente sì, i normali metodi di ottimizzazione fallirebbero se i parametri non fossero stati identificati. Le reti neurali eludono tuttavia questo problema, aggiungendo ulteriori contrasti e utilizzando altri trucchi interessanti.
mpiktas,

fm=-Blnr rX-m

17

Le risposte sopra sono, ovviamente, corrette. Per quello che vale, oltre alle spiegazioni fornite, se si sta provando questo su un set di dati artificiali, secondo la pagina di aiuto nls che si trova su: http://stat.ethz.ch/R-manual/R-patched/ biblioteca / statistiche / html / nls.html

R's nls non sarà in grado di gestirlo. La pagina di aiuto specifica nello specifico:

avvertimento

Non utilizzare nls su dati artificiali "a zero residuo".

La funzione nls utilizza un criterio di convergenza dell'offset relativo che confronta l'imprecisione numerica alle attuali stime dei parametri con la somma dei quadrati residua. Ciò si comporta bene sui dati del modulo

y = f (x, θ) + eps

(con var (eps)> 0). Non riesce a indicare la convergenza sui dati del modulo

y = f (x, θ)

perché il criterio equivale a confrontare due componenti dell'errore di arrotondamento. Se si desidera testare nls su dati artificiali, aggiungere un componente di rumore, come mostrato nell'esempio seguente.

Quindi, nessun rumore == non va bene per R's nls.


Benvenuto nel sito, @B_D_Dubbya. Mi sono preso la libertà di formattare la tua risposta, spero che non ti dispiaccia. Puoi trovare maggiori informazioni sulla modifica delle risposte sul CV qui .
gung - Ripristina Monica

1
Sono a conoscenza di questo problema - quindi uso della funzione "jitter" per aggiungere un po 'di rumore
steiny
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.