library(ggplot2)
library(plyr)
library(reshape)
## 
## Attaching package: 'reshape'
## 
## The following objects are masked from 'package:plyr':
## 
##     rename, round_any
library(gridExtra)
## Loading required package: grid
set.seed(42);

Lord of the ring

Bon, commençons par une petite fonction qui génère la matrice d’adjacence correspondant à un anneau.

ring = function(N=10) {
  M=matrix(0,nrow=N,ncol=N)
  for(i in 1:N-1) {
    M[i,i+1]=1;
    M[i+1,i]=1;
  }
  M[1,N]=1;
  M[N,1]=1;
  M
}

On peut alors écrire une petite fonction qui réalise la marche aléatoire sur le graphe jusqu’à ce qu’on revienne dans le même état.

waiting = function(M,initial_state=1) {
  t = 0;
  N=dim(M)[1];
  state=initial_state;
  repeat {
     state=sample(1:N,size = 1,prob = M[state,])
     t=t+1
     if(state==initial_state) {break};
  } 
  t
}

Lançons maintenant notre simulation. Pour chacun des états de départ possible, je réalise 100 marches jusqu’à retour dans l’état et je conserve la longueur des marches.

simul = function(M,duration=100) {
  df=data.frame();
  for(state in (1:(dim(M)[1]))) {
    for(rep  in (1:duration)) {
      df=rbind(df,data.frame(state=state,time=waiting(M,state)))
    }
  }
  df
}
df = simul(ring(10),100);

Voyons à quoi cela ressemble:

view_boxplot = function(df) {
  ggplot(data=df,aes(x=state,y=time,group=state))+ geom_boxplot() +geom_jitter(alpha=.4,)
}
view_boxplot(df);

plot of chunk unnamed-chunk-5

Essayons d’estimer l’espérance:

view_esperence = function(df,plot_orig_data=T) {
  d = ddply(df, c("state"), summarize, num=length(time), mean=mean(time), sd=sd(time));
  d$ci=2*d$sd/sqrt(d$num);
  
  p = ggplot(data=d,aes(x=state,y=mean)) +
        geom_errorbar(aes(ymin=mean-ci,ymax=mean+ci),width=.2) + 
        geom_point(shape=21,fill="white",color="red");
  if(plot_orig_data) {
    p + geom_jitter(data=df,aes(x=state,y=time,group=state),alpha=.3);
  } else {
    p;
  }
}
view_esperence(df,T)

plot of chunk unnamed-chunk-6

Il y a une variabilité importante mais l’estimation de l’espérance n’a pas l’air trop mauvaise. Comme on pouvait s’y attendre, on ne voit pas de différence significative entre les différents états.

Ligne

Repartons de la fonction ring et adaptons

line = function(N=10) {
  M=matrix(0,nrow=N,ncol=N)
  for(i in 1:N-1) {
    M[i,i+1]=1;
    M[i+1,i]=1;
  }
  M
}

Et réutilisons les fonctions précédentes:

df = simul(line(10),100);
view_boxplot(df);

plot of chunk unnamed-chunk-8

view_esperence(df)

plot of chunk unnamed-chunk-8

Ah, là, on voit clairement la différence entre les états du bords et ceux de l’intérieur. Leur espérance est bien sûr plus élevée mais également leur variance… Pour les autres, par contre, ils semblent identiques. Ceux du milieu ne semblent pas plus “favorisés” que les autres.

Lollipop

lollipop = function(head=10,tail=10) {
  M=matrix(0,nrow=head+tail,ncol=head+tail)
  for(i in 1:tail) {
    M[i,i+1]=1;
    M[i+1,i]=1;
  }
  for(i in tail:(head+tail)) {
    for(j in tail:(head+tail)) {
      if(i!=j) { M[i,j]=1; }
    }
  }
  M
}
df = simul(lollipop(10),100);
view_boxplot(df);

plot of chunk unnamed-chunk-10

Wow, il y a une sacré rupture entre les deux parties. Les valeurs pour la tige sont énormes et ont une variabilité énorme.

view_esperence(df,F);

plot of chunk unnamed-chunk-11

Quand on est dans la tige, si on a de la chance, on y reste mais si jamais on se retrouve dans la clique, on y reste et on met une éternité à en sortir… Pour bien évaluer les choses, il faudrait donc simuler plus longtemps pour estimer l’espérence du temps de retour dans ces états là.