2014-05-21 7 views
0

J'ai une trame de données (df) comme suit:R: détection itératives valeurs aberrantes

V V1 V2 V3 
1 A B 32 
1 A C 33 
1 A E 43 
1 A F 22 
1 A T 53 
1 A N 54 
1 C T 44 
1 C G 11 
1 C N 31 
1 C D 53 
1 C U 75 
1 A T 53 
1 A N 54 
2 C T 42 
2 C G 14 
2 C N 35 
2 C D 23 
2 C U 56 

Que veux-je faire pour obtenir les valeurs aberrantes pour chaque combinaison de (V, V1), ce qui est facile à atteindre avec le code que j'ai.

d <- as.data.table(df) 

# Add a column to keep track of row numbers 
d[, c('row'):= list(seq_len(nrow(d)))] 

# For each group (combination of V and V1), perform the outlier test 
outliers <- d[, chisq.out.test(V3), list(V, V1)] 

Le principal problème est que cette fonction serait de retour pour chaque combinaison de (V,V1) qu'à une valeur aberrante avec une valeur p. Ce dont j'ai besoin est fondamentalement tous les aberrants avec leur p-valeur d'être aberrants pour chacun (V,V1) ou en d'autres termes, tous les candidats de V2 avec leur p-valeur d'être un aberrant à (V,V1).

Des idées comment puis-je changer mon code pour le faire?

Répondre

1

Je pense que cela peut fonctionner. La fonction dropout effectuera une boucle itérative pour tester les valeurs aberrantes. Pour chaque élément que vous passez, il retournera 1 si l'élément n'est pas un outliers, sinon il retournera la valeur p < .05 pour le test aberrant.

library(outliers) 
dropout<-function(x) { 
    if(length(x)<2) return (1) 
    vals <- rep.int(1, length(x)) 
    r <- chisq.out.test(x) 
    while (r$p.value<.05 & sum(vals==1)>2) { 
     if (grepl("lowest", r$alternative)) { 
      d <- which.min(ifelse(vals==1,x, NA)) 
     } else { 
      d <- which.max(ifelse(vals==1, x, NA)) 
     } 
     vals[d] <- r$p.value 
     r <- chisq.out.test(x[vals==1]) 
    } 
    vals 
} 

Avec cette fonction d'assistance en place, nous pouvons maintenant l'appliquer à chacun des sous-groupes définis par V, V1. Pour ce faire, nous utilisons la fonction ave.

with(dd, ave(V3, V1, V2, FUN = dropout)) 

Il semble que vos données d'échantillon n'a pas aberrants dans l'un des sous-groupes donnés chisq.out.test définition des valeurs aberrantes. Et sûrement ce processus itératif n'est pas statistiquement significatif étant donné le problème de repos pour les valeurs aberrantes en général et certainement avec le problème de test multiple. Néanmoins, cette discussion est pour https://stats.stackexchange.com/, ici nous nous concentrons simplement sur le code.

+0

merci pour votre réponse, je mets à jour la fonction afin qu'elle puisse renvoyer les scores aberrants avec V, V1. Mais à la fin, comment puis-je obtenir le numéro de ligne correspondant à chaque valeur aberrante? donc je peux obtenir quelle V2 est la valeur aberrante pour chaque V, V1. parole est la fonction comme suit: 'valeurs aberrantes <- d [, chute de tension (V3), la liste (V, V1)] valeurs aberrantes <- fusion (valeurs aberrantes, d [, liste (max.ind = rangée [qui .max (V3)]), liste (V, V1)], par = c ('V', 'V1')) ' mais cela ne me donnerait que l'indice de ligne du max, je veux pour chaque aberrante le index de ligne. – ifreak

+0

@ifreak 'ave' renvoie les valeurs dans le même ordre que les a trouvées. Vous pouvez donc simplement le rajouter au fichier data.frame, 'dd $ do <- avec (dd, ave (V3, V1, V2, FUN = abandon))'. – MrFlick

+0

maintenant im ayant une erreur bizarre dans le temps («valeur manquante où TRUE/FALSE nécessaire»). As-tu une idée pourquoi? – ifreak

Questions connexes