如何借助exactextractr计算栅格数据的偏度、峰度及四分位距?
使用exactextractr自定义统计函数(偏度、峰度、IQR)
要在exact_extract中实现自定义的偏度、峰度和IQR计算,需要注意函数的参数兼容、NA值处理以及样本量判断,以下是具体解决方案:
1. 加载依赖包
library(exactextractr) library(e1091)
2. 编写自定义统计函数
自定义函数需要兼容exact_extract的参数传递(默认会传入value和weight参数),同时处理NA值和极端样本量情况:
自定义峰度函数
custom_kurtosis <- function(value, weight = NULL) { # 过滤NA值 valid_vals <- value[!is.na(value)] # 计算峰度至少需要3个有效样本 if (length(valid_vals) < 3) { return(NA) } # 使用e1091包的kurtosis函数 kurtosis(valid_vals) }
自定义偏度函数
custom_skewness <- function(value, weight = NULL) { valid_vals <- value[!is.na(value)] if (length(valid_vals) < 3) { return(NA) } skewness(valid_vals) }
自定义IQR函数
custom_iqr <- function(value, weight = NULL) { valid_vals <- value[!is.na(value)] # IQR至少需要2个有效样本 if (length(valid_vals) < 2) { return(NA) } IQR(valid_vals) }
3. 在exact_extract中使用自定义函数
可以单独提取某一个统计量,也可以一次性提取多个:
单独提取峰度
kurt_data <- exact_extract(gridmet_etr, grid_1000, fun = custom_kurtosis, progress = FALSE, summarize_df = TRUE)
一次性提取多个统计量
summary_data <- exact_extract(gridmet_etr, grid_1000, funs = list( 峰度 = custom_kurtosis, 偏度 = custom_skewness, 四分位距 = custom_iqr, 均值 = mean # 可混合内置函数 ), progress = FALSE, summarize_df = TRUE)
原代码无法运行的原因
- 参数不兼容:
exact_extract会自动向自定义函数传递weight参数,原函数只定义了value,导致参数不匹配报错。 - 未处理NA值:栅格数据通常存在NA,
e1091::kurtosis默认不忽略NA,会直接返回NA或报错。 - 样本量不足:当多边形覆盖的有效像元过少时,计算峰度/偏度会触发错误,需要提前判断并返回NA。
内容的提问来源于stack exchange,提问作者user8229029
相关产品推荐
相关产品推荐

