R中的二维线性插值

3

我想在R中进行双线性插值,但是我无法通过akimainterp函数来实现,因为我得到一个矩阵,其中一半填充有数字,另一半填充有NA。这是我的问题示例:

x = rep(c(1,2,3,6,9,12)/12,5)
y = seq(2709,3820,length = 30)
z = seq(9.2,16.5,length = 30)

inter_lin = interp(x,y,z,xo = seq(min(x),max(x),length=100),
                   yo = seq(min(y), max(y), length=100), linear=T)

我还尝试使用函数interp.surface.gridfields中进行操作,但是必须有一个包含全部xy值的矩阵z才能进行操作,而我没有这个矩阵,所以无法实现。 编辑 这是我实际拥有的yz向量:
y = c(2931.076,2901.935,2868.635,2804.006,2760.297,2709.114,2983.466,2969.436,2954.808,2928.802,2915.815,2903.867,
      3043.365,3051.140,3057.960,3079.230,3103.015,3127.245,3118.090,3156.223,3194.574,3291.021,3380.687,3472.676,
      3195.631,3260.866,3331.776,3502.477,3658.052,3829.511)

z = c(10.280984,9.733925, 10.176117, 10.644877, 10.950297, 11.737252, 10.442495, 10.170472, 10.590579, 11.153778 ,11.501962,
  12.066833,11.000000, 11.025000, 11.450000, 12.125000, 12.550000, 12.875000, 12.142495, 11.870472, 12.390579, 13.053778,
  13.501962,14.066833,13.005984, 12.458925, 13.051117, 13.694877, 14.150297, 14.937252)

x向量和之前一样吗? - Dan
@Lyngbakr 是的,它是相同的。 - Alejandro Andrade
1个回答

2

linear = FALSEextrap = TRUE设置为真。

x = rep(c(1,2,3,6,9,12)/12,5)
y = seq(2709,3820,length = 30)
z = seq(9.2,16.5,length = 30)

inter_lin = interp(x,y,z,xo = seq(min(x),max(x),length=100),
                   yo = seq(min(y), max(y), length=100), linear=FALSE, extrap = TRUE)

我认为问题在于边界值的插值,这会从边缘向内波动。通过允许外推 - 这是线性插值可能做到的 - 可以避免这个问题。

编辑

如果插值域限制在存在数据的区域内,结果将非常好。

library(akima)
library(spatialkernel)
library(fields)

# Create grid
grd <- expand.grid(x = seq(min(x),max(x),length=100), y = seq(min(y), max(y), length=100))

# Find points in convex hull
mask <- pinpoly(cbind(x, y)[chull(x, y),], as.matrix(grd))

# Crop grid to convex hull
grd <- grd[mask == 2,]

# Interpolate to points in convex hull
res <- interpp(x, y, z, xo = grd$x, yo = grd$y)

# Plot results
quilt.plot(res$x, res$y, res$z)

enter image description here


@Lyngbarj,我尝试过了,但是使用我的真实数据时,插值出现了错误。从第22列到第23列,数值从10.07785跳至71.98672,然后一直出现错误。我不知道为什么这个例子可以正常工作。我将用真实数据更新问题。 - Alejandro Andrade
@alejandroandrade 为什么将 y 除以1000会改变任何东西?将 y 对 x 进行绘图并查看左上角。有一个没有数据的大区域。现在将 y/1000 对 x 进行绘图。在左上角仍然存在大的空白区域。您正在尝试在没有数据的区域内进行插值,因此出现了错误的值。我的建议是:将插值限制在您拥有数据的区域内。 - Dan
@alejandroandrade 我已更新我的答案,以显示如何使用裁剪的插值域来实现。 - Dan
@alejandroandrade 可能是可行的,但是过度偏离会产生奇怪的结果(就像我们之前看到的那样),因为没有数据来指导插值。您最好使用某种统计模型。 - Dan
我实际上已经拥有了一种插值的统计模型,但是想要线性进行比较。 - Alejandro Andrade
显示剩余3条评论

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