emilienschultz / pyshs-bib

MIT License
9 stars 4 forks source link

Si les observations ont des poids, appliquer la correction de Rao-Scott au test du chi2 sur les tableaux croisés (=utiliser le package samplics) #39

Closed jeanbaptisteb closed 1 year ago

jeanbaptisteb commented 1 year ago

D'abord merci pour ce package, très bonne initiative.

D'après ce que je vois dans le code et le documentation, la fonction tableau_croise applique le test "standard" du Chi2 à un tableau croisé, y compris quand celui-ici a des poids appliqués à chaque observation.

Documenttion: pyshs.tableau_croise(data,"genre","interetscience","poids1")

Code concerné dans la fonction tableau_croise:

t_absolu = round(
        pd.crosstab(df[c1], df[c2], df[weight], aggfunc=sum, margins=True), ro
    ).fillna(0)

[...]

if p:
        return t, chi2_contingency(t_absolu.drop("All").drop("All", axis=1))[1]

D'après les travaux de plusieurs auteurs, appliquer un test du chi2 "standard" à des données pondérées par des poids introduit des biais. Par exemple d'après Thomas et al.: "It is well known that significance levels can be severely distorted (usually inflated) when classical statistical methods designed for i.i.d. data are applied to data drawn from complex sample surveys". En gros cela augmente fortement le risque d'avoir des p-values incorrectes.

S'il y a des poids attribués aux observations, il faut idéalement utiliser un test du Chi2 auquel on applique une correction dite de "Rao-Scott". Ce n'est pas du tout trivial à implémenter, et il existe deux variantes de cette correction ("correction de premier ordre" et "correction de second ordre").

Il existe des implémentations de cette correction dans les logiciels commerciaux (SAS) dans R (package survey) et surtout ce qui nous intéresse ici en Python avec le package samplics. Le package pourrait être utilisé ici pour gagner du temps, plutôt que de faire une réimplémentation; exemple ici, section "Two-way tabulation"). Il me semble que le développeur de samplics est preneur de retours sur sa librairie, donc faire quelques tests avant de l'utiliser dans pyshs pourrait être bénéfique pour les deux librairies.

emilienschultz commented 1 year ago

Merci pour ce super retour ! C'est une excellente idée, et oui j'avais lu quelques travaux sur les distrorsions mais dans la mesure où ces précautions ne sont que très rarement prises dans les travaux que je lis, je n'avais pas cherché plus loin en première approche. Et je n'avais pas vu le package samplics qui a l'air excellent. Je vais voir samplics et intégrer ça (si tu veux faire une pull request et/ou rejoindre le maintien de ce package, tu es le bienvenu :)

jeanbaptisteb commented 1 year ago

Pour le maintien du package, faire des pull requests, etc., sur le principe totalement partant et je le garde en tête, ma limite va être surtout mon temps dispo!

emilienschultz commented 1 year ago

Même combat, c'était juste pour signaler :)

emilienschultz commented 1 year ago

Suite à la proposition, j'ai modifié pour que le test soit effectivement fait par la bibliothèque samplics (thanks @MamadouSDiallo for developping this package), potentiellement à terme refactoriser pour reposer sur cette bibliothèque si elle est maintenue ET/OU extraire ce test comme une fonction autonome, à verser sur statsmodel ?