時系列の問題があり、誰かが助けてくれることを願っています!
問題は、タイムスタンプが異なる2つのデータセットを中心に展開します。 1セットのデータにはキャリブレーションデータが含まれ、もう1セットにはサンプルデータが含まれます。キャリブレーションは、サンプルよりもはるかに頻度が低くなります。
私がやりたいのは、キャリブレーションデータ(低周波数)をサンプル時系列(高周波数)に補間することです。
sam <- textConnection("time, value
01:00:52, 256
01:03:02, 254
01:05:23, 255
01:07:42, 257
01:10:12, 256")
cal <- textConnection("time, value
01:01:02, 252.3
01:05:15, 249.8
01:10:02, 255.6")
sample <- read.csv(sam)
sample$time <- as.POSIXct(sample$time, format="%H:%M:%S")
calib <- read.csv(cal)
calib$time <- as.POSIXct(calib$time, format="%H:%M:%S")
(私が見る)大きな問題は、データの頻度がランダムに変化することです。
同様のことをしなければならなかった人はいますか?私が望むことをするchronまたはZoo関数はありますか(両方のtsがランダムである高周波数データに低周波数データを補間します)?
私はZoo(またはxts)を使用し、次のようにします。
library(Zoo)
# Create Zoo objects
zc <- Zoo(calib$value, calib$time) # low freq
zs <- Zoo(sample$value, sample$time) # high freq
# Merge series into one object
z <- merge(zs,zc)
# Interpolate calibration data (na.spline could also be used)
z$zc <- na.approx(z$zc, rule=2)
# Only keep index values from sample data
Z <- z[index(zs),]
Z
# zs zc
# 2012-10-25 01:00:52 256 252.3000
# 2012-10-25 01:03:02 254 251.1142
# 2012-10-25 01:05:23 255 249.9617
# 2012-10-25 01:07:42 257 252.7707
# 2012-10-25 01:10:12 256 255.6000
このようにapprox
関数を使用することもでき、はるかに簡単になります。データフレームを使用していることを確認してください。また、as.POSIXct
を使用して、キャリブレーションとサンプルデータセットのカラムのフォーマットが同じであることを確認してください。
calib <- data.frame(calib); sample <- data.frame(sample)
IPcal <- data.frame(approx(calib$time,calib$value, xout = sample$time,
rule = 2, method = "linear", ties = mean))
head(IPcal)
# x y
#1 2017-03-22 01:00:52 252.3000
#2 2017-03-22 01:03:02 251.1142
#3 2017-03-22 01:05:23 249.9617
#4 2017-03-22 01:07:42 252.7707
#5 2017-03-22 01:10:12 255.6000
approxfunドキュメント でapprox
の詳細をご覧ください。