Procédure de test d'hypothèse de permutation

Sep 14 2020

Je ne suis pas fort en statistiques et je cherche de l'aide. Je travaille avec des données immobilières et je souhaite comparer les prix des appartements dans 2 quartiers: quartier "A" et quartier "B" .

Description des données:

tableau "A" :

$mean_A$ = 368,52

$std_A$ = 256,02

$n_A$ = 2040

tableau "B" :

$mean_B$ = 340,02

$std_B$ = 284,02

$n_B$ = 2741

En regardant les données, il semble que le district A est plus cher que le district B. Je veux en être sûr et faire une expérience.

La statistique observée: $mean_A - mean_B$ = 28,5

$H_0$: $mean_A - mean_B$ = 0

$H_a$: $mean_A - mean_B$ > 0

Ce que j'ai fait:

  1. J'ai décalé le tableau A de 28,5 (statistique observée) vers le centre $mean_A - mean_B$ à droite sur 0.

  2. J'ai simulé 10000 échantillons aléatoires pour le tableau A et pour le tableau B (échantillonnage avec remplacement), obtenir 10000 différences de moyenne et les enregistrer.

  3. Ensuite, je veux voir là l'observation originale (28,5) est sur cette distribution moyenne des différences et calculer la valeur p.

p-value = (le nombre de valeurs> = 28,5) / 10000

et est égal à 0,001.

Donc la différence est significative et je peux rejeter $H_0$.

Dites-moi s'il vous plaît, est-ce que cette procédure est correcte ou j'ai commis une erreur.

J'apprécierais n'importe quel conseil. Merci beaucoup pour votre temps et vos efforts.

Réponses

2 BruceET Sep 14 2020 at 16:39

Ce que vous faites ressemble plus à une procédure bootstrap qu'à un test de permutation. Comme je n'ai pas vos données ou une description de celles-ci, je ne peux pas être sûr de savoir pourquoi vous n'utilisez pas un test t Welch à 2 échantillons ou un test de somme des rangs de Wilcoxon à 2 échantillons.

Supposons que j'ai des données comme ci-dessous, comme échantillonné dans R. Même si la taille des échantillons est très grande, je ne voudrais pas faire confiance au test avec des données aussi biaisées.

summary(a);  length(a);  sd(a)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  112.2   188.8   285.1   368.7   463.2  1904.2 
[1] 2040
[1] 254.4081
summary(b);  length(b);  sd(b)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  56.03  141.93  256.71  347.55  461.82 2611.67 
[1] 2741
[1] 292.5565
x = c(a,b);  gp = rep(1:2, c(2040,2741))
boxplot(x ~ gp, col="skyblue2", pch=20)

Je n'utiliserai pas au test car je ne fais pas confiance à la statistique t pour avoir une distribution t. Cependant, j'utiliserai la statistique du test t à 2 échantillons groupés comme `` métrique '' pour un test de permutation, car j'estime que la statistique t est un moyen raisonnable d'exprimer la différence entre les valeurs des groupes A et B.

t.obs = t.test(x ~ g, var.eq=T)$stat;  t.obs
       t 
2.613055 

Maintenant, je vais utiliser sample(gp)pour permuter aléatoirement les 1s et 2s dans gp. Tous les 2040 $ + 2741 $ sont réaffectés aux groupes 1 et 2 avec $ n_1 = 2040 $ dans le groupe 1 et le reste dans le groupe 2. À une échelle beaucoup plus petite, le code ci-dessous illustre une permutation du vecteur c(1,1,1,2,2,2,2).

sample(c(1,1,1,2,2,2,2))
[1] 2 2 2 1 1 2 1

Je vais faire 10 $ \, 000 $ permutations de gp, trouver t.prmpour chaque permutation. Ensuite, la valeur P du test de permutation sera la proportion des valeurs dans t.prmlesquelles sont plus grandes en valeur absolue que t.obspour les données originales non autorisées.

set.seed(2020)
t.prm = replicate(10^4, t.test(x~sample(gp),var.eq=T)$stat)
mean(abs(t.prm) > abs(t.obs))
[1] 0.0079

La valeur P est d'environ $0.008$ nous rejetons donc l'hypothèse nulle que les deux groupes ont la même moyenne.

hist(t.prm, prob=T, br=30, col="skyblue2", 
     main="Simulated Permutation Dist'n")
  abline(v = c(-t.obs, t.obs), col="red", lwd=2, lty="dotted")

Notes: (1) Un test de somme des rangs de Wilcoxon montre que les deux groupes ont des emplacements significativement différents:

wilcox.test(x ~ gp)

        Wilcoxon rank sum test with continuity correction

data:  x by gp
W = 3138800, p-value = 3.737e-13
alternative hypothesis: true location shift is not equal to 0

(2) Pour un test unilatéral, comme dans votre question, la dernière ligne de code R pour la valeur P serait la suivante:

mean(t.prm > t.obs)
[1] 0.0042

(3) Je ne connais pas le test que vous avez effectué. Cela semble être un test bootstrap (en raison du rééchantillonnage avec remplacement). Je ne dis pas que votre test est faux; cela donne un résultat raisonnable. Cependant, vous avez posé une question sur un test de permutation; votre test n'est pas un test de permutation; alors je vous en ai montré un.

(4) Le code R ci-dessous a été utilisé pour obtenir les deux exemples utilisés dans la discussion ci-dessus:

set.seed(2020)
a = rexp(2040, 1/256) + 112
b = rexp(2741, 1/284) + 56
x = c(a,b);  gp = rep(1:2, c(2040,2741)