在 R 的 3D 空间中插值(例如温度) - 不是通过选择最近邻而是通过计算

问题描述 投票:0回答:1

我需要计算依赖于附近其他值的值。他们的位置是已知的。在给定情况下,这些值是温度。 考虑一个立式冷冻柜(大约 1m x 1m x 2m(宽 x 深 x 高)),其温度在 15 个点进行测量:

  • 顶层 (=5):5 个点,方向为具有中心点的正方形
  • 中级(=3):5个点,定向为具有中心点的4点星(即正方形旋转45°)
  • 最低级别(=1):5点,方向为有中心点的正方形 所以每个点都有 3 个坐标:x (1-5)、y (1-5) 和 z (1,5)。这 15 个点中的每一个都有一个温度作为其值,例如-19.51°C。 现在考虑一篇文章位于位置 2,2,5 (x, y, z),该位置的温度是多少?

以下是数据的示例:

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 和 pick.from.points RSAGA。 使用apporx3d我无法思考,而使用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")
x y z      T_.C
1 2 2 2 -19.58616

但是,用于计算缺失值的“克里金法”不起作用:

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...

问题:

  • 我尝试了有效的方法吗?
  • 这次尝试出了什么问题?例如。函数调用错误?
  • 数据集不合适吗?
  • 还有其他(更适合的)方法吗?

提示:

  • 测量点等距,但位置未知,它们的值可能不等距

非常感谢!

r spatial temperature
1个回答
0
投票

有一段时间没有尝试在 R 中执行此操作,但

GauPro
似乎得到了积极维护并且易于使用。

鉴于您说您的温度只是随机值,我很想确保其中存在某种结构。鉴于您的结构保存在

x
中,我会这样做:

x2 <- within(x, {
  T_.C <- NULL
  known <- -20 + sqrt((x-3)^2 + (y-3)^2 + (z-3)^2) / 2
  measured <- rnorm(length(known), known, 0.1)
})

“中间”(即 x,y,z = 3)的温度为 -20,距离越远,温度越高。

这可以通过以下方式进行拟合、打印模型摘要信息和显示预测:

require(GauPro)
m <- gpkm(measured ~ x + y + z, x2, kernel='matern52')
summary(m)
predict(m, c(x=3, y=3, z=3), se=T)

这似乎对我来说是正确的,因为中心的预测接近

-20
,而更接近边缘(x,y,z = 1.5)的结果接近
18.7
的真实值。

© www.soinside.com 2019 - 2024. All rights reserved.