【问题标题】:R: Extrapolating x no. of values beyond known valuesR:外推 x 没有。超出已知值的值
【发布时间】:2021-12-20 20:33:35
【问题描述】:

我正在寻找一种函数/方法来推断(线性)超出原始值的 x 个值。

假设我从:

a <- c(NA, NA, NA, NA, NA, NA, 1, 2, 3, NA, NA, NA, NA, NA, NA)

我想推断两个值之外,我最终会得到:

[1] NA NA NA NA -1 0 1 2 3 4 5 NA NA NA NA

到目前为止,我发现的是 Hmisc (https://rdrr.io/cran/Hmisc/man/approxExtrap.html) 的 approxExtrap 函数。但是由于您必须定义“xout”,所以我觉得我必须编写一个循环,并且每次选择我想要推断的部分。这当然是可能的,但最终我希望有数百万个数据点的序列有很多间隙,所以我觉得这可能太耗时了。所以我希望我忽略了一个更简单的解决方案。

已添加:数据中存在不小的差距,但通常约为 100 个 NA,然后约为 40 个数据点。我想在 40 个数据点开始之前和结束之后用 5 个新数据点推断/扩展 40 个数据点,并在两个位置替换 5 个 NA。无法在 40 个数据点的两个序列之间进行插值。

【问题讨论】:

  • 外推步骤是否总是只有 +/- 1?您是否在同一个向量中多次运行非 NA 值?
  • 不幸的是,它并不总是 +/- 1,比如说:+/- 1 (sd: ~ 0.3)。我确实有多次运行 NA(一天内有数百次数据)。
  • +/-1 (sd:~0.3) 是什么意思?
  • 所以你有时间,x坐标,y坐标?并且您想根据时间和上一个/下一个坐标填写 NA 时的坐标?也许像rmisstastic.netlify.app 这样的东西会有所帮助
  • 如果你有c(1, 2, 3, NA, 10, 20, 30)会发生什么? NA 应该替换为 4 还是 0?您愿意在这种情况下in插值吗?你应该在你的问题中指定一整套答案应该遵循的规则。

标签: r extrapolation


【解决方案1】:

我设法通过以下方式解决了这个问题:

  1. 确定不同数据系列的范围
  2. 定义我想要推断的范围
  3. 通过 Hmisc 包进行实际推断

最初,我认为我只能通过一些循环来管理这个,这些循环必须逐行遍历原始数据,并且希望有一个现有的功能。

我敢肯定,你们中的许多人会以这种方式编码更高效、更好。但是还是想为有类似问题的人发布我的脚本。

require(Hmisc)
extrapol.length <- 5
test <- data.frame('Time' = c(1:100), # I didn't use this as my data was equally spread in time, if you want to use it, see the first argument in the approxExtrap-function in the secondlast line
                   'x' = c(rep(NA, 10), 1:30, rep(NA, 30), 1:10, rep(NA, 20))) 

## Determine start and end of the continuous (non-NA) data streams
length.values <- diff(c(0, which(is.na(test[,2]))))-2 # length non-NA's
length.values <- length.values[length.values > -1]
length.nas <- diff(c(0, which(!is.na(test[,2])))) # length NA's
length.nas <- length.nas[length.nas > 1]
if(is.na(test[1,2])){
  # data starts with NA
  length.nas <- data.frame('Order' = seq(1, length(length.nas)*2, by = 2),
                           'Length' = length.nas, 'Type' = 'na')
  length.values <- data.frame('Order' = seq(2, length(length.values)*2, by = 2),
                              'Length' = length.values, 'Type' = 'value')
  start.end <- rbind(length.nas, length.values)
  
  start.end <- start.end[order(start.end$Order),]
  
  value.seqs <- data.frame('no' = c(1:length(start.end$Type[start.end$Type == 'na'])),
                           'start' = NA, 'end' = NA)
  for(a in value.seqs$no){
    value.seqs$start[a] <- sum(start.end$Length[1:((a*2)-1)])
    value.seqs$end[a] <- sum(start.end$Length[1:(a*2)])
  }
}else{
  # Data starts with actual values
  length.nas <- data.frame('Order' = seq(2, length(length.nas)*2, by = 2),
                           'Length' = length.nas, 'Type' = 'na')
  length.values <- data.frame('Order' = seq(1, length(length.values)*2, by = 2),
                              'Length' = length.values, 'Type' = 'value')
  start.end <- rbind(length.nas, length.values)
  
  start.end <- start.end[order(start.end$Order),]
  
  value.seqs <- data.frame('no' = c(1:length(start.end$Type[start.end$Type == 'value'])),
                           'start' = c(1,rep(NA, (length(start.end$Type[start.end$Type == 'value'])-1))), 'end' = NA)
  for(a in value.seqs$no){
    value.seqs$end[a] <- sum(start.end$Length[1:((a*2)-1)])+1
    if(a < max(value.seqs$no))
      value.seqs$start[a+1] <- sum(start.end$Length[1:(a*2)])+1
  }
}

## Do not extrapolate outside of the time-range of the original dataframe
value.seqs$start.extr <- value.seqs$start - extrapol.length
value.seqs$start.extr[value.seqs$start.extr < 1] <- 1 # do not extrapolate below time < 1
value.seqs$end.extr <- value.seqs$end + extrapol.length
value.seqs$end.extr[value.seqs$end.extr > nrow(test) | is.na(value.seqs$end.extr)] <- nrow(test)
value.seqs$end[is.na(value.seqs$end)] <- max(which(!is.na(test[,2])))


## Extrapolate 
for(b in value.seqs$no){
  test[c(value.seqs$start.extr[b]:value.seqs$end.extr[b]),3] <- approxExtrap(value.seqs$start[b]:value.seqs$end[b],test[c(value.seqs$start[b]:value.seqs$end[b]),2],xout=c(value.seqs$start.extr[b]:value.seqs$end.extr[b]))[2]
}

感谢您的考虑!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 2021-09-17
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多