R: Как убрать выбросы из сглаживания в ggplot2?

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

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

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

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

РЕДАКТИРОВАТЬ: Я только что видел это (Как использовать тесты выбросов в 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-й день в этот день произошло что-то странное с чтением, вероятно, машинная ошибка, я думаю.

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

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

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


person John    schedule 10.04.2010    source источник


Ответы (2)


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

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

person hadley    schedule 10.04.2010
comment
Я получаю Error: Unknown parameters: family, когда пытаюсь это сделать. - person JayCo; 22.06.2016
comment
Догадаться! Правильный синтаксис: geom_smooth(method = loess, method.args = list(family = "symmetric")) - person JayCo; 22.06.2016

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

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

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

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

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

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

person Peter Flom    schedule 10.04.2010