Сравнение двух векторов, приведенных после моделирования - PullRequest
6 голосов
/ 03 марта 2020

Я хотел бы применить метод выборки Отклонения для имитации случайного вектора Y=(Y_1, Y_2) равномерного распределения из единицы dis c D = { (X_1 , X_2) \in R^2: \sqrt{x^2_1 + x^2_2} ≤ 1}, так что X = (X_1 , X_ 2) является случайным вектором равномерного распределения в квадрате S = [−1, 1]^2 и плотность соединения f(y_1,y_2) = \frac{1}{\pi} 1_{D(y_1,y_2)}.

При отбраковке мы обычно принимаем образец, если f(x) \leq C * g(x). Я использую следующий код для:

x=runif(100,-1,1)
y=runif(100,-1,1)

d=data.frame(x=x,y=y)
disc_sample=d[(d$x^2+d$y^2)<1,]
plot(disc_sample)

У меня есть два вопроса:

{Если использовать логически приведенный выше код, размер d должен быть больше, чем размер disc_sample но когда я звоню им обоим, я вижу, что в каждом из них есть 100 элементов. Как это могло быть возможно. Почему размеры одинаковы.} ЭТА ЧАСТЬ РЕШЕНА, благодаря комментарию ниже.

Вопрос теперь

Кроме того, как можно Я переформулирую свой код, чтобы дать мне общее количество образцов, необходимое для получения 100 образцов, соответствующих условию. то есть, чтобы дать мне количество отклоненных выборок, пока я не получу 100 необходимых образцов?

Благодаря ответу r2evans , но я хочу написать что-нибудь попроще, пока l oop сохранить все возможные выборки внутри матрицы или фрейма данных вместо списка, а затем вызвать из этого фрейма данных только выборки, соответствующие условию. Я изменил код из ответа без использования списков и без функции sapply, но он не дает нужного результата, он дает только одну строку.

i=0
samps <- data.frame()
goods <- data.frame()
nr <- 0L
sampsize <- 100L
needs <- 100L
while (i < needs) {
  samps <- data.frame(x = runif(1, -1, 1), y = runif(1, -1, 1))
  goods <- samps[(samps$x^2+samps$y^2)<1, ]
i = i+1
}

, и я также подумал об этом:

i=0
j=0
samps <- matrix()
goods <- matrix()
needs <- 100

while (j < needs) {
  samps[i,1] <- runif(1, -1, 1)
  samps[i,2] <- runif(1, -1, 1)
  if (( (samps[i,1])**2+(samps[i,2])**2)<1){
  goods[j,1] <- samps[i,1]
  goods[j,2] <- samps[i,2]
}
else{
i = i+1
}
}

но это не работает.

Буду очень признателен за любую помощь в изменении кода.

1 Ответ

1 голос
/ 03 марта 2020

Что касается вашего второго вопроса ... вы не можете переформулировать свой код, чтобы точно знать, сколько потребуется, чтобы получить (как минимум) 100 результирующих комбинаций. Вы можете использовать while l oop и объединять результаты до тех пор, пока у вас не будет не менее 100 таких строк, а затем обрезать их больше 100. Поскольку использование энтропии по частям (в масштабе) "дорого", вы можете предпочесть всегда переусердствовать оцените нужные вам строки и захватите все сразу.

(отредактировано для уменьшения «сложности» на основе ограничений домашней работы.)

set.seed(42)
samps <- vector(mode = "list")
goods <- vector(mode = "list")
nr <- 0L
iter <- 0L
sampsize <- 100L
needs <- 100L
while (nr < needs && iter < 50) {
  iter <- iter + 1L
  samps[[iter]] <- data.frame(x = runif(sampsize, -1, 1), y = runif(sampsize, -1, 1))
  rows <- (samps[[iter]]$x^2 + samps[[iter]]$y^2) < 1
  goods[[iter]] <- samps[[iter]][rows, ]
  nr <- nr + sum(rows)
}
iter                # number of times we looped
# [1] 2
out <- head(do.call(rbind, goods), n = 100)
NROW(out)
# [1] 100
head(out) ; tail(out)
#            x          y
# 1  0.8296121  0.2524907
# 3 -0.4277209 -0.5668654
# 4  0.6608953 -0.2221099
# 5  0.2834910  0.8849114
# 6  0.0381919  0.9252160
# 7  0.4731766  0.4797106
#               x          y
# 221 -0.65673577 -0.2124462
# 231  0.08606199 -0.7161822
# 251 -0.37263236  0.1296444
# 271 -0.38589120 -0.2831997
# 28  -0.62909284  0.6840144
# 301 -0.50865171  0.5014720
...