r - 是什么导致 R 中栅格计算中 calc 和 cellStats 之间的差异?
问题描述
我正在处理一个由 20 层组成的数据集,这些层堆叠在 RasterBrick 中(源自数组)。我查看了使用“calc”和“cellStats”计算的层总和。我使用 calc 来计算总值和 cellStats 来查看每层值的平均值(对于时间序列很有用)。但是,当我对每一层的平均值求和时,它是另一个计算和的值的一半。是什么导致了这种差异?我在看什么?
代码如下所示:
testarray <- runif(54214776,0,1)
# Although testarray should contain a raster of 127x147 with 2904 time layers.
# Not really sure how to create that yet.
for (i in 1830:1849){
slice<-array2[,,i]
r <- raster(nrow=(127*5), ncol=(147*5), resolution =5, ext=ext1, vals=slice)
x <- stack(x , r)
}
brickhp2 <- brick(x)
r_sumhp2 <- calc(brickhp2, sum, na.rm=TRUE)
r_sumhp2[r_sumhp2<= 0] <- NA
SWEavgpertimestepM <- cellStats(brickhp2, stat='mean', na.rm=TRUE)
目标是将使用“calc(x, sum)”计算的层总和与使用“cellStats(x, mean)”计算的平均值的总和进行比较。
Rasterbrick 看起来像这样(600kb,GTiff):http ://www.filedropper.com/brickhp2 *如果有更好的分享方式,请告诉我。
解决方案
当您使用calc
它在砖块上按像素操作(即对每个像素的 20 个值执行计算并返回单个栅格图层)以及cellStats
单独对每个栅格图层执行计算并返回单个值时,就会出现混淆每一层。如果使用以下代码,您可以看到结果具有可比性:
library(raster)
##set seed so you get the same runif vals
set.seed(999)
##create example rasters
ls=list()
for (i in 1:20){
r <- raster(nrow=(127*5), ncol=(147*5), vals=runif(127*5*147*5))
ls[[i]] <- r
}
##create raster brick
brickhp2 <- brick(ls)
##calc sum (pixel-wise)
r_sumhp2 <- calc(brickhp2, sum, na.rm=TRUE)
r_sumhp2 ##returns raster layer
##calc mean (layer-wise)
r_meanhp2 <- cellStats(brickhp2, stat='mean', na.rm=TRUE)
r_meanhp2 ##returns vector of length nlayers(brickhp2)
##to get equivalent values you need to divide r_sumhp2 by the number of layers
##and then calculate the mean
cellStats(r_sumhp2/nlayers(brickhp2),stat="mean")
[1] 0.4999381
##and for r_meanhp2 you need to calculate the mean of the means
mean(r_meanhp2)
[1] 0.4999381
您需要自己确定是否要为您的应用程序使用像素或层级结果。
推荐阅读
- java - 如何在 Android 中检测物理键的双击?(onKeyMultiple)
- angular - PDF 被 CORS 策略阻止
- google-text-to-speech - Google 文字转语音 - Google::Cloud::InternalError(13:遇到内部错误。):
- python - 在极坐标图中舍入并绘制外部比例
- r - 对于循环比较2个数据帧的值,将测试的输出结果放在R中的第三个数据帧中
- android - 为什么 command + shift + l 正在改变我的视图顺序?
- anylogic - 如何在动态事件中访问数据库中的日期
- arrays - 快速按值对字典进行排序
- java - 简单的网站:嵌入一个记住点击的按钮
- python - Python:如何每次获取数组的下 k 个连续元素?