R: образец матрицы для ячеек, близких к указанной позиции - PullRequest
2 голосов
/ 01 марта 2020

Я пытаюсь найти сайты для сбора улиток, используя метод полуслучайного выбора. Я установил сетку 10 км 2 вокруг области, из которой я хочу собирать улиток, которая разбита на 10 000 клеток 10 м 2 . Я хочу случайным образом эту сетку в R, чтобы выбрать 200 полевых сайтов.

Произвольная выборка матрицы в R достаточно проста;

dat <- matrix(1:10000, nrow = 100)

sample(dat, size = 200)

Однако я хочу сместить выборку, чтобы выбрать ячейки ближе к одной позиции (представляющей участки ближе к исследовательской станции) , Проще объяснить это с помощью изображения:

enter image description here

Желтая ячейка с крестиком представляет позицию, вокруг которой я хочу взять образец. Серое затенение - это вероятность выбора ячейки в функции sample, причем более темные ячейки с большей вероятностью будут выбраны.

Я знаю, что я могу указать вероятности выборки, используя аргумент prob в sample , но я не знаю, как создать двумерную матрицу вероятностей. Буду признателен за любую помощь, я не хочу делать это вручную.

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Я собираюсь сделать это для сетки 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=","))

enter image description here

Более светлые тона указывают на то, что сетки ближе к станции в (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])

enter image description here


Если используется сетка 100 х 100, а станция расположена в координатах (60,70), то изображение будет выглядеть следующим образом, а выбранные сетки будут отображаться в виде черных точек:

enter image description here

Существует тенденция расположения точек вблизи станции. , хотя изменчивость выборки может сделать это трудно увидеть. Если вы хотите придать сетке возле станции даже больше веса, то вы можете изменить масштаб вероятностей, что, я думаю, можно сделать, чтобы сэкономить на поездках, но эти веса должны быть включены в анализ при оценке количества улиток во всем регионе. Здесь я вычленил вероятности только для того, чтобы вы могли видеть, что происходит.

sam <- sample(1:nrow(xy), size = 200, prob=prob^3)

enter image description here

Тенденция к расположению точек рядом со станцией теперь более очевидно.

0 голосов
/ 01 марта 2020

Возможно, есть лучший способ, чем этот, но быстрый способ сделать это - случайная выборка по осям x и y с использованием распределения (я использовал распределение в форме нормального колокола, но вы действительно можете использовать любое). Хитрость заключается в том, чтобы определить среднее значение распределения положения исследовательской станции. Вы можете изменить смещение в сторону исследовательской станции, изменив стандартное отклонение распределения. Затем используйте случайно выбранные позиции в качестве координат x и y для выбора позиций.

dat <- matrix(1:10000, nrow = 100)
#randomly selected a position for the research station
rs <- c(80,30) 
# you can change the sd to change the bias
x <- round(rnorm(400,mean = rs[1], sd = 10)) 
y <- round(rnorm(400, mean = rs[2], sd = 10))  
position <- rep(NA, 200)
j = 1
i = 1

# as some of the numbers sampled can be outside of the area you want I oversampled # and then only selected the first 200 that were in the area of interest. 
while (j <= 200) {
  if(x[i] > 0 & x[i] < 100 &  y[i] > 0 & y [i]< 100){
    position[j] <- dat[x[i],y[i]]
    j = j +1
  }
  i = i +1
}

График результатов:

plot(x,y, pch = 19)
points(x =80,y = 30, col = "red", pch = 19) # position of the station

enter image description here

...