@@ -284,15 +284,14 @@ sits_reduce_imbalance <- function(samples,
284
284
# ' sampling_design <- sits_sampling_design(label_cube, expected_ua)
285
285
# ' }
286
286
# ' @export
287
- sits_sampling_design <- function (cube ,
287
+ sits_sampling_design <- function (cube , ... ,
288
288
expected_ua = 0.75 ,
289
289
std_err = 0.01 ,
290
290
rare_class_prop = 0.1 ) {
291
291
.check_set_caller(" sits_sampling_design" )
292
292
# check the cube is valid
293
- .check_raster_cube_files(cube )
294
- # check cube is class cube
295
- .check_is_class_cube(cube )
293
+ .check_that(inherits(cube , " class_cube" ) ||
294
+ inherits(cube , " class_vector_cube" ))
296
295
# get the labels
297
296
labels <- .cube_labels(cube )
298
297
n_labels <- length(labels )
@@ -304,19 +303,23 @@ sits_sampling_design <- function(cube,
304
303
.check_that(length(expected_ua ) == n_labels )
305
304
# check names of labels
306
305
.check_that(all(labels %in% names(expected_ua )))
307
- # adjust names to match cube labels
308
- expected_ua <- expected_ua [labels ]
309
306
# get cube class areas
310
307
class_areas <- .cube_class_areas(cube )
308
+ # check that names of class areas are contained in the labels
309
+ .check_that(all(names(class_areas ) %in% labels ),
310
+ msg = .conf(" messages" , " sits_sampling_design_labels" ))
311
+ # adjust names to match cube labels
312
+ expected_ua <- expected_ua [names(class_areas )]
311
313
# calculate proportion of class areas
312
314
prop <- class_areas / sum(class_areas )
313
315
# standard deviation of the stratum
314
316
std_dev <- signif(sqrt(expected_ua * (1 - expected_ua )), 3 )
315
317
# calculate sample size
316
318
sample_size <- round((sum(prop * std_dev ) / std_err ) ^ 2 )
317
319
# determine "Equal" allocation
318
- equal <- rep(round(sample_size / n_labels ), n_labels )
319
- names(equal ) <- labels
320
+ n_classes <- length(class_areas )
321
+ equal <- rep(round(sample_size / n_classes ), n_classes )
322
+ names(equal ) <- names(class_areas )
320
323
# find out the classes which are rare
321
324
rare_classes <- prop [prop < = rare_class_prop ]
322
325
# Determine allocation possibilities
@@ -418,66 +421,44 @@ sits_stratified_sampling <- function(cube,
418
421
.check_set_caller(" sits_stratified_sampling" )
419
422
# check the cube is valid
420
423
.check_raster_cube_files(cube )
421
- # check cube is class cube
422
- .check_is_class_cube(cube )
424
+ # check the cube is valid
425
+ .check_that(inherits(cube , " class_cube" ) ||
426
+ inherits(cube , " class_vector_cube" ))
423
427
# get the labels
424
428
labels <- .cube_labels(cube )
425
429
n_labels <- length(labels )
426
430
# check number of labels
427
- .check_that(nrow(sampling_design ) = = n_labels )
431
+ .check_that(nrow(sampling_design ) < = n_labels )
428
432
# check names of labels
429
433
.check_that(all(rownames(sampling_design ) %in% labels ))
430
434
# check allocation method
431
435
.check_that(alloc %in% colnames(sampling_design ),
432
- msg = .conf(" messages" , " sits_sampling_design_alloc " ))
436
+ msg = .conf(" messages" , " sits_stratified_sampling_alloc " ))
433
437
# retrieve samples class
434
438
samples_class <- unlist(sampling_design [, alloc ])
435
439
# check samples class
436
440
.check_int_parameter(samples_class , is_named = TRUE ,
437
- msg = .conf(" messages" , " sits_sampling_design_samples " )
441
+ msg = .conf(" messages" , " sits_stratified_sampling_samples " )
438
442
)
439
443
.check_int_parameter(multicores , min = 1 , max = 2048 )
440
444
.check_progress(progress )
441
445
# name samples class
442
- names(samples_class ) <- rownames(sampling_design )
446
+ # names(samples_class) <- rownames(sampling_design)
443
447
# include overhead
444
448
samples_class <- ceiling(samples_class * overhead )
445
- # estimate size
446
- size <- ceiling(max(samples_class ) / nrow(cube ))
447
- # Prepare parallel processing
448
- .parallel_start(workers = multicores )
449
- on.exit(.parallel_stop(), add = TRUE )
450
- # Create assets as jobs
451
- cube_assets <- .cube_split_assets(cube )
452
- # Process each asset in parallel
453
- samples <- .jobs_map_parallel_dfr(cube_assets , function (tile ) {
454
- robj <- .raster_open_rast(.tile_path(tile ))
455
- cls <- data.frame (id = 1 : n_labels ,
456
- cover = labels )
457
- levels(robj ) <- cls
458
- samples_sv <- terra :: spatSample(
459
- x = robj ,
460
- size = size ,
461
- method = " stratified" ,
462
- as.points = TRUE
463
- )
464
- samples_sf <- sf :: st_as_sf(samples_sv )
465
- samples_sf <- dplyr :: mutate(samples_sf ,
466
- label = labels [.data [[" cover" ]]])
467
- samples_sf <- sf :: st_transform(samples_sf , crs = " EPSG:4326" )
468
- }, progress = progress )
469
449
470
- samples <- purrr :: map_dfr(labels , function (lab ) {
471
- samples_class <- samples | >
472
- dplyr :: filter(.data [[" label" ]] == lab ) | >
473
- dplyr :: slice_sample(n = samples_class [lab ])
474
- })
450
+ # call function to allocate sample per strata
451
+ samples <- .samples_alloc_strata(
452
+ cube = cube ,
453
+ samples_class = samples_class ,
454
+ multicores = multicores )
455
+
475
456
if (.has(shp_file )) {
476
457
.check_that(tools :: file_ext(shp_file ) == " shp" ,
477
- msg = .conf(" messages" , " sits_sampling_design_shp " )
458
+ msg = .conf(" messages" , " sits_stratified_sampling_shp " )
478
459
)
479
460
sf :: st_write(samples , shp_file , append = FALSE )
480
- message(.conf(" messages" , " sits_sampling_design_shp_save " ), shp_file )
461
+ message(.conf(" messages" , " sits_stratified_sampling_shp_save " ), shp_file )
481
462
}
482
463
return (samples )
483
464
}
0 commit comments