R: Как удалить выбросы из сглаживания в ggplot2? - PullRequest
5 голосов
/ 10 апреля 2010

У меня есть следующий набор данных, который я пытаюсь построить с помощью ggplot2, это временной ряд из трех экспериментов A1, B1 и C1, и каждый эксперимент имел три повторения.

Я пытаюсь добавить статистику, которая обнаруживает и удаляет выбросы перед возвратом сглаживания (среднее значение и дисперсия?). Я написал свою собственную функцию выброса (не показана), но я ожидаю, что уже есть функция для этого, я просто не нашел ее.

Я смотрел stat_sum_df ("median_hilow", geom = "smooth") из некоторых примеров в книге ggplot2, но я не понял справочный документ из Hmisc, чтобы увидеть, удаляет ли он выбросы или нет.

Есть ли функция для удаления таких выбросов в ggplot, как эта, или где бы я мог изменить свой код ниже, чтобы добавить свою собственную функцию?

РЕДАКТИРОВАТЬ: я только что видел ( Как использовать Outlier-тесты в коде R ) и заметил, что Хэдли рекомендует использовать надежный метод, такой как rlm. Я строю кривые роста бактерий, поэтому я не думаю, что линейная модель лучше, но любой совет по поводу других моделей или использования или использования надежных моделей в этой ситуации был бы оценен.

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

Это то, что у меня есть и работает хорошо, но выбросы не удаляются:

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

РЕДАКТИРОВАТЬ: я только что добавил две диаграммы ниже, показывающие примеры проблем с выбросами, которые у меня возникают из реальных данных, а не из приведенных выше примеров.

На первых графиках показана серия p26s4, и примерно в день 32 в двух повторностях произошло нечто действительно странное, показав 2 выброса.

На втором графике показана серия p22s5, и на 18-й день произошло что-то странное с чтением в тот день, вероятно, машинная ошибка, я думаю.

В данный момент я проверяю данные, чтобы убедиться, что кривые роста выглядят нормально. Приняв совет Хэдли и установив семейство = "симметричный", я уверен, что Лесс Сглаживатель делает достойную работу, игнорируя выбросы.

p26s4 показывает около 32 дня, что-то действительно странное произошло в двух повторностях, показывая 2 выброса http://img696.imageshack.us/img696/8743/p26s4loess.png p22s5 показывает, что на 18-й день произошло что-то странное с чтением в тот день, вероятно, машинная ошибка, я думаю http://img521.imageshack.us/img521/8083/p22s5loess.png

@ Питер / @ Хэдли, следующее, что я хотел бы сделать, - это попытаться приспособить кривую роста логистики, Гомперца или Ричарда к этим данным вместо лесса и рассчитать темп роста на экспоненциальной стадии. В конце концов я планирую использовать пакет grofit в R (http://cran.r -project.org / web / packages / grofit / index.html ), но сейчас я хотел бы построить их вручную, используя ggplot2, если возможный. Если у вас есть какие-либо указатели, то это будет высоко ценится.

Ответы [ 2 ]

14 голосов
/ 10 апреля 2010

Вы пробовали аргумент family = "symmetric" для geom_smooth (который, в свою очередь, будет передан loess)? Это сделает лесс гладким, устойчивым к выбросам.

Однако, глядя на ваши данные, почему вы думаете, что линейное соответствие не адекватно? У вас есть только 4 значения, и уж точно нет убедительных доказательств отклонения от линейности.

2 голосов
/ 10 апреля 2010

Во-первых, я не уверен, что «выброс» даже правильно определен на таких маленьких данных.

Во-вторых, вам нужно будет решить, что вы подразумеваете под "выбросом", то есть это один из препаратов, один из повторов или один из моментов времени?

Как отмечает Хэдли, имеется мало доказательств отклонения от линейности.

Наконец, я думаю, что суть сглаживания состоит в том, что он хорошо справляется с выбросами при условии, что данных достаточно. Но у тебя очень мало.

Итак, я должен спросить точно, почему вы хотите удалить выбросы. То есть, что вы собираетесь делать с этими данными (помимо создания хороших графиков)?

Надеюсь, это поможет

...