我需要从一个很大的栅格中抽取5%的随机样本,然后返回一个新栅格。我正在尝试使用sampleRandom
软件包中的raster
,但是过程非常慢(我的机器上只有8GB RAM,运行64位R)。栅格已被裁剪/遮罩以匹配不规则形状的研究区域边界-多边形边界周围的矩形范围内的NA值和一些内部NA值也是如此-我正尝试仅从非NA值采样。我已经尝试了5%的采样率并将其转换为95%的采样率-都运行了2个小时以上却没有产生结果,这时我终止了该过程。
我试图通过使用clusterR
命令并行运行来加快速度,但是我对sampleRandom
命令和clusterR
都是陌生的。我的代码运行了,但是我得到了所有非NA像素的返回,因此该示例似乎无法正常工作。这是我的代码有问题还是sampleRandom
无法与clusterR
一起运行?
这是我的栅格图层的描述:
conv.mod
class : RasterLayer
dimensions : 23828, 19095, 454995660 (nrow, ncol, ncell)
resolution : 56, 56 (x, y)
extent : -1220192, -150872, 87580, 1421948 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=aea +lat_1=44.75 +lat_2=55.75 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : C:\GIS\carbon_cows\Intact\conv_mod.tif
names : conv_mod
values : 1, 1 (min, max)
这是我尝试过的代码:
library(raster)
library(parallel)
tot<-cellStats(conv.mod,'sum', na.rm=TRUE) #get the total pixels in conv.mod
sampsize<-tot * 0.05 #calculate how many pixels would represent 5%
removeTmpFiles() #clear some memory
numcores<-detectCores() -1
start<-Sys.time()
beginCluster(numcores)
cl<-getCluster()
clusterExport(cl,"sampsize", envir = .GlobalEnv)
conv.perc <- clusterR(conv.mod,sampleRandom,args=list(size=sampsize,na.rm=TRUE,asRaster=TRUE))
endCluster()
end<-Sys.time()
difftime(end,start)
以下是原始栅格图层中的所有非NA像元:
tot<-cellStats(conv.mod,'sum', na.rm=TRUE)
tot
105193858
以及应为5%样本的数字:
sampsize<-tot * 0.05
sampsize
5259693
但是,生成的栅格具有与原始栅格相同数量的非NA像素:
tot_convperc<-cellStats(conv.perc,'sum',na.rm=T)
tot_convperc
105193858
我还尝试了逆转样本量计算并运行sampleRandom
,因此我希望获得95%的样本。但是,我得到相同的结果。
我很高兴能帮助您理解为什么此代码未按预期运行。谢谢!
答案 0 :(得分:1)
没关系。我能够利用以下信息:https://gis.stackexchange.com/questions/17255/random-sampling-of-raster-using-r和whuber的回复。
以下代码无需使用集群即可解决我的问题:
col.conv <- ncol(conv.mod)
row.conv<-nrow(conv.mod)
r<-conv.mod
start<-Sys.time()
r[runif(col.conv*row.conv) >= 0.95] <- NA # Randomly *unselect* 5% of the data
end<-Sys.time()
difftime(end,start)
该代码运行了大约3分钟,而将simpleRandom
代码放入clusterR
命令则需要一个多小时。我仍然想知道为什么simpleRandom
并没有实际取样,为什么这个新代码效率更高,却乐于解决问题。