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

如何在R语言中针对三个栅格栈计算逐像素局部回归?

基于terra包实现多栅格栈的逐像素回归(提取截距与斜率)

没问题,我来帮你搞定这个逐像素的二元线性回归需求!你需要用s1和s2作为自变量,逐像素对s的时间序列做回归,最终得到每个像素的截距、s1对应的斜率、s2对应的斜率,用terra包可以这样实现:

步骤1:加载包与示例数据

首先我们先加载terra包,并调用示例栅格栈来模拟你的数据(三个栅格栈的层数一致,代表相同长度的时间序列):

library(terra)
# 加载示例栅格栈,模拟时间序列数据
s <- rast(system.file("ex/logo.tif", package="terra"))
s1 <- rast(system.file("ex/logo.tif", package="terra"))
s2 <- rast(system.file("ex/logo.tif", package="terra"))

步骤2:定义逐像素回归函数

我们需要定义一个函数,让它接收每个像素的所有时间点数据(s、s1、s2的时间序列值),然后执行二元线性回归计算系数。这里的回归模型是:
y = β₀ + β₁*x₁ + β₂*x₂
其中y是s的时间序列,x₁是s1的时间序列,x₂是s2的时间序列,β₀是截距,β₁、β₂分别是s1、s2对应的斜率。

# 定义逐像素回归函数
pixel_reg <- function(pixel_vals) {
  # 计算时间序列长度(三个栅格栈的层数一致)
  ts_length <- length(pixel_vals) / 3
  # 拆分出因变量和自变量的时间序列
  y <- pixel_vals[1:ts_length]          # s的时间序列
  x1 <- pixel_vals[(ts_length+1):(2*ts_length)]  # s1的时间序列
  x2 <- pixel_vals[(2*ts_length+1):(3*ts_length)]# s2的时间序列
  
  # 构造包含截距项的设计矩阵
  design_matrix <- cbind(1, x1, x2)
  # 用最小二乘法计算回归系数
  coeffs <- solve(t(design_matrix) %*% design_matrix) %*% t(design_matrix) %*% y
  
  # 将系数转为向量返回,顺序是:截距、s1斜率、s2斜率
  as.vector(coeffs)
}

步骤3:执行逐像素计算

把三个栅格栈组合成一个列表,用terra的app()函数逐像素应用我们定义的回归函数,得到结果栅格栈:

# 组合三个栅格栈
combined_stacks <- list(s, s1, s2)
# 逐像素计算回归系数
result_rasts <- app(combined_stacks, pixel_reg)

# 给结果图层命名,方便识别
names(result_rasts) <- c("intercept", "slope_s1", "slope_s2")

步骤4:查看结果

最后可以用plot()函数查看每个系数的空间分布:

plot(result_rasts)

补充说明

和你提供的单自变量示例不同,这里因为每个像素的自变量(s1、s2的时间序列)是变化的,所以没办法提前预计算(XtX)^-1,必须每个像素单独计算设计矩阵的逆。如果你的栅格数据量很大,可以考虑用terra::focal()或者并行计算来提升效率,但对于常规规模的数据,上面的代码已经足够好用啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:27:33