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
nls()
optim
para 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!
r
nonlinear-regression
nls
steiny
fuente
fuente
Respuestas:
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:
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.( a , b , m , r , c ) ( a , b r- m, 0 , r , c )
Tampoco es difícil ver por qué el gradiente es singular. Denotar
Luego
y lo conseguimos para todosX
De ahí la matriz
no será de rango completo y es por eso
nls
que 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 :)
fuente
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:
Entonces, sin ruido == no es bueno para R's nls.
fuente