1

3 つの異なる場所から複数日 (実際には 2 年間のデータ) にわたって 10 分ごとに測定された地表温度の時系列データのセットがあります。私が計算したいのは、各サイトの毎日の 60 分間隔の最大勾配 (温度上昇率) です。

したがって、基本的には、60 分のウィンドウで 1 日 10 分ずつ作業し、各ウィンドウの勾配を計算してから、最大勾配とそれがいつ発生したかを判断します。次に、この関数をデータセットの毎日に適用したいと思います。日付/時刻の形式は次のとおりです (%m/%d/%y %H:%M)。

この擬似コードのようなことをするために、ddplyとzooパッケージと関数rollapplyを使用して何かを想像しています

ddply(data, .(場所, 日), function(d) max(rollapply(slope(d$temp~d$time, data=d)))

ここで、「時間」は各日 (10 分ごと) 内の時間であり、「日」は単に日付であるため、関数はすべての日付に適用できます。明らかに、「勾配」は R 関数ではなく、実際の勾配を計算するために記述する必要があります。

Zoo と rollapply の経験が豊富な人、またはこの問題を解決する別の方法を考えられる人はいますか?

ここに単一の場所からのサンプルデータをいくつか含めました (したがって、場所の列は削除されています) https://gist.github.com/natemiller/42eaf45747f31a6ccf9a

助けてくれてありがとう、ネイト

編集:それ以来、geektraderのJoshua Ulrichの回答を以下から組み合わせて使用​​し、基本的な代数を使用して値を1時間あたりの℃の単位に変換しました

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

うまくいきます。

4

1 に答える 1

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
于 2013-03-21T16:15:50.350 に答える