【问题标题】:Calculate moving geometric mean by water sampling station水样站计算移动几何平均数
【发布时间】:2015-11-24 20:59:43
【问题描述】:

我需要通过各个采样站计算粪便大肠菌群随时间的移动几何平均值(在每个值我想要该值的几何平均值和前 29 个值)。当我从我们的数据库下载数据时,列标题是:

Station SampleDate FecalColiform

根据种植区域的不同,有几个到十几个站点。

我尝试修改我在HERE 找到的一些代码:

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

这行得通,但问题是我不想要生成的日志值。我只想要常规的 geomean,以便我可以绘制它并且每个人都可以轻松理解这些值。我试图以某种方式从其中的 psych 包中偷偷使用 geometry.mean 函数,但我无法做到这一点。

有计算移动平均值的资源,以及计算几何平均值的代码,我尝试将其中的几个结合起来。我找不到移动几何平均值的示例。

最终,我想按站点绘制所有几何平均值,类似于上面链接中的示例。

> 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”,没有默认值

我似乎无法弄清楚我错过了什么。

【问题讨论】:

  • 几何平均值的对数是数值对数的算术平均值。因此,在计算对数的移动(算术)平均值之后,您必须根据 exp(...) 进行逆运算以获得几何平均值。

标签: r dplyr trend


【解决方案1】:

您可以使用zoo 包中的rollapply(此处使用内置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"))

包含一个分组变量以分别获取每个组的滚动几何平均值。

【讨论】:

  • 谢谢,效果很好。我必须包括 as.numeric () 因为否则它将不起作用。此外,它走错了方向,从 2015 年而不是 1989 年开始。我将对齐更改为“正确”,但出现错误:“by”参数中的符号错误。 ???
  • 请发布您的数据样本(例如,粘贴dput(Fecal[1:10,]) 的输出以提供数据的前 10 行)和您运行的代码。您可以在问题结束时发布此内容。
  • 我从感恩节周末回来并再次运行代码,但由于某种原因它可以正常工作。我仍然按照您的要求发布了一个样本,以防万一。如果您可以帮助我,我还尝试添加滚动的第 90 个百分位数。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多