Je suis actuellement en post-doc et je travaille en aquaculture dans les tropiques. Sur l'espèce de poisson concernée il y a actuellement des problèmes dans la détermination du sexe. Le sexage des géniteurs comporte beaucoup d'erreurs ce qui nuit grandement au développement de la filière.
Pour répondre à cela, une expérimentation a été menée. Ainsi, des géniteurs ont été sexés avec une méthode scientifiquement fiable et une liste de critères morphologiques et comportemental a été établie sur chacun des individus.
Ainsi, pour un lot de géniteurs (sexés de façon fiable, n=37 mâles et n=192 femelles), j'ai un jeu de données regroupant 8 variables qualitatives à 2, 3 ou 5 modalités. Toutes les variables sont encodées par des lettres. J'ai opté pour une régression logistique afin d'établir la liste de critères pertinents à regarder pour les pisciculteurs afin de minimiser les erreurs de sexage. Mais comme vous allez le constater, je rencontre certaines difficultés.
1/ Description du jeu de données :
Code : Tout sélectionner
> summary(Black.Fish)
Sex Col.on.pec Col.under.pec Forehead Lower.jaw Form Movement Tremor Scale
F:192 BH: 56 BH:50 A :119 A : 69 B:203 B:218 A:208 B:210
M: 37 H :144 H :96 H : 16 H : 19 S: 26 S: 11 P: 21 S: 19
P : 29 P :83 L : 23 L : 16
VH: 8 VH: 19
VL: 63 VL:106
> str(Black.Fish)
'data.frame': 229 obs. of 9 variables:
$ Sex : Factor w/ 2 levels "F","M": 1 1 1 1 1 1 1 1 1 1 ...
$ Col.on.pec : Factor w/ 3 levels "BH","H","P": 2 2 2 2 2 2 2 2 2 2 ...
$ Col.under.pec: Factor w/ 3 levels "BH","H","P": 2 2 2 2 2 2 2 2 2 2 ...
$ Forehead : Factor w/ 5 levels "A","H","L","VH",..: 1 1 1 5 5 5 1 5 5 1 ...
$ Lower.jaw : Factor w/ 5 levels "A","H","L","VH",..: 5 5 5 3 3 5 5 5 3 1 ...
$ Form : Factor w/ 2 levels "B","S": 1 2 1 1 1 1 1 1 1 1 ...
$ Movement : Factor w/ 2 levels "B","S": 1 1 1 1 1 1 1 1 1 1 ...
$ Tremor : Factor w/ 2 levels "A","P": 1 1 1 1 1 1 1 1 1 1 ...
2/J'ai, en premier lieu, réalisé un test exact de Fisher chaque variable explicatives et ma variable réponse "Sex" :
Code : Tout sélectionner
>
> # "Col.on.pec" vs. "Sex"
> fisher.test(Black.Fish$Sex,Black.Fish$Col.on.pec)
Fisher's Exact Test for Count Data
data: Black.Fish$Sex and Black.Fish$Col.on.pec
p-value < 2.2e-16
alternative hypothesis: two.sided
>
> # "Col.under.pec" vs. "Sex"
> fisher.test(Black.Fish$Sex,Black.Fish$Col.under.pec)
Fisher's Exact Test for Count Data
data: Black.Fish$Sex and Black.Fish$Col.under.pec
p-value < 2.2e-16
alternative hypothesis: two.sided
>
> # "Forehead" vs. "Sex"
> fisher.test(Black.Fish$Sex,Black.Fish$Forehead)
Fisher's Exact Test for Count Data
data: Black.Fish$Sex and Black.Fish$Forehead
p-value < 2.2e-16
alternative hypothesis: two.sided
>
> # "Lower.jaw" vs. "Sex"
> fisher.test(Black.Fish$Sex,Black.Fish$Lower.jaw)
Fisher's Exact Test for Count Data
data: Black.Fish$Sex and Black.Fish$Lower.jaw
p-value < 2.2e-16
alternative hypothesis: two.sided
>
> # "Form" vs. "Sex"
> fisher.test(Black.Fish$Sex,Black.Fish$Form)
Fisher's Exact Test for Count Data
data: Black.Fish$Sex and Black.Fish$Form
p-value = 0.01054
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.0000000 0.7265123
sample estimates:
odds ratio
0
>
> # "Movement" vs. "Sex"
> fisher.test(Black.Fish$Sex,Black.Fish$Movement)
Fisher's Exact Test for Count Data
data: Black.Fish$Sex and Black.Fish$Movement
p-value = 1
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.01134226 3.76550300
sample estimates:
odds ratio
0.506775
>
> # "Tremor" vs. "Sex"
> fisher.test(Black.Fish$Sex,Black.Fish$Tremor)
Fisher's Exact Test for Count Data
data: Black.Fish$Sex and Black.Fish$Tremor
p-value = 7.614e-14
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
14.94718 328.67409
sample estimates:
odds ratio
57.36457
3/ Finalement, j'ai inclus dans mon modèles les variables explicatives retenues dépendantes du sexe par le test de Fisher :
Code : Tout sélectionner
> glm.ALL<-glm(Sex ~ Col.on.pec + Col.under.pec+Forehead+Lower.jaw+Form+Tremor+Scale, data=Black.Fish, family=binomial(logit))
Warning messages:
1: glm.fit: l'algorithme n'a pas convergé
2: glm.fit: des probabilités ont été ajustées numériquement à 0 ou 1
> summary(glm.ALL)
Call:
glm(formula = Sex ~ Col.on.pec + Col.under.pec + Forehead + Lower.jaw +
Form + Tremor + Scale, family = binomial(logit), data = Black.Fish)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.853e-05 -2.100e-08 -2.100e-08 -2.100e-08 3.717e-05
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.468e+01 4.366e+04 -0.001 1.000
Col.on.pecH -1.685e+01 1.019e+05 0.000 1.000
Col.on.pecP 2.748e+01 1.093e+05 0.000 1.000
Col.under.pecH -4.178e+01 6.106e+04 -0.001 0.999
Col.under.pecP 1.275e+00 4.695e+04 0.000 1.000
ForeheadH 1.323e+00 8.972e+04 0.000 1.000
ForeheadL 2.718e+01 1.135e+05 0.000 1.000
ForeheadVH -1.070e+01 2.537e+05 0.000 1.000
ForeheadVL -1.586e+01 1.149e+05 0.000 1.000
Lower.jawH 3.424e+01 1.974e+05 0.000 1.000
Lower.jawL 1.731e+01 1.201e+05 0.000 1.000
Lower.jawVH 4.640e+01 1.355e+05 0.000 1.000
Lower.jawVL -1.085e+01 1.889e+05 0.000 1.000
FormS 1.955e-01 9.829e+04 0.000 1.000
TremorP 2.861e+01 1.048e+05 0.000 1.000
ScaleS 1.202e+01 2.017e+05 0.000 1.000
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 2.0256e+02 on 228 degrees of freedom
Residual deviance: 7.0141e-09 on 213 degrees of freedom
AIC: 32
Number of Fisher Scoring iterations: 25
Le modèle ne converge pas, les valeurs des estimateurs sont très très mal estimées et du coup les p-values sont égales à 1 !
Il est évident que quelque chose dans ma démarche n'est pas bon. Quelqu'un serait-il à même de m'expliquer où sont mes erreurs ?
Je ne suis pas familier avec la régression logistique et malgré de nombreuses lectures beaucoup de choses m'échappent encore pour bien appréhender cette méthodologie statistique et éviter les erreurs (que j'ai commettre en nombre dans le cas présent :-)).
Je vous remercie par avance de votre aide.
Bonne fin de journée !