Home Articles

每天给定间隔的最大斜率

Asked
Viewed 525 times
1

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

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

我正在想象使用ddply和动物园包和函数rollapply,做类似这样的伪代码

ddply(数据, . (位置,日),函数(d)max(rollapply(斜率(d $ temp~d $ time,data = d)))

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

有没有人有更多的动物园和rollapply的经验或可以想到另一种方法来解决这个问题?

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

谢谢你的帮助,Nate

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

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

效果很好 .

1 Answer

  • 3

    您可以使用 xts timeseries包,这对时间序列分析非常有用 . 结合 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
    

Related