Automáticamente Encontrar buenos valores de partida para un modelo no lineal es un arte. (Es relativamente fácil en el caso de conjuntos de datos puntuales cuando se pueden trazar los datos y hacer algunas buenas conjeturas visualmente). Un enfoque es linealizar el modelo y utilizar las estimaciones por mínimos cuadrados.
En este caso, el modelo tiene la forma
$$\mathbb{E}(Y) = a \exp(b x) + c$$
para parámetros desconocidos $a,b,c$ . La presencia del exponencial nos anima a utilizar logaritmos, pero la adición de $c$ hace que sea difícil hacerlo. Sin embargo, observe que si $a$ es positivo, entonces $c$ será menor que el menor valor esperado de $Y$ --y por lo tanto podría ser un poco menos que el más pequeño observado valor de $Y$ . (Si $a$ podría ser negativo también tendrá que considerar un valor de $c$ que es un poco mayor que el mayor valor observado de $Y$ .)
Entonces, ocupémonos de $c$ utilizando como estimación inicial $c_0$ algo así como la mitad del mínimo de las observaciones $y_i$ . El modelo se puede reescribir ahora sin ese espinoso término aditivo como
$$\mathbb{E}(Y) - c_0 \approx a \exp(b x).$$
Que podemos tomar el registro de:
$$\log(\mathbb{E}(Y) - c_0) \approx \log(a) + b x.$$
Es una aproximación lineal al modelo. Ambos $\log(a)$ y $b$ se puede estimar con mínimos cuadrados.
Aquí está el código revisado:
c.0 <- min(q24$cost.per.car) * 0.5
model.0 <- lm(log(cost.per.car - c.0) ~ reductions, data=q24)
start <- list(a=exp(coef(model.0)[1]), b=coef(model.0)[2], c=c.0)
model <- nls(cost.per.car ~ a * exp(b * reductions) + c, data = q24, start = start)
Su salida (para los datos del ejemplo) es
Nonlinear regression model
model: cost.per.car ~ a * exp(b * reductions) + c
data: q24
a b c
0.003289 0.126805 48.487386
residual sum-of-squares: 2243
Number of iterations to convergence: 38
Achieved convergence tolerance: 1.374e-06
La convergencia parece buena. Vamos a trazarla:
plot(q24)
p <- coef(model)
curve(p["a"] * exp(p["b"] * x) + p["c"], lwd=2, col="Red", add=TRUE)
Ha funcionado bien.
Al automatizar esto, podría realizar algunos análisis rápidos de los residuos, como comparar sus extremos con la dispersión en el ( $y$ ). También podría necesitar un código análogo para tratar la posibilidad $a\lt 0$ Lo dejo como un ejercicio.
Otro método para estimar los valores iniciales se basa en la comprensión de su significado, que puede basarse en la experiencia, la teoría física, etc. Un ejemplo extendido de un ajuste no lineal (moderadamente difícil) cuyos valores iniciales pueden determinarse de esta manera se describe en mi respuesta en https://stats.stackexchange.com/a/15769 .
Análisis visual de un gráfico de dispersión (para determinar las estimaciones iniciales de los parámetros) se describe e ilustra en https://stats.stackexchange.com/a/32832 .
En algunas circunstancias, se realiza una secuencia de ajustes no lineales en la que cabe esperar que las soluciones cambien lentamente. En ese caso, suele ser conveniente (y rápido) utilizar las soluciones anteriores como estimaciones iniciales para las siguientes . Recuerdo haber utilizado esta técnica (sin comentarios) en https://stats.stackexchange.com/a/63169 .
0 votos
Le sugiero que empiece a descifrar buscar el mensaje de error en nuestro sitio .
3 votos
En realidad, lo hice y mi búsqueda del error completo dio como resultado una pregunta a medias con tres datos y ninguna respuesta. Pero tu búsqueda más específica sí obtiene algunos resultados. Posiblemente porque tienes más experiencia aquí y sabes qué términos destacan como relevantes.
1 votos
Una cosa que he descubierto sobre los errores de software es que una búsqueda del mensaje de error específico (normalmente entre comillas) es la forma más segura de averiguar si se ha discutido antes. (Esto es válido para todo Internet, no sólo para los sitios de SE.) Como dice nuestro mensaje de "en espera", si su investigación adicional no resuelve su problema, por favor, vuelva y rebájenos un poco: esta pregunta está en la intersección de la estadística y la informática y podría exponer algunas cuestiones de gran interés aquí.
1 votos
El ajuste de sus valores iniciales está muy lejos de los datos; compare
exp(50)
yexp(95)
a los valores y en x=50 y x=95. Si establecec=0
y tomar el logaritmo de y (haciendo una relación lineal), se puede utilizar la regresión para obtener estimaciones iniciales para log( $a$ ) y $b$ que será suficiente para tus datos (o si ajustas una línea por el origen, puedes dejar $a$ a 1 y sólo utilizar la estimación de $b$ que también es suficiente para sus datos). Si $b$ está muy fuera de un intervalo bastante estrecho en torno a esos dos valores, se encontrará con algunos problemas. [Alternativamente, intente un algoritmo diferente]0 votos
Creo que hay una cuestión estadística importante aquí: una reformulación para preguntar sobre el problema subyacente de tener un gradiente singular cuando se utiliza Gauss-Newton (mínimos cuadrados reponderados iterativos) para los mínimos cuadrados no lineales (o incluso sólo sobre la elección de buenos valores de inicio para los mínimos cuadrados no lineales), en lugar de sobre los detalles de los mensajes de error de R podría servir para hacerlo más claramente en el tema, pero habría que comprobar que no se ha preguntado ya.
1 votos
Gracias @Glen_b. Tenía la esperanza de poder utilizar R en lugar de una calculadora gráfica para trabajar a través de un libro de texto de introducción a las estadísticas (y saltar el curso en sí) por lo que estoy empezando con sólo el conocimiento estadístico mínimo, pero un montón de experiencia haciendo otras rebanadas y cortar en R.
0 votos
Ese es un buen objetivo; es sólo una cuestión de adaptar su pregunta a la SE que publique - por ejemplo, StackOverflow, SuperUser y CrossValidated pueden cada uno tomar diferentes tipos de preguntas que se relacionan con R (o cualquier otro lenguaje), y algunos tipos de preguntas pueden ser mejor colocados en la lista de correo de R (ver nuestro lista de recursos ). Para cada sitio SE lea su página de ayuda/sobre el tema para ver lo que se ajusta.