Encontrar automaticamente bons valores iniciais para um modelo não linear é uma arte. (É relativamente fácil para conjuntos de dados pontuais quando você pode apenas plotar os dados e fazer algumas boas suposições visualmente.) Uma abordagem é linearizar o modelo e usar estimativas de mínimos quadrados.
Nesse caso, o modelo tem a forma
E (Y) = uma exp( b x ) + c
para parâmetros desconhecidos . A presença do exponencial nos encoraja a usar logaritmos - mas a adição de torna difícil fazer isso. Observe, porém, que, se é positivo, então será menor do que o menor valor esperado de --e, portanto, pode ser um pouco menos do que o menor observado valor de . (Se puder ser negativo, você também terá que considerar um valor de um pouco maior que o maior valor observado de ).c a c Y Y aa , b , ccumacYYumacY
Vamos, então, cuidar de usando como estimativa inicial algo como metade do mínimo das observações . O modelo agora pode ser reescrito sem esse termo aditivo espinhoso comocc0 0yEu
E (Y) - c0 0≈ um exp( b x ) .
Que podemos pegar o log de:
registro( E ( Y) - c0 0) ≈ log( a ) + b x .
Essa é uma aproximação linear ao modelo. Ambos e podem ser estimados por mínimos quadrados.registro( Um )b
Aqui está o 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)
Sua saída (para os dados de exemplo) é
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
A convergência parece boa. Vamos traçar isso:
plot(q24)
p <- coef(model)
curve(p["a"] * exp(p["b"] * x) + p["c"], lwd=2, col="Red", add=TRUE)
Funcionou bem!
Ao automatizar isso, você pode executar algumas análises rápidas dos resíduos, como comparar seus extremos com a dispersão nos dados ( ). Você também pode precisar de código análogo para lidar com a possibilidade ; Deixo isso como um exercício.a < 0ya < 0
Outro método para estimar valores iniciais baseia-se na compreensão do que eles significam, que podem ser baseados em experiência, teoria física etc. Um exemplo extenso de um ajuste não-linear (moderadamente difícil) cujos valores iniciais podem ser determinados dessa maneira é descrito em minha resposta em /stats//a/15769 .
A análise visual de um gráfico de dispersão (para determinar as estimativas iniciais dos parâmetros) é descrita e ilustrada em /stats//a/32832 .
Em algumas circunstâncias, é feita uma sequência de ajustes não lineares em que você pode esperar que as soluções mudem lentamente. Nesse caso, geralmente é conveniente (e rápido) usar as soluções anteriores como estimativas iniciais para as próximas . Lembro-me de usar essa técnica (sem comentários) em /stats//a/63169 .