【发布时间】:2020-04-21 11:15:31
【问题描述】:
我开始自动化用于水质数据时间序列数据的 Mann-Kendall 测试。以前是用Excel做的,但是复制粘贴太多了。我想创建一个 R 脚本来运行 MK 测试(包“趋势”)并计算 Sens Slope。我有以下示例表,其中包含我们的水质数据:
| Site | Program | Year | parameter1 | parameter2 |
|------|---------|------|-----|-----|
| A | ABC | 1990 | 5 | 100 |
| A | ABC | 1991 | 10 | 75 |
| A | ABC | 1992 | 15 | 50 |
| A | ABC | 1993 | 20 | 25 |
| A | ABC | 1994 | 25 | 5 |
| B | ABC | 1990 | 10 | 88 |
| B | ABC | 1991 | 20 | 44 |
| B | ABC | 1992 | 30 | 22 |
| B | ABC | 1993 | 40 | 11 |
| B | ABC | 1994 | 50 | 6 |
| C | XYZ | 1990 | 6 | 64 |
| C | XYZ | 1991 | 12 | 44 |
| C | XYZ | 1992 | 18 | 24 |
| C | XYZ | 1993 | 24 | 14 |
| C | XYZ | 1994 | 30 | 4 |
| D | XYZ | 1990 | 7 | 99 |
| D | XYZ | 1991 | 14 | 88 |
| D | XYZ | 1992 | 21 | 77 |
| D | XYZ | 1993 | 28 | 66 |
| D | XYZ | 1994 | 35 | 55 |
我需要为每个参数(ANC 和 SO4)取出数据中的每个时间序列(因此对于站点 A、B、C、D),并在 R 中运行 MannKendall 测试(代码如下)。我需要一个如下所示的输出表,但填充了 MK 统计量和 sens 斜率(不是如下所示的 1)。
| Site | Program | Parameter | MK Statistic | Sens Slope |
|------|---------|-----------|--------------|------------|
| A | ABC | ANC | 1 | 1 |
| A | ABC | SO4 | 1 | 1 |
| B | ABC | ANC | 1 | 1 |
| B | ABC | SO4 | 1 | 1 |
| C | XYZ | ANC | 1 | 1 |
| C | XYZ | SO4 | 1 | 1 |
| D | XYZ | ANC | 1 | 1 |
| D | XYZ | SO4 | 1 | 1 |
关于如何生成此输出表的任何想法?我知道它在某些时候需要一个循环,但不完全确定从哪里开始。可能是每个站点、程序,然后是 ANC 或 S04。下面的 R 代码来自一个单独的站点和参数组合,但是对于我们拥有的 100 个站点和 6 个水质参数,这将是一个痛苦的复制。
install.packages("trend")
library("trend")
#put our data in a time series (but this only creates 1 site and its time series)
time_series <- ts(Trends$parameter1, start=c(1990, 1), end=c(1994, 1), frequency=1)
print(time_series)
#Run the MK Test and Sens Slope from package trend
mk.test(time_series, alternative = c("two.sided", "greater", "less"),
continuity = TRUE)
sens.slope(time_series, conf.level = 0.95)
输出示例 - 这些是来自我的实际数据的结果,而不是示例数据集(因为我没有在示例数据中的所有站点上成功运行 MKtest)。下面有^^^^的数字是我最终输出表需要的数字。
> mk.test(time_series , alternative = c("two.sided", "greater", "less"),
+ continuity = TRUE)
Mann-Kendall trend test
data: time_series
z = -5.7308, n = 26, p-value = 9.996e-09
alternative hypothesis: true S is not equal to 0
sample estimates:
S varS tau
-261.0000000 2058.3333333 -0.8030769
^^^^^^^^^^^^
> sens.slope(time_series , conf.level = 0.95)
Sens slope
data: time_series
z = -5.7308, n = 26, p-value = 9.996e-09
alternative hypothesis: true z is not equal to 0
95 percent confidence interval:
-1.3187075 -0.9495238
sample estimates:
Sens slope
-1.136842
^^^^^^^^^
【问题讨论】:
-
你能检查我更新的代码吗
标签: r loops time-series trend