Le test de Page

add

\bullet Présentation:

Publié en 1963 suite aux travaux de Ellis Batten Page, le test de Page est une approche non paramétrique permettant de:

– tester si les distributions des sous-échantillons X|_{Y = g_1}, \cdots, X|_{Y = g_k}, d’une variable continue ou ordinale X restreinte aux différents groupes K \geq 2 d’une variable ordinale Y, sont distinctes.

– tester si les variables continues ou ordinales appariées X ^1, \dots, X ^T sont liées. Sous cette forme, le test de Page porte également le nom de test des tendances de Page ou test L de Page.

Le test de Page est régulièrement présenté comme une alternative au test de Jonckheere-Terpstra pour le cas non apparié et à l’ANOVA de Friedman pour le cas apparié. En fait, il faut prendre en compte que lorsque nous utilisons le test de Page, nous nous plaçons dans une approche visant à tester les tendances linéaires contrairement aux deux test cités précédemment et qui se limitent à chercher une différente entre les différents groupes (pour le cas non apparié) / traitements (pour le cas apparié). Cette particularité est à prendre en compte lors du choix du test le plus adapté à utiliser.

Enfin, la version pour données non appariées est la moins connue des deux, pourtant elle demeure plus puissante que le test de Kruskal-Wallis plus populaire. Quand à la version appariée, elle l’est plus que l’ANOVA de Friedman.

\bullet Les tests:

Cas pour données non appariées

Hypothèse préliminaire: Variable continue X et variable ordinale Y à K \geq 2 groupes.

La statistique du test de Page est:

Z = \frac{L}{\sqrt{V(L)}}

Où,

L = \frac{1}{\sqrt{n}} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) (\overline{R|_{Y = k}} - \frac{n + 1}{2})

V(L) = \frac{n + 1}{12} \sum_{k = 1} ^K \frac{1}{n_k} (k - \frac{K + 1}{2}) ^2

Elle suit une loi normale centrée-réduite et l’hypothèse H_0 est: « Il y a indépendance entre X et Y / \mu_1 = \cdots = \mu_K« .

Ci-dessous la table de la loi normale centrée-réduite:

add

Tendance pour le rejet de H_0:

Plus la statistique de test Z est grande et plus nous avons de chance de rejeter H_0, ce qui revient à dire,

\frac{L}{\sqrt{V(L)}} \rightarrow \infty

\Rightarrow L \rightarrow \infty

\Rightarrow \frac{1}{\sqrt{n}} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) (\overline{R|_{Y = k}} - \frac{n + 1}{2}) \rightarrow \infty

\Rightarrow k - \frac{K + 1}{2} \rightarrow \infty et/ou \overline{R|_{Y = k}} - \frac{n + 1}{2} \rightarrow \infty

Deux particularités sont à déduire de cette dernière implication:

– La première est que le premier cas est en réalité un coefficient de linéarité à appliquer au second. En effet k - \frac{K + 1}{2} > 0 lorsque nous considérons la classe au-dessus de la classe médiane, mettant en évidence cette caractéristique du test de Page.

– La seconde est l’influence de \overline{R|_{Y = k}} - \frac{n + 1}{2} qui est en réalité le vrai terme qui donne sa valeur à la statistique de test Z. Il explose si la moyenne des rangs pour l’une des classes est nettement supérieure à la médiane, ce qui implique le rejet de H_0.

Cas pour données appariées

Hypothèse préliminaire: Variables continues ou ordinales appariées X ^1, \dots X ^T.

La première étape est de transformer le tableau de données en un tableau synthétisant le rang R_i ^t de X_i ^t par rapport aux X_i ^1, \cdots, X_i ^T de chaque ligne (bloc).

La statistique du test de Page est:

L = \sum_{t = 1} ^T t \sum_{i = 1} ^n R_i ^t

Elle suit une loi de Page pour (T,n) degrés de liberté et l’hypothèse H_0 est: « Il n’y a pas d’influence du temps t sur X / \mu_1 = \cdots = \mu_T« .

Dans le cas où n est assez grand, alors il faut considérer la statistique suivante et qui se base sur le L de Page,

Z = \frac{L - E[L]}{\sqrt{V(L)}}

Où,

E[L] = \frac{1}{4} n T (T + 1) ^2

V(L) = \frac{n T ^2 (T ^2 - 1) ^2}{144 (T - 1)}

Elle suit alors une loi normale centrée-réduite.

Ci-dessous la table de la loi de Page:

add

Ci-dessous la table de la loi normale centrée-réduite:

add

Tendance pour le rejet de H_0:

Plus la statistique de test L est grande et plus nous avons de chance de rejeter H_0, ce qui revient à dire,

L \rightarrow \infty \Rightarrow \sum_{t = 1} ^T t \sum_{i = 1} ^n R_i ^t \rightarrow \infty \Rightarrow t \sum_{i = 1} ^n R_i ^t \rightarrow \infty

Or la somme (en colonne) des rangs (en ligne) explose si \sum_{i = 1} ^n R_i ^1 < \cdots < \sum_{i = 1} ^n R_i ^T (ou inversement). L’ approche exclusivement linéaire du test de Page intervient lors de la multiplication de la somme par le temps t, apportant un poids proportionnel au temps mesuré.

\bullet Tendance lorsque n \longrightarrow \infty:

Nous proposons ici de vérifier si le test de Page pour données appariées et non appariées est sensible aux grands échantillons ou non.

Le tableau ci-dessous présente l’évolution des p-valeurs associées aux statistiques de test calculées sur plusieurs simulations dans le cas où les distribution sont différentes d’un groupe/traitement à l’autre.

add

Globalement, quelque soit la taille de l’échantillon, le test statistique rejette H_0, ce qui est en accords avec nos hypothèses.

Procédons à la même expérience mais cette fois-ci dans un cas où les différentes distributions ne devraient pas être statistiquement différentes d’un groupe/traitement à l’autre. Le tableau ci-dessous présente ces résultats.

add

Jusqu’à N = 1 000 nous restons cohérent avec nos hypothèses pour le cas non appariée (|latex]n = 100[/latex] pour le cas appariés). Cependant nous voyons qu’au delà de ces deux seuils, le test rejette H_0 à tort.

Nous en déduisons que le test de Page est influencé par la taille de l’échantillon.

\bullet Annexe théorique:

Cette partie de l’article présente une esquisse du calcul de l’espérance et de la variance de la statistique L de Page dans le cas non apparié et apparié.

– Calcul de E[L] et V(L) dans le cas non apparié:

Pour l’espérance de L,

E[L]= E[\frac{1}{\sqrt{n}} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) \cdot (\overline{R|_{Y = k} - \frac{n + 1}{2}})]

= \frac{1}{\sqrt{n}} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) \cdot E[\overline{R|_Y = k} - \frac{n + 1}{2}]

= \frac{1}{\sqrt{n}} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) \cdot (E[\overline{R|_Y = k}] - \frac{n + 1}{2})

Or, sous H_0, les distributions des R|_{Y = k}, k \in [1, \cdots, K] sont confondues, par conséquent,

E[L] = \frac{1}{\sqrt{n}} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) \cdot (\frac{n + 1}{2} - \frac{n + 1}{2})

= \frac{1}{\sqrt{n}} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) \cdot 0

= 0

Pour la variance de L,

V(L) = V(\frac{1}{\sqrt{n}} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) \cdot (\overline{R|_{Y = k} - \frac{n + 1}{2}}))

= \frac{1}{n} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) ^2 \cdot V(\overline{R|_Y = k} - \frac{n + 1}{2})

Or, par propriété de la variance, nous avons,

V(L) = \frac{1}{n} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) ^2 \cdot V(\overline{R|_{Y = k}}))

= \frac{1}{n} \sum_{k = 1} ^K (k - \frac{K + 1}{2}) ^2 \cdot \frac{n (n + 1)}{12 n_k}

= \frac{n + 1}{12} \sum_{k = 1} ^K \frac{1}{n_k} (k - \frac{K + 1}{2}) ^2

– Calcul de E[L] et V(L) dans le cas apparié:

Pour l’espérance de L,

E[L] = E[\sum_{t = 1} ^T \sum_{i = 1} ^n R_i ^t

= \sum_{t = 1} ^T E[t \cdot \sum_{i = 1} ^n R_i ^t]

= \sum_{t = 1} ^T t E[\sum_{i = 1} ^n R_i ^t]

= \sum_{t = 1} ^T t \cdot n E[R_i ^t]

= \frac{T(T + 1)}{2} \cdot n \cdot E[R_i ^t]

Or, R_i ^t suit une loi uniforme, par conséquent,

E[L] = \frac{T(T + 1)}{2} \cdot n \cdot \frac{T + 1}{2}

= \frac{n T (T + 1) ^2}{4}

Pour la variance de L,

V(L) = V(\sum_{t = 1} ^T t \sum_{i = 1} ^n R_i ^t)

= \sum_{t = 1} ^T V(t \cdot \sum_{i = 1} ^n R_i ^t) + 2 \sum_{1 < t_1 < t_2 < T} t_1 \cdot t_2 \cdot cov(R_i ^{t_1}, R_i ^{t_2})

Or, sous H_0, nous avons l’indépendance des R_i ^T, t \in [1, \cdots T]. Soit,

V(L) = \sum_{t = 1} ^T t ^2 V(\sum_{i = 1} ^n R_i ^t) + 0

= \sum_{t = 1} ^T t ^2 n V(R_i ^t)

= n \cdot  \frac{T (T ^2 - 1)}{24 (2 T + 1)} \cdot \frac{T (T + 1) (2 T + 1)}{6}

= n \frac{T ^2 (T ^2 - 1) (T + 1)}{144}

= n \frac{T ^2 (T ^2 - 1) (T + 1) (T - 1)}{144 (T - 1)}

= n \frac{T ^2 (T ^2 - 1) ^2}{144 (T - 1)}

\bullet Exemple:

Cas pour données non appariées

Soit l’échantillon ci-dessous:

add

Les boxplots suivants offrent une visualisation plus concrète de notre jeu de données:

addCette représentation des données permet de voir que les distributions de nos 3 groupes sont sensiblement les mêmes. Prouvons le statistiquement.

Dans un premier temps, présentons les rangs de X en fonction des différents groupes de Y,

R|_{Y = 1} = (12, 13, 2, 14, 9, 1, 5) \Rightarrow \overline{R|_{Y = 1}} = 8

R|_{Y = 2} = (8, 17, 19, 4, 20, 16) \Rightarrow \overline{R|_{Y = 2}} = 14

R|_{Y = 3} = (7, 11, 3, 6, 15, 10, 18) \Rightarrow \overline{R|_{Y = 1}} = 10

Avant de calculer la statistique de test de Page pour données non appariées, déterminons le numérateur L et le dénominateur V(L).

Pour le numérateur,

L = \frac{1}{\sqrt{20}} \times \sum_{k = 1} ^3 (k - \frac{3 + 1}{2}) \times (\overline{R_{Y = k}} - \frac{20 + 1}{2})

= 0.2236068 \times [(1 - 2) \times (8- 10.5) + (2 - 2) \times (14 - 10.5) + (3 - 2) \times (10 - 10.5)]

= 0.2236068 \times [2.5 + 0 - 0.5]

= 0.2236068 \times 32.285717

= 0.4472136

Pour le dénominateur,

V(L) = \frac{20+1}{12} \times \sum_{k = 1} ^3 \frac{1}{n_k} \times (k - \frac{3 + 1}{2}) ^2

= 1.75 \times [\frac{(1 - 2) ^2}{7} + \frac{(2 - 2) ^2}{6} + \frac{(3 - 2) ^2}{7}]

= 1.75 \times [0.1428571 + 0 + 0.1428571]

= 1.75 \times 0.2857142

= 0.5

Désormais, calculons la statistique de test de Page,

Z = \frac{0.4472136}{\sqrt{0.5}} = 0.6324555

Si nous reportons cette valeur à la table de la loi normale centrée-réduite, nous obtenons une p-valeur de 0.2635446. Nous en concluons que nous ne pouvons rejeter H_0 et donc qu’il n’y a pas de relation linéaire entre X et Y.

Cas pour données appariées

Soit les cinq échantillons appariés X ^1, X^2, X ^3, X ^4, X ^5 suivants.

add

Ci-dessous, les boxplots associés à (X ^1, X ^2, X ^3, X ^4, X ^5).

add

Les boxplots montrent que X varie énormément en fonction du temps t \in \lbrace 1, \cdots, 5 \rbrace. Prouvons-le statistiquement.

Dans un premier temps, nous déterminons le tableau des rangs en ligne associés à X ^1, X ^2, X ^3, X ^4, X ^5,

add

Nous pouvons calculer les différentes sommes des rangs,

\sum_{i = 1} ^{20} R_i ^{t_1} = 65

\sum_{i = 1} ^{20} R_i ^{t_2} = 46

\sum_{i = 1} ^{20} R_i ^{t_3} = 43

\sum_{i = 1} ^{20} R_i ^{t_4} = 75

\sum_{i = 1} ^{20} R_i ^{t_5} = 71

Nous avons alors,

L = \sum_{t = 1} ^5 t \times \sum_{i = 1} ^{20} R_i ^t = 1 \times 65 + 2 \times 46 + 3 \times 43 + 4 \times 75 + 5 \times 71 = 941

Si nous reportons cette statistique de test à la table de la loi de Page pour (5, 20) degrés de liberté, nous trouvons une p-valeur de 0.03496 < 5 \%. Nous concluons au rejet de H_0 et en l’influence linéaire du temps t sur X.

\bullet Application informatique:

Procédure SAS:

– Pour données non appariées:

%macro PageTest_nonApp(DATA=,X=,Y=);

/* La macro PageTest_nonApp applique la version pour données non appariées du test de Page sur la base de données DATA en spécifiant quel est la variable continue/ordinale X et la variable classe Y */

/* Options pour simplifier la log */    
options nonotes spool;
ods noresults;

/* Récupération de l’effectif de la population totale n */
proc sql;
select count(*) into: n from &DATA.;
quit;

/* Récupération des rangs de X */
proc rank data = &DATA. out = DATA_r;
ranks &X._r;
var &X.;
run;

/* Trie par rapport à la variable classe Y afin de pouvoir calculer les moyennes des rangs */
proc sort data = DATA_r;
by &Y.;
run;

/* Calcul des moyennes des rangs par classe de Y */
proc means data = DATA_r;
var &X._r;
by &Y.;
output out = stats;
run;

/* Nettoyage de la table des statistiques nécessaires au calcul du L de Page */
data stats;
set stats;
if _stat_ in (« N » « MEAN »);
keep &Y. _stat_ &X._r;
run;

/* Transposition de la table afin de pouvoir automatiser le calcul du L de Page et de la variance de L */
proc transpose data = stats out = stats;
by &Y.;
id _stat_;
var &X._r;
run;

/* Récupération du nombre de classe K de Y */
proc sql;
select count(*) into: K from stats;
quit;

/* Calcul des différents termes de la L et de la variance de L en fonction de la classe k de Y considérée */
data stats;
set stats;
L = (_n_ – (&K. + 1)/2) * (MEAN – (&n. + 1)/2);
V = (1/N) * (_n_ – (&K. + 1)/2)**2;
run;

/* Somme des différents termes pour obtenir le L de Page et sa variance */
proc sql;
select sum(L) into: L from stats;
select sum(V) into: V from stats;
quit;

/* Construction de la table des résultats finaux */
data resultats;
Var = « &X. »;
poop = &n.;
L = (1/sqrt(&n.)) * &L.;
V = &V. * (&n. + 1)/12;
Z = L/sqrt(V);
p = 1-cdf(« normal »,Z,0,1);
drop V;
run;

/* Suppression des tables temporaires et inutiles */
proc datasets lib = work nolist;
delete data_r stats;
run;

/* Reset options */
options notes nospool;
ods results;

%mend;

– Pour données appariées:

%macro PageTest_App(DATA=);

/* La macro PageTest_App applique la version pour données appariées du test de Page sur la matrice de données DATA qui doit être de format continue ou ordinale */

/* Options pour simplifier la log */    
options nonotes spool;
ods noresults;

/* Récupération de l’effectif total n */
proc sql;
select count(*) into: n from &DATA.;
quit;

/* Récupération du nombre de traitements T */
proc contents data = &DATA. out = nb_T;
run;

/* Mise dans des macro-variables du nom des traitements et du nombre total de traitements */
proc sql;
select distinct(name) into: list_T separated by  »  » from nb_T;
select count(*) into: nb_T from nb_T;
quit;

/* Initialisation de la matrice des rangs en ligne */
data Mat_rank;
run;

/* Calcul des rangs en ligne de manière itérative pour chaque observation/block/ligne */
%do i = 1 %to &n.;

/* Restriction de la base de données à la ligne en cours de gestion */
data R;
set &DATA.;
if _n_ = &i.;
run;

/* Afin de pouvoir appliquer la procédure rank, transposition de la ligne en cours de gestion */
proc transpose data = R out = R;
run;

/* Calcul des rangs pour la ligne en cours de gestion */
proc rank data = R out = R;
ranks R;
var COL1;
run;

/* Nettoyage de la ligne en cours de gestion */
data R;
set R;
drop COL1;
run;

/* Re-transposition de la ligne en cours de gestion pour pouvoir construire la matrice des rangs */
proc transpose data = R out = R;
run;

/* Ajout de la ligne en cours de gestion à la matrice des rangs */
data Mat_rank;
set Mat_rank R;
run;

%end;

/* Calcul du rang moyen pour les différentes rangs des traitements */
proc means data = Mat_rank (drop = _name_ _label_) sum;
var _all_;
ods output summary = resultats;
run;

/* Construction de la table de résultats regroupant la population n, le nombre de traitements nb_T, la statistique de test de Page L et la p-valeur du test lorsque n est suffisamment grand */
data resultats;
set resultats;
L = 0;
%do t = 1 %to &nb_T.;
L = L + &t. * %scan(&list_T.,&t.)_sum;
%end;
nb_T = &nb_T.;
E = (1/4) * &n. * &nb_T. * (&nb_T. + 1) **2;
V = (&n. * (&nb_T. **2) * ((&nb_T. **2) + 1) **2)/(144 *  (&nb_T. – 1));
Z = (L – E)/sqrt(V);
p_Z = 1-cdf(« normal »,Z,0,1);
Pop = &n.;
keep nb_T Pop L Z p_Z;
run;

/* Suppression des tables temporaires et inutiles */
proc datasets lib = work nolist;
delete nb_T mat_rank R;
run;

/* Reset options */
options notes nospool;
ods results;

%mend;

Package et fonction R:

– Pour données non appariées:

PageTest_nonApp = function(DATA) {

# Reformatage de la base pour s’assurer que le programme se déroule correctement
DATA = na.omit(DATA)
DATA = as.data.frame(DATA)
DATA[,1] = as.factor(DATA[,1])

# Récupération du nombre d’observations
n = dim(DATA)[1]

# Récupération des informations liées aux différentes classes de Y
Ybiblio = summary(DATA[,1])
K = length(Ybiblio)

# Transformation en rang des données
R = rank(DATA[,2])

# Initialisation du calcul de L et de la variance de L
mR = mean(R[which(DATA[,1]==names(Ybiblio)[1])])
L = (1 – (K + 1)/2) * (mR – (n + 1)/2)
V = (1/Ybiblio[1]) * (1 – (K + 1)/2) ^2

# Calcul de L et de la variance de L
for (k in 2:K) {
mR = mean(R[which(DATA[,1]==names(Ybiblio)[k])])
L = L + (k – (K + 1)/2) * (mR – (n + 1)/2)
V = V + (1/Ybiblio[k]) * (k – (K + 1)/2) ^2
}

# Dernière étape de calcul de L et de la variance de L
L = L * (1/sqrt(n))
V = V * (n + 1)/12

# Calcul de la statistique de test
Z = L/sqrt(V)

# Calcul de la p-valeur
p = pnorm(Z,0,1,lower.tail=FALSE)

# Mise au propre des résultats du test de Page pour données non appariées
Resultats = data.frame(Nom = names(DATA)[2],Pop = n, L = L, Z = Z, p_value = p)
return(Resultats)

}

– Pour données appariées: http://www.inside-r.org/node/228946

\bullet Bibliographie:

– Ordered hypotheses for multiple treatments: A significance test for linear ranks de E. B. Page

– Comparaison de populations. Tests non paramétriques de Ricco Rakotomalala