2010-04-10 11 views
5

Mam następujący zestaw danych, który próbuję wykreślić za pomocą ggplot2, jest to szereg czasowy trzech eksperymentów A1, B1 i C1, a każdy eksperyment miał trzy powtórzenia.R: Jak usunąć wartości odbiegające od gładszej w ggplot2?

Próbuję dodać statystyki, która wykrywa i usuwa wartości odstające, zanim zwróci gładszą (średnia i wariancja?). Napisałem własną funkcję odstającą (nie pokazano), ale oczekuję, że jest już funkcja do wykonania tego, po prostu jej nie znalazłem.

Przyjrzałem się stat_sum_df ("median_hilow", geom = "smooth") z kilku przykładów z książki ggplot2, ale nie rozumiałem dokumentu pomocy z Hmisc, aby sprawdzić, czy usuwa on wartości odstające.

Czy istnieje funkcja usuwania takich wartości w ggplot, czy gdzie mógłbym zmienić mój kod poniżej, aby dodać własną funkcję?

EDYCJA: Właśnie zobaczyłem to (How to use Outlier Tests in R Code) i zauważ, że Hadley zaleca użycie solidnej metody, takiej jak rlm. Planuję krzywe wzrostu bakterii, więc nie sądzę, aby model liniowy był najlepszy, ale wszelkie porady dotyczące innych modeli lub używania lub używania niezawodnych modeli w tej sytuacji byłyby mile widziane.

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... 

To, co mam tak daleko i pracuje ładnie, ale odstających nie są usuwane:

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: Właśnie dodałem dwa wykresy poniżej pokazano przykłady problemów poboczna, że ​​jestem posiadanie danych rzeczywistych zamiast danych przykładowych powyżej.

Pierwsze wątki pokazują serie p26s4 i około 32 dnia coś naprawdę dziwnego działo się w dwóch z powtórzeń, pokazując 2 odstające.

Druga działka przedstawia serię p22s5, a w dniu 18 coś dziwnego działo się z odczytem tego dnia, prawdopodobnie błąd maszyny.

W tej chwili przyglądam się danym, aby sprawdzić, czy krzywe wzrostu wyglądają dobrze. Po przyjęciu rady Hadleya i ustaleniu rodziny = "symetrycznej", jestem przekonany, że lessowy gładzik wykonuje przyzwoitą pracę ignorując wartości odstające.

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, następną rzeczą, którą chciałbym zrobić, to spróbować dopasować logistycznej, Gompertz lub krzywą wzrostu Richarda do tych danych zamiast lessu i obliczyć wzrost stawka w fazie wykładniczej. Ostatecznie planuję użyć pakietu grofit w R (http://cran.r-project.org/web/packages/grofit/index.html), ale na razie chciałbym je wykreślić ręcznie za pomocą ggplot2, jeśli to możliwe. Jeśli masz jakieś wskazówki, byłoby to bardzo cenne.

Odpowiedz

14

Wypróbowałeś argument family = "symmetric" dla geom_smooth (który z kolei zostanie przekazany do loess)? Sprawi to, że less stanie się gładkie i odporne na ataki odstające.

Jednak patrząc na twoje dane, dlaczego uważasz, że dopasowanie liniowe nie jest odpowiednie? Masz tylko 4 x wartości i na pewno nie ma mocnych dowodów na odejście od liniowości.

+0

Otrzymuję komunikat "Błąd: nieznane parametry: rodzina", gdy próbuję tego. – JayCo

+1

Wyliczyłem to! Poprawna składnia to 'geom_smooth (method = less, method.args = list (family =" symmetric "))' – JayCo

2

Po pierwsze, nie jestem pewien, czy "odstający" jest właściwie zdefiniowany na takich małych danych.

Po drugie, musiałbyś wtedy zdecydować, co masz na myśli przez "odstający", czyli czy jest to jeden z leków, jeden z powtórzeń, czy jeden z punktów czasowych?

Jak zauważa Hadley, niewiele wskazuje na odchylenie od liniowości.

Wreszcie, myślę, że częścią punktu, w którym stosuje się płynniejszą operację, jest to, że radzi sobie dobrze z wartościami odstającymi, pod warunkiem, że jest wystarczająca ilość danych. Ale masz bardzo mało.

Tak więc, muszę dokładnie zapytać, dlaczego chcesz usunąć wartości odstające. To znaczy, co zamierzasz zrobić z tymi danymi (poza tworzeniem ładnych wątków)?

Mam nadzieję, że pomoże to

Powiązane problemy