空间线性回归:在不同空间尺度应用回归模型参数
问题与解决方案
问题背景
有两个栅格图层:500m分辨率的ntl.tif和100m分辨率的tirs.tif。已将tirs重采样至ntl分辨率并拟合线性回归模型,现在希望用predict函数在精细尺度(100m)生成预测栅格,而非手动计算系数,但调用predict(tirs, model)时出现以下错误:
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : object is not a matrix. In addition: Warning message:'newdata' had 1377 rows but variables found have 1008 rows
错误原因
- 变量名不匹配:拟合模型时使用的自变量名为
tirs,但精细分辨率栅格的实际列名是B10_median,predict无法匹配模型所需变量。 - 空间范围不一致:
ntl和tirs的边界范围存在细微差异,导致数据维度不匹配,触发警告。
解决步骤
1. 统一变量名
将精细分辨率栅格的列名修改为模型中使用的自变量名tirs,确保predict能识别变量。
2. 对齐空间范围(可选但推荐)
将精细栅格裁剪至与ntl完全一致的空间范围,彻底避免维度不匹配问题。若需保留原范围可跳过此步骤,但裁剪更稳妥。
3. 调用predict函数
使用修正后的栅格执行预测。
完整修正代码
library(terra) # 加载栅格 ntl = rast("path/ntl.tif") # 粗分辨率栅格 tirs = rast("path/tirs.tif") # 精细分辨率栅格 # 重采样tirs到ntl分辨率用于建模 tirs_res <- resample(tirs, ntl, method="bilinear") # 合并栅格并命名,确保变量名对应 s = c(ntl, tirs_res) names(s) = c("ntl", "tirs") # 拟合线性回归模型 model <- lm(formula = ntl ~ tirs, data = s) # 处理精细栅格:统一变量名 + 对齐范围 tirs_fine <- tirs names(tirs_fine) <- "tirs" # 关键:将列名改为模型中的自变量名 tirs_fine <- crop(tirs_fine, ntl) # 裁剪到ntl的范围,消除维度差异 # 使用predict函数生成精细尺度预测 lm_pred <- predict(tirs_fine, model) # 查看结果 plot(lm_pred)
补充说明
- 若不需要限制预测范围,可去掉
crop步骤,直接修改列名后调用predict,terra会自动处理范围差异,但可能保留原栅格的边界像素(需确认是否符合需求)。 - 手动计算系数的方式可行,但
predict能更规范地处理缺失值等情况,且便于扩展到更复杂的模型。
内容的提问来源于stack exchange,提问作者Nikos
相关产品推荐
相关产品推荐

