张金龙的博客分享 http://blog.sciencenet.cn/u/zjlcas 物种适应性、分布与进化

博文

克里格空间插值Kriging及其在R的实现

已有 26464 次阅读 2016-3-23 01:09 |个人分类:科研笔记|系统分类:科研笔记

克里格是一种空间插值的方法. 克里格插值, 是法国地统计学家 Georges Matheron (1930-2000)基于南非工程师 Danie G. Krige (1919-2013)的硕士论文发展起来的方法. D. Krige硕士论文研究的问题是如何根据金矿探测点的含金量推断含金量在空间上的变化.

所谓空间插值, 就是通过一些列具有空间关系的点数据, 来推广到面上数据的方法.

除了克里格方法之外, 从点数据推断面的数据变化, 还有线性插值, 距离反平方插值等多种方法. 而克里格其实也是一类方法的通称, 它包括普通克里格, 通用克里格, 通用模块克里格等等. 但是克里格方法可以求得模型的无偏估计,并且方便得获得预测的误差, 这对于其他方法来讲常常难易实现.

这里只简单介绍用gstat程序包实现普通克里格, 以及通过一套模拟数据获得高程图.除了gstat程序包外, geoR程序包以及fields程序包也提供了克里格插值方法.


#### 首先生成一套模拟数据simdat, 通过Volcano数据随机提取1000个点, 用raster的extract函数提取
library(raster)
rrr <- raster(t(volcano), xmn=0, xmx= 870 , ymn=0, ymx=610)
x11()
plot(rrr, col = terrain.colors(100))

set.seed(12345)
loc <- data.frame(x = round(runif(1000, min = 0, max = 870), 2), y = round(runif(1000, min = 0, max = 610), 2))
value <- extract(rrr, loc)
simdat <- data.frame(loc, alt = value) ### The simulated data


#### Krig准备工作开始, 导入程序包
library(sp)
library(gstat)

#### simdat需要转换为sp格式, 需要指定坐标
coordinates(simdat) <- ~x+y
### bubble(simdat, "alt")
spplot(simdat, "alt") ### 查看每个点的值

#### 创建克里格所用的网格, 20m方格的中心位置
xgrid <- seq(ceiling(min(simdat$x)), floor(max(simdat$x)), by = 20)
ygrid <- seq(ceiling(min(simdat$y)), floor(max(simdat$y)), by = 20)
basexy <- expand.grid(xgrid, ygrid)
#### plot(y ~ x, basexy)
colnames(basexy) <- c("x", "y")
coordinates(basexy) <- ~x+y
gridded(basexy) <- TRUE

### 因Kriging需要基于 Variogram以及相应的模型.Variogram横轴是距离, 纵轴是方差. 做模型拟合时, 应先查看 Variogram. Variogram根据点与点之间的距离, 分成若干段, 并计算每一段的方差, 再通过拟合Variogram模型, 获得Krig所需要的参数. 拟合Variogram模型时, 需要提供模型的初始值,再进行迭代优化, 否则很难获得模型的准确参数.

######### 若所进行的是普通克里格插值, 则需要插值的变量只与自身取样点的距离相关,用公式表示为 alt~1, 这里的~1是variogram的规定 (参见 ?variogram).
vgm1 <- variogram(alt~1, simdat)
plot(vgm1, plot.numbers = TRUE)

### variogram的模型常包括
### Circular
### Spherical
### Exponential
### Gaussian
### Linear
### gstat程序包提供的模型可以通过 vgm() 查看

m <- fit.variogram(vgm1,vgm(.01,"Sph",100,300))
plot(vgm1, model=m)

### 在拟合gm模型时, 需要提供以下几个参数的初始值
psill: partial sill
model: 模型的类型
range: 范围
nugget: 块金值

图1 Range, Sill, Partial Sill, and Nugget of the Variogram

各参数的几何意义如图一所示. 初始值要通过在variogram的图中读取, 尽量接近真实值, 这样后续的迭代才会成功.

例如以下例子中: .01 psill
"Sph" 为球状模型
300 为范围
nugget为 块金值.

### 设定vgm模型的初始值
m <- vgm(.01,"Sph",300, 0.2)

### 进行克里格
krige_res <- krige(alt~1, simdat, basexy, model = m)

### 查看克里格插值的结果
spplot(krige_res, zcol = "var1.pred", main = "Predictions of altitude based on the randomly sampled data", col.regions = terrain.colors(100))

参考:
http://planet.botany.uwc.ac.za/nisl/GIS/spatial/images/pic024.jpg
http://webhelp.esri.com/arcgisdesktop/9.3/index.cfm?TopicName=How%20Krige%20and%20Variogram%20work


http://geostat-course.org/system/files/lewis_tutortPM.pdf
苏姝,林爱文,刘庆华 (2004) 普通 Kriging 法在空间内插中的运用 江南大学学报 (自然科学版) 3(1):18-21



https://blog.sciencenet.cn/blog-255662-964266.html

上一篇:R编程的一些规则与建议
下一篇:ggplot2绘图学习笔记: 数据,图层与统计变换
收藏 IP: 14.0.180.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (4 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-20 03:37

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部