Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1







