IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Régression non linéaire


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Par défaut Régression non linéaire
    Bonjour,je cherche a faire une régression non linéaire selon une sigmoïde
    donc je commence ce script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ##################################################
    ####tentative de fit R stage M2 psychophysique#### 
    ##################################################
    #
    # ouvrir les données
    data1=read.table('donnearrangec.txt',h=T) 
    #
    #garder les données actives
    attach(data1)
    #
    #afficher la tableau de données
    data1
    #
    #tentative de fit sur un sujet
    x = c(X0[1],X50[1],X70[1],X90[1],X110[1],X130[1],X150[1],X200[1],X250[1],X300[1],X350[1])
    y = c(X0[2],X50[2],X70[2],X90[2],X110[2],X130[2],X150[2],X200[2],X250[2],X300[2],X350[2])
    plot(y~x)
    test =  nls(y ~ a/(b + exp(b-(c*x))))
    qui lorsque je le lance me lance : ce message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Erreur dans c * x : argument non numérique pour un opérateur binaire
    De plus : Message d'avis :
    In nls(y ~ a/(b + exp(b - (c * x)))) :
      Pas de valeurs initiales fournies pour certains paramètres.
    Initialisation ‘a’, ‘b’ à '1'.
    Spécifiez 'start' ou utilisez un model de type 'SelfStart'
    
    J'aimerais savoir comment est la syntaxe,car après en avoir testé plusieurs,je n'arrive toujours à rien...
    Comment utiliser un modèle de type selfstart(si il est correct)?
    Comment serait la syntaxe correcte (je 'arrangerais pour les paramètres de départ)?
    Comment afficher un plot avec le fit associé? et récupérer les valeurs
    Merci de l'attention porté à ce post en espérant que je ne vais pas trop exaspérer les connaisseurs

  2. #2
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    La fonction nls a besoin de savoir quel sont les paramètres à ajuster. Si tu ne le précises pas, elle doit essayer de les "deviner" en regardant quels sont les objets existants et fixe leur valeur de départ (pour l'algorithme de recherche des meilleurs valeurs) à 1. Ce dernier point est d'ailleurs l'objet du warning que tu obtiens.

    Dans le cas du paramètre c, je suppose qu'elle trouve la fonction du même nom (création de vecteurs) et essaye de l'utiliser comme une variable, d'où l'erreur.

    Tu devrais donc utiliser une syntaxe du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test =  nls(y ~ a/(b + exp(b-(c*x))), start=list(a=1, b=1, c=1))
    en ajustant évidement tes valeurs de départ à ce que tu sais a priori de ces paramètres.

    Pour obtenir de l'aide sur les nombreuses options de cette fonctions :

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Par défaut
    Merci d'avoir répondu si vite, hélas, même en mettant des paramètres start, je n'avais pas réussi,j'ai donc tenté de de changer le c par un d (j'avais oublié que le c voulait dire concaténation ) mais à priori, cela ne change pas le problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fit1 =  nls(y ~ a/(b + exp(b-(d*x))), start=list(a=1, b=1, d=1))
    Erreur dans nls(y ~ a/(b + exp(b - (d * x))), start = list(a = 1, b = 1,  : 
      des paramètres n'ont pas de valeurs initiales dans 'data' : y, x
    Je n'arrive pas a comprendre pourquoi il ne récupère pas les X et y que j'ai défini plus haut

  4. #4
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Es-tu sûr qu'ils sont toujours bien définis et accessibles par la fonction nls (si tu l'appelles depuis une autre fonction, ça peut coincer).

    Chez moi, l'exemple suivant fonctionne bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    x <- 1:30
     
    (y <- 2.2 / (0.1 + exp(0.1 - (1.7 * x))) + rnorm(30, 0, 0.01))
     
    nlscont <- nls.control(maxiter = 200, tol = 1e-05, minFactor = 1/1024,
                           printEval = FALSE, warnOnly = FALSE)
     
    test <- nls(y ~ a/(b + exp(b-(c*x))),
                start=list(a=1.6, b=0.201, c=2.0),   # éviter les valeurs entières : => matrices singulières
                algorithm="port", control=nlscont)
     
    test
    et me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Nonlinear regression model
      model:  y ~ a/(b + exp(b - (c * x))) 
       data:  parent.frame() 
         a      b      c 
    2.2050 0.1002 1.6987 
     residual sum-of-squares: 0.002861
     
    Algorithm "port", convergence message: both X-convergence and relative convergence (5)
    Mais comme tu peux le voir, il a cherché les données dans l'environnement parent.

    Une solution alternative et plus robuste est d'avoir les variables dans une data.frame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data <- data.frame(x=x, y=y)
     
    test2 <- nls(y ~ a/(b + exp(b-(c*x))),data=data,
                 start=list(a=1.6, b=0.201, c=2.0),
                 algorithm="port", control=nlscont)
     
    test2

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Par défaut
    en réduisant mon nombre de constantes j'ai ça(les valeurs initiales,j'en ai une idée de part d'autres tests):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     fit1 =  nls(y ~ 1/(1 + exp(a-(b*x))),data = data, start=list(a=1.05, b=0.05))
    > fit1
    Nonlinear regression model
      model:  y ~ 1/(1 + exp(a - (b * x))) 
       data:  data 
          a       b 
    6.15465 0.05646 
     residual sum-of-squares: 0.04391
    En revanche,en gardant 4 constantes, ça ne marche toujours pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fit2 =  nls(y ~ a/(b + exp(g-(d*x))),data = data, start=list(a=1.0001, b=1.0001, g=5.0001, d=0.05))
    Erreur dans nlsModel(formula, mf, start, wts) : 
      matrice de gradient singulière pour les estimations initiales des paramètres
    
    Je ne comprends pas ce qu'il entend par gradient particulier

  6. #6
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    C'est une matrice qui n'est pas inversible.

    Je te conseille d'utiliser l'algorithme "port", comme dans mon exemple ci-dessus. J'ai remarqué qu'il conduisait moins souvent à ce cas de figure.
    Après, faut jouer sur les valeurs initiales.

Discussions similaires

  1. Régression non-linéaire
    Par GroRelou dans le forum MATLAB
    Réponses: 5
    Dernier message: 04/03/2013, 09h03
  2. Régression non linéaire
    Par wolfenstein51 dans le forum Méthodes prédictives
    Réponses: 2
    Dernier message: 22/03/2012, 09h38
  3. Réponses: 1
    Dernier message: 30/06/2010, 08h47
  4. Régression non linéaire
    Par iamsebfont dans le forum MATLAB
    Réponses: 0
    Dernier message: 13/02/2010, 12h31
  5. Régression non linéaire
    Par loique dans le forum MATLAB
    Réponses: 9
    Dernier message: 25/06/2008, 14h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo