1

我有一组时间序列数据,其中每 10 分钟测量一次来自三个不同位置的多天(实际上是 2 年的数据)的地表温度。我感兴趣的是计算每个站点每天任何 60 分钟间隔的最大斜率(温度升高率)。

所以基本上我想每天工作 10 分钟,有一个 60 分钟的窗口,计算每个窗口的斜率,然后确定最大斜率以及它在一天中发生的时间。然后我想将此函数应用于数据集中的每一天。日期/时间采用以下格式 (%m/%d/%y %H:%M)。

我正在想象使用 ddply 和 zoo 包和函数 rollapply 来做类似这个伪代码的事情

ddply(数据,.(位置,天),函数(d)最大值(rollapply(斜率(d$temp~d$time,data=d)))

其中“时间”是每天(每 10 分钟)内的时间,“天”只是日期,因此该函数可以应用于所有日期。显然,“斜率”不是 R 函数,必须编写来计算实际斜率。

有没有人对 zoo 和 rollapply 有更多经验,或者可以想出另一种方法来解决这个问题?

我在这里包含了来自单个位置的一些示例数据(因此位置列已被删除) https://gist.github.com/natemiller/42eaf45747f31a6ccf9a

感谢您的帮助,内特

编辑:从那以后,我结合使用了 geektrader 的 Joshua Ulrich 从下面的答案,并使用基本代数将值转换回每小时 ºC 的单位

    CperH<-dat$Temp-(dat$Temp/(1+dat$ROC))

效果很好。

4

1 回答 1

3

您可以使用xts对时间序列分析非常有用的时间序列包。结合TTR包,你可以很容易地得到你想要的。

require(xts)
require(TTR)
dat <- read.csv("https://gist.github.com/natemiller/42eaf45747f31a6ccf9a/raw/916443cfb353d82e8af6cdebdd80b2e956317b24/sampleTempData.csv")

dat.xts <- .xts(x = dat$Temp, index = as.POSIXct(strptime(dat$Date, format = "%m/%d/%y %H:%M")))
names(dat.xts) <- "Temp"
head(dat.xts)
##                     Temp
## 2011-04-11 03:48:00  9.5
## 2011-04-11 03:58:00  9.5
## 2011-04-11 04:08:00  9.5
## 2011-04-11 04:18:00  9.5
## 2011-04-11 04:28:00  9.5
## 2011-04-11 04:38:00  9.5


dat.xts$ROC <- ROC(dat.xts, n = 6)
head(dat.xts, 10)
##                     Temp ROC
## 2011-04-11 03:48:00  9.5  NA
## 2011-04-11 03:58:00  9.5  NA
## 2011-04-11 04:08:00  9.5  NA
## 2011-04-11 04:18:00  9.5  NA
## 2011-04-11 04:28:00  9.5  NA
## 2011-04-11 04:38:00  9.5  NA
## 2011-04-11 04:48:00  9.5   0
## 2011-04-11 04:58:00  9.5   0
## 2011-04-11 05:08:00  9.5   0
## 2011-04-11 05:18:00  9.5   0

dat.xts[which.max(dat.xts$ROC), ]
##                     Temp       ROC
## 2011-04-12 09:48:00 14.5 0.5340825


# If you want to do analysis on per day basis.
dat.xts <- .xts(x = dat$Temp, index = as.POSIXct(strptime(dat$Date, format = "%m/%d/%y %H:%M")))
names(dat.xts) <- "Temp"
head(dat.xts)
##                     Temp
## 2011-04-11 03:48:00  9.5
## 2011-04-11 03:58:00  9.5
## 2011-04-11 04:08:00  9.5
## 2011-04-11 04:18:00  9.5
## 2011-04-11 04:28:00  9.5
## 2011-04-11 04:38:00  9.5


ll <- split.xts(dat.xts, f = "days")


ll <- lapply(ll, FUN = function(x) {
    x$ROC <- ROC(x, 6)
    return(x)
})

max.ll <- lapply(ll, function(x) x[which.max(x$ROC), ])

max.ll
## [[1]]
##                     Temp       ROC
## 2011-04-11 13:38:00 20.5 0.4946962
## 
## [[2]]
##                     Temp       ROC
## 2011-04-12 09:48:00 14.5 0.5340825
## 
## [[3]]
##                     Temp       ROC
## 2011-04-13 10:18:00 15.5 0.4382549
## 
## [[4]]
##                     Temp       ROC
## 2011-04-14 10:38:00 14.5 0.3715636
于 2013-03-21T16:15:50.350 回答