Обнаружение точки изменения растрового стека с помощью функции Pettitt.test (x) пакета Trend в R - PullRequest
0 голосов
/ 02 августа 2020

У меня есть набор данных временных рядов NDVI с 38 слоями, большим растровым стеком, и я хочу определить точку изменения с помощью функции Pettitt.test (x) пакета Trend, но я получаю сообщение об ошибке при запуске следующего кода:

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

почему? Кто-нибудь может мне помочь решить эту проблему? Спасибо !!!

1 Ответ

0 голосов
/ 03 августа 2020

Причина этой ошибки в том, что 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...