具有KendallATS功能的Raster Calc来自" smwrQW"包

时间:2015-11-28 00:33:55

标签: r raster subscript calc r-raster

这是我在StackOverflow上的第一个问题。我试图在由15层(计数时间序列)组成的栅格砖上使用Mann-Kendall趋势测试来制作三个栅格(sen斜率,tau-b和p值)。我需要使用tau-b而不是tau-a,因为我的一些数据基本上是绑定的,并且用tau-a生成的输出(例如,来自kendallTrendTest(x)包的函数Envstats)有时是异常的(例如显着的零斜率)。我在R软件包中找到的唯一一个函数,它正是我需要的函数kendallATS.test(x,y)来自USGSsmwrQW个函数。问题在于,虽然我删除了研究区域外的所有NA并且所有系列完全由相同的值组成(例如{{1},但我无法使此功能与calc包中的raster函数一起使用。 }})。我对操作进行了不同的编码,但是徒劳无功。以下是我使用的一些示例:

c(0,0,0,0,0)

获得的错误消息:

library(raster)
library(smwrQW)

setwd("C:R/WorkingDirectory/Annual_SCD")
list <- list.files(pattern = "*.tif")
RasterStack <- stack(list)
rb <- brick(RasterStack)

# Remove NA outside study area
j <- calc(rb, function(x) {x[is.na(x)] <- -999; return(x)}) 

# MK tau-b Slope (PROBLEM)
m <- calc(j, function(x) { y <- 1:15; X <- all(x == x[1]); if (X == FALSE) {
kendallATS.test(c(x[]),y)$estimate[1] } else return(-999)}, forcefun=TRUE)

我的研究区域内的所有单元格都包含砖块中15层的数字数据。我使用Error in x@.Data[i, , drop = FALSE] : (subscript) logical subscript too long 代替c(x[])来获取向量,否则,我会收到另一条错误消息:

x

Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘as.lcens’ for signature ‘"matrix", "missing", "missing"’. 函数属于as.lcens。我已经在smwrQWna.rm=TRUE使用了kendallATS.test,但没有变化。但是,该函数与指定的行和列完全相同:

calc

我的编码知识非常基础,我很感激任何帮助来解决这个问题。

由于

1 个答案:

答案 0 :(得分:1)

这是一个有效的例子,也许可以作为一个起点:

library(raster)
library(smwrQW)

b <- brick(ncol=10, nrow=10, nl=15)
b <- setValues(b, matrix(runif(1200), 100, 15))
b[1:5] <- NA

y <- 1:nlayers(b)
f <- function(x) { 
    if (any(is.na(x))) {
        return(c(NA, NA, NA))
    } else if (any(x != x[1])) {
        kendallATS.test(x , y)$estimate 
    } else {
        return(c(NA, NA, NA))
    }
}

m <- calc(b, f)

如果要返回单个变量,请注意下面如何编辑函数:

fp <- function(x) { 
    if (any(is.na(x))) {
        return(NA)
    } else if (any(x != x[1])) {
        kendallATS.test(x , y)$p.value
    } else {
        return(NA)
    }
}

n <- calc(b, fp)