计算时间序列的速度(时间的一阶导数)

时间:2016-02-24 10:57:03

标签: r xts

我想根据xts时间序列中的数据来计算速度。我的数据看起来像这样(命令波纹管生成样本,实际数据要大得多)。

measurement <- xts(c(7.9, 8.6, 12.7, 13.3), 
                   as.POSIXct(c("2016-02-24 06:00:00",
                                "2016-02-24 07:30:00",
                                "2016-02-24 09:15:00",
                                "2016-02-24 11:15:00")))
names(measurement) <- "pos"

head(measurement)
                     pos
2016-02-24 06:00:00  7.9
2016-02-24 07:30:00  8.6
2016-02-24 09:15:00 12.7
2016-02-24 11:15:00 13.3

如果我使用diff,我会在连续值之间进行更改。

diff(measurement)
                    pos
2016-02-24 06:00:00  NA
2016-02-24 07:30:00 0.7
2016-02-24 09:15:00 4.1
2016-02-24 11:15:00 0.6

但是,我想花时间考虑并计算速度(例如时间段的变化)。我尝试过使用以下肮脏的道路。

measurement$time  <- as.numeric(index(measurement))
measurement$speed  <- diff(measurement$pos) / diff(measurement$time) * 3600

head(measurement)
                    pos  time       speed
2016-02-24 06:00:00  7.9 1456290000        NA
2016-02-24 07:30:00  8.6 1456295400 0.4666667
2016-02-24 09:15:00 12.7 1456301700 2.3428571
2016-02-24 11:15:00 13.3 1456308900 0.3000000

必须有一种更简单,更优雅的方式来做到这一点。请记住,我还是R的新手,可能会遗漏一些东西。

1 个答案:

答案 0 :(得分:3)

我不知道基地R或speed套餐提供了一种直接以您的方式计算物理费率的方法。在几小时内进行# alternative time conversion del_t <- diff(index(measurement)) units(del_t) <- "hours" measurement$speed_hr <- diff(measurement$pos, na.pad=FALSE)/as.numeric(del_t) 计算的更直接的方法可能是

diff

可以指定hours返回的时间单位,因此在这种情况下可以设置为speed

更一般地说,您的速度计算在数据点处存在不连续性。在某些情况下,还需要跨数据点speed的连续性。然后可以使用R splinefun例程来计算# provides continuity of speed at data points # perform cubic spline fit spline_fit <- splinefun(x=index(measurement), y=measurement$pos, method="natural") # add spline speeds to measurements measurement$spline_spd <- spline_fit(index(measurement), deriv=1)*3600 ,该例程不仅可以返回位置的样条插值,还可以返回给出速度近似的一阶导数,该速度是连续的并且取决于多于两个相邻的数据点。代码看起来像

# make a sequence of plot times for spline fits
  spline_times <- seq(start(measurement), end(measurement), length.out=40)
# plot positions
  par(mfcol=c(2,1))
  plot(spline_times, spline_fit(spline_times, deriv=0), col="red", type="b", 
       main="Positions", xlab = "Time", ylab="Pos")
  points(index(measurement), measurement$pos, type="p", pch=19, cex=1.1)
  legend("topleft", legend = c("-- pos data","-- spline pos interpolations"), 
         text.col = c("black","red"), y.intersp=.2, yjust=3., bty="n", cex=1.3)
# plot speeds
  plot(spline_times, spline_fit(spline_times, deriv=1)*3600, col="red", type="b",
       main="Speeds", xlab="Time", ylab="Speed")
  lines(index(measurement), measurement$speed, type="b", pch=19, cex=1.1)
  legend("topleft", legend = c("-- speed calculation","-- spline speed interpolations"), 
       text.col = c("black","red"), y.intersp=.2, yjust=3., bty="n", cex=1.3)

样条速度不同于原始计算的速度,但这似乎是数据点连续性约束的结果。情节可能有助于澄清这一点。

$dizi=array();
$a=2;
$dizi[]= $a;
$dizi[]= 4;
$dizi[]= 7;

$variable = implode("", $dizi);
echo $variable;

enter image description here

四个数据点对于良好的样条拟合来说实在太少了,但这可能会传达出一般的想法。