在R中进行值的插值(并避免负的插值值)

4

在R中是否有任何插值方法,可以避免使用负值对缺失值进行插值?

让我们来看一个向量:

d <- c(NA, NA, 5000, 17782, NA, NA, 21450, 42320, NA, NA, 52900, 54170, 
60600, 69000, 78000, 87000, 96900, 96900, 122000, 132700, 145000, 
171500, 198900, 213400, 229600, 250200, 272000, 291600, 318000, 
343000, 367000, 419200, 445000, 495000, 540000)

plot(d)

使用三次样条插值

library(zoo)  # for na.spline
d.interpolation <- na.spline(d)

这会给出。
[1] -100174.12  -31198.04    5000.00   17782.00   16961.75   14160.17   21450.00   42320.00   53674.83
[10]   54841.83   52900.00   54170.00   60600.00   69000.00   78000.00   87000.00   96900.00   96900.00
[19]  122000.00  132700.00  145000.00  171500.00  198900.00  213400.00  229600.00  250200.00  272000.00
[28]  291600.00  318000.00  343000.00  367000.00  419200.00  445000.00  495000.00  540000.00

然而,在这种情况下,负值并没有太多意义。

显然,像这样的内容

d.interpolation <- na.spline(c(0,d))

也不起作用。

你有什么解决方法吗?


标准警告适用:你希望在 'NA' 位置的实际值是什么?例如,如果你的数据期望 "平滑",你可以用 mean(d[j-1],d[j+1]) 替换每个 'NA',然后进行拟合。 - Carl Witthoft
1个回答

4
您可以对log(d)进行插值:
library(zoo)
d.interpolation <- exp(na.spline(log(d)))
d.interpolation
#  [1]      1.86    282.86   5000.00  17782.00  22424.08  19122.70  21450.00
#  [8]  42320.00  59826.52  58724.79  52900.00  54170.00  60600.00  69000.00
# [15]  78000.00  87000.00  96900.00  96900.00 122000.00 132700.00 145000.00
# [22] 171500.00 198900.00 213400.00 229600.00 250200.00 272000.00 291600.00
# [29] 318000.00 343000.00 367000.00 419200.00 445000.00 495000.00 540000.00

enter image description here


感谢您指出这个选项。但是,您是否知道如何确保值不断增加的可能性?例如 42320、NA、NA、5290042320.00 59826.52 58724.79 52900.00 替换。 - majom
@majom -- 你确定这不是由于应用于数据的样条参数(基本上是高频截止)引起的吗? - Carl Witthoft
由于您的数据似乎遵循指数规律,因此您可以在对数空间中进行线性内/外插值(而不是使用样条曲线)。我在SO上看到了很多关于这个组合的问题。 - flodel
你对于这个特定曲线的 d.interpolation <- na.approx(c(0,d)) 的选择看起来最好。 - majom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接