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

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

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

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

Существует ли функция для удаления выбросов как это в ggplot, или где я исправил бы свой код ниже для добавления моей собственной функции?

Править: Я просто видел это (Как использовать Тесты Изолированной части в Коде R), и заметьте, что Hadley рекомендует использовать устойчивый метод, такой как 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, что-то странное продолжалось чтение в тот день, вероятная ошибка машины, я думаю.

В данный момент я - визуальный контроль данные, чтобы проверить, что рост изгибает взгляд хорошо. После того, чтобы слушать совет Hadley и установки семейства = "симметричный", я уверен, что более гладкий лесс делает достойное задание игнорирования выбросов.

p26s4 shows around day 32 something really weird went on in two of the replicates, showing 2 outliers p22s5 shows that on day 18, something weird went on with the reading that day, likely machine error I think

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

5
задан Glorfindel 22 July 2019 в 11:09
поделиться

2 ответа

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

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

14
ответ дан 18 December 2019 в 10:43
поделиться

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

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

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

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

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

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

.
2
ответ дан 18 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: