La magie des pourcentages

Ce matin, je me suis fait interpeller sur twitter par @PierreAgeron qui m’interrogeait sur la Figure suivante

Il me demandait comment les hausses observées en 2014  par trimestre (+0.0%, +0.0%, +0.1%, et +0.1%) pouvait donner +0.4% “globalement” pour 2014.

Le principe avec les pourcentages, c’est qu’on parle de variation, par rapport à une référence, et si on change la référence, alors forcément, on perd toute cohérence. On mélange des choux et des carottes. Cela dit, ce qui me gênait le plus, ce n’était pas 2014, mais2012. En effet, on a une hausse de +0.2% suivi d’une baisse de -0.2%, et une hausse de +0.3% suivi d’une baisse de -0.3%. Dit comme ça, on devrait s’attendre à une baisse globale, d’après une égalité que l’on connaît tous,(1+x)(1-x)=1-x^2

Une hausse de x suivie d’une baisse de x, c’est une baisse de [/latex]x^2[/latex]. Et pourtant, en 2012, on nous dit qu’on a une hausse.

Heureusement, Damien Babet, a.k.a. @DaBab, m’a proposé un joli exemple numérique que je vais reprendre ici . Considérons les huit valeurs suivantes pour 2011 et 2012,

> v=c(1011,1010,1012,1014,1016,1014,1017,1014)
> names(v)=c(paste("2011Q",1:4,sep=""),
+ paste("2012Q",1:4,sep=""))
> barplot(v,ylim=c(1000,1020))

En fait, cet exemple correspond effectivement au cas décrit initialement, puisqu’en 2012, on a une hausse puis une baisse du même taux,

> d=diff(v)/v[1:7]
> barplot(dv)

On est donc bien dans la situation du graphique introductif. Et maintenant, quand on agrège nos données trimestrielle, on a bien une hausse

> v2=c(sum(v[1:4]),sum(v[4+1:4]))
> names(v2)=c(2011,2012)
> barplot(v2,ylim=c(4000,4080))
> (v2[2]/v2[1]-1)*100
     2012 
0.3459353

(si vous n’êtes pas convaincu, mettez une grosse grève qui aurait paralysé la France pendant deux trimestre en 2011, avec 0 en Q1 et Q2…). Étonnant, non ? J’avais prévenu ! Les pourcentages, c’est de la magie !

How to import some parts of a large database

In the introduction of Computational Actuarial Science with R, there was a short paragraph on how could we import only some parts of a large database, by selecting specific variables. The trick was to use the following

> read.table.select.columns=function(datatablename,
I,sep=";"){
+ datanc=read.table(datatablename,header=TRUE,
sep=sep,skip=0,nrows=1)
+ mycols=rep("NULL",ncol(datanc))
+ names(mycols)=names(datanc)
+ mycols[I]=NA
+ datat=read.table(datatablename,header=TRUE,
sep=sep,colClasses=mycols)
+ return(datat)}

For instance, if we use the same dataset as in the introduction, we can import only two variables of interest,

> loc="http://myweb.fsu.edu/jelsner/extspace/extremedatasince1899.csv"
> dt1=read.table.select.columns(loc,c("Region",
"Wmax"),sep=",")
> head(dt1,10)
    Region      Wmax
1    Basin 105.56342
2    Basin  40.00000
3    Basin  35.41822
4    Basin  51.06743
5  Florida  87.34328
6    Basin  96.64138
7     Gulf  35.41822
8       US  35.41822
9       US  87.34328
10      US 106.35318
> dim(dt1)
[1] 2100    2

Continue reading How to import some parts of a large database

Cross Validation for Kernel Density Estimation

In a post publihed in July, I mentioned the so called the Goldilocks principle, in the context of kermel density estimation, and bandwidth selection. The bandwith should not be too small (the variance would be too large) and it should not be too large (the bias would be too large). Another standard method to select the bandwith, as mentioned this afternoon in class is the cross-validation technique (described in Chiu (1991)). Here, we would like to minimize

https://latex.codecogs.com/gif.latex?\mathbb{E}\left[\int%20[\widehat{f}_h(x)-f(x)]^2dx\right]

The integral can be writen

https://latex.codecogs.com/gif.latex?\int%20\widehat{f}_h(x)^2dx-2\int%20\widehat{f}_h(x)f(x)dx+\int%20f(x)^2dx

Since the third component is constant, we have to minimize the expected value of the sum of the first two.

The idea is to approximate it as

https://latex.codecogs.com/gif.latex?J(h)=\int%20\widehat{f}_h(x)^2dx-\frac{2}{n}\sum_{i=1}^n%20\widehat{f}_{(-i)}(X_i)

which can easily be computed. Consider here some sample, with 50 observations, from a Gaussian distribution,

> set.seed(1)
> X=rnorm(50)

From Silverman’s rule of thumb (which should be appropriate here since the sample has a Gaussian sample) the optimal bandwidth is

> 1.06*sd(X)*length(X)^(-1/5)
[1] 0.4030127

Using the cross-validation technique mentioned above, compute

> J=function(h){
+ fhat=Vectorize(function(x) density(X,from=x,to=x,n=1,bw=h)$y)
+ fhati=Vectorize(function(i) density(X[-i],from=X[i],to=X[i],n=1,bw=h)$y)
+ F=fhati(1:length(X))
+ return(integrate(function(x) fhat(x)^2,-Inf,Inf)$value-2*mean(F))
+ }
> vx=seq(.1,1,by=.01)
> vy=Vectorize(J)(vx)
> df=data.frame(vx,vy)
> library(ggplot2)
> qplot(vx,vy,geom="line",data=df)

The function has the following shape

and the optimal value is

> optimize(J,interval=c(.1,1))
$minimum
[1] 0.4687553

$objective
[1] -0.3355477

Note that, indeed, it is close to Siverman’s optimal bandwidth.