You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

空间线性回归:在不同空间尺度应用回归模型参数

问题与解决方案

问题背景

有两个栅格图层: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

错误原因

  1. 变量名不匹配:拟合模型时使用的自变量名为tirs,但精细分辨率栅格的实际列名是B10_median,predict无法匹配模型所需变量。
  2. 空间范围不一致: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:45:20