Рассчитать скользящее среднее геометрическое по станции отбора проб воды

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

Station SampleDate FecalColiform

В зависимости от района выращивания существует от нескольких до более дюжины станций.

Я попытался адаптировать код, который нашел по адресу ЗДЕСЬ:

#File: Fecal
Fecal <- group_by(Fecal, Station) %>%
arrange(SampleDate) %>%
mutate(logres = log10(ResultValue)) %>%
mutate(mgm = stats::filter(logres, rep(1/24, 24), sides =1))

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

Существуют ресурсы для расчета скользящего среднего и код для расчета среднего геометрического, и я попытался объединить несколько из них. Я не могу найти пример для перемещения среднего геометрического.

В конце концов, я хотел бы построить график всех геосредних по станциям, как в примере по ссылке выше.

> dput(ByStationRGMData[1:10,])

structure(list(Station = c(114L, 114L, 114L, 114L, 114L, 114L, 
114L, 114L, 114L, 114L), Classification = structure(c(3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("  Approved  ", "  Conditionally        Approved  ", 
"  Prohibited  "), class = "factor"), SampleDate = c(19890103L, 
19890103L, 19890209L, 19890316L, 19890413L, 19890511L, 19890615L, 
19890713L, 19890817L, 19890914L), SWTemp = c(NA, NA, 5L, 8L, 
NA, 13L, 15L, 18L, NA, 18L), Salinity = c(NA, NA, 22L, 18L, NA, 
26L, 22L, 24L, NA, 32L), FecalColiform = c(180, 49, 2, 17, 7.9, 
1.8, 4.5, 11, 33, 1.8), RGM = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
)), .Names = c("Station", "Classification", "SampleDate", "SWTemp", 
"Salinity", "FecalColiform", "RGM"), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L), vars = list(
Station), drop = TRUE, indices = list(0:9), group_sizes = 10L,      biggest_group_size = 10L, labels = structure(list(
Station = 114L), class = "data.frame", row.names = c(NA, 
-1L), vars = list(Station), drop = TRUE, .Names = "Station"))

Я также хотел бы добавить движущийся 90-й процентиль к кадру данных и графикам. Я пробовал следующее:

ByStationRGMData <- RawData %>%
group_by(Station) %>%
arrange(SampleDate) %>%
mutate(RGM = as.numeric(rollapply(FecalColiform, 30, geometric.mean,     fill=NA, align="right"))) +
mutate(F90 = as.numeric(rollapply(FecalColiform, 30, quantile, p=0.90, fill=NA, align="right")))

Это дает мне ошибку:

Ошибка в mutate_(.data, .dots = lazyeval::lazy_dots(...)) : аргумент ".data" отсутствует, без значения по умолчанию

Я не могу понять, чего мне не хватает.


person Lindsey Hamilton    schedule 24.11.2015    source источник
comment
Журнал среднего геометрического представляет собой среднее арифметическое логов значений. Таким образом, после вычисления скользящего (арифметического) среднего логарифмического значения вы должны инвертировать на exp(...), чтобы получить среднее геометрическое.   -  person jogo    schedule 25.11.2015


Ответы (1)


Вы можете использовать rollapply из пакета zoo (здесь показано использование встроенного фрейма данных mtcars). Я использовал окно из 3 значений, но вы можете установить его на 30 в ваших реальных данных. align="left" использует текущее значение и n-1 предыдущих значений, где n — ширина окна:

library(psych)
library(dplyr)
library(zoo)

mtcars %>% 
  mutate(mpgGM = rollapply(mpg, 3, geometric.mean, fill=NA, align="left"))

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

person eipi10    schedule 24.11.2015
comment
Спасибо, это сработало хорошо. Мне пришлось включить as.numeric(), потому что иначе это не сработало бы. Кроме того, он пошел в неправильном направлении, начиная с 2015 года вместо 1989 года. Я изменил выравнивание на правое и получил ошибку: неправильный знак в аргументе «по». ??? - person Lindsey Hamilton; 25.11.2015
comment
Опубликуйте образец своих данных (например, вставьте вывод dput(Fecal[1:10,]), чтобы предоставить первые 10 строк ваших данных) и код, который вы выполнили. Вы можете опубликовать это в конце вашего вопроса. - person eipi10; 26.11.2015
comment
Я вернулся с выходных, посвященных Дню Благодарения, и снова запустил код, и он почему-то сработал. Я все же разместил образец, как вы просили, на всякий случай. Я также пытаюсь добавить скользящий 90-й процентиль, если вы можете мне помочь. Спасибо за вашу помощь. - person Lindsey Hamilton; 01.12.2015