首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“KendallATS”包中带有smwrQW函数的光栅Calc

“KendallATS”包中带有smwrQW函数的光栅Calc
EN

Stack Overflow用户
提问于 2015-11-28 00:33:55
回答 1查看 591关注 0票数 0

这是我在StackOverflow上的第一个问题。我试图使用Mann趋势测试在一个由15层(时间序列计数)组成的栅格砖上形成三个栅格(sen斜率、τ-b值和p值)。我需要使用τ-b而不是τ-a,因为我的一些数据在很大程度上是绑定的,而用τ-a产生的输出(例如,使用来自Envstats包的函数Envstats)有时是异常的(例如,显著的空斜率)。我在R包中找到的唯一函数,也正是我所需要的函数,就是来自kendallATS.test(x,y)的包smwrQW中的美国地质调查局。问题是,我无法使这个函数与calc包中的raster函数一起工作,尽管我删除了研究区域之外的所有NA,以及所有完全由相同值组成的系列(例如c(0,0,0,0,0))。我用不同的方式对手术进行了编码,但都是徒劳。下面是我使用的一些例子:

代码语言:javascript
复制
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)

获得的错误消息:

代码语言:javascript
复制
Error in x@.Data[i, , drop = FALSE] : 
  (subscript) logical subscript too long

我研究区域内的所有单元格都包含砖中15层的数值数据。我使用c(x[])而不是x来拥有向量,因为否则,我会得到另一条错误消息,上面写着:

代码语言:javascript
复制
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘as.lcens’ for signature
 ‘"matrix", "missing", "missing"’.

as.lcens函数属于smwrQW。我已经在kendallATS.testcalc中使用了kendallATS.test,但没有改变。但是,该函数与指定的行和列完全独立工作:

代码语言:javascript
复制
kendallATS.test(c(rb[250,300]),1:15)

我在编码方面的知识是非常基础的,我希望能有任何帮助来解决这个问题。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-19 06:30:10

下面是一个有用的例子,也许可以作为一个起点:

代码语言:javascript
复制
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)

注意,如果您想返回一个变量,那么如何编辑函数:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33966430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档