Introduction aux tests nonparamétriques

Aujourd’hui, on va commencer la partie du cours sur les tests, avec une introduction par les tests non-paramétriques. On parlera (dans la continuité de ce qu’on a fait jusqu’à présent) de tests d’ajustement de lois, mais aussi de tests plus divers, comme des tests d’indépendance (entre observations successives).

Le test le plus classique est le test des signes. L’idée est de regarder puis de compter le nombre de fois où https://latex.codecogs.com/gif.latex?X_{i-1}\leq%20X_i (différence positive) et le nombre de fois où https://latex.codecogs.com/gif.latex?X_{i-1}\leq%20X_i (différence négative).

> (X=rnorm(20))
 [1]  0.81352495  0.78076709 -0.58654359  0.52805014 -0.31101282 -0.65022034 -0.93619729 -0.16483729 -1.97396753 -0.22506985  1.14959851 -0.38895448 -0.09298421
> (S=c("N","P")[1+1*(diff(X)>0)])
 [1] "N" "N" "P" "N" "N" "N" "P" "N" "P" "P" "N" "P" "P" "N" "P" "N" "P" "P" "N"

On verra ce test en cours. On peut par exemple compter le nombre de fois où la différence était positive,

> sim=function(a=0){
+ n=100
+ epsilon=X=rnorm(n)
+ for(t in 2:n) X[t]=a*X[t-1]+epsilon[t]
+ S=c("N","P")[1+1*(diff(X)>0)]
+ return(sum(S=="P"))}

(je fais ici une fonction un peu plus compliqué pour voir ce qui se passe si les données ne sont pas indépendantes, justement). Si on génère plein d’échantillons, on peut voir que le nombre de variations positives suit une loi normale, si les observations sont effectivement indépendantes,

> library(ggplot2)
> set.seed(1)
> vectS=unlist(lapply(rep(0,1000),sim))
> ggplot(data=data.frame(vectS = vectS), 
+ aes(x = vectS)) +
+ geom_histogram(aes(y = ..density..),
+ binwidth = 1, fill = "light blue", 
+ col = "black") +
+ stat_function(fun=function(x) dnorm(x,
+ (n-1)/2+.5,sqrt((n+1)/12)),
+ col = "red", size = 1) + ylab("Densite") +
+ ggtitle("Histogramme")

Ce qui est assez différent de ce qu’on observe avec une marche aléatoire,

> set.seed(1)
> vectS=unlist(lapply(rep(1,1000),sim))
> ggplot(data=data.frame(vectS = vectS), 
+ aes(x = vectS)) +
+ geom_histogram(aes(y = ..density..),
+ binwidth = 1, fill = "light blue", 
+ col = "black") +
+ stat_function(fun=function(x) dnorm(x,
+ (n-1)/2+.5,sqrt((n+1)/12)),
+ col = "red", size = 1) + ylab("Densite") +
+ ggtitle("Histogramme")

Mais il existe des dizaines d’autres tests, toujours pour tester la même hypothèse (d’échantillon indépendant). Par exemple, ce test avait été utilisé dans les matchs de basketball, How common are “runs” in the NBA?.

L’idée est simple: on va regarder la longueur des séquences d’accroissements positifs, ou négatifs.

> a=0
> n=10000
> epsilon=X=rnorm(n)
> for(t in 2:n) X[t]=a*X[t-1]+epsilon[t]
> S=c(-1,+1)[1+1*(diff(X)>0)]
> id=which(diff(S)!=0)
> run=abs(diff(c(0,cumsum(S)[id])))
> table(run)
run
   1    2    3    4    5    6 
4141 1771  542  144   19    3

que l’on peut visualiser

> ggplot(data=data.frame(run = run), aes(x =run)) +
+ geom_histogram(aes(y = ..density..),
+ binwidth = 1, fill = "light blue")+
+ ylab("Densite") +
+ ggtitle("Histogramme")

alors que dans le cas d’une marche aléatoire,

> a=1
> n=10000
> epsilon=X=rnorm(n)
> for(t in 2:n) X[t]=a*X[t-1]+epsilon[t]
> S=c(-1,+1)[1+1*(diff(X)>0)]
> id=which(diff(S)!=0)
> run=abs(diff(c(0,cumsum(S)[id])))
> table(run)
run
   1    2    3    4    5    6    7    8    9   10   11   12   13 
2429 1240  638  330  149   83   29   20   13    5    4    2    1

On peut aussi

> sim=function(a=0){
+ n=100
+ epsilon=X=rnorm(n)
+ for(t in 2:n) X[t]=a*X[t-1]+epsilon[t]
+ S=c(-1,+1)[1+1*(diff(X)>0)]
+ id=which(diff(S)!=0)
+ run=diff(c(0,cumsum(S)[id]))
+ return(sum(run>0))}  
> set.seed(1)
> vectR=unlist(lapply(rep(1,500),sim))
> ggplot(data=data.frame(vectR = vectR), aes(x = vectR)) +
+ geom_histogram(aes(y = ..density..),
+ binwidth = 1, fill = "light blue",
+ col = "black") +
+ geom_line(stat="density", col = "red", size = 1) + ylab("Densite") +
+ ggtitle("Histogramme")

On reviendra sur cette idée de tests non-paramétriques; et je parlerais aussi du devoir, qui visera à comprendre et expliquer un test particulier.


Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.