The construction of the CRM requires that the flight flux through the observed window be scaled to the size of a turbine and then applied to each turbine. If If the (effective) detection range of the observer overlaps multiple turbines the flux needs to be scaled appropriate over the turbines in the observation range.
Usage
cluster_correction_a(eff_detection_width, df_turbines, crs = 4326)
cluster_correction_l(
eff_detection_width,
avg_min_distance = NULL,
df_turbines = NULL,
crs = 4326
)Arguments
- eff_detection_width
numeric; the effective detection (half) width or effective detection radius
- df_turbines
data.frame; (optional) a data.frame with one row per turbine, containing the coordinates of each turbine as latitude, longitude pairs. Coordinate columns can be named (lon, long, longitude, x) and (lat, latitude, y)
- crs
optional coordinate system epsg code for the coordinates. Only used if df_turbines provided. Defaults to crs = 4326 (WGS 84 - lat/lon).
- avg_min_distance
numeric; (optional) the mean distance between each turbine and its nearest neighbour. Alternatively you can input a data.frame with turbine coordinates
Value
numeric; the minimum of 1 or a fractional scaling factor, calculated as the ratio of the total area covered by the turbines buffered by the EDA divided by the area if each turbine buffer were completely independent.
numeric; the minimum of 1 or a fractional scaling factor, calculated as the ratio of the average distance between turbine neighbours and the effective strip width
Details
If the turbine layout is more compact and/or your effective detection width is large, then the effective detection area contains more than one turbine, in which case the observed flux needs to be weighted to account for the effective turbines in the observed area. This accounts for the fact that the observed flux is an instantaneous measure and cannot interact with multiple turbines at once.
This package provides a 1D line correction cluster_correction_l() and 2D aerial cluster_correction_a().
cluster_correction_l()
The 1D (line) correction calculates the ratio of the effective strip width (ESW) and the mean distance between each turbine and it's nearest neighbour. It's suitable for line transects or for interim CRM early in the project life-cycle where the turbine spacing can be estimated but the layout may not be available.
cluster_correction_a()
The 2D aerial correction places a buffer of radius equal to the effective detection radius (EDR) around each turbine, then generates a spatial union of those buffers. The correction is the ratio of the actual turbine area to the area if the turbine buffers do not overlap.
Relationship to other spatial corrections
This correction is derived from different assumptions but fulfils a similar model correction as the sqrt(n_turbines) in previous CRM (Smales et al. 2013; Band 2012)
.
Alternatively, a spatial probability surface can be generated by the analyst using kernel density estimate (KDE) or similar and used instead to estimate the proportion of flights at a given turbine estimation. That approach requires more data and site coverage.
Examples
# generate inputs information
df_turbines <- data.frame(
turbine_id = c("T1", "T2", "T3"),
lat = c(-35.036287, -35.03900, -35.03200),
lon = c(145.947140, 145.94500, 145.94200)
)
eff_detection_width <- 500
cluster_correction_a(eff_detection_width = 500, df_turbines, crs = 4326)
#> [1] 0.9424847
# generate input data
df_turbines <- data.frame(
turbine_id = c("T1", "T2", "T3"),
lat = c(-35.036287, -35.03900, -35.03200),
lon = c(145.947140, 145.94500, 145.94200)
)
##option 1 - provide the average distance between turbine neighbours
sf_turbines <- sf::st_as_sf(df_turbines,
coords = c("lon", "lat"),
crs = 4326)
idx <- sf::st_nearest_feature(sf_turbines)
dist_avg <- sf::st_distance(sf_turbines, sf_turbines[idx,], by_element=TRUE) |>
mean() |>
as.numeric()
corr1 <- cluster_correction_l(eff_detection_width = 800,
avg_min_distance = dist_avg)
## option 2 - provide the data frame (might be slower)
corr2 <- cluster_correction_l(eff_detection_width = 800,
df_turbines = df_turbines,
crs = 4326 # provide crs with turbines
)
## should be equal (or very very close)
corr1; corr2
#> [1] 0.5776061
#> [1] 0.5771365
