我正在尝试使用 r 中的 GAM 来预测物种的出现(存在/不存在)。我已经安装了 GAM,但有两个问题。
library(terra)
library(mgcv)
library(sf)
#polygons to generate random points within
v <- vect(system.file("ex/lux.shp", package="terra")) |> st_as_sf()
#get a raster from terra
r <- rast(system.file("ex/elev.tif", package="terra"))
# Create 50 random points
set.seed(50)
pnts <- st_sample(v, size = 50, type = "random") |> st_as_sf()
# Return the exact raster value the point lies on
pnts_r <- terra::extract(r, pnts, method = "simple")
# Add occurrence column
pnts_r$occ <- as.factor(sample(0:1, 50, replace = TRUE))
# Fit the GAM
mod_gam <- mgcv::gam(formula = occ ~ elevation,
data = pnts_r,
family = binomial(link = "logit"),
method = "REML")
# Predict using our training data
predict(mod_gam) # Why aren't the responses 1s and 0s?
# Predict using the entire raster
terra::predict(mod_gam, r, fun = "predict", na.rm=TRUE) # Error invalid name(s)
我知道模型中的变量名称需要与栅格中的变量名称相同,但在本例中只有 1(“高程”)并且两者相同。
经过一番摆弄,我想我已经回答了我的两个问题。也许这会对以后的某人有所帮助。
响应不是二进制的,而是发生的概率。通过设置阈值(通常为 0.5),可以进一步将其操纵为存在/不存在栅格。
terra::as.data.frame(r, xy = TRUE)
将它们转换为数据帧,
terra::predict() 将在给定新栅格(或堆栈)的情况下工作。