如何成功地从空间逻辑回归创建预测值栅格? R spaMM 包

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

我正在尝试使用 R 中的 spaMM 包运行空间逻辑回归模型。我有一堆代表树冠高度、树冠层和大树密度的三个预测栅格,并且正在尝试训练一个模型来预测“复杂森林” “整个景观的结构(基于已知的古老森林区域与木材采伐区域)。

我正在使用 spaMM 包来尝试解释空间自相关,并希望最终得到一个输出栅格,该输出栅格可以说明每个 30m 栅格单元处存在复杂森林的概率。 (我能够使用 glm() 拟合和预测模型,并且它工作得很好;但是(我相信)我无法用 glm 来解释空间效应,这也是我尝试 spaMM 包的原因。)是我一直参考的教程:https://www.r-bloggers.com/2019/09/spatial-regression-in-r-part-1-spamm-vs-glmmtmb/#google_vignette

我能够使用 fitme() 函数在 spaMM 中拟合模型,但是当我尝试预测我关注的整个范围时,不断遇到有关索引问题的错误:“错误:[

[
(j)]索引j的类型不能是因子或字符”

有谁知道为什么会出现这个错误?我尝试确保我的 terra 栅格预测变量堆栈中的值都是数字,但这并不能解决问题。

这是我希望是一个可重现的示例,其中包含一些虚拟数据,包括指示我遇到的错误的注释:

library(terra)
library(spaMM)

# crs we're using
crs_ref <- "EPSG:3310"

# create empty raster
empty_r <- rast(res=30, nlyr= 3, # number of layers according the number of cols of dataframe
                xmin=-251376,
                xmax=-228036,
                ymin=69372,
                ymax=138628, # can be other object extent like a shapefile, etc
                crs= crs_ref)
nrow(empty_r)
### fill the empty raster with cell values. including as.numeric to ensure values are numeric
values(empty_r$lyr.1) <- paste(as.numeric(sample(30:80, 2309, replace=T)))
values(empty_r$lyr.2) <- paste(as.numeric(sample(1:3, 2309, replace=T)))
values(empty_r$lyr.3) <- paste(as.numeric(sample(20:100, 2309, replace=T)))

### adjust the names
names(empty_r) <- c("height","layers","density")

# create the presence/absence attribute
empty_r$olderTrees <- paste(as.numeric(sample(0:1, 2309, replace=T)))
head(empty_r)

# sample 100 random points to train the model (pretending we don't need testing data)
Random_points <- terra::spatSample(empty_r, size = 100, as.points=T, values=T, method = "random")
plot(Random_points)
Random_points <- as.data.frame(Random_points, geom='XY')
head(Random_points)

# fit model with inclusion of spatial effect
mod <- fitme(olderTrees ~ height+layers+density 
             + Matern(1 | x + y), data = Random_points, family = "binomial")
# I get some warnings, assuming this is due to structure of dummy data. I don't get the
# warning when using the real dataset. 
#"Warning messages:
#1: In .qr.rank.def.warn(r) :
#  matrix is structurally rank deficient; using augmented matrix with additional 7 row(s) of zeros
#2: spaMM_glm.fit: fitted probabilities numerically 0 or 1 occurred 

summary(mod)

predictTest <- predict(mod, newdata=empty_r)
# Error: [`[`(j)] the type of index j cannot be a factor or character

# try adding x and y attributes to the raster stack in case that's the issue
empty_r$x <- crds(empty_r)[,1]
empty_r$y <- crds(empty_r)[,2]

predictTest2 <- predict(mod, allow.new.levels=T, newdata=empty_r)
# same error as above about index j

# and trying to turn the raster into a df
empty_r_df <- as.data.frame(empty_r)

predictTest3 <- predict(mod, newdata=empty_r_df)
# Error in model.frame.default(Terms, data, xlev = .get_from_terms_info(object = fitobject,  : 
# factor SaloCC_CanopyHeightClip has new levels 35, 42, 59, 60, 72, 75, 78
# add allow.new.levels=T??

predictTest3 <- predict(mod, newdata=empty_r_df, allow.new.levels=T)
# Same error about new levels
r raster spatial predict mixed-models
1个回答
0
投票

从价值生成中删除

paste
函数,即
values(empty_r$lyr.1) <- paste(as.numeric(sample(30:80, 2309, replace=T)))
-->
values(empty_r$lyr.1) <- as.numeric(sample(30:80, 2309, replace=T))
,允许为我运行第三个预测(使用 df)。包含
paste
函数使它们成为字符,模型将它们视为分类变量。

© www.soinside.com 2019 - 2024. All rights reserved.