【问题标题】:How to normalize a raster stack?如何规范化栅格堆栈?
【发布时间】:2019-10-16 18:42:14
【问题描述】:

我有一个光栅堆栈,我想通过标准化原始图层中的每一层来创建一个新堆栈。我可以在下面不优雅的例子中做到这一点。有没有更简单的方法?

library(raster)
#> Loading required package: sp
set.seed(1)

# Create random data for 3 layers in a stack
s <- stack(raster(matrix(rnorm(100, mean = 10, sd = 1), nrow = 10)),
           raster(matrix(rnorm(100, mean = 20, sd = 3), nrow = 10)),
           raster(matrix(rnorm(100, mean = 30, sd = 5), nrow = 10)))

# Roll my own functions for normalizing
mu <- function (x) {
  mean(extract(x, 1:ncell(x)))
}

sigma <- function (x) {
  sd(extract(x, 1:ncell(x)))
}

normalize <- function (x) {
  return((x - mu(x))/sigma(x))
}

normalize_stack <- function (x) {
  ls <- list()
  for (i in 1:dim(x)[3]) {
    ls[[i]] <- normalize(subset(x, i))
  }
  return(stack(ls))
}

# Normalize the stack
normal <- normalize_stack(s)

# Verify that means are essentially 0
for (i in 1:dim(normal)[3]) {
  print(mu(subset(normal, i)))
}
#> [1] 7.222304e-16
#> [1] -2.867314e-16
#> [1] -1.519569e-16

# Verify that sds are 1
for (i in 1:dim(normal)[3]) {
  print(sigma(subset(normal, i)))
}
#> [1] 1
#> [1] 1
#> [1] 1

reprex package (v0.3.0) 于 2019 年 10 月 16 日创建

【问题讨论】:

    标签: r r-raster


    【解决方案1】:

    由于您已经在使用 raster 包,一种方法是使用 raster::scale 本身,如下所示:

    您的示例数据:

    library(raster)
    #> Loading required package: sp
    set.seed(1)
    
    # Create random data for 3 layers in a stack
    s <- stack(raster(matrix(rnorm(100, mean = 10, sd = 1), nrow = 10)),
               raster(matrix(rnorm(100, mean = 20, sd = 3), nrow = 10)),
               raster(matrix(rnorm(100, mean = 30, sd = 5), nrow = 10)))
    

    使用比例的简单方法:

    normal <- scale(s)
    

    【讨论】:

      【解决方案2】:

      一个简单的改变是转储musigmanormalize,只使用scale

      normalize_stack <- function (x) {
        ls <- list()
        for (i in 1:dim(x)[3]) {
           ls[[i]] <- scale(subset(x, i))
         }
         return(stack(ls))
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多