Protocole
Un exemple de ce protocole avec un jeu de données artifiel est réalisé. (cf Protocole : Exemple de complétion). La série de données est nommée "x".
x=rep(4,16)+runif(16,0,1)
x=c(NA,x[1:5],NA,x[6:16],NA)
Les indices NA (Not Available=valeur manquante) des données x sont repérés, et mis dans le vecteur "indNA".
indNA=which(is.na(x))
Le nombre total de NA est calculé, ce qui correspond à la longueur du vecteur "indNA".
nb.indNA=length(indNA)
Le nombre de total de valeur est calculé, cela correspond à la longueur totale de "x".
nb.x=length(x)
La duplication des données "x" en "xcomplete" est effectuée pour éviter d'écrasser les données brutes.
xcomplete=x
Une boucle "for" est réalisée pour exécuter une moyenne. Cette moyenne est calculée à partir des 2 valeurs avant et des 2 valeurs après la valeur manquante.
2 remarques :
-Si la valeur manquante est la 1ère de la série, il prend alors la valeur de la donnée suivante, si ce n'est pas aussi une valeur manquante.
-Si la valeur manquante est la denière de la série, il prend alors la valeur de la donnée qui la précéde, si ce n'est pas aussi une valeur manquante.
delai=2
for(i in 1:nb.indNA){
val=indNA[i];
if(val<=delai){xcomplete[val]=x[val+1];#copie du suivant
}else{
if(val>=(nb.x-delai)){xcomplete[val]=x[nb.x-1]; #copie du precedent
}else{
borneMin=max(1,val-delai); #les 2 valeurs avant le NA, avec comme minimum le début de la fenêtre à 1
borneMax=min(val+delai,nb.x); #les 2 valeurs après le NA, avec comme maximum la fi de la fenêtre égale à la longueur de la série.
if (sum(is.na(x[borneMin:borneMax]))<(borneMax-borneMin+1)){
xcomplete[val]=mean(x[borneMin:borneMax],na.rm=T);
}
}
}
}