Message d'erreur pondération

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Max Pacalet
Messages : 14
Enregistré le : 20 Mar 2014, 16:39

Message d'erreur pondération

Messagepar Max Pacalet » 29 Aoû 2014, 22:16

Bonjour,

J'ai deux problèmes de pondération.
Le premier est relatif à la fonction sjt.xtab du paquet sjPlot.
Elle sert à faire des tableaux et l'un de ses arguments est «  weightBy » définit comme suit : «  A weight factor that will be applied to weight all cases. Default is NULL , so no weights are used. »

J'utilise une base de donnée avec une colonne contenant la pondération à appliquer à chaque individu. C'est une variable numérique avec des éléments tels que 1.1989609, 0.5371036 ou encore 2.3130557.

Lorsque j'utilise ma fonction : sjt.xtab(base$b1,base$a6,weightBy=base$ponderation)
j'obtiens le message d'erreur suivant :
Erreur dans sprintf("<span class=\"td_n\">%i</span>", tab[irow, icol]) :
format incorrect '%i' ; utilisez les formats %f, %e, %g ou %a pour les objets numérique

N'ayant pas réussi à comprendre d'où vient le problème, je me tourne vers vous au cas où vous ayez une idée.

Je profite de ce poste pour poser seconde question, toujours sur les pondérations mais avec une autre fonction, glm. Cette fois-ci R exécute bien le code mais m'affiche le message suivant :
Message d'avis :
In eval(expr, envir, enclos) :
nombre de succès non entier dans un glm binomial !

Savez-vous où se situe le problème (s'il y en a un) ?

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Messagepar jean lobry » 30 Aoû 2014, 19:20

Bonjour,

voici un exemple minimal qui reproduit ton message d'erreur :

Code : Tout sélectionner

> sprintf(fmt = "%i", pi)
Erreur dans sprintf(fmt = "%i", pi) :
  format incorrect '%i' ; utilisez les formats %f, %e, %g ou %a pour les objets numériques

Tu dois avoir quelque part des nombres à virgule alors que des entiers sont attendus.

Amicalement,

jean

Max Pacalet
Messages : 14
Enregistré le : 20 Mar 2014, 16:39

Messagepar Max Pacalet » 31 Aoû 2014, 16:27

Merci pour votre réponse Jean !
Je suppose qu'il n'est du coup pas possible d'obtenir un tableau vu que ma variable de pondération ne contient effectivement que des nombres à virgules.

Et pour ce qui est de la régression logistique pondérée, savez-vous ce que signifie le message "In eval(expr, envir, enclos) :
nombre de succès non entier dans un glm binomial ! " ?
Je ne l'obtiens pas du tout quand ma régression n'est pas pondérée.

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

Messagepar Gilles San Martin » 31 Aoû 2014, 19:06

Bonjour

Ce serait beaucoup plus simple de répondre avec un exemple reproductible.
(utiliser dput(mon.jeu.de.données) pour fournir un extrait réutilisable facilement du jeu de données).

Les glm binomiaux peuvent s'écrire selon deux syntaxes dans R:
1) y est un vecteur représentant la proportion de succès et weights indique le nombre total d'essais (et doit donc être un entier)
2) y est une matrice à 2 colonnes la première comptabilisant le nombre de succès, la deuxième le nombre d'échecs. Dans ce cas je suppose qu'on pourrait utiliser weights de manière classique avec des poids non entiers le cas échéant.

Max Pacalet
Messages : 14
Enregistré le : 20 Mar 2014, 16:39

Messagepar Max Pacalet » 01 Sep 2014, 21:53

Bonjour Gilles,

Merci pour votre réponse. Vous avez sans doute mis le doigt sur l'élément qui ne va pas : ma variable y est un facteur à deux modalités et ma variable weights ne comporte pas d'entiers.

J'ai essayé la commande dput mais elle me donne une liste interminable d'éléments (la console ne peut même pas tous les afficher - ma base contient 2000 observations et une soixantaine de variables).

J'imagine qu'il me faut donc transformer ma variable à expliquer en matrice à deux colonnes mais je ne visualise pas du tout quel changement doit être effectué et l'aide de R ne donne pas plus d'indications. J'imagine que ces deux colonnes doivent être contenues dans la base d'où proviennent les variables explicatives, c'est ça ?
Faut-il créer une colonne échec et une colonne succès avec, pour chaque individu "0" ou "1" selon la modalité ?

Ma régression :
reg1 <- glm(formula = Travail ~ GR5
+ Sexe + Age + Etudes + pcs2 + Couple + Enfants + Origine + Sante,
family = "binomial"(logit), data = LPO, weights=LPO$PONDERATION)

Quelques exemples de variables :

$ Quartier : chr "01" "01" "01" "01" ...
$ dKM2 : int 19811 19811 19811 19811 19811 19811 19811 19811 19811 19811 ...
$ dGRP : int 25817 25817 25817 25817 25817 25817 25817 25817 25817 25817 ...
$ dAJ : int 19842 19842 19842 19842 19842 19842 19842 19842 19842 19842 ...
$ dCBN : num 22822 22822 22822 22822 22822 ...
$ GR5 : Factor w/ 5 levels "_-6,7","_6,7-11",..: 4 4 4 4 4 4 4 4 4 4 ...
$ Age : Factor w/ 3 levels "30-49","18-29",..: 3 3 3 3 3 2 3 3 1 1 ...
$ Sexe : Factor w/ 2 levels "_H","_F": 1 2 2 1 1 1 1 2 2 1 ...
$ Etudes : Factor w/ 2 levels "_ref","_Sup": 2 2 2 2 2 2 2 1 2 2 ...
$ pcs : Factor w/ 6 levels "_0","_2","_3",..: 3 3 5 3 3 3 3 5 3 3 ...
$ PONDERATION : num 1.199 0.537 0.537 0.903 1.798 ...
$ Couple : Factor w/ 2 levels "_Non","_Oui": 2 1 2 1 2 1 2 2 2 2 ...
$ Enfants : Factor w/ 3 levels "0","_1-2","_3+": 3 2 2 1 3 1 2 2 1 2 ...
$ Sante : Factor w/ 2 levels "_BonMoy","_Mauvaise": 1 1 1 1 1 1 1 1 1 1
$ Travail : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ Test : num 1 1 1 1 1 1 1 1 1 1 ...
$ GR3 : Factor w/ 3 levels "_-11","_11-27",..: 2 2 2 2 2 2 2 2 2 2 ...
$ pcs2 : Factor w/ 4 levels "_6","_2+3","_4",..: 2 2 4 2 2 2 2 4 2 2 ...
$ Origine : Factor w/ 3 levels "FrNaiss","_FrAcqu",..: 2 1 1 1 1 1 1 1 3 1 ...

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

Messagepar Gilles San Martin » 01 Sep 2014, 22:48

Bonjour

Dans ce cas (trop de données), il faut faire le dput sur un extrait des données ou créer un jeu de données artificiel qui permette de reproduire le problème.

Faut-il créer une colonne échec et une colonne succès avec, pour chaque individu "0" ou "1" selon la modalité ?

Ca m'a l'air d'être une bonne piste. Mais personnelelment je n'ai pas du tout l'habitude d'utiliser les pondartions de ce type dans les glm donc ce serait peut-être bien d'avoir l'avis d'autres personnes.
En tous cas çà semble cohérent d'autant plus que les deux syntaxes avec weights donnent le même résultat, la seconde ne donnant pas de message d'avis.

Code : Tout sélectionner

> # On crée un jeu de données
> n = 100
> d <- data.frame(
+     travail = sample(factor(c("0", "1")),n, replace = TRUE),
+     x1 = rnorm(n),
+     x2 = rnorm(n),
+     ponderation = abs(rnorm(n, 10, 10))
+ )
>
>
> # modèle classique sans pondération. La pondération par défaut est 1
> m1 <- glm(travail ~ x1 + x2, family = binomial, data = d)
>
> # message d'erreur dû a la pondération non entière car il s'attend à ce que weights
> # représente le nombre d'essais (qui dans ce cas est en fait 1 partout effectivement)
> glm(travail ~ x1 + x2, family = binomial, data = d, weights = ponderation)

Call:  glm(formula = travail ~ x1 + x2, family = binomial, data = d,
    weights = ponderation)

Coefficients:
(Intercept)           x1           x2 
    -0.4446      -0.2724      -0.2377 

Degrees of Freedom: 99 Total (i.e. Null);  97 Residual
Null Deviance:       1630
Residual Deviance: 1596    AIC: 1595
Message d'avis :
In eval(expr, envir, enclos) :
  nombre de succès non entier dans un glm binomial !
>
>
> # Autre syntaxe : y comme matrice de succès et d'échec.
> # Comme le facteur travail est constitué en fait de 0 et de 1 je pense que c'est plus
> # facile de travailler avec cette variable en numérique
> d$travail <- as.numeric(as.character(d$travail))
> head(d$travail)
[1] 1 0 1 0 0 0
>
> # Sans pondération on trouve bien le même résultat qu'avec la première syntaxe
> m2 <- glm(cbind(d$travail, abs(d$travail-1)) ~ x1 + x2, family = binomial, data = d)
> m1

Call:  glm(formula = travail ~ x1 + x2, family = binomial, data = d)

Coefficients:
(Intercept)           x1           x2 
    -0.4619      -0.1278      -0.1746 

Degrees of Freedom: 99 Total (i.e. Null);  97 Residual
Null Deviance:       133.7
Residual Deviance: 132.8    AIC: 138.8
> m2

Call:  glm(formula = cbind(d$travail, abs(d$travail - 1)) ~ x1 + x2,
    family = binomial, data = d)

Coefficients:
(Intercept)           x1           x2 
    -0.4619      -0.1278      -0.1746 

Degrees of Freedom: 99 Total (i.e. Null);  97 Residual
Null Deviance:       133.7
Residual Deviance: 132.8    AIC: 138.8
>
> # Avec pondération non entière, on a plus le message d'avis et les résultats sont
> # identiques àla première syntaxe avec weights
> glm(cbind(d$travail, abs(d$travail-1)) ~ x1 + x2, family = binomial, data = d,
+     weights = ponderation)

Call:  glm(formula = cbind(d$travail, abs(d$travail - 1)) ~ x1 + x2,
    family = binomial, data = d, weights = ponderation)

Coefficients:
(Intercept)           x1           x2 
    -0.4446      -0.2724      -0.2377 

Degrees of Freedom: 99 Total (i.e. Null);  97 Residual
Null Deviance:       1630
Residual Deviance: 1596    AIC: 1595

Max Pacalet
Messages : 14
Enregistré le : 20 Mar 2014, 16:39

Messagepar Max Pacalet » 05 Sep 2014, 09:50

Bonjour Gilles,

Merci pour ces nouveaux éléments. Effectivement, quand j'essaye votre méthode, le message d'erreur disparaît mais les résultats restent identiques. J'en conclus donc que l'avis ne doit pas être très important (en tout cas pas dans tous les cas).

Merci encore pour votre aide !


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité