Error de gradiente singular en nls con valores iniciales correctos

19

Estoy tratando de ajustar una línea + curva exponencial a algunos datos. Como comienzo, intenté hacer esto con algunos datos artificiales. La función es: Es efectivamente una curva exponencial con una sección lineal, así como un parámetro de desplazamiento horizontal adicional ( m ). Sin embargo, cuando uso la función de R obtengo el temido error " matriz de gradiente singular en las estimaciones iniciales de parámetros ", incluso si uso los mismos parámetros que usé para generar los datos en primer lugar. He probado diferentes algoritmos, diferentes valores iniciales y he intentado usar

y=un+sir(X-metro)+CX
nls()
optimpara minimizar la suma residual de cuadrados, todo en vano. He leído que una posible razón para esto podría ser una sobre-parametrización de la fórmula, pero no creo que sea (¿es así?)
¿Alguien tiene una sugerencia para este problema? ¿O es solo 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)

¡Gracias!

steiny
fuente
2
Sugerencia: observe el coeficiente de (para una fija ) y observe que tiene una familia unidimensional de soluciones con . r b r - m = constante ( b , m ) b = r mconstanterXrsir-metro=constante(si,metro)si=rmetroconstante
whuber
1
Este no es un modelo identificado, a menos que o estén de alguna manera restringidos. Creo que requerir el haría el trabajo. r r ( 0 , 1 )sirr(0 0,1)
Macro

Respuestas:

16

He sido mordido por esto recientemente. Mis intenciones eran las mismas, hacer un modelo artificial y probarlo. La razón principal es la dada por @whuber y @marco. Tal modelo no está identificado. Para ver eso, recuerde que NLS minimiza la función:

yo=1norte(yyo-un-sirXyo-metro-CXyo)2

Digamos que está minimizado por el conjunto de parámetros . No es difícil ver que el conjunto de parámetros dará el mismo valor de la función a minimizar. Por lo tanto, el modelo no se identifica, es decir, no hay una solución única.(un,si,metro,r,C)(un,sir-metro,0 0,r,C)

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

F(un,si,r,metro,C,X)=un+sirX-metro+CX

Luego

Fsi=rX-metro

Fmetro=-siEnrrX-metro

y lo conseguimos para todosX

siEnrFsi+Fmetro=0.

De ahí la matriz

(F(X1)F(Xnorte))

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

Pasé más de una semana buscando errores en mi código en otro lugar hasta que noté que el error principal estaba en el modelo :)

mpiktas
fuente
2
Esto es muy antiguo, lo sé, pero me pregunto si esto significa que nls no se puede usar en modelos que no son identificables. Por ejemplo, una red neuronal?
Count Zero
gran probabilidad, lo sé, pero ¿podría desglosar esto para las personas que recuerdan menos calcio? :). Además, ¿cuál es la solución al problema del OP? ¿Te rindes y te vas a casa?
theforestecologist
2
La solución al problema de OP es usar un parámetro en lugar de dos, es decir, en lugar de use . El parámetro es superfluo, ya que se fusiona en , es decir, . β r x m β β = b r - msirX-metroβrXmetroββ=sir-metro
mpiktas
@CountZero, básicamente sí, los métodos de optimización habituales fallarían si los parámetros no están identificados. Sin embargo, las redes neuronales evitan este problema agregando restricciones adicionales y utilizando otros trucos interesantes.
mpiktas
Creo que ? falta un lnr en la respuesta? Fmetro=-siEnr rX-metro
wiswit
17

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

Los Rls no podrán manejarlo. La página de ayuda establece específicamente:

Advertencia

No utilice nls en datos artificiales "cero residuos".

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

y = f (x, θ) + eps

(con var (eps)> 0). No indica convergencia en los datos del formulario.

y = f (x, θ)

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

Entonces, sin ruido == no es bueno para R's nls.

B_D_Dubbya
fuente
Bienvenido al sitio, @B_D_Dubbya. Me tomé la libertad de formatear su respuesta, espero que no le importe. Puede encontrar más información sobre cómo editar sus respuestas en el CV aquí .
gung - Restablecer Monica
1
Soy consciente de este problema, por lo tanto, uso de la función "jitter" para agregar algo de ruido
2017