Encontrar automáticamente buenos valores iniciales para un modelo no lineal es un arte. (Es relativamente fácil para los conjuntos de datos únicos cuando solo puede trazar los datos y hacer algunas buenas suposiciones visuales). Un enfoque es linealizar el modelo y usar estimaciones de mínimos cuadrados.
En este caso, el modelo tiene la forma
E(Y)=aexp(bx)+c
para parámetros desconocidos . La presencia de lo exponencial nos anima a usar logaritmos, pero la adición de c hace que sea difícil hacerlo. Nótese, sin embargo, que si una es positiva entonces c será menor que el menor valor esperado de Y -y, por tanto, podría ser un poco menor que la más pequeña observada valor de Y . (Si a puede ser negativo, también tendrá que considerar un valor de c que sea un poco mayor que el mayor valor observado de Y ).a,b,ccacYYacY
Entonces, cuidemos de usando como estimación inicial c 0 algo así como la mitad del mínimo de las observaciones y i . El modelo ahora puede reescribirse sin ese término aditivo espinoso comocc0yi
E(Y)−c0≈aexp(bx).
Que podemos tomar el registro de:
Iniciar sesión( E ( Y) - c0 0) ≈ log( a ) + b x .
Esa es una aproximación lineal al modelo. Tanto como b se pueden estimar con mínimos cuadrados.Iniciar sesión( a )si
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 de 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 se ve bien. Vamos a trazarlo:
plot(q24)
p <- coef(model)
curve(p["a"] * exp(p["b"] * x) + p["c"], lwd=2, col="Red", add=TRUE)
¡Funcionó bien!
Al automatizar esto, puede realizar algunos análisis rápidos de los residuos, como comparar sus extremos con la dispersión en los datos ( ). También es posible que necesite un código análogo para lidiar con la posibilidad a < 0 ; Lo dejo como ejercicio.ya < 0
Otro método para estimar los valores iniciales se basa en comprender lo que significan, que puede basarse en la experiencia, la teoría física, etc. En mi respuesta se describe un ejemplo extendido de un ajuste no lineal (moderadamente difícil) cuyos valores iniciales se pueden determinar de esta manera. en /stats//a/15769 .
El análisis visual de un diagrama de dispersión (para determinar las estimaciones iniciales de los parámetros) se describe e ilustra en /stats//a/32832 .
En algunas circunstancias, se realiza una secuencia de ajustes no lineales donde puede esperar que las soluciones cambien lentamente. En ese caso, a menudo es conveniente (y rápido) usar las soluciones anteriores como estimaciones iniciales para las siguientes . Recuerdo haber usado esta técnica (sin comentarios) en /stats//a/63169 .