如何用R的spaMM包从空间逻辑回归生成预测值栅格?
spaMM空间逻辑回归预测栅格的错误解决
问题描述
使用R的spaMM包拟合空间逻辑回归模型,基于冠层高度、冠层层数、大树密度3个栅格预测因子,训练成熟林/采伐区数据预测复杂森林结构的存在概率。glm()可正常拟合预测,但无法处理空间自相关;改用fitme()拟合模型成功,但预测时持续出现两类错误:
- 直接用栅格栈作为
newdata时:Error: [[(j)] the type of index j cannot be a factor or character - 转为数据框预测时:
Error in model.frame.default(...) : 因子存在新水平
错误原因
- 变量类型错误:虚拟数据生成时误用
paste()将数值转为字符串,导致栅格变量自动转为字符型,后续转数据框时变为因子,与训练数据的数值型变量不匹配,引发因子新水平错误。 - spaMM对栅格对象的兼容性:spaMM的
predict函数对terra栅格对象的支持有限,直接传入会触发索引类型错误。
修正方案与完整代码
library(terra) library(spaMM) # 使用的坐标系 crs_ref <- "EPSG:3310" # 创建空栅格 empty_r <- rast(res=30, nlyr=3, xmin=-251376, xmax=-228036, ymin=69372, ymax=138628, crs= crs_ref) ### 关键修正:直接填充数值型数据,避免paste()转字符串 values(empty_r$lyr.1) <- sample(30:80, ncell(empty_r), replace=T) values(empty_r$lyr.2) <- sample(1:3, ncell(empty_r), replace=T) values(empty_r$lyr.3) <- sample(20:100, ncell(empty_r), replace=T) # 修改图层名称 names(empty_r) <- c("height","layers","density") # 创建存在/缺失属性:直接用数值型0/1,避免paste() empty_r$olderTrees <- sample(0:1, ncell(empty_r), replace=T) # 采样100个随机点训练模型 Random_points <- terra::spatSample(empty_r, size = 100, as.points=T, values=T, method = "random") Random_points <- as.data.frame(Random_points, geom='XY') # 拟合包含空间效应的模型 mod <- fitme(olderTrees ~ height+layers+density + Matern(1 | x + y), data = Random_points, family = "binomial") summary(mod) ### 预测步骤修正: # 1. 将栅格转为数据框,并添加x、y坐标 empty_r_df <- as.data.frame(empty_r, geom = "XY") # 2. 确保变量类型与训练数据一致(此处因直接用数值生成,已自动匹配) str(empty_r_df) str(Random_points) # 3. 预测概率值,指定type="response" predict_probs <- predict(mod, newdata=empty_r_df, type="response") # 4. 将预测结果转回栅格 empty_r$complex_forest_prob <- predict_probs # 查看结果 plot(empty_r$complex_forest_prob)
关键说明
- 生成数据时禁止用
paste()转换数值,确保所有预测变量和响应变量为数值型,避免因子类型不匹配问题。 - 预测时先将栅格转为带坐标的数据框,确保
x、y变量存在且类型与训练数据一致。 - 使用
type="response"直接获取逻辑回归的概率输出,再将结果赋值回栅格得到最终的预测概率图层。
内容的提问来源于stack exchange,提问作者user25754519
相关产品推荐
相关产品推荐

