Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 10-07-2025 13:50:32

Weg
Membre
Inscription : 16-11-2024
Messages : 12

permutation test et bootstrap

Bonjour,

Je cherche a tester si deux échantillons sont significativement différents. H_0: μ_x == μ_y.
Hypothèses de normalité non remplie, donc pas de test de Student classique.
Voici quelques exemples de code :


from scipy import stat
import numpy as np
import pandas as pd
# […]

column = "column name"                  # Test the column you want
x = df.loc[df["classe"] == 0, column]  # First sample
y = df.loc[df["classe"] == 1, column]  # Second sample
z = df[column]                                   # Concatenated sample
B = 9999                                           # nb répetition


# (1) Permutation wth built-in scipy*:

ttr = stats.ttest_ind(x, y,
                      equal_var = False,
                      alternative = "two-sided",
                      method = PermutationMethod(n_resamples=B, batch=100)
                     )
t_obs = ttr.statistic
ttr.pvalue

# (2) Handmade permutation test:
def statistic(x, y):
    num = y.mean() - x.mean()
    denom = 1  # np.sqrt(y.var()/y.shape[0] + x.var()/x.shape[0])
    return num/denom

t_obs = statistic(x, y)
t_dist = np.zeros(shape=B)

for i in range(B):
    z_ = np.random.permutation(z)
    x_ = z_[:len(x)]
    y_ = z_[len(x):]
    t_dist[i] = statistic(x_, y_)
    #t_dist[i] = stats.ttest_ind(x_, y_,
    #                            equal_var = False,
    #                            alternative = "two-sided").statistic  # give a little higher p-value

ASL = np.sum(np.abs(t_dist) >= abs(t_obs))/B
np.sum(np.abs(t_dist) >= abs(t_obs))
ASL


# (3) Bootstrap for means equality:
def statistic(x, y):
    num = y.mean() - x.mean()
    denom =  np.sqrt(y.var()/y.shape[0] + x.var()/x.shape[0])
    return num/denom

t_obs = statistic(x, y)
t_dist = np.zeros(shape=B)

for i in range(B):
    x_ = np.random.choice(x - x.mean() + z.mean(), len(x), replace=True)
    y_ = np.random.choice(y - y.mean() + z.mean(), len(y), replace=True)
    t_dist[i] = statistic(x_, y_)

ASL = np.sum(np.abs(t_dist) >= abs(t_obs))/B
np.sum(np.abs(t_dist) >= abs(t_obs))
ASL

# (4) Bootstrap for distribution equality:
t_dist = np.zeros(shape=B)

for i in range(B):
    z_ = np.random.choice(z, len(z), replace=True)
    x_ = z_[:len(x)]
    y_ = z_[len(x):]
    t_dist[i] = statistic(x_, y_)

ASL = np.sum(np.abs(t_dist) >= abs(t_obs))/B
np.sum(np.abs(t_dist) >= abs(t_obs))
ASL


 

Le (1) est un test de permutation avec scipy. Le (2) est une réimplémentation manuelle censée faire exactement la même chose. Il semble cependant y avoir un léger biais entre les deux approches. C’est difficile à estimer dans la mesure où les valeurs peuvent changer d’un tirage aléatoire à un autre, mais sur certaines colones, il semble que la p-value données par la méthode scipy soit systématiquement plus faible de quelques % par rapport à la méthode manuelle. Pourquoi?

Ensuite j’ai mis deux implémentations du bootstrap. Le premier est présenté comme servant à tester l’égalité de deux moyennes. Le deuxième comme servant à tester l’égalité de deux distribution (Efron & Tibshirani). Ils donne des pvalue similaire voire un peu plus élevées que (2). J’ai du mal à comprendre les nuance entre les deux. (4) est identique à (2), à ceci près que les tirages sont effectués avec replacement. (3) est un peu différent et je ne comprends pas trop ce que signifie le centrage sur la moyenne de z. Pourquoi (3) testerait-il plus l’égalité des moyenne et (4) l’égalité des distributions?

Merci d’avance.

* forum bug : si j’ajoute le i de « wth», j’ai un message «no spam please». Il est donc interdit de lire «avec» en anglais sur ce forum!

Dernière modification par Weg (10-07-2025 13:52:28)

Hors ligne

#2 10-07-2025 16:09:54

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : permutation test et bootstrap

RE,

Non, pas de forum bug : il eut été plus "prudent" de questionner...

Voici pourquoi.
Il fut un temps où nous recevions chaque jour des pages de spams en anglais (médicaments, compléments alimentaires à commander sur des sites qui nous étaient -bien entendu - inconnus...) et on passait notre temps à les supprimer.

Un de nos adhérents avait proposé de coder un anti-spam maison qui bloquerait les mots-clés spécifiques desdits spams...
Proposition acceptée et testée sans succès : les spécialités médicamenteuses et leurs mérites étalés étaient si nombreux que nous étions en retard sur les bots qui  qui nous ciblaient...

Alors J'AVAIS (j'assume !) eu une idée certes gênante quelquefois pour nous : j'ai proposé de cibler les petits mots les plus courants de l'anglais qui allaient immanquablement se retrouver dans les spams, lesquels seraient refoulés :
- les bots bénéficieraient systématiquement du message "No spam please" sans pouvoir faire leur boulot,
- les expéditeurs ne prendraient pas le temps de chercher pourquoi leurs spams étaient refoulés et quels étaient les mots déclencheurs du message "No spam please" : c'est faisable bien sûr, mais ça prend du temps...

Donc, tu as maintenant la clé du mystère,.
Je t'espère rassuré : non le WITH (là, ça passe) n'est pas un bug du forum.
Je suis bien conscient que nous sommes tous impactés tôt ou tard par cet anti-spam maison basé sur les petits mots de l'anglais, moi comme les autres : tu peux essayer avec wi_th (là, ça passe aussi) et signaler que supprimer l'underscore.

Cordialement,

       Yoshi
- Modérateur -

Dernière modification par yoshi (10-07-2025 16:19:46)

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt quatre moins vingt neuf
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums