R语言3D空间温度值插值:克里金法失效排查及替代方案
3D空间温度插值问题解答
问题背景
需在R语言中对1m×1m×2m立式冰柜内的3D温度值进行非最近邻插值计算,已知15个测量点的布局:
- 顶层(z=5):5个点为带中心点的正方形布局
- 中层(z=3):5个点为带中心点的4点星型(正方形旋转45°)布局
- 底层(z=1):5个点为带中心点的正方形布局
每个点包含x(1-5)、y(1-5)、z(1/3/5)坐标及温度值,目标计算位置(2,2,5)的温度。
示例数据集:
structure(list(x = c(1, 1, 3, 5, 5, 1, 3, 3, 3, 5, 1, 1, 3, 5, 5), y = c(1, 5, 3, 1, 5, 3, 1, 3, 5, 3, 1, 5, 3, 1, 5), z = c(5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1), T_.C = c(-20.750182521983, -19.04687, -19.5861606555542, -20.5691695760194, -20.6176610127199, -16.4671828378447, -16.5713893044039, -23.6506737064773, -19.9124349790261, -23.7875255615229, -26.0653073705183, -20.2412939002774, -21.0219350609566, -21.8749485590661, -23.805990645601)), row.names = c("1", "2", "21", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"), class = "data.frame")
已尝试方法:
oce::approx3d:未掌握用法,未成功RSAGA::pick.from.points:最近邻法可正常运行,代码如下:
toKnow <- as.data.frame(list(x=2,y=2,z=2)) pick.from.points(data=toKnow, src=myresults, pick=c("T_.C"), method="nearest.neighbour")
但克里金法报错,代码及错误信息:
pick.from.points(data=toKnow, src=myresults, pick=c("T_.C"), method="krige") [using ordinary kriging] x y z T_.C 1 2 2 2 NA Warnmeldung: In predict.gstat(g, newdata = newdata, block = block, nsim = nsim, : Covariance matrix singular at location [2,2,0]: skipping...
问题解答
1. 所尝试的方法是否有效?
- 最近邻法:有效,但属于非插值类的点估计方法,仅返回距离目标点最近的样本温度,无法体现空间温度的连续变化,不符合你要求的"非最近邻插值"需求。
oce::approx3d:本身是有效的3D线性插值函数,但需要输入规则网格数据(或先转换数据为规则网格结构),你未掌握用法导致失败,并非方法本身无效。RSAGA::pick.from.points的克里金法:函数本身支持3D克里金,但因数据问题失败,不是方法本身无效。
2. 克里金法尝试失败的原因是什么?是否为函数调用错误?
不是函数调用错误,核心原因是协方差矩阵奇异,具体诱因:
- 样本量过少(仅15个点):3D克里金需要足够样本拟合描述空间自相关性的变异函数,样本不足会导致协方差矩阵无法求逆。
- 坐标处理偏差:错误信息显示位置为
[2,2,0],与目标点z=2不符,可能是函数对z坐标的处理出现偏差,进一步加剧矩阵奇异问题。 - 布局差异大:中层点布局与上下层正方形布局差异明显,空间自相关性拟合难度高,也会导致矩阵奇异。
3. 当前数据集是否适配克里金法?
不太适配,原因如下:
- 样本量不足:3D克里金通常需要几十甚至上百个样本点才能稳定拟合变异函数,15个点无法支撑可靠的空间自相关性建模。
- 布局不均匀:中层与上下层的点布局结构差异大,空间连续性规律难以捕捉,变异函数拟合精度极低。
- 局部点覆盖有限:目标点
(2,2,5)位于顶层,顶层仅5个点,无法为克里金提供足够的局部样本建立有效插值模型。
4. 有哪些更合适的替代插值方法?
根据你的数据情况,推荐以下几种方法:
- 3D线性插值:使用
akima::interp3D,对样本量要求较低,能基于邻近点的线性关系计算插值结果,适合小数据集。示例代码:
library(akima) interp_result <- interp3D(x = myresults$x, y = myresults$y, z = myresults$z, value = myresults$T_.C, xo = 2, yo = 2, zo = 5) print(interp_result$value)
- 反距离权重插值(IDW):使用
gstat::idw,通过给邻近点分配与距离成反比的权重计算插值,无需拟合变异函数,操作简单。示例代码:
library(gstat) toKnow <- data.frame(x=2,y=2,z=5) idw_model <- idw(T_.C ~ 1, locations = ~x+y+z, data = myresults, newdata = toKnow) print(idw_model$var1.pred)
- 径向基函数插值(RBF):使用
fields::radbas,通过构造径向基函数拟合空间数据,能较好处理不规则布局的样本点,插值结果平滑性好,适合3D温度场估计。
内容的提问来源于stack exchange,提问作者DerEinstein
相关产品推荐
相关产品推荐

