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 :

Fonction "predict" sur un objet "regsubsets"


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2015
    Messages : 101
    Par défaut Fonction "predict" sur un objet "regsubsets"
    Bonjour,

    je souhaite tester un modèle de régression multiple sur un jeu de données test. Pour cela j'utilise la fonction "predict". Le modèle a été créé en utilisant la fonction "regsubsets" de la librairie "leaps". Cette fonction permet de faire le choix du meilleur modèle sur la base de différentes métriques tel que: r², adjusted-r², BIC...la création du modèle se base sur trois méthodes, la méthode ascendante (forward), descendante (backward) et la méthode exhaustive.

    Mais pour le test du modèle, la fonction "predict" n'est pas compatible avec le résultat de la fonction "regsubsets" d'après un message d'erreur.

    Ci-après un code reproductible

    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
     
    n<-100
    d<-data.frame (y=runif(n), x1=(runif(n))*0.5, x2=(runif(n))*0.25, x3=(runif (n))*3.2,
                   x4=(runif(n))*4.35, x5=(runif(n))*2.2)
    set.seed(123)
    smp_size <- floor(0.75 * nrow(d))
    train_ind <- sample(seq_len(nrow(d)), size = smp_size)
     
    train <- d[train_ind, ]
    test <- d[-train_ind, ]
     
    regfit.full=regsubsets(y~.,train,nvmax=5)
    reg.summaryfull<-summary (regfit.full)
    names(summary(regfit.full))
    summary(regfit.full)$rsq
    summary(regfit.full)$obj
    summary(regfit.full)$adjr2
    which.max (reg.summaryfull$rsq)
     
    library(Metrics)
    #le souci se situe à ce niveau
    predictedfor_multlm<-predict(regfit.full, test) 
    rmse_mult<-rmse(test$y,predictedfor_multlm)
    rmse_mult
    rmse_mult/mean(test$y)
    reg<-lm(test$y~predictedfor_multlm)
    summary(reg)
    Merci pour toute aide pour compléter ce code ou en proposer un autre.

  2. #2
    Membre expérimenté Avatar de Alpacky
    Homme Profil pro
    .
    Inscrit en
    Mars 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Mars 2014
    Messages : 99
    Par défaut
    hello,

    en fait la fonction te retourne les différents modèles, donc il faut "en choisir" un pour pouvoir ensuite prédire les résultats
    voila un lien qui fourni une explication assez complète je trouve (je n'ai que survolé) https://rpubs.com/davoodastaraky/subset

    en espérant que cela aide
    a+

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

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2015
    Messages : 101
    Par défaut
    Merci Alpacky, je travaillais justement sur ce code que j'avais trouvé sur:
    https://www.r-bloggers.com/in-depth-...expert-videos/

    tout marche très bien sauf le dernier code:

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    n<-100
    d<-data.frame (y=runif(n), x1=(runif(n))*0.5, x2=(runif(n))*0.25, x3=(runif (n))*3.2,
                   x4=(runif(n))*4.35, x5=(runif(n))*2.2)
    set.seed(123)
    train<-sample(seq(100), 70, replace=FALSE)
    regfit.bestfwd=regsubsets(y~.,data=d[train,],
                                nvmax =5, method="forward")
     
    summar.regfitfwd<-summary(regfit.bestfwd)
     
     
    test.mat=model.matrix(y~.,data=d[-train,])
    {val.errors=rep(NA,5)
      stor.r2=rep(NA,5)
      stor.rmse=rep(NA,5)
      stor.pe=rep(NA,5)
     
      for(i in 1:5){
        coefi=coef(regfit.bestfwd,id=i)
        pred=test.mat [,names(coefi)]%*% coefi
        val.errors[i]=mean((d$y[-train]-pred)^2)
        stor.r2[i]=1-(sum((d$y[-train]-pred)^2)/sum((d$y[-train]-
                                                                            mean(d$y[-train]))^2))
        stor.rmse[i]=(sum((pred-d$y[-train])^2/20))^0.5
        stor.pe[i]=stor.rmse[i]/mean(d$y[-train])
      }}
    stor.r2
    which.max(summar.regfitfwd$rsq)
    coef(regfit.bestfwd, 5)
     
    #c'est à partir de là que sa coince
    predict.regsubsets=function(object ,newdata, id,...){
      form=as.formula(regfit.bestfwd$call[[2]])
      mat=model.matrix (form ,newdata)
      coefi =coef(regfit.bestfwd ,id=id)
      xvars =names (coefi)
      mat[,xvars ]%*% coefi
    }
     
    pro<-predict.regsubsets(regfit.bestfwd,d$y[-train])
    Error in terms.formula(object, data = data) : 
      '.' dans la formule et pas d'argument 'data'
    Called from: terms.formula(object, data = data)
    Browse[1]> Q
    Q
    Error: object 'Q' not found
    > pro
    Error: object 'pro' not found
    Comment on utilise la nouvelle fonction "predict.regsubsets" ?
    merci

  4. #4
    Membre expérimenté Avatar de Alpacky
    Homme Profil pro
    .
    Inscrit en
    Mars 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Mars 2014
    Messages : 99
    Par défaut
    hello,
    ya qqs petites erreurs dans la fonction et des arguments manquants dans son appel,

    voila ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    predict.regsubsets=function(object ,newdata, id,...){
      form=as.formula(regfit.bestfwd$call[[2]])
      mat=model.matrix (form ,newdata)
      coefi =coef(regfit.bestfwd ,id=id)
      xvars =names (coefi)
      mat[,xvars ]%*% coefi
    }
     
    pro<-predict.regsubsets(regfit.bestfwd,d$y[-train])
    si tu as en argument de ta fonction l'argument "object" alors dans ta fonction tu devrais appeler "object" et non regfit.... De plus tu as un argument "id" sans valeur dans ton appel (et pas de valeur par défaut). J'imagine que ton "id" est le modèle qui a les meilleurs scores pour toi. Enfin tu passes un objet vecteur pour newdata (juste les données de y) il manque donc les prédicteurs (sous forme de df). Enfin tu utilises ... dans ton appel mais on les retrouve nul part ailleurs donc quelle utilité ?

    ce code devrait fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    predict.regsubsets =function (object ,newdata ,id ,...){
            form=as.formula(object$call [[2]])
            mat=model.matrix(form,newdata)
            coefi=coef(object ,id=id)
            xvars=names(coefi)
            mat[,xvars]%*%coefi
    }
     
    pro<-predict.regsubsets(regfit.bestfwd,d[-train,], id=which.max(summar.regfitfwd$rsq))
    a+

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

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Octobre 2015
    Messages : 101
    Par défaut
    ça marche,

    Merci pour ces explications très didactiques, il m'ont permis d'ailleurs de comprendre ce qu'est le id=. Et merci pour ton aide

    A+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/02/2008, 21h35

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