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 linéaire calcul


Sujet :

R

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2014
    Messages : 59
    Points : 60
    Points
    60
    Par défaut régression linéaire calcul
    Bonjour,

    J'ai crée un modèle de régression linéaire de température en fonction de l'altitude, ma variable contenant le modèle s'appelle "modele"

    J'ai crée ce modèle à partir d'une centaine de données.

    Maintenant j'ai une matrice contenant une quantité assez importante d'altitude. Je voudrais calculer les températures à partir du modèle de regression.

    Comment faire ? En sachant que je peux convertir ma matrice en autre structure, c'est pas très important pour le moment.

    En clair je veux ça :
    Données d'entrée:Altitude ----> mon modele -----> Données de sortie:température

    Quelqu'un sait comment faire ?

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur en études décisionnelles
    Inscrit en
    Février 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en études décisionnelles

    Informations forums :
    Inscription : Février 2013
    Messages : 134
    Points : 351
    Points
    351
    Par défaut
    Bonjour,

    Utilisez la fonction predict.lm. Pour obtenir de l'aide à ce sujet, tapez : ?predict.lm
    En lisant l'aide et en ajoutant bien le paramètre type="response", vous devriez arriver à faire ce que vous souhaitez.

    Bon courage

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2014
    Messages : 59
    Points : 60
    Points
    60
    Par défaut
    Je m'en sort pas, voici ce que je fais:

    j'ai 2 matrices: une "temp" avec 204 températures et beaucoup de valeurs manquantes
    Et une matrice "alt" de la même dimension de "temp" mais avec toutes les altitudes.

    En clair j'ai 204 points où j'ai mes températures, je veux faire un modèle de regression linéaire en fonction de mes altitudes pour pouvoir interpoler mes données sur toute la matrice.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    modele <- lm(temp[temp>0]~alt[temp>0], na.action=na.omit)  # je veux mes température en fonction de mes altitudes
    result <- predict.lm(modele,alt,type="response", na.action=na.omit) # j'ai essayé plusieurs commandes avec predict aussi (ici alt est transformé en data.frame)
    Mais dans chaque cas, j'ai l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Message d'avis :
    'newdata' had 29036739 rows but variables found have 204 rows
    Et ça me calcule seulement 204 valeurs.... alors que je rentre des millions d'altitude (je veux en sortie mes millions de températures, calculées en fonction de mes altitudes...)

    De plus, R m'oblige à convertir ma matrice alt en data.frame....

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Tu peux nous montrer tes matrices? (au moins l'entête avec head) et si possible le résultat que tu souhaiterais obtenir sur les premières lignes par exemple?

    Quand je vois ton modèle sans en savoir plus sur la structure des données, je ne comprend pas ce que tu fais.

    D'autre part, s'il s'agit juste de faire une interpolation, tu peux directement utiliser une fonction comme approxfun().

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2014
    Messages : 59
    Points : 60
    Points
    60
    Par défaut
    En fait je cherche juste à utiliser le modèle de régression linéaire.

    Le modèle de régression c'est y = ax+b

    Dans le modèle, il y a les valeurs des coefficients a et b.

    Je veux savoir comment les utiliser.

    Imaginons que mon modèle soit fait à partir de 100 données.

    maintenant j'ai ceci par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x <- c(2,451,256,21,45,87,35)
    Je veux calculer mes y.

    Comment faire ?

    Dans un premier temps j'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    b <- modele$coefficients[1]
    a <- modele$coefficients[2]
    y <- (a*x + b)
    Mais il doit y avoir plus simple non ?

  6. #6
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    La réponse vous a déjà été donnée :

    Citation Envoyé par Emmanuel R Voir le message
    Utilisez la fonction predict.lm. Pour obtenir de l'aide à ce sujet, tapez : ?predict.lm
    En lisant l'aide et en ajoutant bien le paramètre type="response", vous devriez arriver à faire ce que vous souhaitez.
    Petite précision : l'élément à spécifier pour le paramètre "newdata" doit être de type "dataframe" (comme cela est indiqué dans la documentation de la fonction "predict.lm").

    Bonne continuation


    Cordialement,


    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    salut,
    essaye avec ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    predict(modele, newdata = data.frame(x =  c(2,451,256,21,45,87,35)))
    cordialement.

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2014
    Messages : 59
    Points : 60
    Points
    60
    Par défaut
    Merci pour les réponses.

    Voici un exemple pour illustrer:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    > test
      taille poids
    1    170    65
    2    180    68
    3    160    52
    4    190    85
    5    180    75
    6    156    60
    7    188    82
    8    180    75
    > f <- lm(test$taille~test$poids)
    > f
     
    Call:
    lm(formula = test$taille ~ test$poids)
     
    Coefficients:
    (Intercept)   test$poids  
        102.550        1.038  
     
     
    > poids <- c(84,52,69)
    > poids <- as.data.frame(poids)
    > predict.lm(f,poids)
           1        2        3        4        5        6        7        8 
    170.0482 173.1635 156.5485 190.8170 180.4326 164.8560 187.7017 180.4326 
    Message d'avis :
    'newdata' had 3 rows but variables found have 8 rows 
    > predict(f,poids)
           1        2        3        4        5        6        7        8 
    170.0482 173.1635 156.5485 190.8170 180.4326 164.8560 187.7017 180.4326 
    Message d'avis :
    'newdata' had 3 rows but variables found have 8 rows
    Donc predict.lm et predict donne le même résultat.

    Dans mon exemple, j'attends de ces fonctions qu'elles me donnent seulement 3 résultats: (poids <- c(84,52,69)) Un pour 84 kg, un pour 52 kg et un pour 69 kg. Et je me retrouve avec 8 résultats... Le même nombre de données que la série qui m'a permis de construire le modèle.

    Je bloque vraiment sur les regression avec R, je dois pas comprendre la logique des fonctions

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    predict et predict.lm font exactement la même chose ici. En fait predict se contente d'appeler la fonction predict.xx ou xx est la classe de l'objet qu'on lui passe en argument (lm ici donc). Donc la seule différence c'est que predict marcherait aussi avec des modèles autres que lm.


    Ensuite ton code ne marche pas car tu ne créé pas comme il faut la dataframe poids.
    Il faut en effet que les noms des colonnes de la dataframe utilisée comme new.data soit les mêmes que ceux utiliser pour ajuster le modèle.
    Hors comme tu ne précise pas de nom.
    Essayes à la place de ta ligne 24 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    poids <- data.frame(poids = poids)

  10. #10
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2014
    Messages : 59
    Points : 60
    Points
    60
    Par défaut
    ça donne le même résultat:

    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
    20
     
    test <- data.frame(taille=c(170,180,160,190,180,156,188,180), poids=c(65,68,52,85,75,60,82,75))
    > test
      taille poids
    1    170    65
    2    180    68
    3    160    52
    4    190    85
    5    180    75
    6    156    60
    7    188    82
    8    180    75
    > f <- lm(test$taille~test$poids)
    > poids <- c(84,52,69)
    > poids <- data.frame(poids = poids)
    > predict.lm(f,poids)
           1        2        3        4        5        6        7        8 
    170.0482 173.1635 156.5485 190.8170 180.4326 164.8560 187.7017 180.4326 
    Warning message:
    'newdata' had 3 rows but variables found have 8 rows
    Toujours le même problème, il y a 8 valeurs qui sortent. j'en ai mis 3 en entrée... je comprends pas la logique du truc

  11. #11
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Il y a encore un problème de nom.
    Ca viens de la formule que tu utilise qui est "test$taille~test$poids" donc les variables du modèle ne sont pas taille et poids mais test$taille et test$poids.

    Ça devrais marcher avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f <- lm(taille~poids, data = test)

Discussions similaires

  1. Régression linéaire, loi F, t, normale et Khi-2
    Par philben dans le forum Contribuez
    Réponses: 3
    Dernier message: 20/08/2020, 14h22
  2. Calcul de régression linéaire en C#
    Par olibara dans le forum C#
    Réponses: 4
    Dernier message: 28/12/2010, 13h00
  3. calcul de pente de régression linéaire
    Par I.Z.M.M dans le forum SSAS
    Réponses: 0
    Dernier message: 23/03/2010, 13h23
  4. Module qui permet de faire des régression linéaire ?
    Par Anti-T dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 04/09/2009, 13h28
  5. [NaN] Calcul d'une régression linéaire
    Par GLDavid dans le forum Langage
    Réponses: 1
    Dernier message: 24/10/2006, 12h55

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