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

基于terra包为时序栅格单元格拟合自定义回归模型的问题

问题解决:Terra栅格时序数据拟合自定义回归(含mblm)

问题回顾

需要基于terra包为时序栅格的每个单元格拟合回归模型,尝试用regress函数时出现斜率全为0的问题,示例代码如下:

# 创建示例时序栅格
d<-rast(lapply(1:10, FUN = function(x){
  rast(matrix(rnorm(100, mean=x), ncol=10))
}))
names(d)<-1:10

# 创建年份栅格(错误写法)
d1<-rast(lapply(names(d)[1:10], function(x) {rast(matrix(x, nrow=10, ncol=10))
}))
names(d1)<-1:10

# 执行回归后斜率全为0
plot(regress(d, d1))

错误原因

你创建的d1栅格中,年份是字符类型(names(d)返回字符串),而线性回归要求自变量为数值型。字符型自变量无法参与回归计算,导致斜率全部为0。

解决方案

1. 修正年份栅格的数值类型

将年份转为数值后再生成栅格:

d1 <- rast(lapply(as.numeric(names(d)), function(x) {
  rast(matrix(x, nrow=10, ncol=10))
}))
names(d1) <- names(d)

2. 用terra::regress执行标准线性回归

重新运行regress即可得到正确的斜率结果:

lm_result <- regress(d, d1, fun=lm)
plot(lm_result[["x"]]) # 查看斜率栅格

3. 适配mblm包的中位数回归

要拟合mblm的自定义模型,需编写一个返回模型参数的函数,供regress调用:

library(mblm)

# 自定义函数:输入因变量y(栅格时间序列)和自变量x(年份),返回模型系数
mblm_fit <- function(y, x) {
  # 过滤可能的NA值(可选,根据数据情况调整)
  valid_idx <- !is.na(y) & !is.na(x)
  if(sum(valid_idx) < 2) return(c(NA, NA))
  
  model <- mblm(y[valid_idx] ~ x[valid_idx])
  coef(model) # 返回截距和斜率两个参数
}

# 执行自定义回归
mblm_result <- regress(d, d1, fun=mblm_fit)
names(mblm_result) <- c("Intercept", "Slope")
plot(mblm_result[["Slope"]]) # 查看中位数回归的斜率栅格

内容的提问来源于stack exchange,提问作者FrostyBottom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:33:21