带 gstat 的克里金法:"Covariance matrix singular at location" 带预测
Kriging with gstat : "Covariance matrix singular at location" with predict
我正在尝试通过使用 gstat 的克里金法进行估计,但由于协方差矩阵的问题而永远无法实现。我从来没有对我想要的位置进行估计,因为它们都被跳过了。对于每个位置,我都有以下警告消息:
1: In predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
Covariance matrix singular at location [-8.07794,48.0158,0]: skipping...
并且所有估计都是 NA。
到目前为止,我已经浏览了许多相关的 Whosebug 线程,但是 none 解决了我的问题 (https://gis.stackexchange.com/questions/222192/r-gstat-krige-covariance-matrix-singular-at-location-5-88-47-4-0-skipping ; https://gis.stackexchange.com/questions/200722/gstat-krige-error-covariance-matrix-singular-at-location-917300-3-6109e06-0 ; https://gis.stackexchange.com/questions/262993/r-gstat-predict-error?rq=1)
我检查过:
我的数据集中实际上有一个空间结构(见下面的代码气泡图)
没有重复的位置
变差函数模型不是单一的并且与实验变差函数有很好的拟合(见下面的代码图)
我还尝试了 range、sill、nugget 和 gstat 库中所有模型的几个值
协方差矩阵是正定的并且具有正特征值。根据 gstat,它是单数的,但不是 is.singular.matrix function
有足够的点对来做实验变差函数
如何克服这个问题?避免奇异协方差矩阵的技巧是什么?我也欢迎 "best practice" 克里金法。
代码(需要forSO.Rdata:https://www.dropbox.com/s/5vfj2gw9rkt365r/forSO.Rdata?dl=0):
library(ggplot2)
library(gstat)
#Attached Rdata
load("forSO.Rdata")
#The observations
str(abun)
#Spatial structure
abun %>% as.data.frame %>%
ggplot(aes(lon, lat)) +
geom_point(aes(colour=prop_species_cells), alpha=3/4) +
coord_equal() + theme_bw()
#Number of pair of points
cvgm <- variogram(prop_species_cells ~1, data=abun, width=3, cutoff=300)
plot(cvgm$dist,cvgm$np)
#Fit a model covariogram
efitted = fit.variogram(cvgm, vgm(model="Mat", range=100, nugget=1), fit.method=7, fit.sills=TRUE, fit.ranges=TRUE)
plot(cvgm,efitted)
#No warning, and the model is non singular
attr(efitted, "singular")
#Covariance matrix (only on a small set of points, I have more than 25000 points) : positive-definite, postiive eigen values and not singular
hex_pointsDegTiny=hex_pointsDeg
hex_pointsDegTiny@coords=hex_pointsDegTiny@coords[1:10,]
dists <- spDists(hex_pointsDegTiny)
covarianceMatrix=variogramLine(efitted, maxdist = max(cvgm$dist), n = 10*max(cvgm$dist), dir = c(1,0,0), dist_vector = dists, covariance = TRUE)
eigen(covarianceMatrix)$values
is.positive.definite(covarianceMatrix)
is.singular.matrix(covarianceMatrix)
# No duplicate locations
zerodist(hex_pointsDegTiny)
# Impossible to krig
OK_fit <- gstat(id = "OK_fit", formula = prop_species_cells ~ 1, data = abun, model = efitted)
dist <- predict(OK_fit, newdata = hex_pointsDegTiny)
dist@data
实际上,在 abun
数据集 (zerodist(abun)
) 中有重复的位置,它们不会被搜索到我想要 krig 估计的网格中。去除重复项后,克里金法工作正常。
我正在尝试通过使用 gstat 的克里金法进行估计,但由于协方差矩阵的问题而永远无法实现。我从来没有对我想要的位置进行估计,因为它们都被跳过了。对于每个位置,我都有以下警告消息:
1: In predict.gstat(g, newdata = newdata, block = block, nsim = nsim, :
Covariance matrix singular at location [-8.07794,48.0158,0]: skipping...
并且所有估计都是 NA。
到目前为止,我已经浏览了许多相关的 Whosebug 线程,但是 none 解决了我的问题 (https://gis.stackexchange.com/questions/222192/r-gstat-krige-covariance-matrix-singular-at-location-5-88-47-4-0-skipping ; https://gis.stackexchange.com/questions/200722/gstat-krige-error-covariance-matrix-singular-at-location-917300-3-6109e06-0 ; https://gis.stackexchange.com/questions/262993/r-gstat-predict-error?rq=1)
我检查过:
我的数据集中实际上有一个空间结构(见下面的代码气泡图)
没有重复的位置
变差函数模型不是单一的并且与实验变差函数有很好的拟合(见下面的代码图)
我还尝试了 range、sill、nugget 和 gstat 库中所有模型的几个值
协方差矩阵是正定的并且具有正特征值。根据 gstat,它是单数的,但不是 is.singular.matrix function
有足够的点对来做实验变差函数
如何克服这个问题?避免奇异协方差矩阵的技巧是什么?我也欢迎 "best practice" 克里金法。
代码(需要forSO.Rdata:https://www.dropbox.com/s/5vfj2gw9rkt365r/forSO.Rdata?dl=0):
library(ggplot2)
library(gstat)
#Attached Rdata
load("forSO.Rdata")
#The observations
str(abun)
#Spatial structure
abun %>% as.data.frame %>%
ggplot(aes(lon, lat)) +
geom_point(aes(colour=prop_species_cells), alpha=3/4) +
coord_equal() + theme_bw()
#Number of pair of points
cvgm <- variogram(prop_species_cells ~1, data=abun, width=3, cutoff=300)
plot(cvgm$dist,cvgm$np)
#Fit a model covariogram
efitted = fit.variogram(cvgm, vgm(model="Mat", range=100, nugget=1), fit.method=7, fit.sills=TRUE, fit.ranges=TRUE)
plot(cvgm,efitted)
#No warning, and the model is non singular
attr(efitted, "singular")
#Covariance matrix (only on a small set of points, I have more than 25000 points) : positive-definite, postiive eigen values and not singular
hex_pointsDegTiny=hex_pointsDeg
hex_pointsDegTiny@coords=hex_pointsDegTiny@coords[1:10,]
dists <- spDists(hex_pointsDegTiny)
covarianceMatrix=variogramLine(efitted, maxdist = max(cvgm$dist), n = 10*max(cvgm$dist), dir = c(1,0,0), dist_vector = dists, covariance = TRUE)
eigen(covarianceMatrix)$values
is.positive.definite(covarianceMatrix)
is.singular.matrix(covarianceMatrix)
# No duplicate locations
zerodist(hex_pointsDegTiny)
# Impossible to krig
OK_fit <- gstat(id = "OK_fit", formula = prop_species_cells ~ 1, data = abun, model = efitted)
dist <- predict(OK_fit, newdata = hex_pointsDegTiny)
dist@data
实际上,在 abun
数据集 (zerodist(abun)
) 中有重复的位置,它们不会被搜索到我想要 krig 估计的网格中。去除重复项后,克里金法工作正常。