Bonjour,
J’ai un petit problème sur lequel je penche depuis le début de la semaine.
J’ai un jeux de données :
Une colonne « Parcelle » qui correspond à l’objet étudié : une parcelle de terrain qui peut avoir deux état : "C" (cultivée) ou "P" (prairie)
Ensuite une colonne « Nombre » qui indique le nombre de vers de terre collectés.
Et enfin une colonne « Stade » qui contient l’état des vers de terre "AD" ou "JV" pour adulte ou juvénile.
L’idée est de déterminer si l’un des deux types fait un meilleurs bio-indicateur que l’autre (ou que l’ensemble) pour déterminer le type de parcelle.
Le test de Shapiro sur la colonne Nombre
nous indique que les données ne suivent pas une distribution normale et il n’est pas possible de les normaliser avec l’algo BoxCox. Il faut donc faire un test non paramétrique.
J’ai pu lancer sous R un test de Kruskal-Wallis pour vérifier qu’il y a déjà une différence de population collectée (sans tenir compte du stade) entre les deux types de parcelles. J’ai refais le même test avec une Permanova à un facteur (la parcelle).
kruskal_data <- kruskal.test(Nombre~Parcelle, data=data)
kruskal_data$p.value # H0 rejected => significant differences
distance_data <- DistContinuous(data$Nombre, coef="Pythagorean")
permanova_data_parcelle <- PERMANOVA(Distance=distance_data,
group=factor(data$Parcelle))
summary(permanova_data_parcelle) # H0 rejected => significant differences
Ce qui m’amène à ma première question : est-ce que ces deux tests mesurent bien exactement la même chose ? C’est juste la puissance du test qui diffère ? Ou est-ce que je me trompe et dans ce cas ma méthodologie est mauvaise ?
Ensuite je veux déterminer si l’un des deux stades et plus discriminant que l’autre (ou que l’ensemble).
Il me semble que ce que je dois faire, c’est une Permanova à deux facteurs. Est-ce qu’il faut regarder les deux facteurs individuellement, ou est-ce que je dois regarder la combinaison des deux ? Dis autrement : est-ce que j’utilise 'Nombre ~ C(Parcelle) + C(Stade)'
ou 'Nombre ~ C(Parcelle:Stade)'
?
Enfin dernière question, je n’arrive pas à trouver la syntaxe pour effectuer cette Permanova, ni en R, ni en Python.
Sur R, j’ai un truc du style :
library(PERMANOVA)
[…] # import et mise en forme des données dans le tableau data…
contrast_data <- ConstructContrasts(data[c("Parcelle", "Stade")], 2) # Doesn’t work !!!!
permanova_data <- PERMANOVA(Distance=distance_data,
group=factor(data$Parcelle),
C=contrast_data)
summary(permanova_data) # H0 rejected => significant differences
La documentation de R est comme toujours, assez absconse.
Sur Python :
import scipy as sp
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
[…] # import et mise en forme des données dans le tableau data…
data_parcelle = data[["Parcelle", "Nombre"]]
data_stade = data[["Stade", "Nombre"]]
def statistic(parcelle, stade):
permuted_data = data
permuted_data["Parcelle"] = parcelle
permuted_data["Stade"] = stade
model = ols('Nombre ~ C(Parcelle) + C(Stade)', data=permuted_data).fit()
return sm.stats.anova_lm(model, typ=2)
print(sp.stats.permutation_test(data=(data_parcelle, data_stade),
statistic=statistic))
j’ai aboutit à ce truc farfelu après avoir compris après plusieurs heures de recherche que l’argument data
attendait deux jeux de données et non un seul, ce qui me fait me demander si je ne fait pas fausse route.
Donc si une âme charitable et surtout bien calée en statistiques réussi à comprendre mieux que moi ce que je fais, qu’elle n’hésite pas à m’aiguiller dans la bonne direction.
En vous remerciant d’avance.