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 :

Leave-one-out et cv.glm


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Par défaut Leave-one-out et cv.glm
    Bonjour,

    Je souhaiterais faire une validation croisée avec la méthode leave-one-out mais plutot que la somme des erreurs au carré, je voudrais afficher le coefficient de détermination r2. J'ai un prédictant et des prédicteurs, je construit une fonction qui calcule le r2, je calcule mon modèle avec glm et je fais la cross validation avec cv.glm (les deux dernières fonctions sont du package boot):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cost<-function(x,y) (cor(x,y))^2
    yields.reg<-glm(Predictant~., data = datayields, family=gaussian)
    yields.loo<-cv.glm(datayields,yields.reg,cost)
    print(yields.loo)
    Tout fonctionne à part que l'estimation delta en sortie de cv.glm est égale à NA alors que cela marche si je prends la fonction cost par défaut.

    Merci d'avance si quelqu'un a déjà utilisé ces fonctions et peut 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,

    Le problème semble venir du fait que tu ne spécifies pas le paramètre K (nombre de groupes) et qu'il est du coup fixé par défaut au nombre d'observations.
    Tu te trouves donc avec des estimations de corrélation avec une valeur en x et une en y... ce qui n'a pas de sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > cor(x=0.2, y=0.5)
    [1] NA

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    Bonjour et bienvenue,

    Le problème semble venir du fait que tu ne spécifies pas le paramètre K (nombre de groupes) et qu'il est du coup fixé par défaut au nombre d'observations.
    Tu te trouves donc avec des estimations de corrélation avec une valeur en x et une en y... ce qui n'a pas de sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > cor(x=0.2, y=0.5)
    [1] NA
    Merci pour ta réponse

    En fait, quand tu ne spécifies pas K, K = n (nombre d'observations). Il crée donc un modèle en prenant toutes les observations sauf une, et il évalue la prédiction pour l'observation qui n'a pas été prise en compte. J'étais persuadé qu'il faisait cela autant de fois que tu as d'observation. Si c'est le cas on se retrouve avec un vecteur de n valeurs prédites à comparer aux obs donc pas de raison que le r2 ne fonctionne pas.

    Tu dois surement avoir raison mais c'est ce qui est décrit ci-dessus que je voulais faire. Je peux le coder mais est-ce qu'il n'y a pas déjà une fonction pour cela ?

  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 esteban98 Voir le message
    En fait, quand tu ne spécifies pas K, K = n (nombre d'observations). Il crée donc un modèle en prenant toutes les observations sauf une, et il évalue la prédiction pour l'observation qui n'a pas été prise en compte. J'étais persuadé qu'il faisait cela autant de fois que tu as d'observation. Si c'est le cas on se retrouve avec un vecteur de n valeurs prédites à comparer aux obs donc pas de raison que le r2 ne fonctionne pas.
    En fait, K est bien le nombre de groupes créés. Si tu as 10 observations et K=3, il va te calculer la fonction de coût pour un groupe de 2 obs, et deux groupes de 4 obs (je ne sais pas pourquoi il ne fait pas 2x3+4). Si K=10 on a donc 10 groupes de 1 obs.

    Pour faire ce que tu décris ci-dessus, je ne sais vraiment pas comment s'y prendre.

    En tout cas, pour vérifier ce qui se fait réellement dans la fonction, tu peux utiliser les possibilités de débogage de R :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cost<-function(x,y)
    {
        browser()
        return(cor(x,y)^2)
    }
    Puis dans la console, lorsque tu rencontres le prompt tu peux
    • lancer une commande... par exemple pour voir la valeur de x dans l'itération courante.
    • appuyer sur <Entrée> pour passer à l'itération suivante.
    • taper Q (+ <Entrée>) pour quitter le mode débogage.

  5. #5
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Par défaut
    Citation Envoyé par pitipoisson Voir le message
    En tout cas, pour vérifier ce qui se fait réellement dans la fonction, tu peux utiliser les possibilités de débogage de R :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cost<-function(x,y)
    {
        browser()
        return(cor(x,y)^2)
    }
    Puis dans la console, lorsque tu rencontres le prompt tu peux
    • lancer une commande... par exemple pour voir la valeur de x dans l'itération courante.
    • appuyer sur <Entrée> pour passer à l'itération suivante.
    • taper Q (+ <Entrée>) pour quitter le mode débogage.
    Super merci beaucoup Comme tu as du le comprendre, je débute en R Habitué de matlab, le fait que R n'affiche aucune erreur ou warning quand une commande ne fonctionne pas est assez déroutant. Je ne connaissais pas ce mode debogage. Merci encore.

    Et pour cloturer le sujet, voici la petite fonction que j'ai écrite pour faire ce que je voulais (voir plus haut).

    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
    CvLOO <- function(Predictant,Predictor)
    {
    nbobs<-length(Predictant)
    Predictor<-as.matrix(Predictor)
    Pred<-NULL
    for (i in 1:nbobs) {
    	indicesloo<-1:nbobs
    	mm <- which(i != indicesloo,arr.ind = FALSE)
    	PredictantCur<-	Predictant[mm] # uniquement les données sans l'obs sur laquelle
    	PredictorCur<-Predictor[mm,] # on veut faire le test
    	datacur<-data.frame(Predictant=PredictantCur,Predictor=PredictorCur) 
    	yields.regcur<-glm(Predictant~., data = datacur, family=gaussian) # on construit le modèle sur ce sous-ensemble
    	yields.pred<-predict(yields.regcur,newdata = data.frame(Predictant=Predictant,Predictor=Predictor)) # on évalue sur toutes les obs
    	Pred[i]<-yields.pred[i] # on récupère la valeur prédite sur l'obs non utilisée pour construire le modèle
    }
    return(Pred)
    }

  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
    Citation Envoyé par esteban98 Voir le message
    Habitué de matlab, le fait que R n'affiche aucune erreur ou warning quand une commande ne fonctionne pas est assez déroutant.
    Il y a une gestion des erreurs et des warnings sous R. Mais il est de la responsabilité de chaque développeur de package (c'est aussi valable pour le développeur de "solution maison", ceci dit) d'implémenter les tests adéquats.

    Les développeurs du package boot n'ont visiblement pas jugé utile de mettre un warning ici... ou n'y ont juste pas pensé.

Discussions similaires

  1. validation croisée (leave one out)
    Par magictol53 dans le forum MATLAB
    Réponses: 6
    Dernier message: 27/04/2012, 16h11
  2. leave one out methode
    Par bensof1 dans le forum Statistiques, Data Mining et Data Science
    Réponses: 5
    Dernier message: 23/03/2011, 14h52
  3. Réseau neurones, Leave-one-out
    Par rob408231 dans le forum Méthodes prédictives
    Réponses: 7
    Dernier message: 30/05/2009, 04h23
  4. Leave one out
    Par sialamed dans le forum Méthodes prédictives
    Réponses: 1
    Dernier message: 17/06/2008, 23h31
  5. Validation croisée (leave one out)
    Par sialamed dans le forum OpenCV
    Réponses: 0
    Dernier message: 17/06/2008, 13h14

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