Tag Archives: test

Dominance stochastique, ordre 1 ou ordre 2 ?

Mercredi dernier, on commençait le cours avec une présentation rapide du test de Wilcoxon-Mann-Whitney (parfois appelé test de la somme des rangs, de Wilcoxon). Ce test a été proposé par Frank Wilcoxon en 1945, et (presque en même temps) par Henry Mann et Donald Whitney (en 1947), dans un article intitulé On a Test of Whether one of Two Random Variables is Stochastically Larger than the Other. Le titre est clair. Ce test (non paramétrique) a vocation à tester l’hypothèse selon laquelle la distribution dans deux échantillons est la même. Ou, pour reprendre les notations du derniers billets, la distribution est la même dans deux groupes.

Autrement dit, on va chercher à tester, ici, https://latex.codecogs.com/gif.latex?H_0:F=G, au sens où https://latex.codecogs.com/gif.latex?H_0:\forall%20x,F(x)=G(x). Dans le test de Kolmogorov Smirnov, l’hypothèse alternative est https://latex.codecogs.com/gif.latex?H_1:\exists%20x,F(x)\neq%20G(x).

Ici, comme le notent d’ailleur Mann et Whitney, “the test is shown to be consistent with respect to the class of alternatives https://latex.codecogs.com/gif.latex?F(x)%3EG(x) for every https://latex.codecogs.com/gif.latex?x“. Cette propriété est un peu particulière, et correspond à la notion de dominance stochastique à l’ordre 1. https://latex.codecogs.com/gif.latex?F\preceq_1%20Gcorrespond à https://latex.codecogs.com/gif.latex?F(x)\geq%20G(x) https://latex.codecogs.com/gif.latex?\forall%20x, ou encore, pour tout fonction https://latex.codecogs.com/gif.latex?u(\cdot) croissante, si https://latex.codecogs.com/gif.latex?\mathbb{E}[u(X)]\leq\mathbb{E}[u(Y)] avec https://latex.codecogs.com/gif.latex?X\sim%20F et https://latex.codecogs.com/gif.latex?Y\sim%20G.

Mais regardons un peu le test. On considère deux populations https://latex.codecogs.com/gif.latex?\boldsymbol{x}=\{x_1,\cdots,x_{n_x}\} et https://latex.codecogs.com/gif.latex?\boldsymbol{y}=\{y_1,\cdots,y_{n_y}\}. L’idée est de réordonner les https://latex.codecogs.com/gif.latex?(n_x%20+%20n_y) éléments de https://latex.codecogs.com/gif.latex?\boldsymbol{z}=\boldsymbol{x}\cup\boldsymbol{y} par ordre croissant. On note https://latex.codecogs.com/gif.latex?\boldsymbol{r} le vecteur des rangs associés. Soit https://latex.codecogs.com/gif.latex?S_x la somme des https://latex.codecogs.com/gif.latex?n_x (premiers) rangs des éléments de https://latex.codecogs.com/gif.latex?\boldsymbol{x}, i.e. https://latex.codecogs.com/gif.latex?S_x=r_1+\cdots+r_{n_x}.

Comme l’ont montré Wilcoxon, Mann et Whitney, sous https://latex.codecogs.com/gif.latex?H_0, https://latex.codecogs.com/gif.latex?S_x suit une “loi connue”, où classiquement, “connue” veut dire tabulée pour de petits échantillons, et pour des échantillons plus grands.

Histoire d’illustrer, considerons deux échantillons, tirés suivant deux lois https://latex.codecogs.com/gif.latex?F et https://latex.codecogs.com/gif.latex?G avec https://latex.codecogs.com/gif.latex?F\preceq_1%20G, par exemple deux lois normales de moyennes différentes (et de même variance)

> u=seq(-3,4,length=251)
> plot(u,pnorm(u,0,1),col="red",type="l")
> lines(u,pnorm(u,.5,1),col="darkblue")

Effectivement, nos deux fonctions de répartition sont ordonnées, et on est bien dans une situation de dominance stochastique à l’ordre 1. Les densité sont ici

>plot(u,dnorm(u,0,1),col="red",type="l")
>lines(u,dnorm(u,.5,1),col="darkblue")

On peut générer 10,000 paires d’échantillons, de taille 100 (respectivement), et regarder la distribution de https://latex.codecogs.com/gif.latex?S_x (et celle de https://latex.codecogs.com/gif.latex?S_y).

> P=matrix(NA,1e4,3)
> for(i in 1:1e4){
+  x=c(rnorm(100,0,1),rnorm(100,.5,1))
+  P[i,1:2]=c(sum(rank(x)[1:100]),sum(rank(x)[101:200]))
+  x0=c(rnorm(100,0,1),rnorm(100,0,1))
+  P[i,3]=  sum(rank(x0)[1:100])
+}
> plot(density(P[,1]),col="red"))
> lines(density(P[,2]),col="darkblue")
> lines(density(P[,3]),lty=2)

Sous https://latex.codecogs.com/gif.latex?H_0, la somme aurait eu la distribution avec les pointillés. On en est manifestement assez loin, autrement dit, on va rejeter ici l’hypothèse de lois égales, https://latex.codecogs.com/gif.latex?H_0:F=G.

Intuitivement, c’est normal, car effectivement, les rangs dans un cas sont – en moyenne – plus faibles que pour l’autre,

Au lieu de simuler des lois dominées, à l’ordre 1, on peut tenter des lois dominées à l’ordre 2. Rappelons que https://latex.codecogs.com/gif.latex?F\preceq_2%20G signifie

https://latex.codecogs.com/gif.latex?\int_{-\infty}^x%20F(t)dt%20\geq\int_{-\infty}^x%20G(t)dt,\forall%20x

ou encorehttps://latex.codecogs.com/gif.latex?\mathbb{E}[u(X)]\leq\mathbb{E}[u(Y)]

avec https://latex.codecogs.com/gif.latex?X\sim%20F et https://latex.codecogs.com/gif.latex?Y\sim%20G. où https://latex.codecogs.com/gif.latex?u(\cdot) est unne fonction croissante et concave.

En gestion des risques (ou sur les inégalités), on va supposer en plus que https://latex.codecogs.com/gif.latex?\mathbb{E}[X]=\mathbb{E}[Y], ce qui correspond à une notion de “mean preserving spread” (on peut relire le document sur la notion de
single crossing, par Alain Chateauneuf). Une caractérisation est

https://latex.codecogs.com/gif.latex?\mathbb{E}[u(X)]\leq\mathbb{E}[u(Y)]https://latex.codecogs.com/gif.latex?X\sim%20F et https://latex.codecogs.com/gif.latex?Y\sim%20G. où https://latex.codecogs.com/gif.latex?u(\cdot) est concave. Une caractérisation alternative est https://latex.codecogs.com/gif.latex?Y=X+\varepsilon avec https://latex.codecogs.com/gif.latex?\mathbb{E}[\varepsilon\vert%20X]=0 (on pourra relire Rothschild et Stiglitz, Increasing Risk: A Definition)

Dans le cas des lois normales, on a cette notion de ‘mean preserving spread’ lorsque les moyennes sont identiques, mais pas les variances. On a alors plus de dispersion,

> u=seq(-4,4,length=251)
> plot(u,pnorm(u,0,1),col="red",type="l")
> lines(u,pnorm(u,0,1.5),col="darkblue")

Effectivement, nos deux fonctions de répartition sont ordonnées, et on est bien dans une situation de dominance stochastique à l’ordre 2, avec du single crossing. Les densités sont ici

> plot(u,dnorm(u,0,1),col="red",type="l")
> lines(u,dnorm(u,0,1.5),col="darkblue")

On peut générer 10,000 paires d’échantillons, de taille 100 (respectivement), et regarder la distribution de https://latex.codecogs.com/gif.latex?S_x (et celle de https://latex.codecogs.com/gif.latex?S_y).

> P=matrix(NA,1e4,3)
> for(i in 1:1e4){
+  x=c(rnorm(100,0,1),rnorm(100,0,1.5))
+  P[i,1:2]=c(sum(rank(x)[1:100]), sum(rank(x)[101:200]))
+  x0=c(rnorm(100,0,1),rnorm(100,0,1))
+  P[i,3]=  sum(rank(x0)[1:100])
+}
> plot(density(P[,1]),col="red"))
> lines(density(P[,2]),col="darkblue")
> lines(density(P[,3]),lty=2)

Autrement dit, ici les sommes des rangs sont identiques, avec les deux échantillons,  et donc on aura tendance à accepter ici l’hypothèse de lois égales, https://latex.codecogs.com/gif.latex?H_0:F=G. L’idée naturelle est que avec les dans le premiers cas, effectivement, on avait plus de petits rangs avec le petit échantillon. Mais plus ici: le fait d’avoir plus de dispersion fait qu’on a en même temps plus de petits, et plus de grands. Et en moyenne, ça ne change rien

Interpréter un test de Wald

Jeudi, dans le cadre du cours de statistique mathématiques, nous avions passé un peu de temps à mettre en oeuvre le test de Wald, et discuter la construction et l’interprétation d’un test. On reste ici sur un test paramètrique. La vraie valeur du paramètre, on va la fixer, pour générer des données

> p=.5

En l’occurence, on va considérer un modèle de Bernoulli, i.e. une succession de tirages de pièces (pile ou face)

> n=20
> set.seed(1)
> echantillon=sample(c("pile","face"),
+    size=n,replace=TRUE,
+    prob=c(p,1-p))
> echantillon
[1] "face" "face" "pile" "pile" "face" "pile" "pile" "pile" "pile" "face" "face" "face" "pile" "face" "pile" "face" "pile" "pile" "face" "pile"

Classiquement, on va recoder en https://latex.codecogs.com/gif.latex?\{0,1\}

> X=(echantillon=="pile")*1
> X
[1] 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1

La vraisemblance est ici donnée par

> L=function(p) prod(dbinom(X,1,p))
> logL=function(p) sum(log(dbinom(X,1,p)))
> xp=seq(0,1,by=.01)
> yL=Vectorize(L)(xp)
> plot(xp,yL,type="l")

mais on va plutôt travailler sur la log-vraisemblance

> ylogL=Vectorize(logL)(xp)
> plot(xp,ylogL,type="l")

Continue reading Interpréter un test de Wald

Niveau et puissance de test (paramétrique)

Lors du dernier cours de statistique, nous avons vu comme se construisent des tests, et comment on compare leur puissance. Considérons pour cela des observations  tirées suivant une loi uniforme . Et on se pose la question de savoir si l’hypothèse est rejetée, ou acceptée, avec par exemple. L’hypothèse alternative sera ici le complémentaire, autrement dit .

Comme on l’a vu, la construction d’un test se fait en utilisant une statistique de test (ou plus simplement un estimateur du paramètre inconnu), avec . On prend la décision (consistant à rejeter ) si , et la décision (consistant à ‘accepter’ ) si .

Le risque d’erreur de première espèce est basé sur . Si l’hypothèse est une hypothèse simple , le risque d’erreur de première espèce est https://latex.codecogs.com/gif.latex?\alpha=\mathbb{E}[\psi(\boldsymbol{X})\vert%20X_1,\cdots,X_n\sim%20F_{\theta_0}], soit pour un seuil . On va déterminer le seuil de manière à ce que le risque de première espèce soit 5%.

Pour cela, il nous fait un estimateur dont on connaîtrait la loi. Commençons par l’estimateur du maximum de vraisemblance. Rappelons que l’estimateur du maximum de vraisemblance est . Nous avons vu – dans la section sur les statistiques d’ordre – que

pour . Aussi, pour un seuil ,

pour . Le risque de première espèce

soit

qui atteindra son maximum en . Aussi

soit . Les régions d’acceptation et de rejet sont les suivantes,

Continue reading Niveau et puissance de test (paramétrique)

Statistical Tests: Asymptotic, Exact, ou based on Simulations?

This morning, in our mathematical statistics course, we’ve been discussing the ‘proportion test‘, i.e. given a sample of Bernoulli trials, with , we want to test

against 

A natural test (which can be related to the maximum likelihood ratio test) is  based on the statistic

The test function is here

To get the bounds of the acceptance region, we need the distribution of , under . Consider here a numerical application

n=20
p=.5
set.seed(1)
echantillon=sample(0:1,size=n,
            prob=c(1-p,p),
            replace=TRUE)
  • the asymptotic distribution

The first (and standard idea) is to use the central limit theorem, since

So, under ,

Then  while . The acceptance region is then between the two red lines, below,

T=sqrt(n)*(mean(echantillon)-.5)/
  sqrt(mean(echantillon)*
  (1-mean(echantillon)))
u=seq(-3,3,by=.01)
v=dnorm(u)
plot(u,v,type="l",lwd=2)
abline(v=qnorm(.025),col="red")
abline(v=qnorm(.975),col="red")
abline(v=T,col="blue")

  • the exact distribution

Here we use the fact that

Using transformation of the ‘density’, we can (at least numerically) compute the (exact) distribution of

 

u=seq(-3,3,by=.01)
v=sqrt(.5*(1-.5))*n*dbinom(round(
  (sqrt(.5*(1-.5))*u/sqrt(n)+.5)*n),
  size=n,prob=.5)/sqrt(n)

Here I used a round value, it guess it would be better with a floor function, but here the graph looks symmetric (which is something I like)

abline(v=sqrt(n)*(qbinom(.025,size=n,prob=.5)/n-.5)/sqrt(.5*(1-.5)),col="red")
abline(v=sqrt(n)*(qbinom(.975,size=n,prob=.5)/n-.5)/sqrt(.5*(1-.5)),col="red")
lines(u,v,type="s")

  • distribution based on Monte Carlo simulations

Probably more interesting, here we do not use the fact that we might know the distribution of the mean. We just generate random samples, under , and then compute ,

T=rep(NA,1000)
for(i in 1:1000){
x=sample(0:1,size=n,
         prob=c(1-.5,.5),
         replace=TRUE)
m=mean(x)
T[i]=(m-.5)/sqrt(m*(1-m))*sqrt(n)}
lines(density(T),lwd=2)
abline(v=quantile(T,.025),col="red")
abline(v=quantile(T,.975),col="red")

Where does that 2 come from in the likelihood ratio test?

This afternoon, in class, we’ve seen Wald test, the likelihood-ratio test, and finally the score test. All of them rely on the same idea

and then, use that if   with , we can write

Or – slightly more interesting – if  , then

Then one can get that

Based on that property, we can derive Wald statistics,

that can be visualized below

The score test is a test on the square of the slope

The idea for the likelihood ratio test is to consider

Observe that  can be written, using Taylor’s expansion

for some . The first term is null, since the maximum likelihood estimator is precisely at the maximum of the (log) likelihood. So

That’s more or less where the 2 comes from. Then observe that

and therefore

This test will be discussed further next week (since it is related to Neyman-Pearson’s theorem), but also, that result can be used to derive confidence intervals. With a log-likelihood as follows

it is possible to get a confidence interval for the parameter by looking for‘s such that

We will discuss that idea later on, in the context of profile likelihood.

Tests, Power and Significance

In the mathematical statistics course today, we started talking about tests, and decision rules. To illustrate all the concepts introduced today, we considered the case where we have a sample  with . And we want to test

  against 

In the course, we’ve seen that we could use a test based on the order statistics .  The test would be

i.e. if  we choose , and if , we choose .

From the definition of the first order risk,

we can easily get that

Thus, the power is then

To visualize it, use the following parameters

n=5
alpha=.1
theta0=1

Then

C1=theta0*(1-alpha)^(1/n)
theta=seq(0,2,by=.01)
P1=(1-(theta0/theta)^n*(1-alpha))*(theta>C1)
plot(theta,P1,type="l",lwd=2,col="blue",xlab="",ylab="Power")

Note that, so far, we did never consider the maximum of our sample. Assume that the maximum is , then we can compute the -value,

Here it is

PV=(1-theta^n)*(theta<=1)
plot(theta,PV,type="l",lwd=2,col="blue",xlab="",ylab="p-value")

Now, why not consider another test, based on the minimum (since we have the distribution of the minimum of a sample from a uniform distribution). The test is the same as before

but here, the threshold is

The power of the test is here

This test has the same significance level (by construction), but the power of the test is clearly lower than the one we got using the maximum of our sample, when 

C2=theta0*(1-alpha^(1/n))
P2=(1-(theta0/theta)*(1-alpha^(1/n)))^n*(theta>C2)
lines(theta,P2,type="l",lwd=2,col="red")

Why not consider a test based on ? The problem is that we need the distribution (more specifically the survival distribution) of . We can compute it, numerically. But that might be painful. An alternative is to consider some approximation, based on the central limit theorem, i.e.

Our test is based on , and to get the same significance as before, use

The power of the test is then

Here it is

mu=2*(theta0/2)
s2=2^2*(theta0^2/12)/n
C3=qnorm(1-alpha,mu,sqrt(s2))
(P=1-pnorm(C3,theta,sqrt(s2)))*(theta>C3)
lines(theta,P)

Observe here that the test based on the maximum is not more powerful than the one based on the average (I just wonder if it could be due to the Gaussian approximation…).

Dear reader, who are you?

While working on an updated (not to say revised) version of Blogging in Academia, a Personal Experience, I noticed that I now have a better understanding of me as a blogger (this academic alter-ego, to use Vanessa Paz Dennen’s words), the role of blogs within academia, and the community of academic-bloggers. But tonight, in the train, I was asking myself about the readers. I mean You. I know from the stats of my blog that a few thousand people will read this post, that you are 32% American, 21% French, 6% Brazilian and 3% Swedish. That it is quite unlikely that you use a Linux computer. But I don’t know much more…

Since I have always claimed that my blog was a place to experiment, I wanted to try one! Dear reader, if you have 10 seconds, can you please post a comment, with your age, your gender, and your background (I’d like to know if you’re a student, a colleague, an economist, a mathematician, a biologist, a journalist, an astronaut, a lion tamer, an actuary, a modeler, a model, a robot… ). If you want to spend more time explaining how you ended up on my blog, I’d be glad to know… But at least, your age, your gender, and your ‘academic background’ (since I have some sort of academic blog), that would be great! If you come frequently on my blog, you should start to know me, and I thought it would be great if I could know more about you…

Puissance et tests statistiques (simples)

Pour comprendre la notion de puissance dans un test statistique, reprenons Statistical power analysis for the behavioral sciences de Jacob Cohen. Comme il le rappelle Fisher (dans The Design of Experiments) ne souhaite pas “prouver” qu’une hypothèse (appelée H_0) est valide, mais il espère, en réalité, rejeter l’hypothèse en question (c’est ce que rappellent d’ailleurs Hubbard et Bayarri en 2003). Autrement dit, supposons que l’on cherche à faire un test médical, et à détecter si une personne est malade (ou pas). Si une personne est généralement malade dès lors qu’un taux de quelque chose est faible (noté https://latex.codecogs.com/gif.latex?\theta), on va chercher à tester https://latex.codecogs.com/gif.latex?H_0:\theta_\star%3E\theta_0. Dans un test statistique, on espère rejeter l’hypothèse nulle https://latex.codecogs.com/gif.latex?H_0.

The power of a statistical test of a null hypothesis is the probability that it will lead to the rejection of the null hypothesis.

Continue reading Puissance et tests statistiques (simples)

Tests basés sur la vraisemblance – score

Une autre grandeur intéressant est le score, qui est la dérivée de la vraisemblance. Intuitivement (c’est l’idée de la condition du premier ordre),   et  seront proches si les dérivées en ces points sont proches. En  la dérivée est nulle, donc on va se demander ici, tout simplement, si la dérivée en  est proche de 0. Ou pas.

Continue reading Tests basés sur la vraisemblance – score

Tests basés sur la vraisemblance – Rapport de Vraisemblance

Chose promise, chose due. J’avais dit qu’on parlerait du test de rapport de vraisemblance. L’idée – visuelle – est d’avoir une lecture dans l’autre sens : au lieu de se demander si  et  sont proches, on va se demander si   et  sont proches.

Si la fonction de vraisemblance est suffisamment régulière, on se pose la même question.

Continue reading Tests basés sur la vraisemblance – Rapport de Vraisemblance

Tests basés sur la vraisemblance – Wald

Petit rappel préliminaire. Si on dispose d’un échantillon , i.id de loi , où le paramètre  est inconnu, alors on peut calculer le maximum de la vraisemblance, ce qui nous donnera un estimateur intéressant (cf. cours de stat). Illustrons avec un jeu de pile ou face. Reprenons l’échantillon de mon précédent billet,

> X=c(0, 0, 1, 1, 0, 1, 1, 1, 1, 0,
      0, 0, 1, 0, 1, 0, 1, 1, 0, 1)

On peut ici tracer la fonction de vraisemblance

ou (un peu plus malin) la fonction de log-vraisemblance

> p=seq(0,1,by=.01)
> logL=function(p)
+ {sum(log(dbinom(X,size=1,prob=p)))}
> plot(p,Vectorize(logL)(p),
+ type="l",col="red",lwd=2)
> p0=.5
> abline(v=p0,col="blue")

La valeur correspondant au trait bleu correspondant au cas que l’on va chercher à tester, de pièce non pipée, soit  (de manière très générale)

Continue reading Tests basés sur la vraisemblance – Wald

Les tests et la logique, modus tollens

Quand on apprend la logique, on apprend la notion de modus tollens, correspondant à une notion de contraposition. Si on a une proposition du genre , alors la proposition contraposée est .  Et on apprend que les deux propositions sont équivalentes (je fais de la logique classique). Par exemple si  correspond à “feu” et  à “fumée“,  signifie que tout feu fait de la fumée. Si cette affirmation est vrai, alors il n’y a pas de fumée sans feu, et donc , autrement dit, s’il n’y a pas de fumée, c’est qu’il n’y a pas de feu.

Continue reading Les tests et la logique, modus tollens

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")

Continue reading Introduction aux tests nonparamétriques

Multiple Tests, an Introduction

Last week, a student asked me about multiple tests. More precisely, she ran an experience over – say – 20 weeks, with the same cohort of – say – 100 patients. An we observe some https://latex.codecogs.com/gif.latex?X_{i,t}

size=100
nb=20
set.seed(1)
X=matrix(rnorm(size*nb),size,nb)

(here, I just generate some fake data). I can visualize some trajectories, over the 20 weeks,

library(RColorBrewer)
cl1=brewer.pal(12,"Set3")[12]
cl2=brewer.pal(8,"Set2")[2:7]
cl=c(cl1,cl2)
boxplot(X)
for(i in 1:length(cl)){
lines(1:20,X[i,],type="b",col=cl[i])  }

https://f.hypotheses.org/wp-content/blogs.dir/253/files/2014/09/Selection_585.png

Continue reading Multiple Tests, an Introduction

Temperatures Series as Random Walks

Last year, I did mention in a post that unit-root tests are dangerous, because they might lead us to strange models. For instance, in a post, I did obtain that the temperature observed in January 2013, in Montréal, might be considered as a random walk process (or at leat an integrated process). The code to extract the data has changed (since the website has been updated), so here, we use

library(RCurl)
library(XML)
options(RCurlOptions = list(useragent = "R"))
HEURE=0:23
extracttemp=function(Y,M,D){
url=paste(
"http://climate.weather.gc.ca/climateData/hourlydata_e.html?timeframe=1&Prov=QC&StationID=5415&Year=",Y,"&Month=",
M,"&Day=",D,sep="")
wp <- getURLContent(url)
doc <- htmlParse(wp, asText = TRUE) 
docName(doc) <- url
tmp <- readHTMLTable(doc)
basejour=data.frame(Year=Y,Month=M,Day=D,
Hour=HEURE,Temp=as.numeric(as.character(data.frame(tmp[2])[,2]))[2:25])
return(basejour)}
B=NULL
for(y in 1955:2013){
for(d in 1:31){
B=rbind(B,extracttemp(y,1,d))}}

Here are all the temperatures observed, and 2013,

plot(B$X,B$Temp,cex=.5,col="light blue",xlab="January, in Montreal",ylab="Temperature (Celsius)")
I=which(B$Year==2013)
lines(B$X[I],B$Temp[I],col="red")

In the previous post, one test only was used, and one year was considered. I was wondering if this behavior was observed only with temperature of 2013 (or not), and how the other tests (mentioned in a previous post too) were performing.

I might need a function, because those tests cannot be used if there is a missing value, even only one. So I did use the value observed one hour before (just to make sure that the tests can be done)

correcty=function(Y){
I=which(is.na(Y))
	if(length(I)==0){Yc=Y}
	if(length(I)>0){Yc=Y;for(i in I) Yc[i]=Yc[i-1]}	
return(Yc)
}

Now, we can compute the p-values, for all the years, and the three different three (keeping in mind that two test if the series is non-stationary, and one if the series is stationary)

DF=matrix(NA,2013-1954,3)
library(urca)
for(y in 1955:2013){
Z=B$Temp[which(B$Year==y)]
	Zc=correcty(Z)
	DF[y-1954,2]=as.numeric(pp.test(Zc)$p.value)	
	DF[y-1954,1]=as.numeric(kpss.test(Zc)$p.value)	
	DF[y-1954,3]=as.numeric(adf.test(Zc)$p.value)
}

Visually, if red means stationary, and blue means non-stationary, we get

DFP=DF
DFP[,1]=DF[,1]<.05
DFP[,2:3]=DF[,2:3]>.05
library(RColorBrewer)
CL=brewer.pal(6, "RdBu")
plot(0:1,0:1,xlim=c(1950,2015),ylim=c(0,3),axes=FALSE,xlab="",ylab="")
axis(1)
text(1952,.5,"KPSS")
text(1952,1.5,"PP")
text(1952,2.5,"ADF")
for(y in 1955:2013){
for(i in 1:3){
polygon(y+c(-1,-1,1,1)/2.2,i-.5+c(-1,1,1,-1)/2.2,col=CL[1+(DFP[y-1954,i]==1)*5],border=NA)}}

Quite frequently, we conclude that the temperature is a random walk. Which does not make sense (from a physical point of view). But again, it might come from the fact that temperature are stationary, but with some fractional behavior (as suggested in the previous post).