2011-03-12 14 views
3

Je suis un R-novice. Je souhaite effectuer un nettoyage des valeurs aberrantes et une mise à l'échelle globale de 0 à 1 avant de placer l'échantillon dans une forêt aléatoire.R: nettoyage des valeurs aberrantes pour chaque colonne dans une base de données en utilisant des quantiles 0,05 et 0,95

g<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10) 

Si je fais une mise à l'échelle simple, 0 à 1 le résultat serait:

> round((g - min(g))/abs(max(g) - min(g)),1) 

[1] 1.0 0.1 0.0 0.1 0.0 0.0 0.0 0.1 0.1 0.1 0.0 0.1 0.0 0.1 0.0 0.1 0.0 

Donc, mon idée est de remplacer les valeurs de chaque colonne sont supérieures à la 0,95-quantile avec le valeur suivante plus petite que le 0,95-quantile - et la même chose pour le quantile 0,05.

Ainsi, le résultat avant l'échelle serait:

g<-c(**70**,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,**40**) 

et mis à l'échelle:

> round((g - min(g))/abs(max(g) - min(g)),1) 

[1] 1.0 0.7 0.3 0.7 0.3 0.0 0.3 0.7 1.0 0.7 0.0 1.0 0.3 0.7 0.3 1.0 0.0 

J'ai besoin de cette formule pour un dataframe ensemble, de sorte que la mise en œuvre fonctionnelle au sein de R doit être quelque chose comme:

> apply(c, 2, function(x) x[x`<quantile(x, 0.95)]`<-max(x[x, ... max without the quantile(x, 0.95)) 

Quelqu'un peut-il aider?

Parlée à côté: s'il existe une fonction qui effectue ce travail directement, s'il vous plaît faites le moi savoir. J'ai déjà vérifié cut et cut2. cut échoue en raison de ruptures non uniques; cut2 fonctionnerait, mais ne donne que de retour des valeurs de chaîne ou la valeur moyenne, et je besoin d'un vecteur numérique de 0 - 1.

pour le procès:

a<-c(100,6,5,6,5,4,5,6,7,6,4,7,5,6,5,7,1) 

b<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10) 

c<-cbind(a,b) 

c<-as.data.frame(c) 

Cordialement et merci pour l'aide,

Rainer

+0

Il existe plusieurs paquets sur CRAN qui peuvent répondre à vos besoins: 'outliers',' mvoutliers', 'heavy',' extremevalues' ... il suffit de se diriger vers les paquets contribués et de trouver celui qui convient. – aL3xa

+0

Merci pour ce conseil, je vais jeter un oeil à ces forfaits! Cordialement, Rainer – Rainer

Répondre

3

Je ne peux pas penser à une fonction R qui fait cela, mais vous pouvez définir une petite vous:

foo <- function(x) 
{ 
    quant <- quantile(x,c(0.05,0.95)) 
    x[x < quant[1]] <- min(x[x >= quant[1]]) 
    x[x > quant[2]] <- max(x[x <= quant[2]]) 
    return(round((x - min(x))/abs(max(x) - min(x)),1)) 
} 

Ensuite sapply ce à chaque variable dans votre dataframe:

sapply(c,foo) 
     a b 
[1,] 1.0 1.0 
[2,] 0.7 0.7 
[3,] 0.3 0.3 
[4,] 0.7 0.7 
[5,] 0.3 0.3 
[6,] 0.0 0.0 
[7,] 0.3 0.3 
[8,] 0.7 0.7 
[9,] 1.0 1.0 
[10,] 0.7 0.7 
[11,] 0.0 0.0 
[12,] 1.0 1.0 
[13,] 0.3 0.3 
[14,] 0.7 0.7 
[15,] 0.3 0.3 
[16,] 1.0 1.0 
[17,] 0.0 0.0 

Edit: Cette réponse était destinée à résoudre le problème de programmation. En ce qui concerne l'utilisation réelle je suis entièrement d'accord avec Hadley

+0

Merci beaucoup pour votre aide, Sacha! – Rainer

10

S'il vous plaît ne pas le faire. Ce n'est pas une bonne stratégie pour traiter les cas extrêmes - d'autant plus qu'il est peu probable que 10% de vos données soient aberrantes!

+0

bonjour Hadley, l'exemple dataframe était juste un exemple. Néanmoins: pourquoi pensez-vous que cette stratégie n'est pas bonne et quelle meilleure stratégie préférez-vous? – Rainer

+0

Eh bien .. vous pouvez toujours utiliser la règle boxplot pour filtrer les valeurs aberrantes. Notez "l'écran", ne pas supprimer. Vous devriez vous attendre à des valeurs aberrantes dans vos données, selon John Tukey, mais vous ne devriez (presque) jamais les supprimer. Jetez un oeil à ce post: http: // goo.gl/Ywbo8 – aL3xa

+0

@ Les valeurs aberrantes sont dépendantes du modèle - jeter des points de données extrêmes est maintenant pervers - et si on avait utilisé un modèle, la plupart de ces «valeurs aberrantes» étaient juste aux extrêmes de la distribution conditionnelle de y étant donné les covariables du modèle ? Vous pouvez également utiliser une méthode robuste pour les valeurs aberrantes. Enfin, si vous jetez ceci dans RF, je doute que cela fera une différence ou beaucoup de différence avec les règles de décision sélectionnées si vous avez un signal raisonnable dans vos données. En bref, laissez-les dans les données et le rééchelonnement n'est pas pertinent dans RF car il n'utilise que les classements ... –

Questions connexes