【问题标题】:Linear interpolation or resampling in RR中的线性插值或重采样
【发布时间】:2019-11-25 14:02:23
【问题描述】:

我有一个与插值有关的问题。我有 2 列($1 是以秒为单位的时间,另一个海平面)。我尝试过的示例大多来自日期列,例如1970-11-11,但我有记录为秒,我想线性插值到分钟。采样最初是每 0.3 秒。有什么建议请教哪个包最好?在下文中,它生成了一个大矩阵,但没有按预期减少值的数量。格式只有 2 列。尝试在进一步分析中使用,不是每 0.1 秒而是每 1 分钟采样一次数据。

set.seed(1);
time <- rep(seq(0,180,by=0.1));
sl <-runif(1801,-0.1,4.0);
data1 <-  cbind2(time,sl);

#Output needed...
time(min)   sl(cm)


#Examples tried:

time<-data1$V1
SL<-data1$V2
seq1 <- zoo(order.by=((seq(min(time), max(time), by=30))))

mer1 <- merge(zoo(x=data1[1:2],order.by=time), seq1)
#Linear interpolation
dataL <- na.approx(mer1)

【问题讨论】:

  • 检查是否可以使用aggregate函数。
  • 您能否提供一些示例数据来显示您正在查看的格式以及理想情况下所需的输出?
  • @Brian Fisher,谢谢你我加入了一个非常普遍的例子,不确定是否会有所帮助,但这是我想要做的事情的想法。另外,我会尝试移动平均线。
  • @Amber 你能解释一下你在寻找什么/你是如何得到想要的结果的吗?在您提供的示例中,输入被标记为秒,因此如果我们将其解释为一分钟的分数,并且您要插入的点位于1,已经有一个数据点(17.25),但是您的输出显示您得到 33,这超出了示例数据的范围。您想拟合曲线还是汇总数据?
  • 对于这个例子,您应该提供至少 3 分钟的数据(可以模拟),以及您试图通过重采样实现的目标。您是要节省内存,还是要总结报告,还是要在进一步分析中使用?要回答哪个可能是最好的方法,您需要包括您的标准是什么(最快、最少代码、最符合实际测量值等)

标签: r time-series interpolation sampling


【解决方案1】:

这是一种解决方案。这种方法不使用任何线性插值,而是以每分钟为中心取平均值。

library(dplyr) # for group_by and summarize
colnames(data1) <- c("time", "sl")  # makes it easier to call variables by names
data1 <- as.data.frame(data1)  
data1$minute <- round(data1$time/60,0)  #
head(data1)
#  time        sl minute
# 1  0.0 0.9885855      0
# 2  0.1 1.4257080      0
# 3  0.2 2.2486988      0
# 4  0.3 3.6236519      0
# 5  0.4 0.7268959      0
# 6  0.5 3.5833977      0

data_by_minute <- data1 %>%
      group_by(minute) %>%
      summarize(sl_avg = mean(sl))
data_by_minute

# # A tibble: 4 x 2
#   minute sl_avg
#    <dbl>  <dbl>
# 1      0   1.91
# 2      1   1.98
# 3      2   1.87
# 4      3   1.96

如果您只想每分钟获取一次实际读数,而不是计算平均值,另一种方法:

data1[data1$time%%60==0,]  # only returns the observations on the minute. throws everything else out
#      time sl
# 1       0 0.9885855
# 601    60 3.2384322
# 1201  120 1.4027590
# 1801  180 0.1525986

或者,如果您正在寻找可以使用的插值:

minutes <- time/60  # calculate minutes based on the time variable
mod_leoss <- loess(minutes~sl) # fit a loess model to your data, this is essentially a smoothed version of your sl data based on time
Minute <- c(0,1,2,3)  # minutes for which you want a predicaiton
SL_Preds <- predict(mod_leoss, Minute)  # calculate values from the model

tableA <- cbind(Minute, SL_Preds)
tableA
#      Minute SL_Preds
# [1,]      0 1.665899
# [2,]      1 1.463291
# [3,]      2 1.445809
# [4,]      3 1.498165

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 2019-04-12
    • 2014-10-04
    • 1970-01-01
    • 2023-03-06
    • 2013-07-25
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多