在 R-Studio 中使用 gstat 进行时空插值 - 拟合正确的变异函数
Spatio Temporal Interpolation with gstat in R-Studio - Fitting the correct variogram
我对空间评估很陌生,来自心理学。
我正在使用软件 R 和软件包“gstat”和“spacetime”。
我想做一个时空插值。为此,我遵循 Gräler 等人的论文。 (https://cran.r-project.org/web/packages/gstat/vignettes/spatio-temporal-kriging.pdf)
不幸的是,我不能 find/fit 正确的变差函数模型。我可以创建经验变异函数,这对我来说也是决定性的,但我没有进一步了解。我不明白如何定义单独的参数,例如“基台”或“金块”或它们代表什么。
这是我以前的方法:
我的 ST-Dataframe:
> df.stf
An object of class "STFDF"
Slot "data":
# A tibble: 2,406 x 6
KRS month DeprIndex MMW10 MMW25 NewInfect
<dbl> <int> <dbl> <dbl> <dbl> <dbl>
1 1001 1 -4.08 NA NA NA
2 1002 1 -2.28 13.3 NA NA
3 1003 1 -3.29 17.8 11.7 NA
4 1004 1 -4.31 NA NA NA
5 1051 1 -2.51 17.7 NA NA
6 1053 1 -1.07 13.0 9.93 NA
7 1054 1 -0.863 NA NA NA
8 1055 1 -1.63 NA NA NA
9 1056 1 0.887 NA NA NA
10 1057 1 -1.21 14.7 8.84 NA
# ... with 2,396 more rows
Slot "sp":
class : SpatialPolygonsDataFrame
features : 401
extent : 3280359, 3921536, 5237511, 6103443 (xmin, xmax, ymin, ymax)
crs : +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +units=m +no_defs
variables : 1
names : AGS
min values : 1001
max values : 16077
Slot "time":
timeIndex
0001-01-30 1
0002-01-30 2
0003-01-30 3
0004-01-30 4
0005-01-30 5
0006-01-30 6
Slot "endTime":
[1] "0002-01-30 CET" "0003-01-30 CET" "0004-01-30 CET" "0005-01-30 CET" "0006-01-30 CET" "0007-01-30 CET"
所以,我有 401 个德国县和六个月内的月平均 PM10 值。
我的经验变异函数:
eVgmPm10<-variogramST(MMW10~1,df.stf,tlags = 0:5)
eVgmPm10$dist<-eVgmPm10$dist/1000
eVgmPm10$avgDist <- eVgmPm10$avgDist/1000
eVgmPm10$spacelag <- eVgmPm10$spacelag/1000
plot(eVgmPm10, map=F)
到目前为止一切正常(我猜)
现在我想像论文中解释的那样制作一个可分离的模型:
separableModel <- vgmST("separable",
space = vgm(0.9, "Exp", 200, 0.1),
time = vgm(0.9, "Sph", 3.5, 0.1),
sill = 124)
我明白,我必须为 space 和时间创建一个变差函数。但我不知道如何为变差函数正确定义参数(psill、模型、范围、块)。如果我使用与论文中相同的参数,我会得到以下图:
如您所见,在这个模型中,我只有两个滞后,变异函数看起来很奇怪。所以,我认为这是因为我的模型参数错误。我还测试了论文中的另一种方法。
sumMetricModel <- vgmST("sumMetric",
space = vgm(20, "Sph", 150, 1),
time = vgm(10, "Exp", 2, 0.5),
joint = vgm(80, "Sph", 1500, 2.5),
stAni = 120)
同样,我不知道如何设置参数,所以我采用了与论文中相同的方法并绘制了所有三个参数。
我很确定它取决于参数,但我真的不知道如何找到适合的正确变差函数模型。
第一个答案后更新:
按照建议,我为新的经验变差函数使用了更少的时间延迟:
eVgmPm10<-variogramST(MMW10~1,df.stf,tlags = 0:2)
我得到了这个线框图:
如您所见,我仍然有 3 个时间步从“滞后 0”开始。
然后我尝试按照建议填充模型参数。
separableModel<-vgmST("separable",
space=vgm(psill = 15,model = "Exp", range =250 ,nugget = 5),
time = vgm(psill = 15,model = "Exp", range =1 ,nugget = 0),
sill = 15)
这是两者的线框图:
我真的很沮丧,我很抱歉我的知识匮乏,但我真的很努力去理解它,我很感激每一个帮助
sill
、range
和nugget
的初始参数可以从经验时空变异函数中读取。通过以下方式生成经验变异函数的 3D 线框图:
plot(eVgmPm10, wireframe=T, scales=list(arrows=F))
金块大约是表面与 z-axis 的近似交点(这相当于模型无法解释的小规模可变性)。基台大约是经验表面接近的最大值 z-value,范围大约是表面变平的距离。您将拥有空间 (x-axis) 和时间 (y-axis) 范围。
不同的模型对这些值的解释略有不同;详细信息在您在问题中引用的 gstat 小插图的第 2.1 节中给出。在可分离的情况下,例如,空间和时间变异函数分量被归一化为 1 的联合基台(基台 + 金块),并且模型被模型定义中的基台参数“拉伸”。在 sum-metric 模型中,此规范化不适用。对于度量分量,必须拟合时空各向异性,以便在单个模型中关联空间和时间距离(检查 gstat::estiStAni()
)。我建议在 R 中使用 运行 demo("stkrige")
并试验这些参数以更好地了解它们的影响。请注意,参数也会相互影响,这有时会使解释和数值优化变得麻烦。
根据您在问题中提供的内容,5 的金块、15 的基台和 250 的空间范围可能是开始的值。此外,它看起来好像您的经验表面沿着时间域以波浪形式移动。这可能是数据集时间覆盖的人工制品。 6 个时间步长(在您的情况下为几个月)很少用于估计任何时间依赖性,尤其是超过 1 个(或可能是 2 个)步长。您的绘图表明您正在查看 5 个时间步长,其中“lag5”将仅基于第一个月和最后一个月的值。在估计经验变异函数时,请考虑使用较少的时间滞后:
eVgmPm10<-variogramST(MMW10~1, df.stf, tlags = 0:2)
关于您问题的标题“正确的变差函数”,很难确定那是什么。您只能找到一个模型,该模型将是您提供给算法的数据中依赖结构的“良好”近似。例如,依赖性可能会在冬季和夏季月份之间发生变化,并且平均值中可能存在季节性成分,这也需要反映在模型中。
我对空间评估很陌生,来自心理学。
我正在使用软件 R 和软件包“gstat”和“spacetime”。
我想做一个时空插值。为此,我遵循 Gräler 等人的论文。 (https://cran.r-project.org/web/packages/gstat/vignettes/spatio-temporal-kriging.pdf)
不幸的是,我不能 find/fit 正确的变差函数模型。我可以创建经验变异函数,这对我来说也是决定性的,但我没有进一步了解。我不明白如何定义单独的参数,例如“基台”或“金块”或它们代表什么。
这是我以前的方法:
我的 ST-Dataframe:
> df.stf
An object of class "STFDF"
Slot "data":
# A tibble: 2,406 x 6
KRS month DeprIndex MMW10 MMW25 NewInfect
<dbl> <int> <dbl> <dbl> <dbl> <dbl>
1 1001 1 -4.08 NA NA NA
2 1002 1 -2.28 13.3 NA NA
3 1003 1 -3.29 17.8 11.7 NA
4 1004 1 -4.31 NA NA NA
5 1051 1 -2.51 17.7 NA NA
6 1053 1 -1.07 13.0 9.93 NA
7 1054 1 -0.863 NA NA NA
8 1055 1 -1.63 NA NA NA
9 1056 1 0.887 NA NA NA
10 1057 1 -1.21 14.7 8.84 NA
# ... with 2,396 more rows
Slot "sp":
class : SpatialPolygonsDataFrame
features : 401
extent : 3280359, 3921536, 5237511, 6103443 (xmin, xmax, ymin, ymax)
crs : +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +units=m +no_defs
variables : 1
names : AGS
min values : 1001
max values : 16077
Slot "time":
timeIndex
0001-01-30 1
0002-01-30 2
0003-01-30 3
0004-01-30 4
0005-01-30 5
0006-01-30 6
Slot "endTime":
[1] "0002-01-30 CET" "0003-01-30 CET" "0004-01-30 CET" "0005-01-30 CET" "0006-01-30 CET" "0007-01-30 CET"
所以,我有 401 个德国县和六个月内的月平均 PM10 值。
我的经验变异函数:
eVgmPm10<-variogramST(MMW10~1,df.stf,tlags = 0:5)
eVgmPm10$dist<-eVgmPm10$dist/1000
eVgmPm10$avgDist <- eVgmPm10$avgDist/1000
eVgmPm10$spacelag <- eVgmPm10$spacelag/1000
plot(eVgmPm10, map=F)
到目前为止一切正常(我猜)
现在我想像论文中解释的那样制作一个可分离的模型:
separableModel <- vgmST("separable",
space = vgm(0.9, "Exp", 200, 0.1),
time = vgm(0.9, "Sph", 3.5, 0.1),
sill = 124)
我明白,我必须为 space 和时间创建一个变差函数。但我不知道如何为变差函数正确定义参数(psill、模型、范围、块)。如果我使用与论文中相同的参数,我会得到以下图:
如您所见,在这个模型中,我只有两个滞后,变异函数看起来很奇怪。所以,我认为这是因为我的模型参数错误。我还测试了论文中的另一种方法。
sumMetricModel <- vgmST("sumMetric",
space = vgm(20, "Sph", 150, 1),
time = vgm(10, "Exp", 2, 0.5),
joint = vgm(80, "Sph", 1500, 2.5),
stAni = 120)
同样,我不知道如何设置参数,所以我采用了与论文中相同的方法并绘制了所有三个参数。
我很确定它取决于参数,但我真的不知道如何找到适合的正确变差函数模型。
第一个答案后更新:
按照建议,我为新的经验变差函数使用了更少的时间延迟:
eVgmPm10<-variogramST(MMW10~1,df.stf,tlags = 0:2)
我得到了这个线框图:
如您所见,我仍然有 3 个时间步从“滞后 0”开始。
然后我尝试按照建议填充模型参数。
separableModel<-vgmST("separable",
space=vgm(psill = 15,model = "Exp", range =250 ,nugget = 5),
time = vgm(psill = 15,model = "Exp", range =1 ,nugget = 0),
sill = 15)
这是两者的线框图:
我真的很沮丧,我很抱歉我的知识匮乏,但我真的很努力去理解它,我很感激每一个帮助
sill
、range
和nugget
的初始参数可以从经验时空变异函数中读取。通过以下方式生成经验变异函数的 3D 线框图:
plot(eVgmPm10, wireframe=T, scales=list(arrows=F))
金块大约是表面与 z-axis 的近似交点(这相当于模型无法解释的小规模可变性)。基台大约是经验表面接近的最大值 z-value,范围大约是表面变平的距离。您将拥有空间 (x-axis) 和时间 (y-axis) 范围。
不同的模型对这些值的解释略有不同;详细信息在您在问题中引用的 gstat 小插图的第 2.1 节中给出。在可分离的情况下,例如,空间和时间变异函数分量被归一化为 1 的联合基台(基台 + 金块),并且模型被模型定义中的基台参数“拉伸”。在 sum-metric 模型中,此规范化不适用。对于度量分量,必须拟合时空各向异性,以便在单个模型中关联空间和时间距离(检查 gstat::estiStAni()
)。我建议在 R 中使用 运行 demo("stkrige")
并试验这些参数以更好地了解它们的影响。请注意,参数也会相互影响,这有时会使解释和数值优化变得麻烦。
根据您在问题中提供的内容,5 的金块、15 的基台和 250 的空间范围可能是开始的值。此外,它看起来好像您的经验表面沿着时间域以波浪形式移动。这可能是数据集时间覆盖的人工制品。 6 个时间步长(在您的情况下为几个月)很少用于估计任何时间依赖性,尤其是超过 1 个(或可能是 2 个)步长。您的绘图表明您正在查看 5 个时间步长,其中“lag5”将仅基于第一个月和最后一个月的值。在估计经验变异函数时,请考虑使用较少的时间滞后:
eVgmPm10<-variogramST(MMW10~1, df.stf, tlags = 0:2)
关于您问题的标题“正确的变差函数”,很难确定那是什么。您只能找到一个模型,该模型将是您提供给算法的数据中依赖结构的“良好”近似。例如,依赖性可能会在冬季和夏季月份之间发生变化,并且平均值中可能存在季节性成分,这也需要反映在模型中。