Forum de Statistiques
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Les posteurs les plus actifs de la semaine
Aucun utilisateur

Le Deal du moment : -29%
PC portable Gamer ERAZER DEPUTY P60 – ...
Voir le deal
999.99 €

"Effect coding"

3 participants

Aller en bas

"Effect coding" Empty "Effect coding"

Message par A.D. Jeu 10 Nov 2011 - 10:57

Bonjour à tous,

Je travaille actuellement avec les données suivantes : 3 variables qualitatives (A, B et C) pouvant prendre 5 modalités différentes chacune (A1, A2, ..., A5, B1, ..., B5, C1, ..., C5) et une variable réponse binaire (oui/non) Y.
Je dois effectuer une régression logistique et une régression hierarchique bayésienne sur ces variables : Y ~ A + B + C , et pour cela j'étudie les différentes manières de coder mes variables.

J'ai tout d'abord vu le codage disjonctif complet (ou "dummy coding"). Cette méthode me donnerait par exemple pour un individu ayant les valeurs suivantes ( A=2 ; B=1 ; C=5 ) :

A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5
0 1 0 0 0 1 0 0 0 0 0 0 0 0 1
Ensuite je devrais par exemple choisir une modalité de référence pour chacune des 3 variables et appliquer ma régression.

J'ai vu également qu'il existait une méthode appelée "effect coding". Il semblerait que se soit celle-là même qui soit à privilégier dans le cas qui m'intéresse (régression hierarchique bayésienne). Cependant, je n'arrive pas bien à saisir comment elle fonctionne Sad J'ai commencé à rechercher sur internet des informations à ce sujet mais je n'arrive pas à les appliquer à mon cas particulier (on me parle de "groupe de référence" mais je ne vois pas bien à quoi cela correspond dans mon cas...).
Voilà, donc si quelqu'un pouvait m'indiquer comment procéder (par exemple avec mon exemple ( A=2 ; B=1 ; C=5 ) ou/et m'indiquer de la doc pertinente sur le sujet, un grand merci par avance Smile


Cordialement,

A.D.


Dernière édition par A.D. le Jeu 10 Nov 2011 - 16:36, édité 1 fois

A.D.

Nombre de messages : 305
Age : 35
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par droopy Jeu 10 Nov 2011 - 13:50

Bonjour,

le site suivant est clair je trouve :
http://www.ats.ucla.edu/stat/mult_pkg/faq/general/effect.htm

Dans R (car je te sais une utilisatrice assidue) c'est la fonction contr.sum pour utiliser ce genre de contraste.

Cdlt
droopy
droopy

Nombre de messages : 1156
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par A.D. Jeu 10 Nov 2011 - 14:17

Bonjour droopy,

Tout d'abord, merci pour votre réponse.

J'avais parcouru le site que vous m'indiquez, cependant je ne vois pas bien comment mettre ceci en application dans mon cas d'étude (à quoi correspondent les "groupes", à des variables?).
De même, concernant la fonction R (ma problématique est à mettre en application avec R d'ailleurs Smile ), je ne suis pas sûre de bien saisir comment l'utiliser... Embarassed Par exemple, si je reprends l'exemple mentionné dans mon premier message, comme mes variables ont 5 modalités, je fais :

Code:
> contr.sum(5)

  [,1] [,2] [,3] [,4]
1    1    0    0    0
2    0    1    0    0
3    0    0    1    0
4    0    0    0    1
5    -1  -1    -1  -1
Mais comment appliquer cela à mon individu ( A=2 ; B=1 ; C=5 ) par exemple?
Est-ce qu'ici une colonne obtenue correspond au recodage d'une modalité de ma variable? Par exemple, colonne 1 = recodage pour la modalité 1 de ma variable (et la dernière modalité est prise comme "référence" donc écartée)?

Je suis désolée, je n'arrive pas bien à voir comment cela fonctionne... Embarassed


Cordialement,

A.D.

A.D.

Nombre de messages : 305
Age : 35
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par droopy Jeu 10 Nov 2011 - 14:55

dans l'exemple, les groupes correspondent aux modalités d'une variable catégoriel, R autrement dit à un factor. Il faut attribuer des contrastes à tes facteurs ou alors les spécifier dans la fonction lm. Un exemple avec 4 groupes dont le groupe 4 est le groupe de référence :
Code:
> x <- gl(4,4)
> y <- rnorm(16)
> lm1 <- lm(y~x)
> lm1 # par défaut les contrastes sont issues de contr.treatment

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)          x2          x3          x4 
    -0.6419      1.6527      0.3535      0.4694

> mat <- contr.sum(levels(x))
> colnames(mat) <- c(1:3) # parce que la référence est ici le groupe 4

x1 <- x
contrats(x1) <- mat
> lm2 <- lm(y~x1)
> lm2

Call:
lm(formula = y ~ x1)

Coefficients:
(Intercept)          x11          x12          x13 
  -0.02298    -0.61891      1.03380    -0.26537
# ou
> lm3 <- lm(y~x, contr=list(x=mat))
> lm3

Call:
lm(formula = y ~ x, contrasts = list(x = mat))

Coefficients:
(Intercept)          x1          x2          x3 
  -0.02298    -0.61891      1.03380    -0.26537
Il te faut répéter la manip pour chaque variable. Si tu veux ensuite voir comment est coder l'affaire, fait model.matrix(lm2).
Cdlt
droopy
droopy

Nombre de messages : 1156
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par A.D. Jeu 10 Nov 2011 - 15:21

Bon, j'ai un peu (beaucoup? Embarassed ) du mal car je ne maîtrise pas bien la gestion des contrastes en régression je crois...

droopy a écrit:Un exemple avec 4 groupes dont le groupe 4 est le groupe de référence :
Groupe de référence = modalité de référence (fixée à 0 par exemple)?

Si je reprends mon exemple avec 3 variables à 5 modalités chacune, on aura à faire la manip' 3 fois et à chaque fois on aura 5 groupes dont un de référence. Jusque là c'est correct?

Mon objectif, avant même de réaliser ma régression (régression hierarchique bayésienne que j'ai programmée moi-même), est que je cherche à recoder mon tableau X à 3 colonnes (= mes 3 variables A, B et C). J'ai lu dans de la documentation qu'il fallait utiliser (de préférence) un "effect coding", seulement je ne vois pas bien comment procéder.
Extrait de ma matrice X :

A B C
2 1 5
3 1 2
1 1 3
2 5 1
Je n'arrive pas à voir comment procéder pour la recoder...

Autre question au passage, concernant le vecteur binaire réponse Y, doit-il être codé d'une manière spéciale ou simplement 1/0?


Encore merci pour votre attention concernant mon "problème" Smile


Cordialement,

A.D.

A.D.

Nombre de messages : 305
Age : 35
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par A.D. Jeu 10 Nov 2011 - 16:35

Re-bonjour,

Est-ce que par exemple pour l'individu ( A=2 ; B=1 ; C=5 ) , on a le recodage en "effect coding" comme suit :

A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5
0 1 0 0 0 1 0 0 0 0 -1 -1 -1 -1 -1
Et si on prend comme modalité de référence la dernière, cela nous donne finalement :

A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4
0 1 0 0 1 0 0 0 -1 -1 -1 -1
Est-ce correct?

Merci d'avance et bon week-end ! Smile


Cordialement,

A.D.

A.D.

Nombre de messages : 305
Age : 35
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par Nik Sam 12 Nov 2011 - 7:58

Salut,

Je ne sais pas ce qu'est le "effect coding" et j'ai pas le temps de regarder en détail. Pour les contrasts appliqué aux individus, regardes la fonction model.matrix(), comme te l'a indiqué Droopy, tu auras le codage de tous tes individus.

Nik

Nik

Nombre de messages : 1606
Date d'inscription : 23/05/2008

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par droopy Lun 14 Nov 2011 - 8:09

re,

les contrastes se définissent variable par variable et non pas sur l'intégralité des variables !
Alors pour ton exemple ça donnerait :
Code:
tab <- expand.grid(A=factor(1:5), B=factor(1:5), C=factor(1:5)) # ici on crée toutes les combinaisons possibles des modalités des trois facteurs
# la matrice de contrasts
mat <- contr.sum(levels(tab$A))
colnames(mat) <- levels(tab$A)[1:4]

# et la manière dont s'est codé dans un modèle :
mod <- model.matrix(~., data=tab, contr=list(A=mat, B=mat, C=mat))

# pour A=2, B=1, C=5 ça donne :
mod[tab$A=="2"& tab$B=="1"& tab$C=="5",]
(Intercept)          A1          A2          A3          A4          B1          B2          B3          B4          C1          C2          C3          C4
          1          0          1          0          0          1          0          0          0          -1          -1          -1          -1
Cdlt
droopy
droopy

Nombre de messages : 1156
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par A.D. Mar 15 Nov 2011 - 9:06

Bonjour,

Et tout d'abord, merci à tous les deux pour vos réponses Smile

Je pense maintenant avoir compris le principe de ce recodage. Cependant, savez-vous s'il existe une fonction R déjà écrite qui permettrait le recodage de tout mon plan d'expériences selon ce critère? En effet, je pourrais la programmer moi-même en passant par des chose de ce genre :
Code:
mod[tab$A=="2"& tab$B=="1"& tab$C=="5",]
mais il y a peut-être mieux à faire...

Encore merci en tout cas Smile


Cordialement,

A.D.

A.D.

Nombre de messages : 305
Age : 35
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par droopy Mar 15 Nov 2011 - 9:51

la réponse est déjà contenue dans les précédents posts :
model.matrix(~., data=tab, contr=list(A=mat, B=mat, C=mat)). A la place du ".", tu mets la formule comme dans ton modèle et tu mets les contrasts de tes facteurs dans une liste comme contr=list(...).

Cdlt
droopy
droopy

Nombre de messages : 1156
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par A.D. Mar 15 Nov 2011 - 11:19

Merci droopy Smile

J'ai donc procédé ainsi (avec X ma matrice de plan d'expériences telle qu'elle est initialement (cf. mon 1er post)) :

Code:
P<-model.matrix(~.,data=X,contr=list(A="contr.sum","B="contr.sum",C="contr.sum"))
Cela me permet bien d'obtenir ce que je souhaitais !

Cependant, cette procédure va être incluse dans une fonction pour laquelle le nombre de variables (ici 3 : A, B et C) est passé en arguments (nvars). Il va donc me falloir définir les contrastes en fonction de ce paramètre. J'ai essayé de procéder comme suit :

Code:
v<-NULL
for(k in 1:nvars)
{
    v<-c(v,paste(colnames(X)[k],"\"contr.sum\"",sep="=")
}

v
[1] "A=\"contr.sum\"" "B=\"contr.sum\"" "C=\"contr.sum\""

P<-model.matrix(~.,data=X,contr=list(v))
Error in model.matrix.default(~., data = mat, contr = list(v)) :
  invalid 'contrasts.arg' argument

v<-paste(v,collapse=",")
v
[1] "A=\"contr.sum\",B=\"contr.sum\",C=\"contr.sum\""

P<-model.matrix(~.,data=X,contr=list(v))
Error in model.matrix.default(~., data = mat, contr = list(v)) :
  invalid 'contrasts.arg' argument

P<-model.matrix(~.,data=X,contr=list(eval(v)))
Error in model.matrix.default(~., data = mat, contr = list(eval(v))) :
  invalid 'contrasts.arg' argument
Mais je dois sûrement passer à côté de quelque chose...

Pour info, un extrait de ma matrice X :

Code:
A B C
4 4 5
2 1 5
3 3 5
5 4 2
5 5 1
Voilà, désolée si ce problème n'est plus directement en rapport avec le post initial et merci encore pour votre attention et votre aide face à mes "petits problèmes" Embarassed


Cordialement,

A.D.

A.D.

Nombre de messages : 305
Age : 35
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par Nik Mar 15 Nov 2011 - 16:14

Salut,

je ne vois pas trop où tu veux en venir...
Code:
v<-NULL
for(k in 1:nvars)
{
    v<-c(v,paste(colnames(X)[k],"\"contr.sum\"",sep="=")
}
Je ne vois pas l'intérêt de cette boucle : un truc du type
Code:
paste(c(A,B,C),"\"contr.sum\"",sep="=")
ferait la même chose, non ? Avec au pire une adaptation pour un nombre de variables non défini par names(dataframe) ou quelques choses comme ça.

Code:
> list(paste(c("A","B","C"),"contr.sum",sep="="))
[[1]]
[1] "A=contr.sum" "B=contr.sum" "C=contr.sum"

> list(A="contr.sum",B="contr.sum",C="contr.sum")
$A
[1] "contr.sum"

$B
[1] "contr.sum"

$C
[1] "contr.sum"
Tu vois que ça ne donne pas la même chose donc ça ne peux pas marcher. Il faut définir autrement ta liste de contrasts.
Si c'est pour toujours mettre la même chose, voir l'appel à options()$contrasts
Si tu veux définir facteur par facteur, voir la fonction C() qui permet de définir les contrastes comme tu veux dans une autre fonction (très pratique dans un glm par exemple)

Nik

Nik

Nombre de messages : 1606
Date d'inscription : 23/05/2008

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par droopy Mar 15 Nov 2011 - 19:19

Re,

Voila une solution :
Code:
l1 <- eval(parse(text=paste("list(", paste(colnames(tab),"='contr.sum'", collapse=","), ")", sep="")))
model.matrix(~., data=tab, contr=l1)
Cdlt
droopy
droopy

Nombre de messages : 1156
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par A.D. Mer 16 Nov 2011 - 9:56

Merci beaucoup pour vos réponses à tous les deux ! Smile

Je crois que je m'étais un peu compliqué la vie, en effet, je suis parvenue à mes fins avec un "simple" :

Code:
ll<-as.vector(rep("contr.sum",nvars),mod="list")
names(ll)<-colnames(tab)
Cela dit, merci pour la jolie méthode en une ligne avec l'utilisation de "eval" et "parse".

Bonne journée !


Cordialement,

A.D.

A.D.

Nombre de messages : 305
Age : 35
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

"Effect coding" Empty Re: "Effect coding"

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum