Dans un premier temps, je te propose une simplification en termes de code car les mapply que tu emploies sont lourds et inutile étant donné la nature vectorisée des calculs que tu veux faire.
Code : Tout sélectionner
vecteur <- c(5,3,3,6,9,7,5,8,4,1,2,8,2,5,8,5)
oc <- table(vecteur)
Pour la création de pdt, ceci:
Code : Tout sélectionner
unlist(mapply( function(x) {as.numeric(names(oc[x]))*as.numeric(oc[x]) },names(oc),SIMPLIFY =FALSE))
1 2 3 4 5 6 7 8 9
1 4 6 4 20 6 7 24 9
Donne le même résultat que:
Code : Tout sélectionner
as.numeric(names(oc))*oc
vecteur
1 2 3 4 5 6 7 8 9
1 4 6 4 20 6 7 24 9
Donc je te suggère de garder cette dernière solution qui est certainement plus lisible et plus rapide.
Code : Tout sélectionner
pdt <- as.numeric(names(oc))*oc
moyenne <- sum(pdt)/length(vecteur)
Ensuite, ceci:
Code : Tout sélectionner
unlist(mapply( function(x) {
as.numeric(oc[x])*((as.numeric(names(oc[x]))-moyenne)*(as.numeric(names(oc[x]))-moyenne))
},names(oc),SIMPLIFY =FALSE))
est équivalent à
Donc, on garde cette solution. et ta fonction devient :
Code : Tout sélectionner
variance <- function(vecteur){
oc <- table(vecteur)
pdt <- as.numeric(names(oc))*oc
moyenne <- sum(pdt)/length(vecteur)
elemNum <- pdt-(oc*moyenne))*(pdt-(oc*moyenne))
return(sum(elemNum)/sum(oc))#tu ajoutes un "-1" au dénominateur si tu veux l'estimateur non biaisé.
}
On en vient à l'intérêt de ta fonction
oc est un objet qui te dit le nombre de fois où chaque valeur est répétée : les "names" de oc sont les valeurs trouvées et les valeurs dans oc sont les nombres de répétition.
Donc quand tu fais
Code : Tout sélectionner
mapply( function(x) {as.numeric(names(oc[x]))*as.numeric(oc[x]) },names(oc),SIMPLIFY =FALSE)
tu lui dis de transformer un des names de oc en nombre, c'est à dire que tu retrouve les valeurs numérique trouvée dans vecteur que tu viens multiplier par le nombre de fois où elle a été trouvée...ça revient exactement à prendre le vecteur initial et faire la somme des valeurs identiques
Code : Tout sélectionner
sort(vecteur) #le vecteur ordonné
[1] 1 2 2 3 3 4 5 5 5 5 6 7 8 8 8 9
[1] 1 4 6 4 20 6 7 24 9 #le vecteur modifié en faisant la somme des valeurs répétées
Donc si en travaillant sur oc, tu ne fais qu'utiliser vecteur de façon détournée (= tu te compliques sérieusement la vie), alors ta fonction reviens exactement à calculer la variance de ton vecteur (au correctif de biais près). Si tu as des morceaux de vecteurs, on peut voir ça comme un grand vecteur initial découpé en groupe selon un facteur de regroupement, d'où ma suggestion de faire un calcul de variance par groupe. Par ex. :
il reste possible que je n'ai pas compris une subtilité de ta demande :)
Nicolas