2010-04-10 21 views
5

Ho il seguente set di dati che sto cercando di tracciare con ggplot2, è una serie temporale di tre esperimenti A1, B1 e C1 e ogni esperimento ha avuto tre repliche.R: Come rimuovere i valori anomali da una sfumatura in ggplot2?

Sto tentando di aggiungere una statistica che rileva e rimuove i valori anomali prima di restituire un valore più uniforme (media e varianza?). Ho scritto la mia funzione outlier (non mostrata) ma mi aspetto che ci sia già una funzione per farlo, ma non l'ho trovata.

Ho visto stat_sum_df ("median_hilow", geom = "smooth") da alcuni esempi nel libro ggplot2, ma non ho capito il documento di aiuto di Hmisc per vedere se rimuove i valori anomali o meno.

Esiste una funzione per rimuovere valori anomali come questo in ggplot o dove dovrei modificare il mio codice qui sotto per aggiungere la mia funzione?

EDIT: Ho appena visto questo (How to use Outlier Tests in R Code) e notare che Hadley consiglia di utilizzare un metodo robusto come rlm. Sto tracciando le curve di crescita batterica, quindi non credo che un modello lineare sia il migliore, ma qualsiasi consiglio su altri modelli o l'utilizzo o l'utilizzo di modelli robusti in questa situazione sarebbe apprezzato.

library (ggplot2) 

data = data.frame (day = c(1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7), od = 
c(
0.1,1.0,0.5,0.7 
,0.13,0.33,0.54,0.76 
,0.1,0.35,0.54,0.73 
,1.3,1.5,1.75,1.7 
,1.3,1.3,1.0,1.6 
,1.7,1.6,1.75,1.7 
,2.1,2.3,2.5,2.7 
,2.5,2.6,2.6,2.8 
,2.3,2.5,2.8,3.8), 
series_id = c(
"A1", "A1", "A1","A1", 
"A1", "A1", "A1","A1", 
"A1", "A1", "A1","A1", 
"B1", "B1","B1", "B1", 
"B1", "B1","B1", "B1", 
"B1", "B1","B1", "B1", 
"C1","C1", "C1", "C1", 
"C1","C1", "C1", "C1", 
"C1","C1", "C1", "C1"), 
replicate = c(
"A1.1","A1.1","A1.1","A1.1", 
"A1.2","A1.2","A1.2","A1.2", 
"A1.3","A1.3","A1.3","A1.3", 
"B1.1","B1.1","B1.1","B1.1", 
"B1.2","B1.2","B1.2","B1.2", 
"B1.3","B1.3","B1.3","B1.3", 
"C1.1","C1.1","C1.1","C1.1", 
"C1.2","C1.2","C1.2","C1.2", 
"C1.3","C1.3","C1.3","C1.3")) 

> data 
    day od series_id replicate 
1 1 0.10  A1  A1.1 
2 3 1.00  A1  A1.1 
3 5 0.50  A1  A1.1 
4 7 0.70  A1  A1.1 
5 1 0.13  A1  A1.2 
6 3 0.33  A1  A1.2 
7 5 0.54  A1  A1.2 
8 7 0.76  A1  A1.2 
9 1 0.10  A1  A1.3 
10 3 0.35  A1  A1.3 
11 5 0.54  A1  A1.3 
12 7 0.73  A1  A1.3 
13 1 1.30  B1  B1.1 
... etc... 

Questo è quello che ho finora e sta lavorando bene, ma valori anomali non vengono rimossi:

r <- ggplot(data = data, aes(x = day, y = od)) 
r + geom_point(aes(group = replicate, color = series_id)) + # add points 
    geom_line(aes(group = replicate, color = series_id)) + # add lines 
    geom_smooth(aes(group = series_id)) # add smoother, average of each replicate 

EDIT: Ho appena aggiunto due grafici qui sotto mostrano esempi dei problemi valori anomali che sto avendo dai dati reali piuttosto che i dati di esempio sopra.

I primi grafici mostrano la serie p26s4 e intorno al giorno 32 qualcosa di veramente strano è andato avanti in due dei replicati, mostrando 2 valori anomali.

I secondi grafici mostrano la serie p22s5 e il giorno 18, qualcosa di strano è andato avanti con la lettura quel giorno, probabilmente un errore della macchina, penso.

Al momento sto osservando i dati per verificare che le curve di crescita abbiano un aspetto OK. Dopo aver preso il consiglio di Hadley e aver impostato la famiglia = "simmetrica", sono fiducioso che il loess smooth fa un lavoro decente nell'ignorare i valori anomali.

p26s4 shows around day 32 something really weird went on in two of the replicates, showing 2 outliers http://img696.imageshack.us/img696/8743/p26s4loess.png p22s5 shows that on day 18, something weird went on with the reading that day, likely machine error I think http://img521.imageshack.us/img521/8083/p22s5loess.png

@ Peter/@ Hadley, la prossima cosa che vorrei fare è quello di cercare di montare un logistico, Gompertz o curva di crescita di Richard a questi dati, invece di un loess e calcolare la crescita tasso nella fase esponenziale. Alla fine ho intenzione di utilizzare il pacchetto grofit in R (http://cran.r-project.org/web/packages/grofit/index.html), ma per ora mi piacerebbe tracciare questi manualmente utilizzando ggplot2 se possibile. Se hai qualche indicazione allora sarebbe molto apprezzato.

risposta

14

Hai provato l'argomento family = "symmetric" a geom_smooth (che a sua volta verrà passato a loess)? Questo renderà il loess liscio resistente ai valori anomali.

Tuttavia, guardando i dati, perché pensi che un adattamento lineare non sia adeguato? Hai solo 4 valori x, e certamente non sembra esserci una forte evidenza di un allontanamento dalla linearità.

+0

Ottengo 'Errore: parametri sconosciuti: famiglia' quando provo questo. – JayCo

+1

Capito! La sintassi corretta è 'geom_smooth (method = loess, method.args = list (family =" symmetric "))' – JayCo

2

In primo luogo, non sono sicuro che un "valore anomalo" sia definito correttamente anche su dati così piccoli.

In secondo luogo, dovresti quindi decidere cosa intendi per "outlier" cioè, è uno dei farmaci, uno dei replicati o uno dei punti temporali?

Come osserva Hadley, c'è poca evidenza di deviazione dalla linearità.

Infine, penso che parte del punto di utilizzo di un metodo più agevole è che si adatta bene ai valori anomali, purché vi siano dati sufficienti. Ma tu hai molto poco.

Quindi, devo chiedere esattamente perché si desidera rimuovere i valori anomali. Cioè, cosa hai intenzione di fare con questi dati (oltre a fare belle trame)?

Spero che questo aiuti

Problemi correlati