Я собираюсь сделать это для сетки 9 x 6 (54 ячейки), просто чтобы было легче увидеть, что происходит, и опробовать только 5 из этих 54 ячеек. Вы можете изменить это на сетку 100 x 100, где вы выбираете 200 из 10000 ячеек.
# Number of rows and columns of the grid (modify these as required)
nx <- 9 # rows
ny <- 6 # columns
# Create coordinate matrix
x <- rep(1:nx, each=ny);x
y <- rep(1:ny, nx);y
xy <- cbind(x, y); xy
# Where is the station? (edit: not snails nest)
Station <- rbind(c(x=3, y=2)) # Change as required
# Determine distance from each grid location to the station
library(SpatialTools)
D <- dist2(xy, Station)
На странице справки dist2
dist2 принимает матрицы координат координаты1 и координаты2 и возвращает межевклидовы расстояния между координатами.
Мы можем визуализировать это с помощью функции image
.
XY <- (matrix(D, nr=nx, byrow=TRUE))
image(XY) # axes are scaled to 0-1
# Create a scaling function - scales x to lie in [0-1)
scale_prop <- function(x, m=0)
(x - min(x)) / (m + max(x) - min(x))
# Add the coordinates to the grid
text(x=scale_prop(xy[,1]), y=scale_prop(xy[,2]), labels=paste(xy[,1],xy[,2],sep=","))
Более светлые тона указывают на то, что сетки ближе к станции в (3,2)
.
# Sampling probabilities will be proportional to the distance from the station, which are scaled to lie between [0 - 1). We don't want a 1 for the maximum distance (m=1).
prob <- 1 - scale_prop(D, m=1); range (prob)
# Sample from the grid using given probabilities
sam <- sample(1:nrow(xy), size = 5, prob=prob) # Change size as required.
xy[sam,] # Thse are your (**MY!**) 5 samples
x y
[1,] 4 4
[2,] 7 1
[3,] 3 2
[4,] 5 1
[5,] 5 3
Чтобы убедиться, что вероятности выборок верны, вы можете смоделировать множество выборок и посмотреть, какие координаты были выбраны наиболее .
snail.sam <- function(nsamples) {
sam <- sample(1:nrow(xy), size = nsamples, prob=prob)
apply(xy[sam,], 1, function(x) paste(x[1], x[2], sep=","))
}
SAMPLES <- replicate(10000, snail.sam(5))
tab <- table(SAMPLES)
cols <- colorRampPalette(c("lightblue", "darkblue"))(max(tab))
barplot(table(SAMPLES), horiz=TRUE, las=1, cex.names=0.5,
col=cols[tab])
Если используется сетка 100 х 100, а станция расположена в координатах (60,70), то изображение будет выглядеть следующим образом, а выбранные сетки будут отображаться в виде черных точек:
Существует тенденция расположения точек вблизи станции. , хотя изменчивость выборки может сделать это трудно увидеть. Если вы хотите придать сетке возле станции даже больше веса, то вы можете изменить масштаб вероятностей, что, я думаю, можно сделать, чтобы сэкономить на поездках, но эти веса должны быть включены в анализ при оценке количества улиток во всем регионе. Здесь я вычленил вероятности только для того, чтобы вы могли видеть, что происходит.
sam <- sample(1:nrow(xy), size = 200, prob=prob^3)
Тенденция к расположению точек рядом со станцией теперь более очевидно.