26 votos

Error de gradiente singular en nls con valores iniciales correctos

Estoy intentando ajustar una curva lineal+exponencial a unos datos. Para empezar, he intentado hacerlo con algunos datos artificiales. La función es: $$y=a+b\cdot r^{(x-m)}+c\cdot x$$ Se trata efectivamente de una curva exponencial con una sección lineal, así como un parámetro adicional de desplazamiento horizontal ( m ). Sin embargo, cuando utilizo la función nls() me aparece el temido " matriz de gradiente singular en las estimaciones iniciales de los parámetros "incluso si utilizo los mismos parámetros que utilicé para generar los datos en primer lugar.
He probado los diferentes algoritmos, diferentes valores de partida y trató de utilizar optim para minimizar la suma residual de cuadrados, todo en vano. He leído que una posible razón para esto podría ser un exceso de parametrización de la fórmula, pero no creo que sea (¿es así?)
¿Alguien tiene alguna sugerencia para este problema? ¿O se trata simplemente de un modelo incómodo?

Un breve ejemplo:

#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)

Merci !

21voto

Marc-Andre R. Puntos 789

Esto me ha picado recientemente. Mis intenciones eran las mismas, hacer algún modelo artificial y probarlo. La razón principal es la dada por @whuber y @marco. Dicho modelo no se identifica. Para verlo, recordar que NLS minimiza la función:

$$\sum_{i=1}^n(y_i-a-br^{x_i-m}-cx_i)^2$$

Digamos que se minimiza mediante el conjunto de parámetros $(a,b,m,r,c)$ . No es difícil ver que el conjunto de parámetros $(a,br^{-m},0,r,c)$ darán el mismo valor de la función a minimizar. Por lo tanto, el modelo no está identificado, es decir, no existe una solución única.

Tampoco es difícil ver por qué el gradiente es singular. Denotemos

$$f(a,b,r,m,c,x)=a+br^{x-m}+cx$$

Entonces

$$\frac{\partial f}{\partial b}=r^{x-m}$$

$$\frac{\partial f}{\partial m}=-b\ln rr^{x-m}$$

y conseguimos que para todos $x$

$$b\ln r\frac{\partial f}{\partial b}+\frac{\partial f}{\partial m}=0.$$

Por lo tanto, la matriz

\begin{align} \begin{pmatrix} \nabla f(x_1)\\\\ \vdots\\\\ \nabla f(x_n) \end{pmatrix} \end{align}

no será de rango completo y por eso nls dará el mensaje de gradiente singular.

Me he pasado más de una semana buscando fallos en mi código en otros sitios hasta que me he dado cuenta de que el fallo principal estaba en el modelo :)

18voto

NVI Puntos 358

Las respuestas anteriores son, por supuesto, correctas. Por si sirve de algo, además de las explicaciones dadas, si está intentando esto en un conjunto de datos artificial, de acuerdo con la página de ayuda nls que se encuentra en: http://stat.ethz.ch/R-manual/R-patched/library/stats/html/nls.html

R's nls no será capaz de manejarlo. La página de ayuda dice específicamente:

Advertencia

No utilice nls en datos artificiales "cero-residuales".

La función nls utiliza un criterio de convergencia de desplazamiento relativo que compara la imprecisión numérica en las estimaciones actuales de los parámetros con la suma de cuadrados residuales. Esto funciona bien con datos de la forma

y = f(x, θ) + eps

(con var(eps) > 0). No indica convergencia en datos del tipo forma

y = f(x, θ)

porque el criterio equivale a comparar dos componentes del error de redondeo. Si desea probar nls con datos artificiales, añada un componente de ruido, como se muestra en el ejemplo siguiente.

Por lo tanto, no hay ruido== no es bueno para R's nls.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X