Trouver automatiquement de bonnes valeurs de départ pour un modèle non linéaire est un art. (Il est relativement facile pour des ensembles de données uniques lorsque vous pouvez simplement tracer les données et faire de bonnes suppositions visuellement.) Une approche consiste à linéariser le modèle et à utiliser les estimations des moindres carrés.
Dans ce cas, le modèle a la forme
E(Y)=aexp(bx)+c
pour les paramètres inconnus . La présence de l'exponentielle nous encourage à utiliser des logarithmes - mais l'ajout de c rend cela difficile. Remarquez, cependant, que si un est alors positif c sera inférieure à la plus petite valeur attendue de Y --et pourrait donc être un peu moins que la plus petite observée valeur de Y . (Si a peut être négatif, vous devrez également considérer une valeur dea,b,ccacYYa légèrement supérieure à la plus grande valeur observée de Y. )cY
Prenons donc soin de en utilisant comme estimation initiale c 0 quelque chose comme la moitié du minimum des observationscc0 . Le modèle peut maintenant être réécrit sans ce terme additif épineux commeyi
E(Y)−c0≈aexp(bx).
Que nous pouvons prendre le journal de:
log(E(Y)−c0)≈log(a)+bx.
Il s'agit d'une approximation linéaire du modèle. Les deux log(a) et peuvent être estimés avec moindres carrés.b
Voici le code révisé:
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)
Sa sortie (pour les données d'exemple) est
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 convergence semble bonne. Trouvons-le:
plot(q24)
p <- coef(model)
curve(p["a"] * exp(p["b"] * x) + p["c"], lwd=2, col="Red", add=TRUE)
Cela a bien fonctionné!
Lors de l'automatisation, vous pouvez effectuer des analyses rapides des résidus, comme comparer leurs extrêmes à la dispersion dans les données ( ). Vous pourriez également avoir besoin d'un code analogue pour faire face à la possibilité d' un < 0ya<0 ; Je laisse cela comme un exercice.
Une autre méthode pour estimer les valeurs initiales repose sur la compréhension de leur signification, qui peut être basée sur l'expérience, la théorie physique, etc. Un exemple étendu d'un ajustement non linéaire (modérément difficile) dont les valeurs initiales peuvent être déterminées de cette manière est décrit dans ma réponse. à /stats//a/15769 .
Analyse visuelle d'un nuage de points (pour déterminer les estimations initiales des paramètres) est décrite et illustrée sur /stats//a/32832 .
Dans certaines circonstances, une séquence d'ajustements non linéaires est effectuée où vous pouvez vous attendre à ce que les solutions changent lentement. Dans ce cas, il est souvent pratique (et rapide) d' utiliser les solutions précédentes comme estimations initiales pour les suivantes . Je me souviens avoir utilisé cette technique (sans commentaire) sur /stats//a/63169 .