spgwr 包:将 GWR 模型参数应用到更精细的空间尺度

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

我正在使用

R
spgwr
来执行地理加权回归 (GWR)。我想将模型参数应用到更精细的空间尺度,但收到此错误:
Error in validObject(.Object): invalid class “SpatialPointsDataFrame” object: number of rows in data.frame and SpatialPoints don't match

当我使用另一个名为

GWmodel
的 GWR 软件包时,我没有这个问题。例如使用
GWmodel
,我这样做:

# library(GWmodel)
# library(sp)
# library(raster)

ghs = raster("path/ghs.tif") # fine resolution raster
regpoints <- as(ghs, "SpatialPoints")

block.data = read.csv(file = "path/block.data.csv")

coordinates(block.data) <- c("x", "y")
proj4string(block.data) <- "EPSG:7767"

eq1 <- ntl ~ ghs
abw = bw.gwr(eq1, 
             data = block.data, 
             approach = "AIC", 
             kernel = "gaussian",
             adaptive = TRUE, 
             p = 2,
             parallel.method = "omp",
             parallel.arg = "omp")

ab_gwr = gwr.basic(eq1, 
                   data = block.data, 
                   regression.points = regpoints,
                   bw = abw, 
                   kernel = "gaussian", 
                   adaptive = TRUE, 
                   p = 2, 
                   F123.test = FALSE,
                   cv = FALSE,
                   parallel.method = "omp",
                   parallel.arg = "omp")

ab_gwr

sp <- ab_gwr$SDF
sf <- st_as_sf(sp)

# intercept
intercept = as.data.frame(sf$Intercept)
intercept = SpatialPointsDataFrame(data = intercept, coords = regpoints)
gridded(intercept) <- TRUE
intercept <- raster(intercept)
raster::crs(intercept) <- "EPSG:7767"

intercept = resample(intercept, ghs, method = "bilinear")
    
# slope
slope = as.data.frame(sf$ghs)
slope = SpatialPointsDataFrame(data = slope, coords = regpoints)
gridded(slope) <- TRUE
slope <- raster(slope)
raster::crs(slope) <- "EPSG:7767"

slope = resample(slope, ghs, method = "bilinear")

gwr_pred = intercept + slope * ghs

writeRaster(gwr_pred, 
            "path/gwr_pred.tif", 
            overwrite = TRUE)

如何使用

spgwr
包将 GWR 模型参数应用到更精细的空间尺度?

这是使用

spgwr
包的代码:

library(spgwr)
library(sf)
library(raster)
library(parallel)

ghs = raster("path/ghs.tif") # fine resolution raster
regpoints <- as(ghs, "SpatialPoints")

block.data = read.csv(file = "path/block.data.csv")

#create mararate df for the x & y coords
x = as.data.frame(block.data$x)
y = as.data.frame(block.data$y)

#convert the data to spatialPointsdf and then to spatialPixelsdf
coordinates(block.data) = c("x", "y")

# specify a model equation
eq1 <- ntl ~ ghs

# find optimal ADAPTIVE kernel bandwidth using cross validation
abw <- gwr.sel(eq1, 
               data = block.data, 
               adapt = TRUE, 
               gweight = gwr.Gauss)

# fit a gwr based on adaptive bandwidth
cl <- makeCluster(detectCores())
ab_gwr <- gwr(eq1, 
              data = block.data,
              adapt = abw, 
              gweight = gwr.Gauss,
              hatmatrix = TRUE,
              regpoints,
              predictions = TRUE,
              se.fit = TRUE,
              cl = cl)
stopCluster(cl)
#print the results of the model
ab_gwr

sp <- ab_gwr$SDF
sf <- st_as_sf(sp)

# intercept
intercept = as.data.frame(sf$Intercept)
intercept = SpatialPointsDataFrame(data = intercept, coords = regpoints)
gridded(intercept) <- TRUE
intercept <- raster(intercept)
raster::crs(intercept) <- "EPSG:7767"

intercept = resample(intercept, ghs, method = "bilinear")

# slope
slope = as.data.frame(sf$ghs)
slope = SpatialPointsDataFrame(data = slope, coords = regpoints)
gridded(slope) <- TRUE
slope <- raster(slope)
raster::crs(slope) <- "EPSG:7767"

slope = resample(slope, ghs, method = "bilinear")

gwr_pred = intercept + slope * ghs

writeRaster(gwr_pred, 
            "path/gwr_pred.tif", 
            overwrite = TRUE)

此外,如果我设置

ab_gwr <- gwr(eq1, 
                  data = block.data,
                  adapt = abw, 
                  gweight = gwr.Gauss,
                  hatmatrix = TRUE,
                  fit.points = regpoints,
                  predictions = TRUE,
                  se.fit = TRUE,
                  cl = cl)

我收到此错误:

Error in gwr(eq1, data = block.data, adapt = abw, gweight = gwr.Gauss,: No data slot in fit.points

精细分辨率光栅:

ghs = raster(ncols=47, nrows=92, xmn=582216.388, xmx=603366.388, ymn=1005713.0202, ymx=1047113.0202, crs='+proj=lcc +lat_0=18.88015774 +lon_0=76.75 +lat_1=16.625 +lat_2=21.125 +x_0=1000000 +y_0=1000000 +datum=WGS84 +units=m +no_defs')

csv
可以从这里下载。

r model raster gwr spgwr
1个回答
0
投票

为了使用

GWR
包将
spgwr
的模型参数应用到更精细的空间尺度:

library(spgwr)
library(sf)
library(raster)
library(parallel)

ghs = raster("path/ghs.tif") # fine res raster
regpoints <- as.data.frame(ghs[[1]], xy = TRUE)
regpoints = na.omit(regpoints)
colnames(regpoints)[3] = "the_name_of_the_fine_res_raster"
coordinates(regpoints) <- c("x", "y")
gridded(regpoints) <- TRUE

block.data = read.csv(file = "path/block.data.csv") # df containing the dependent and independent coarse variables

#convert the data to spatialPointsdf
coordinates(block.data) = c("x", "y")

# specify a model equation
eq1 <- ntl ~ ghs

# find optimal ADAPTIVE kernel bandwidth using cross validation
abw <- gwr.sel(eq1, 
               data = block.data, 
               adapt = TRUE, 
               gweight = gwr.Gauss)

# find optimal ADAPTIVE kernel bandwidth using cross validation
abw <- gwr.sel(eq1, 
               data = block.data, 
               adapt = TRUE, 
               gweight = gwr.Gauss, 
               method = "cv")

# predict to a finer spatial scale
cl <- makeCluster(detectCores()-1)
ab_gwr <- gwr(eq1, 
              data = block.data,
              adapt = abw, 
              gweight = gwr.Gauss,
              fit.points = df2,
              predictions = TRUE,
              se.fit.CCT = FALSE,
              cl = cl)
stopCluster(cl)

#print the results of the model
# ab_gwr

sp <- ab_gwr$SDF
sf <- st_as_sf(sp)

# export prediction
gwr_pred = as.data.frame(sf$pred)
gwr_pred = SpatialPointsDataFrame(data = gwr_pred, coords = df2)
gridded(gwr_pred) <- TRUE
gwr_pred <- raster(gwr_pred)
raster::crs(gwr_pred) <- provoliko

gwr_pred = crop(gwr_pred, e)
gwr_pred <- mask(gwr_pred, s)

writeRaster(gwr_pred, 
            paste0(wd, "gwr_pred.tif"), 
            overwrite = TRUE)
© www.soinside.com 2019 - 2024. All rights reserved.