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

在R的terra包中计算两个多层栅格的逐像元相关性

在terra包中实现raster包corLocal()的等效功能(逐像元相关性与p值计算)

目前terra包没有直接对应raster包corLocal()的内置函数,但可以通过app()函数自定义实现逐像元的相关性及p值计算,完全满足你对两个同范围、同分辨率、同层数SpatRaster对象的分析需求。

实现步骤与代码示例

假设你有两个SpatRaster对象x和y,两者层数一致(均为k层):

  1. 合并两个栅格对象
    将x和y合并为一个多层SpatRaster,方便app()逐像元提取所有层的值:
library(terra)
# 构造示例数据(可替换为你的实际数据)
x <- rast(ncols=10, nrows=10, nlyr=5)
values(x) <- rnorm(ncell(x)*nlyr(x))
y <- rast(ncols=10, nrows=10, nlyr=5)
values(y) <- values(x) + rnorm(ncell(x)*nlyr(x), sd=0.2)

# 合并栅格
xy <- c(x, y)
k <- nlyr(x) # 获取层数
  1. 定义自定义计算函数
    编写函数处理单个像元的层值对,计算Spearman相关系数与p值,同时处理缺失值和样本量不足的情况:
pixel_cor <- function(v, k) {
  # 拆分两个栅格的层值
  x_vals <- v[1:k]
  y_vals <- v[(k+1):(2*k)]
  
  # 过滤非缺失值对
  valid_pairs <- !is.na(x_vals) & !is.na(y_vals)
  if (sum(valid_pairs) < 2) {
    # 有效样本量不足时返回NA
    return(c(cor=NA_real_, p=NA_real_))
  }
  
  # 计算Spearman相关性与p值
  cor_result <- cor.test(x_vals[valid_pairs], y_vals[valid_pairs], 
                         method="spearman", exact=FALSE)
  return(c(cor=unname(cor_result$estimate), p=cor_result$p.value))
}
  1. 逐像元应用函数
    使用app()函数将自定义逻辑应用到每个像元,得到包含相关系数和p值的两层SpatRaster:
# 执行逐像元计算
cor_p_raster <- app(xy, pixel_cor, k=k)

# 重命名结果层,方便识别
names(cor_p_raster) <- c("spearman_cor", "p_value")

结果说明

  • cor_p_raster[[1]]:存储每个像元的Spearman相关系数
  • cor_p_raster[[2]]:存储对应像元的相关性检验p值

你可以根据需求替换cor.test()中的method参数(如"pearson"),实现不同类型的相关性计算。


内容的提问来源于stack exchange,提问作者San-Diego-WX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:32:54