如何根据概率将栅格样本分为三类,并在R中设置这些类别的值?
抱歉我的问题太麻烦了。我要做的是生成一个光栅,其中随机1%的图层像素有值,在这些值像素中,随机35%有值1,55%有值2,10%有值3。其余像素应采用R NA中的“无数据”标记 使用以下代码,使用1%的像素创建具有统一值的光栅非常简单:如何根据概率将栅格样本分为三类,并在R中设置这些类别的值?,r,random,raster,R,Random,Raster,抱歉我的问题太麻烦了。我要做的是生成一个光栅,其中随机1%的图层像素有值,在这些值像素中,随机35%有值1,55%有值2,10%有值3。其余像素应采用R NA中的“无数据”标记 使用以下代码,使用1%的像素创建具有统一值的光栅非常简单: pixels <- raster(ext = extent(-120, -119, 49, 50), resolution = c(0.001, 0.001), crs = CRS("+proj=longlat +datum=WGS84"), vals =
pixels <- raster(ext = extent(-120, -119, 49, 50), resolution = c(0.001, 0.001), crs = CRS("+proj=longlat +datum=WGS84"), vals = 1)
testing <- sampleRandom(pixels, size = as.integer(0.01*ncell(pixels)), asRaster = TRUE)
但是,我不确定如何将测试的有值像素划分为三个类别,并根据上述内容设置这些类别的值
这是可能的,还是另一种实现我所追求的目标的方式?不太麻烦 函数f取单元格的总数
f <- function(N) {
n <- N/100 # 1% sample
# create a vector with the values you want
v <- c(rep(1, 0.35*n), rep(2, 0.55*n), rep(3, 0.1*n))
# sample these values (that is, put them in random order)
v <- sample(v)
# create output vector
out <- rep(NA, N)
# put the values in random places
out[sample(N, length(v))] <- v
out
}
library(raster)
# create a RasterLayer
r <- raster(ncol=100, nrow=100)
set.seed(10) # for reproducibility
values(r) <- f(ncell(r))
另一种方法是对样本使用概率
set.seed(10)
N <- ncell(r)
v <- sample(3, N/100, prob=c(0.35, 0.55, 0.1), replace=TRUE)
table(v)
# 1 2 3
#30 67 3
但因为它使用概率,所以比例并不精确。在这种情况下,这似乎很遥远,但这是因为样本量小
按照你的例子,你也可以沿着这条路线走
library(raster)
r <- raster(ext=extent(-120, -119, 49, 50), resolution=c(0.001, 0.001), crs="+proj=longlat +datum=WGS84", vals = 1)
r <- sampleRandom(r, size = (0.01*ncell(r)), asRaster = TRUE)
sfun <- function(x) {
i <- !is.na(x)
x[i] <- sample(1:3, sum(i), prob=c(0.35, 0.55, 0.1), replace=TRUE)
x
}
set.seed(101)
x <- calc(r, sfun)
再次大致正确
tab <- table(values(x))
100 * tab / sum(tab)
# 1 2 3
#35.45 54.62 9.93
tab <- table(values(x))
100 * tab / sum(tab)
# 1 2 3
#35.45 54.62 9.93