首页 > 解决方案 > 使用R中Trend包的Pettitt.test(x)函数对栅格堆栈进行变化点检测

问题描述

我有一个包含 38 层、大型栅格堆栈的 NDVI 时间序列数据集,并且想使用 Trend 包的 Pettitt.test (x) 函数检测变化点,但是当我运行以下代码时收到错误消息:

library(sp)
library(raster)
library(rgdal)
library(trend)
# example dataset with 27 layers
s <- stack(system.file("external/rlogo.grd", package="raster")) 
s <- stack(s, s* 2, s*3)
ss <- stack(s, s* 2, s*3)
# calculating change point k
fun2 <- function(x){       
        if(length(na.omit(x))<27) return(c(NA))
        pttest <- pettitt.test(ts(na.omit(x)))
        vl <-pttest$estimate
        return(c(vl))
}
p.test<-calc(ss,fun2)

它返回以下错误

Error in setValues(out, x) : 
  values must be numeric, integer, logical or factor

为什么?有没有人可以帮我解决这个问题?谢谢!!!

标签: r

解决方案


此错误的原因是pttest$estimate可能有多个值。如果您像这样更改功能,错误就会消失

fun3 <- function(x){
        x <- na.omit(x)       
        if (length(x) < 27) return(NA)
        pttest <- pettitt.test(ts(x))
        v <- pttest$estimate
        v[1]
}
p.test<-calc(ss, fun3)

或者如果你想有两个值,像这样

fun4 <- function(x){       
        x <- na.omit(x)       
        if (length(x) < 27) return(c(NA, NA))
        pttest <- pettitt.test(ts(x))
        v <- pttest$estimate
        rep_len(v, 2)
}
p.test<-calc(ss, fun4)

推荐阅读