gpt4 book ai didi

r - 为插值方法创建数据对象,例如 R 中的克里金法

转载 作者:行者123 更新时间:2023-12-04 22:46:49 42 4
gpt4 key购买 nike

我有不同位置(X1,X2,...)的每日温度数据平均值,我想用它们插入 map 。
我通过从格式化的 excel 表中加载它们来创建一个长格式数据对象,例如:

library(reshape2)
tempdata <- read.csv("...", sep=";")
names(tempdata) <- c("date", paste("X", 1:73))
head(tempdata)
# date X1 X2 X3 X4 X5 X6 X7
# 1 1 7.3 6.6 6.7 5.8 6.1 6.1 5.5
# 2 2 7.5 6.6 6.6 5.6 4.8 4.7 3.9
# 3 3 8.8 7.7 7.6 7.0 7.0 6.0 5.8
# 4 4 8.5 7.4 7.5 7.0 7.3 5.9 5.5
# 5 5 7.7 6.7 6.9 6.1 6.8 5.1 4.1
# 6 6 7.5 6.7 6.8 6.0 6.4 5.0 4.1

位置 X1、X2、...的纬度经度相同:
lat.lon <- read.csv("...", sep=";")
rownames(lat.lon) <- c(paste0("X",1:73))
head(lat.lon)
# latitude longitude
# X1 54.1650 6.3458
# X2 54.1667 7.4500
# X3 54.1832 7.8856
# X4 55.0114 8.4158
# X5 54.5068 9.5393
# X6 54.5214 11.0522

我将它们合并为长格式:
res <- merge(
melt(tempdata, id.vars="date"),
lat.lon,
by.x="variable", by.y="row.names"
)
head(res)
# variable date value latitude longitude
# X1 1 9.9 54.165 6.3458
# X1 2 8.9 54.165 6.3458
# X1 3 7.8 54.165 6.3458
# X1 4 9.2 54.165 6.3458
# X1 5 8.7 54.165 6.3458
# X1 6 8.4 54.165 6.3458


coordinates(res) = ~longitude+latitude

我可以使用 spplot 将它们绘制在正确的位置,也包括国家边界:
library(maptools)
load(url('http://gadm.org/data/rda/DEU_adm0.RData'))
GE <- gadm
GE <- spChFIDs(GE, paste("GE", rownames(GE), sep = "_"))
spplot(res["value"], sp.layout = list("sp.polygons", GE), col.regions=bpy.colors(20))

我想将 IDW 用于单天的观察,但是我发现的包中的 idw 方法(例如 gstat)需要其他“网格化”数据对象。我如何创建这样的数据对象以便用这样的方法插入它们?

最佳答案

像这样的东西

加载必要的包

kpacks <- c('sp','rgdal', 'gstat', 'raster')
new.packs <- kpacks[!(kpacks %in% installed.packages()[,"Package"])]
if(length(new.packs)) install.packages(new.packs)
lapply(kpacks, require, character.only=T)
remove(kpacks, new.packs)

数据(wrld_simpl)

使用的投影坐标系
p.utm33n <- CRS("+init=epsg:32633") # UTM 33N Landsat Images

一个国家(我特别喜欢这个)
ago <- wrld_simpl[wrld_simpl@data$NAME == 'Angola',]

将其投影到 UTM 33S
ago <- spTransform(ago, p.utm33n)

对多边形内的一些点进行采样
ago_p <- spsample(ago, type="random", n=25)    
plot(ago, col = 'grey' , axes = T)
plot(ago_p, add = T)

angola

3天的一些假想温度数据
tdata <- data.frame(x=rep(coordinates(ago_p)[,1], 3), 
y=rep(coordinates(ago_p)[,2], 3),
temp=runif(75, 12,35),
day = rep(1:3, each = 25))

设法将其作为空间点数据帧对象
coordinates(tdata) <- ~x+y 

proj4string(tdata) <- CRS(proj4string(ago))

由于我不知道您的 basemap ,我将使用我在上面选取的国家/地区
基础层必须是 SpatialPixelDataBase。我会玩 rasterLayer
rago <- raster(extent(ago))
res(rago) <- c(10000,10000)
rago[] <- 1
proj4string(rago) <- CRS(proj4string(ago))
r_ago <- mask(rago, ago)
#plot(r_ago)
grid_ago <- as(r_ago, 'SpatialPointsDataFrame')
grid_ago <- grid_ago[!is.na(grid_ago@data$layer), ]
gridded(grid_ago) <- TRUE

我现在可以运行 idw()来自 gstat。我将使用第 == 1 天的数据运行
idw_ago <- idw(temp ~ 1, tdata[tdata$day == 1, ], grid_ago, idp = 2.5)

最后绘制它
spplot(idw_ago, "var1.pred")

spplot for idw krig

现在有了你的数据,我在你的问题中遗漏了。同样的做法
library(latticeExtra)
p.dutch <- CRS("+init=epsg:28991") # Dutch National Grid EPSG:28991
load(url('http://gadm.org/data/rda/DEU_adm0.RData'))
ger <- gadm
ger <- spChFIDs(ger, paste("ger", rownames(ger), sep = "_"))
ger <- spTransform(ger, p.dutch)
ger_p <- spsample(ger, type="random", n=25)
plot(ger, col = 'yellow', border = NA, axes = T, cex.axis = 0.6)
plot(ger_p, add = T, pch = 20)

points
tdata <- data.frame(x=rep(coordinates(ger_p)[,1], 3), 
y=rep(coordinates(ger_p)[,2], 3),
temp=runif(75, 12,35),
day = rep(1:3, each = 25))
coordinates(tdata) <- ~x+y
proj4string(tdata) <- CRS(proj4string(ger))
rger <- raster(extent(ger))
res(rger) <- c(10000,10000)
rger[] <- 1
proj4string(rger) <- CRS(proj4string(ger))
r_ger <- mask(rger, ger)
plot(r_ger)
grid_ger <- as(r_ger, 'SpatialPointsDataFrame')
grid_ger <- grid_ger[!is.na(grid_ger@data$layer), ]
gridded(grid_ger) <- TRUE
idw_ger <- idw(temp ~ 1, tdata[tdata$day == 1, ], grid_ger, idp = 2.5)
spplot(idw_ger, "var1.pred") +
latticeExtra::layer(sp.polygons(ger, fill = NA, col = 'blue')) +
latticeExtra::layer(sp.points(tdata[tdata$day == 1, ],
fill = NA, col = 'red'))

germany idw spplot

希望能帮助到你

关于r - 为插值方法创建数据对象,例如 R 中的克里金法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22230167/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com