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 :

RMSE de part-est-d'autre de la droite de régression


Sujet :

R

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2015
    Messages : 101
    Points : 70
    Points
    70
    Par défaut RMSE de part-est-d'autre de la droite de régression
    Bonjour,

    J'ai tracé une droite de régression et mon souci est que je souhaite tracer deux droites parallèles de part et d'autre de celle-ci. la distance de chacune par rapport à la droite de régression est égale au Root Mean squared error "RMSE" mais je n'y arrive pas. pour calculer le RMSE j'ai utilisé la librairie (Metrics).
    pour faire simple voici un code qui récapitule les étapes de modélisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    > x<-c(10,15,14,13,17,12,14,12,10,12,15,13,16,19,13)
    > y<-c(103,107,109, 109, 111, 102, 105,104,104,100,108,106,122,124,104)
    > data<-data.frame(x,y)
    > model<-lm(x~y)
    > plot(x~y)
    > abline(model)
    > pred<-predict(model, data)
    >library(Metrics)
    > rmse(data$x, pred)
    cordialement.

  2. #2
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut
    Bonjour,

    je peux vous proposer cette solution (assez moche mais fonctionnelle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    library(Metrics)
     
    x<-c(10,15,14,13,17,12,14,12,10,12,15,13,16,19,13)
    y<-c(103,107,109, 109, 111, 102, 105,104,104,100,108,106,122,124,104)
    data<-data.frame(x,y)
     
    model<-lm(x~y)
    pred<-predict(model, data)
    dis <- rmse(data$x, pred)
     
    plot(x~y)
    abline(model)
    abline(model$coefficient[1] - dis, model$coefficient[2])
    abline(model$coefficient[1] + dis, model$coefficient[2])
    On récupère le premier coefficient du model (l'abscisse à l'origine) puis on utilise abline() dans sa forme basique en précisant directement a et b.
    Il vous reste ensuite à mettre en forme (titre, couleur ...)

  3. #3
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2015
    Messages : 101
    Points : 70
    Points
    70
    Par défaut
    Elle est peut-être moche ta proposition mais en tout cas ça marche. ce-ci dit j'aimerait bien voir à quoi ça ressemble un code pas moche

    merci et à bientôt.

  4. #4
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Du point de vue statistique, que signifient ces deux droites parallèles car l'intervalle de confiance, de même que l'erreur de prédiction, autour d'une droite de régression n'est pas compris entre deux droites parallèles mais entre deux paraboles ? Pour obtenir ces paraboles dans R, on peut utiliser la fonction predict avec comme premier argument le résultat de lm, éventuellement des nouvelles abscisses (argument newdata) et comme valeurs à l'argument interval, soit 'confidence', soit 'prediction' (voir help predict.lm) et le résultat peut être affiché sur la droite de régression par la fonction points.

  5. #5
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2015
    Messages : 101
    Points : 70
    Points
    70
    Par défaut
    Tu as parfaitement raison Faubry, d'ailleurs je cherchais comment réaliser cela lorsque je trouve ton message.
    voici le script complet pour avoir le plot de la régression linéaire avec les intervalles de confiances en espérant que 'supernul' ne trouve pas ça moche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    x<-c(10,15,14,13,17,12,14,12,10,12,15,13,16,19,13)
    y<-c(103,107,109, 109, 111, 102, 105,104,104,100,108,106,122,124,104)
    data<-data.frame(x,y)
     
    model<-lm(y~x)
    pred<-predict(model, data, interval=c("confidence"), level=0.95, type="respons")
    predy<-data.frame(pred)
    plot(y~x)
    abline(model)
    lines(x[order(x)], predy$lwr[order(predy$lwr)], lty="dashed")
    lines(x[order(x)], predy$upr[order(predy$upr)], lty="dashed")
    Cependant pour afficher les intervalles de confiances je préfère la fonction lines plutôt que points.

    merci à tous et à bientôt.

  6. #6
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Pas de problème pour utiliser lines plutôt que points. Par contre un petit souci dans la fin de tons script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lines(x[order(x)], predy$lwr[order(predy$lwr)], lty="dashed")
    lines(x[order(x)], predy$upr[order(predy$upr)], lty="dashed")
    order donne les indices qui ordonne son argument, donc pour ordonner les valeurs dans le bon sens il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    o.x <- order( data$x)
    lines(x[o.x], predy$lwr[o.x], lty="dashed")
    lines(x[o.x], predy$upr[o.x], lty="dashed")

  7. #7
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2015
    Messages : 101
    Points : 70
    Points
    70
    Par défaut
    order donne les indices qui ordonne son argument, donc pour ordonner les valeurs dans le bon sens il faut écrire
    je t'avoue que je n'est pas très bien saisie cette partie d'autant plus que le résultat est le même sur le plot, j'ai essayé avec les deux codes, les paraboles se superposes parfaitement.

  8. #8
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Normal car dans ton exemple x est ordonné. Pour comprendre les rôle de order, voici un petit script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    set.seed( 1)
    x <- sample( -20:20)
    y <- x^2 / 20
    plot( y ~ x)
    lines( x, y, col="red")
    lines( x[order( x)], y[order( y)], col="green")
    x.o <- order( x)
    lines( x[x.o], y[x.o], col="blue")

  9. #9
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2015
    Messages : 101
    Points : 70
    Points
    70
    Par défaut
    ok Faubry, je te merci pour le tuyau.

  10. #10
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut
    Bonjour,

    voici pourquoi je trouve la solution que je t'ai proposée totalement inélégante :
    - plot + abline + abline + abline : je n'apprécie pas le système basique de R auquel je préfère ggplot2.
    - comme expliqué par faubry, l'intervalle ne peut être entre deux droites

    De là résulte une solution que je privilégie et qui met en avant le modèle à utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     library(ggplot2)
    x<-c(10,15,14,13,17,12,14,12,10,12,15,13,16,19,13)
    y<-c(103,107,109, 109, 111, 102, 105,104,104,100,108,106,122,124,104)
    data<-data.frame(x,y)
    ggplot(data = data, aes(x = x, y = y)) + geom_point() + geom_smooth(method = "lm")
    Bravo faubry pour les explications

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. un objets dont l'attribut est un autre objet
    Par wafiwafi dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 04/09/2009, 23h27
  2. fonction dont le paramemetre est une autre fonction
    Par Wanaka dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/05/2008, 15h54
  3. [Upload] Upload de photo : c'est une autre qui s'enregistre
    Par dream_of_australia dans le forum Langage
    Réponses: 2
    Dernier message: 02/08/2007, 10h25
  4. Réponses: 2
    Dernier message: 31/10/2006, 08h51
  5. [XSL] replace un espace? ou est ce autre chose?
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 01/12/2005, 19h17

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