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 :

contrainte croisée avec la fonction nls()


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par défaut contrainte croisée avec la fonction nls()
    Bonjour,

    Dans le cadre de mes recherches sur la photosynthèse,
    je dois fiter une formule composée de 3 exponentielles avec la fonction nls :

    f ~ A*exp1+B*exp2+C*exp3

    J'aimerais ajouter une contrainte : A+B+C=1
    Mais je ne trouve pas comment...

    Si j'avais 2 exponentielles, ce serait facile :

    Au lieu de mettre B, j'écrirais (1-A)

    f ~ A*exp1+(1-A)*exp2


    Mais pour 3 exponentielles, je n'ai pas trop d'idée...

    Qui saurait m'aider?

  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 et bienvenue,

    Tu peux procéder à peu près de la même façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f ~ A * exp1 + B * exp2 + (1 - A - B) * exp3
    Un petit exemple :
    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
    df <- as.data.frame(sapply(1:3, function(x)rnorm(20)))
    colnames(df) <- letters[1:3]
    
    df$resp <- 0.1 * exp(df$a) + 0.5 * exp(df$b) + 0.4 * exp(df$c) + rnorm(nrow(df), 0, 0.1)
    
    nls1 <- nls(resp ~ A * exp(a) + B * exp(b) + (1 - A - B) * exp(c),
                data=df,
                start=list(A=0.3, B=0.3))
    
    summary(nls1)
    
    print(coefs.nls1 <- c(summary(nls1)$coefficients[ , 1],
                          C = 1 - sum(summary(nls1)$coefficients[ , 1])))
    
    sum(coefs.nls1)

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par défaut
    Tout d'abord,

    Merci pour ta réponse!

    J'ai un peu du mal à comprendre car dans le cas de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nls1 <- nls(resp ~ A * exp(a) + B * exp(b) + (1 - A - B) * exp(c),
                data=df,
                start=list(A=0.3, B=0.3))
    C va être égal à 1-A-B mais il n'est pas dis que A+B+C=1. On pourrait très bien avoir A=0.5 B=0.8 et C=1-0.5-0.8=-0.3... Non?

  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
    Citation Envoyé par lezburg Voir le message
    C va être égal à 1-A-B mais il n'est pas dis que A+B+C=1. On pourrait très bien avoir A=0.5 B=0.8 et C=1-0.5-0.8=-0.3... Non?
    Si justement, la somme fera toujours 1, puisque C n'est pas optimisé mais déduit d'après les deux autres paramètres qui eux sont optimisés.

    Mais effectivement - et tu ne l'avais pas précisé jusque là - rien n'oblige les paramètres à être compris dans l'intervalle [0, 1].

    Pour A et B, il doit être simple d'ajouter de telles contraintes via les paramètres optionnels upper et lower (marche uniquement avec l'algorithme "port").
    Mais pour C=1 - (A + B), c'est une autre histoire (dont je n'ai pas la clef).

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par défaut .
    C'est vrai, j'aurais du le préciser avant... Mais je te remercie pour la rapidité de ta réponse. Je vais essayer de creuser la question...

Discussions similaires

  1. Emulation contrainte check avec fonction
    Par randriano dans le forum PL/SQL
    Réponses: 17
    Dernier message: 18/09/2008, 11h16
  2. [fmincon] Problème avec la fonction contrainte
    Par ENSAM-ALAMI dans le forum MATLAB
    Réponses: 0
    Dernier message: 24/04/2008, 12h32
  3. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 10h04
  4. Réponses: 13
    Dernier message: 20/03/2003, 09h11
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 14h22

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