Domanda:
Esiste un pacchetto R con una bella funzione in grado di gestire efficacemente i valori anomali?
xiaodai
2011-06-06 11:57:07 UTC
view on stackexchange narkive permalink

Uno dei set di dati con cui ho a che fare è piuttosto strano. Il datawarehouse da cui ho scaricato i dati ha molti valori 999999999 in una delle variabili. Apparentemente il sistema informatico su cui si trova il datawarehouse non supporta la memorizzazione di valori nulli. Quindi usano 999999999 come valore "nullo". Ora, se eseguo pretty in R sulla variabile, fornisce intervalli non sensati.

  • Esiste un pacchetto con una versione di pretty in grado di gestire i valori anomali inserendoli nel range di say (100, High)?
Perché non rimuovere semplicemente i valori 999999999?
o contrassegnali come "NA": "foo [foo == 999999999] <- NA"
Non posso rimuoverli perché ci sono 1000 variabili nel set di dati ed è difficile sapere quali variabili hanno quale valore predefinito. Anche se confrontati con un nuovo set di dati lo stesso deve essere fatto. A volte, ad esempio, il valore predefinito è 99999990. Quindi è meglio avere un algoritmo generale in grado di affrontarlo
Due risposte:
#1
+18
chl
2011-06-06 15:51:04 UTC
view on stackexchange narkive permalink

Se stai importando i tuoi dati con un comando come, ad esempio,

  read.table ('yourfile.txt', header = TRUE, ...)  

puoi indicare quali valori devono essere considerati come valori "null" o NA , specificando na.strings = "999999999" . Possiamo anche considerare valori diversi per indicare i valori NA . Considera il seguente file ( fake.txt ) in cui vogliamo trattare "." e "999999999" come valori NA:

  1 2 .3 999999999 45 6 7  

quindi in R dovremmo:

  > a <- read.table ("fake.txt", na.strings = c (".", "999999999")) > a V1 V2 V31 1 2 NA2 3 NA 43 5 6 7  

Altrimenti, puoi sempre filtrare i tuoi dati come indicato da @Sacha nel suo commento. In questo caso, potrebbe essere qualcosa del tipo

  a [a == "." | a == 999999999] <- NA  

Modifica

Nel caso in cui siano presenti più valori anomali che possono essere osservati in colonne diverse con valori diversi, ma conosci il probabile intervallo di valori ammissibili , puoi applicare una funzione a ciascuna colonna. Ad esempio, definire il seguente filtro:

  my.filter <- function (x, threshold = 100) ifelse (x > threshold, NA, x)  

quindi

  a.filt <- apply (a, 2, my.filter)  

sostituirà ogni valore> 100 con NA nella matrice a.

Esempio:

  > a <- replicate (10, rnorm (10)) > a [1,3] <- 99999999> a [5,6] <- 99999999> a [8,10] <- 99999990> riepilogo (a [, 3]) Min. 1 ° Qu. Mediana Media 3 ° Qu. Max. -1e + 00 0e + 00 0e + 00 1e + 07 1e + 00 1e + 08 > af <- applica (a, 2, my.filter) > riepilogo (af [, 3]) Min. 1 ° Qu. Mediana Media 3 ° Qu. Max. NA -1.4640 -0.2680 0.4671 -0.0418 0.4981 0.7444 1.0000  

Ovviamente può essere basato su vettori:

  > summary (my.filter (a [, 3], 500)) Min. 1 ° Qu. Mediana Media 3 ° Qu. Max. NA -1.4640 -0.2680 0.4671 -0.0418 0.4981 0.7444 1.0000  
Non sempre sai in anticipo quali sono i valori speciali, soprattutto se vedi il set di dati per la prima volta! Speravo che ci fosse una funzione cut2 o qualcosa che si occupa già di questo.
@xiaodai Sì, c'è una funzione `cut ()` in R ma probabilmente non fa quello che vuoi. Aggiornerò la mia risposta.
#2
+1
IrishStat
2011-06-07 00:23:01 UTC
view on stackexchange narkive permalink

Mi imbatto in questo abbastanza spesso quando ho a che fare con i dati delle serie temporali giornaliere dei clienti. Sembra che molti sistemi contabili IGNORINO i dati giornalieri che non si sono verificati, ovvero non sono state registrate transazioni per quel giorno (intervallo di tempo / bucket) e non inseriscono un numero "0". Poiché l'analisi delle serie temporali richiede una lettura per ogni intervallo / bucket dobbiamo inserire uno "0" per l'osservazione omessa. Intervention Detection è essenzialmente uno schema per rilevare l'anomalia e sostituirla con un valore atteso basato su un profilo / segnale / previsione identificato. Se ce ne sono molti di questi "mancanti" valori "il sistema può guastarsi Il problema diventa un po 'più complesso quando c'è un forte profilo del giorno della settimana nei dati storici e una" patch sequenziale di valori "non viene registrata, suggerendo che i valori di sostituzione possono essere ottenuti mediante calcolo medie giornaliere locali come precursore della messa a punto di questi valori.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...