Ce test est plus naturel que celui du
lorsque la loi attendue
a une fonction de répartition continue. Soit X une v.a. réelle dont la loi a une fonction
de répartition continue F et X1, X2,..., Xm, m réalisations indépendantes
d'un processus dont on suppose qu'il suit la même loi que X (on cherche à tester
cette hypothèse). Le test consiste à mesurer l'écart
entre la fonction de répartition exacte et la fonction de répartition
empirique :
![]()

![]()
![]()

![]()
![]()
![]()
Nous allons illustrer ce test sur le processus stochatisque suivant (où U désigne la loi uniforme sur [0,1]) :

![]()
function [X] = pont_brownien(t,n) // X = sum(bool2s(grand(n,1,"def") <= t) - t)/sqrt(n)Voici maintenant un script possible, qui, après m simulations du processus, affiche le graphe de la fonction de répartition empirique puis lui superpose celui de la fonction de répartition attendue et finalement effectue le test statistique :
// Le pont Brownien
// Petite simulation pour illustrer que : Xn(t) --> N(0,t(1-t)) pour n -> infini
//
// où Xn(t) = somme_{i=1}^n ( 1_(Ui <= t) - t ) /sqrt(n)
//
t = 0.3;
sigma = sqrt(t*(1-t)); // l'écart type attendu
n = 1000; // n "grand"
m = 4000; // le nb de simulations
X = zeros(m,1); // initialisation du vecteur des realisations
for k=1:m
X(k) = pont_brownien(t,n); // la boucle pour calculer les realisations
end
repartition_empirique(X) // le dessin de la fonction de repartition empirique
x = linspace(min(X),max(X),60)'; // les abscisses et
[P,Q]=cdfnor("PQ",x,0*ones(x),sigma*ones(x)); // les ordonnees pour la fonction exacte
plot2d(x,P,2,"000") // on l'ajoute sur le dessin initial
// mise en place du test KS
alpha = 0.05
X = - sort(-X); // tri
FX = cdfnor("PQ",X,0*ones(X),sigma*ones(X));
Dplus = max( (1:m)'/m - FX );
Dmoins = max( FX - (0:m-1)'/m );
Km = sqrt(m)*max([Dplus ; Dmoins]);
K_seuil = sqrt(log(1/alpha)/2) - 1/(6*sqrt(m)) ;
// affichage des resultats
//
write(%io(2)," Test KS : ")
write(%io(2)," -------- ")
write(%io(2)," valeur obtenue par le test : "+string(Km))
write(%io(2)," valeur seuil a ne pas depasser : "+string(K_seuil))
if (Km > K_seuil) then
write(%io(2)," Conclusion provisoire : Hypothese rejetee !")
else
write(%io(2)," Conclusion provisoire : Hypothese non rejetee !")
end
Voici les résultats obtenus avec n=1000 et m = 4000 (cf figure(5.6)) :
Test KS : -------- valeur obtenue par le test : 1.1204036 valeur seuil a ne pas depasser : 1.2212382 Conclusion provisoire : Hypothese non rejetee !
Pour finir nous allons, pour n fixé, dessiner la courbe
. Il est
assez simple de voir, qu'après le tri croissant des Ui (en supposant aussi les
Ui tous distincts et différents de et 1 et en posant U0 = 0 et Un+1 = 1)
que :
![]()
function [] = dessin_pont_brownien(n) // U = -sort(-rand(1,n)) Xbas = ((0:n-1) - n*U)/sqrt(n) Xhaut = ((1:n) - n*U)/sqrt(n) absc = [0 ; matrix([U ; U], 2*n, 1) ; 1] ord = [0 ; matrix([Xbas ; Xhaut], 2*n, 1) ; 0] xbasc() plot2d(absc,ord)La figure (5.7) montre une courbe obtenue avec n=10000 avec 3 zooms successifs qui peuvent laisser entrevoir le caractère fractal de la << courbe limite >>.