J'essaie d'adapter une ligne + une courbe exponentielle à certaines données. Pour commencer, j'ai essayé de le faire sur certaines données artificielles. La fonction est: Il s'agit en fait d'une courbe exponentielle avec une section linéaire, ainsi que d'un paramètre de décalage horizontal supplémentaire ( m ). Cependant, lorsque j'utilise la fonction de R, j'obtiens l' erreur redoutée de " matrice de gradient singulier aux estimations de paramètres initiales ", même si j'utilise les mêmes paramètres que ceux que j'ai utilisés pour générer les données en premier lieu. J'ai essayé les différents algorithmes, différentes valeurs de départ et essayé d'utiliser
nls()
optim
pour minimiser la somme résiduelle des carrés, tout cela en vain. J'ai lu qu'une raison possible à cela pourrait être une paramétrisation excessive de la formule, mais je ne pense pas que ce soit (n'est-ce pas?) Quelqu'un a-t-il une suggestion pour ce problème? Ou est-ce juste un modèle maladroit?
Un petit exemple:
#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)
Merci!
r
nonlinear-regression
nls
Steiny
la source
la source
Réponses:
Je me suis mordu récemment. Mes intentions étaient les mêmes, faire un modèle artificiel et le tester. La raison principale est celle donnée par @whuber et @marco. Un tel modèle n'est pas identifié. Pour voir cela, n'oubliez pas que NLS minimise la fonction:
Disons qu'il est minimisé par l'ensemble de paramètres( a , b , m , r , c ) . Il n'est pas difficile de voir que l'ensemble des paramètres ( a , b r- m,0,r,c) donnera la même valeur de la fonction à minimiser. Le modèle n'est donc pas identifié, c'est-à-dire qu'il n'y a pas de solution unique.
Il n'est pas difficile non plus de comprendre pourquoi le gradient est singulier. Dénoter
alors
et nous obtenons cela pour toutX
D'où la matrice
ne sera pas de rang complet et c'est pourquoi
nls
donnera le message de gradient singulier.J'ai passé plus d'une semaine à chercher des bogues dans mon code ailleurs jusqu'à ce que je remarque que le bogue principal était dans le modèle :)
la source
Les réponses ci-dessus sont bien sûr correctes. Pour ce que cela vaut, en plus des explications données, si vous essayez cela sur un ensemble de données artificielles, selon la page d'aide nls disponible à l' adresse : http://stat.ethz.ch/R-manual/R-patched/ bibliothèque / stats / html / nls.html
Les nls de R ne pourront pas le gérer. La page d'aide indique spécifiquement:
Donc, pas de bruit == pas bon pour les nls de R.
la source